您的位置:首页 > 数据库

经典SQL语句大全收藏

2010-05-22 12:57 429 查看
下列语句部分是
Mssql

语句,不可以在
access

中使用。

  
SQL

分类:

  
DDL

—数据定义语言
(CREATE


ALTER


DROP


DECLARE)

  
DML

—数据操纵语言
(SELECT


DELETE


UPDATE


INSERT)

  
DCL

—数据控制语言
(GRANT


REVOKE


COMMIT


ROLLBACK)

  首先
,

简要介绍基础语句:

  
1

、说明:创建数据库

CREATE DATABASE
database-name

  
2

、说明:删除数据库

drop database
dbname

  
3

、说明:备份
sql server

  
---

创建

备份数据的
device

USE master

EXEC
sp_addumpdevice 'disk', 'testBack', 'c:/mssql7backup/MyNwind_1.dat'

  
---

开始

备份

BACKUP DATABASE
pubs TO testBack

  
4

、说明:创建新表

create table
tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

  根据已有的表创建新表:

A


create table
tab_new like tab_old (

使用旧表创
建新表
)

B


create table
tab_new as select col1,col2


from tab_old
definition only

  
5

、说明:

  删除新表:
drop table
tabname

  
6

、说明:

  增加一个列:
Alter table
tabname add column col type

  注:列增加后将不能删除。
DB2

中列加上后数据类型也不能改变,唯一能改变的是增加
varchar

类型的长度。

  
7

、说明:

  添加主键:
Alter table
tabname add primary key(col)

  说明:

  删除主键:
Alter table
tabname drop primary key(col)

  
8

、说明:

  创建索引:
create
[unique] index idxname on tabname(col


.)

  删除索引:
drop index
idxname

  注:索引是不可更改的,想更
改必须删除重新建。

  
9

、说明:

  创建视图:
create view
viewname as select statement

  删除视图:
drop view
viewname

10

、说明:几个简
单的基本的
sql

语句

  选择:
select * from
table1 where

范围

  插入:
insert into
table1(field1,field2) values(value1,value2)

  删除:
delete from
table1 where

范围

  更新:
update table1
set field1=value1 where

范围

  查找:
select * from
table1 where field1 like


%value1%


---like

的语法很精妙,查资料
!

  排序:
select * from
table1 order by field1,field2 [desc]

  总数:
select count *
as totalcount from table1

  
11

、说明:几个高级查询运算词

  
B


EXCEPT

运算符

  
EXCEPT

运算符通过包括所有在
TABLE1

中但不在
TABLE2

中的行并消除所有重复行而派生出一个结果表。当
ALL


EXCEPT

一起使用时
(EXCEPT ALL)

,不消除重复行。

  
C


INTERSECT

运算符

  
INTERSECT

运算符通过只包括
TABLE1


TABLE2

中都有的行并消除所有重复行而派生出一个结果表。当
ALL


INTERSECT

一起使用时
(INTERSECT ALL)

,不消除重复行。

  注:使用运算词的几个查询结
果行必须是一致的。

  
12

、说明:使用外连接

  
A


left outer join



  左外连接(左连接):结果集
几包括连接表的匹配行,也包括左连接表的所有行。

SQL: select
a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

  
B


right outer join:

  右外连接
(

右连接
)

:结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

  
C


full outer join



  全外连接:不仅包括符号连接
表的匹配行,还包括两个连接表中的所有记录。

  其次,大家来看一些不错的
sql

语句

  
1

、说明:复制表
(

只复制结构
,

源表名:
a

新表名:
b) (Access

可用
)

  法一:
select * into b
from a where 1<>1

  法二:
select top 0 *
into b from a

  
2

、说明:拷贝表
(

拷贝数据
,

源表名:
a

目标表名:
b) (Access

可用
)

insert into
b(a, b, c) select d,e,f from b;

  
3

、说明:跨数据库之间表的拷贝
(

具体数据使用绝对路径
) (Access

可用
)

insert into b(a, b, c) select d,e,f from b in

‘具体数据库’
where

条件

  例子:
..from b in
'"&Server.MapPath(".")&"/data.mdb" &"' where..

  
4

、说明:子查询
(

表名
1


a

表名
2


b)

select a,b,c from a where a IN (select d from b )

或者
: select a,b,c from a where a IN
(1,2,3)

  
5

、说明:显示文章、提交人和最后回复时间

select
a.title,a.username,b.adddate from table a,(select max(adddate) adddate
from table where table.title=a.title) b

6

、说明:外连接查

(

表名
1


a

表名
2


b)

select a.a,
a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

  
7

、说明:在线视图查询
(

表名
1


a )

select * from
(SELECT a,b,c FROM a) T where t.a > 1;

  
8

、说明:
between

的用法
,between

限制查询数据范围时包括了边界值
,not between

不包括

select * from
table1 where time between time1 and time2

select a,b,c, from table1 where a not between

数值
1 and

数值
2

  
9

、说明:
in

的使用方法

select * from table1 where a [not] in (

‘值
1


,

’值
2


,

’值
4


,

’值
6


)

  
10

、说明:两张关联表,删除主表中已经在副表中没有的信息

delete from
table1 where not exists ( select * from table2 where
table1.field1=table2.field1 )

  
11

、说明:四表联查问题:

select * from a
left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d
on a.a=d.d where .....

  
12

、说明:日程安排提前五分钟提醒

SQL: select * from

日程安排
where datediff('minute',f

开始时间
,getdate())>5

  
13

、说明:一条
sql

语句搞定数据库分页

select top 10 b.* from (select top 20

主键字段
,

排序字段
from

表名
order by

排序字段
desc) a,

表名
b where b.

主键字段
= a.

主键字段
order by a.

排序字段

  
14

、说明:前
10

条记录

select top 10 * form table1 where

范围

  
15

、说明:选择在每一组
b

值相同的数据中对应的
a

最大的记录的所有信息
(

类似这样的用法可以用于论坛每月排行榜
,

每月热销产品分析
,

按科目成绩排名
,

等等
.)

select a,b,c
from tablename ta where a=(select max(a) from tablename tb where
tb.b=ta.b)

  
16

、说明:包括所有在
TableA

中但不在
TableB


TableC

中的行并消除所有重复行而派生出一个结果表

(select a from
tableA ) except (select a from tableB) except (select a from tableC)

  
17

、说明:随机取出
10

条数据

select top 10 *
from tablename order by newid()

  
18

、说明:随机选择记录

select newid()

  
19

、说明:删除重复记录

Delete from
tablename where id not in (select max(id) from tablename group by
col1,col2,...)

  
20

、说明:列出数据库里所有的表名

select name
from sysobjects where type='U'

21

、说明:列出表
里的所有的

select name
from syscolumns where id=object_id('TableName')

  
22

、说明:列示
type


vender


pcs

字段,以
type

字段排列,
case

可以方便地实现多重选择,类似
select

中的
case



select
type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when
'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end)
FROM tablename group by type

  显示结果:

type
vender pcs

电脑
A 1

电脑
A 1

光盘
B 2

光盘
A 2

手机
B 3

手机
C 3

  
23

、说明:初始化表
table1

TRUNCATE TABLE
table1

  
24

、说明:选择从
10


15

的记录

select top 5 * from (select top 15 * from table order
by id asc) table_

别名
order by id
desc

随机选择数据库记录的方法(使用
Randomize

函数,通过
SQL

语句实现)

  对存储在数据库中的数据来
说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求
ASP

“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:

Randomize

RNumber =
Int(Rnd*499) +1

 

While Not
objRec.EOF

If objRec("ID")
= RNumber THEN

...

这里是执行
脚本
...

end if

objRec.MoveNext

Wend

  这很容易理解。首先,你取出
1


500

范围之内的一个随机数(假设
500

就是数据库内记录的总数)。然后,你遍历每一记录来测试
ID

的值、检查其是否匹配
RNumber

。满足条件的话就执行由
THEN

关键字开始的那一块代码。假如你的
RNumber

等于
495

,那么要循环一遍数据库花的时间可就长了。虽然
500

这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内
就包含了成千上万条记录。这时候不就死定了?

  采用
SQL

,你就可以很快地找出准确的记录并且打开一个只包含该记录的
recordset

,如下所示:

Randomize

RNumber =
Int(Rnd*499) + 1

 

SQL = "SELECT *
FROM Customers WHERE ID = " & RNumber

 

set objRec =
ObjConn.Execute(SQL)

Response.WriteRNumber
& " = " & objRec("ID") & " " & objRec("c_email")

  不必写出
RNumber


ID

,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。
Recordset

没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。

再谈随机数

  现在你下定决心要榨干
Random

函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标

Random

示例扩展一下就可以用
SQL

应对上面两种情况了。

  为了取出几条随机选择的记录
并存放在同一
recordset

内,你可以存储三个随
机数,然后查询数据库获得匹配这些数字的记录:

  
SQL = "SELECT *
FROM Customers WHERE ID = " & RNumber & " OR ID = " &
RNumber2 & " OR ID = " & RNumber3

  假如你想选出
10

条记录(也许是每次页面装载时的
10

条链接的列表),你可以用
BETWEEN

或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是
SELECT

语句只显示一种可能(这里的
ID

是自动生成的号码):

SQL = "SELECT *
FROM Customers WHERE ID BETWEEN " & RNumber & " AND " &
RNumber & "+ 9"

  注意:以上代码的执行目的不
是检查数据库内是否有
9

条并发记录。

  随机读取若干条记录,测试过

Access

语法:
SELECT top 10 *
From

表名
ORDER BY
Rnd(id)

Sql server:select top n * from

表名
order by newid()

mysql select * From

表名
Order By rand() Limit n

  
Access

左连接语法
(

最近开发要用左连接
,Access

帮助什么都没有
,

网上没有
Access


SQL

说明
,

只有自己测试
,

现在记下以备后查
)

  语法
select
table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on
table1.fd1,table2.fd1 where ...

  使用
SQL

语句


...

代替过长的字符串显示

  语法:

  
SQL

数据库:
select case when len(field)>10
then left(field,10)+'...' else field end as news_name,news_id from
tablename

  
Access

数据库:
SELECT
iif(len(field)>2,left(field,2)+'...',field) FROM tablename;

  
Conn.Execute

说明

  
Execute

方法

  该方法用于执行
SQL

语句。根据
SQL

语句执行后是否返回记录集,该方法的使用格式分为以下两种:

  
1

.执行
SQL

查询语句时,将返回查询得到的记录集。用法为:

  
Set

对象变量名
=

连接对象
.Execute("SQL

查询语言
")

  
Execute

方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过
Set

方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

  
2

.执行
SQL

的操作性语言时,没有记录集的返回。此时用法为:

  连接对象
.Execute "SQL

操作性语句
" [, RecordAffected][, Option]

  ·
RecordAffected

为可选项,此出可放置一个变量,
SQL

语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道
SQL

语句队多少条记录进行了操作。

  ·
Option

可选项,该参数的取值通常为
adCMDText

,它用于告诉
ADO

,应该将
Execute

方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。

  ·
BeginTrans


RollbackTrans


CommitTrans

方法

  这三个方法是连接对象提供的
用于事务处理的方法。
BeginTrans

用于开始一个事物;
RollbackTrans

用于回滚事务;
CommitTrans

用于提交所有的事务处理结果,即确认事务的处理。

  事务处理可以将一组操作视为
一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。

  
BeginTrans


CommitTrans

用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可
通过连接对象的
Error

集合来实现,若
Error

集合的成员个数不为
0

,则说明有错误发生,事务处理失败。
Error

集合中的每一个
Error

对象,代表一个错误信息。

SQL

语句大全精要

2006/10/26
13:46

DELETE

语句

DELETE

语句:
用于创建一个删除查询,可从列在
FROM

子句之中的一个或
多个表中删除记录,且该子句满足
WHERE

子句中的条件,
可以使用
DELETE

删除多个记录。

语法:
DELETE
[table.*] FROM table WHERE criteria

语法:
DELETE * FROM
table WHERE criteria='

查询的字
'

说明:
table

参数用于指定从其中删除记录的表的名称。

criteria


数为一个表达式,用于指定哪些记录应该被删除的表达式。

可以使用
Execute

方法与一个
DROP

语句从数据库中放弃整个表。不过,若用这种方法删除表,将会失去表的结构。不同的是当使用
DELETE

,只有数据会被删除;表的结构以及表的所有属性仍然保留,例如字段属性及索引。

UPDATE

有关
UPDATE

,急!!!!!!!!!!!


ORACLE

数据库中


A ( ID
,FIRSTNAME,LASTNAME )


B(
ID,LASTNAME)


A

中原来
ID,FIRSTNAME

两个字段的数据是完整的


B

中原来
ID,LASTNAME

两个字段的数据是完整的

现在要把表
B

中的
LASTNAME

字段的相应的数据填入到
A

表中
LASTNAME

相应的位置。两个表中的
ID

字段是相互关联的。

先谢谢了
!!!!

update a set
a.lastname=(select b.lastname from b where a.id=b.id)

  掌握
SQL

四条最基本的数据操作语句:
Insert


Select


Update


Delete



  

练掌握
SQL

是数据库用户的宝贵财

富。在本文中,我们将引导你掌握四条最基本的数据操作语句—
SQL

的核心功能—来依次介绍比较操作符、选择断言以及三值逻辑。当你完成这些学习后,显然你已经开始算是
精通
SQL

了。

  在我们开始之前,先使用
CREATE TABLE

语句来创建一个表(如图
1

所示)。
DDL

语句对数据库对象如表、列和视进行定义。它们并不对表中的行进行处理,这是因为
DDL

语句并不处理数据库中实际的数据。这些工作由另一类
SQL

语句—数据操作语言(
DML

)语句进行处理。

  
SQL

中有四种基本的
DML

操作:
INSERT


SELECT


UPDATE


DELETE

。由于这是大多数
SQL

用户经常用到的,我们有必要在此对它们进行一一说明。在图
1

中我们给出了一个名为
EMPLOYEES

的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表,我们在后面的例子中将要用到它。

  
INSERT

语句

  用户可以用
INSERT

语句将一行记录插入到指定的一个表中。例如,要将雇员
John Smith

的记录插入到本例的表中,可以使用如下语句:

  
INSERT INTO
EMPLOYEES VALUES

  

('Smith','John','1980-06-10',

  
'Los
Angles',16,45000);

  通过这样的
INSERT

语句,系统将试着将这些值填入到相应的列中。这些列按照我们创建表时定义的顺序排列。在本例中,第
一个值“
Smith

”将填到第一个列
LAST_NAME

中;第二个值“
John

”将填到第二列
FIRST_NAME

中……以此类推。

  我们说过系统会“试着”将值
填入,除了执行规则之外它还要进行类型检查。如果类型不符(如将一个字符串填入到类型为数字的列中),系统将拒绝这一次操作并返回一个错误信息。

  如果
SQL

拒绝了你所填入的一列值,语句中其他各列的值也不会填入。这是因为
SQL

提供对事务的支持。一次事务将数据库从一种一致性转移到另一种一致性。如果事务的某一部分失败,则
整个事务都会失败,系统将会被恢复(或称之为回退)到此事务之前的状态。

  

回到原来的
INSERT

的例子,请注意所有的整形十
进制数都不需要用单引号引起来,而字符串和日期类型的值都要用单引号来区别。为了增加可读性而在数字间插入逗号将会引起错误。记住,在
SQL

中逗号是元素的分隔符。

  同样要注意输入文字值时要使
用单引号。双引号用来封装限界标识符。

  对于日期类型,我们必须使用
SQL

标准日期格式(
yyyy-mm-dd

),但是在系统中可以进行定义,以接受其他的格式。当然,
2000

年临近,请你最好还是使用四位来表示年份。

  既然你已经理解了
INSERT

语句是怎样工作的了,让我们转到
EMPLOYEES

表中的其他部分:

  
INSERT INTO
EMPLOYEES VALUES

  

('Bunyan','Paul','1970-07-04',

  

'Boston',12,70000);

  
INSERT INTO
EMPLOYEES VALUES

  

('John','Adams','1992-01-21',

  

'Boston',20,100000);

  
INSERT INTO
EMPLOYEES VALUES

  

('Smith','Pocahontas','1976-04-06',

  
'Los
Angles',12,100000);

  
INSERT INTO
EMPLOYEES VALUES

  

('Smith','Bessie','1940-05-02',

  

'Boston',5,200000);

  
INSERT INTO
EMPLOYEES VALUES

  

('Jones','Davy','1970-10-10',

  

'Boston',8,45000);

  
INSERT INTO
EMPLOYEES VALUES

  

('Jones','Indiana','1992-02-01',

  

'Chicago',NULL,NULL);

  在最后一项中,我们不知道
Jones

先生的工薪级别和年薪,所以我们输入
NULL

(不要引号)。
NULL


SQL

中的一种特殊情况,我们以后将进行详细的讨论。现在我们只需认为
NULL

表示一种未知的值。

  有时,像我们刚才所讨论的情
况,我们可能希望对某一些而不是全部的列进行赋值。除了对要省略的列输入
NULL

外,还可以采用另外一种
INSERT

语句,如下:

  
INSERT INTO
EMPLOYEES(

  
FIRST_NAME,
LAST_NAME,

  
HIRE_DATE,
BRANCH_OFFICE)

  
VALUE(

  

'Indiana','Jones',

  

'1992-02-01','Indianapolis');

  这样,我们先在表名之后列出
一系列列名。未列出的列中将自动填入缺省值,如果没有设置缺省值则填入
NULL

。请注意我们改变了列的顺序,而值的顺序要对应新的列的顺序。如果该语句中省略了
FIRST_NAME


LAST_NAME

项(这两项规定不能为空),
SQL

操作将失败。

  让我们来看一看上述
INSERT

语句的语法图:

  
INSERT INTO
table

  
[(column {
,column})]

  
VALUES

  
(columnvalue
[{,columnvalue}]);

  和前一篇文章中一样,我们用
方括号来表示可选项,大括号表示可以重复任意次数的项(不能在实际的
SQL

语句中使用这些特殊字符)。
VALUE

子句和可选的列名列表中必须使用圆括号。

  
SELECT

语句

  
SELECT

语句可以从一个或多个表中选取特定的行和列。因为查询和检索数据是数据库管理中最重要的功能,所以
SELECT

语句在
SQL

中是工作量最大的部分。实际上,仅仅是访问数据库来分析数据并生成报表的人可以对其他
SQL

语句一窍不通。

  
SELECT

语句的结果通常是生成另外一个表。在执行过程中系统根据用户的标准从数据库中选出匹配的行和列,并
将结果放到临时的表中。在直接
SQL


direct SQL

)中,它将结果显示在终端的显示屏上,或者将结果送到打印机或文件中。也可以结合其他
SQL

语句来将结果放到一个已知名称的表中。

  
SELECT

语句功能强大。虽然表面上看来它只用来完成本文第一部分中提到的关系代数运算“选择”(或称“限
制”),但实际上它也可以完成其他两种关系运算—“投影”和“连接”,
SELECT

语句还可以完成聚合计算并对数据进行排序。

  
SELECT

语句最简单的语法如下:

  
SELECT columns
FROM tables;

  当我们以这种形式执行一条
SELECT

语句时,系统返回由所选择的列以及用户选择的表中所有指定的行组成的一个结果表。这就是实现关系投
影运算的一个形式。

  让我们看一下使用图
1


EMPLOYEES

表的一些例子(这个表是我们以后所有
SELECT

语句实例都要使用的。而我们在图
2

和图
3

中给出了查询的实际结果。我们将在其他的例子中使用这些结果)。

  假设你想查看雇员工作部门的
列表。那下面就是你所需要编写的
SQL

查询:

  
SELECT
BRANCH_OFFICE FROM EMPLOYEES;

  以上
SELECT

语句的执行将产生如图
2

中表
2

所示的结果。

  由于我们在
SELECT

语句中只指定了一个列,所以我们的结果表中也只有一个列。注意结果表中具有重复的行,这是因为有多
个雇员在同一部门工作(记住
SQL

从所选的所有行中将值返
回)。要消除结果中的重复行,只要在
SELECT

语句中
加上
DISTINCT

子句:

  
SELECT DISTINCT
BRANCH_OFFICE

  
FROM EMPLOYEES;

  这次查询的结果如表
3

所示。

  现在已经消除了重复的行,但
结果并不是按照顺序排列的。如果你希望以字母表顺序将结果列出又该怎么做呢?只要使用
ORDER BY

子句就可以按照升序或降序来排列结果:

  
SELECT DISTINCT
BRANCH_OFFICE

  
FROM EMPLOYEES

  
ORDER BY
BRANCH_OFFICE ASC;

  这一查询的结果如表
4

所示。请注意在
ORDER BY

之后是如何放置列名
BRANCH _OFFICE

的,这就是我们想要对其进行排序的列。为什么即使是结果表中只有一个列时我们也必须指出列名呢?这是
因为我们还能够按照表中其他列进行排序,即使它们并不显示出来。列名
BRANCH_ OFFICE

之后的关键字
ASC

表示按照升序排列。如果你希望以降序排列,那么可以用关键字
DESC



  同样我们应该指出
ORDER BY

子句只将临时表中的结果进行排序;并不影响原来的表。

  假设我们希望得到按部门排序
并从工资最高的雇员到工资最低的雇员排列的列表。除了工资括号中的内容,我们还希望看到按照聘用时间从最近聘用的雇员开始列出的列表。以下是你将要用到的
语句:

  
SELECT
BRANCH_OFFICE,FIRST_NAME,

  

LAST_NAME,SALARY,HIRE_DATE

  
FROM EMPLOYEES

  
ORDER BY SALARY
DESC,

  
HIRE_DATE
DESC;

  这里我们进行了多列的选择和
排序。排序的优先级由语句中的列名顺序所决定。
SQL

将先对列出的第一个列进行排序。如果在第一个列中出现了重复的行时,这些行将被按照第二列进行排序,
如果在第二列中又出现了重复的行时,这些行又将被按照第三列进行排序……如此类推。这次查询的结果如表
5

所示。

  将一个很长的表中的所有列名
写出来是一件相当麻烦的事,所以
SQL

允许在选择表中所有的列
时使用
*

号:

  
SELECT * FROM
EMPLOYEES;

  这次查询返回整个
EMPLOYEES

表,如表
1

所示。

  

下面我们对开始时给出的
SELECT

语句的
语法进行一下更新(竖直线表示一个可选项,允许在其中选择一项。):

  
SELECT
[DISTINCT]

  
(column [{,
columns}])| *

  
FROM table [ {,
table}]

  
[ORDER BY
column [ASC] | DESC

  
[ {, column
[ASC] | DESC }]];

  定义选择标准

  在我们目前所介绍的
SELECT

语句中,我们对结果表中的列作出了选择但返回的是表中所有的行。让我们看一下如何对
SELECT

语句进行限制使得它只返回希望得到的行:

  
SELECT columns
FROM tables [WHERE predicates];

  
WHERE

子句对条件进行了设置,只有满足条件的行才被包括到结果表中。这些条件由断言(
predicate

)进行指定(断言指出了关于某件事情的一种可能的事实)。如果该断言对于某个给定的行成立,该行将
被包括到结果表中,否则该行被忽略。在
SQL

语句中断言通
常通过比较来表示。例如,假如你需要查询所有姓为
Jones

的职员,则可以使用以下
SELECT

语句:

  
SELECT * FROM
EMPLOYEES

  
WHERE LAST_NAME
= 'Jones';

  
LAST_NAME =
'Jones'

部分就是断言。在执行该语句时,
SQL

将每一行的
LAST_NAME

列与“
Jones

”进行比较。如果某一职员的姓为“
Jones

”,即断言成立,该职员的信息将被包括到结果表中(见表
6

)。

  使用最多的六种比较

  我们上例中的断言包括一种基
于“等值”的比较(
LAST_NAME = 'Jones'

),
但是
SQL

断言还可以包含其他几种类型的比较。其中最常用的为:

  等于
=

  不等于
<>

  小于
<

  大于
>

  小于或等于
<=

  大于或等于
>=

  下面给出了不是基于等值比较
的一个例子:

  
SELECT * FROM
EMPLOYEES

  
WHERE SALARY
> 50000;

  这一查询将返回年薪高于
$50,000.00

的职员(参见表
7

)。

  逻辑连接符

  有时我们需要定义一条不止一
种断言的
SELECT

语句。举例来说,如果你仅仅
想查看
Davy
Jones

的信息的话,表
6

中的结果将是不正确的。为了进一步定义一个
WHERE

子句,用户可以使用逻辑连接符
AND


OR


NOT

。为了只得到职员
Davy Jones

的记录,用户可以输入如下语句:

  
SELECT * FROM
EMPLOYEES

  
WHERE LAST_NAME
= 'Jones' AND FIRST_NAME = 'Davy';

  在本例中,我们通过逻辑连接

AND

将两个断言连接起来。只有两个断言都满足时整个表达式才会满足。如果用户需要定义一个
SELECT

语句来使得当其中任何一项成立就满足条件时,可以使用
OR

连接符:

  
SELECT * FROM
EMPLOYEES

  
WHERE LAST_NAME
= 'Jones' OR LAST_NAME = 'Smith';

  有时定义一个断言的最好方法
是通过相反的描述来说明。如果你想要查看除了
Boston

办事
处的职员以外的其他所有职员的信息时,你可以进行如下的查询:

  
SELECT * FROM
EMPLOYEES

  
WHERE
NOT(BRANCH_OFFICE = 'Boston');

  关键字
NOT

后面跟着用圆括号括起来的比较表达式。其结果是对结果取否定。如果某一职员所在部门的办事处在
Boston

,括号内的表达式返回
true

,但是
NOT

操作符将该值取反,所以该行将不被选中。

  断言可以与其他的断言嵌套使
用。为了保证它们以正确的顺序进行求值,可以用括号将它们括起来:

  
SELECT * FROM
EMPLOYEES

  
WHERE
(LAST_NAME = 'Jones'

  
AND FIRST_NAME =
'Indiana')

  
OR (LAST_NAME =
'Smith'

  
AND FIRST_NAME =
'Bessie');

  
SQL

沿用数学上标准的表达式求值的约定—圆括号内的表达式将最先进行求值,其他表达式将从左到右进行求
值。

  以上对逻辑连接符进行了说
明,在对下面的内容进行说明之前,我们再一次对
SELECT

语句的语法进行更新:

  
SELECT
[DISTINCT]

  
(column [{,
column } ] )| *

  
FROM table [ { ,
table} ]

  
[ORDER BY
column [ASC] | [DESC

  
[{ , column
[ASC] | [DESC } ] ]

  
WHERE predicate
[ { logical-connector predicate } ];

  
NULL

和三值逻辑

  在
SQL


NULL

是一个复杂的话题,关于
NULL

的详细描述更适合于在
SQL

的高级教程而不是现在的入门教程中进行介绍。但由于
NULL

需要进行特殊处理,并且你也很可能会遇到它,所以我们还是简略地进行一下说明。

  首先,在断言中进行
NULL

判断时需要特殊的语法。例如,如果用户需要显示所有年薪未知的职员的全部信息,用户可以使用如下
SELECT

语句:

  
SELECT * FROM
EMPLOYEES

  
WHERE SALARY IS
NULL;

  相反,如果用户需要所有已知
年薪数据的职员的信息,你可以使用以下语句:

  
SELECT * FROM
EMPLOYEES

  
WHERE SALARY IS
NOT NULL;

  请注意我们在列名之后使用了
关键字
IS
NULL


IS NOT NULL

,而不是标准的比较形式:
COLUMN = NULL


COLUMN <> NULL

或是逻辑操作符
NOT


NULL

)。

  这种形式相当简单。但当你不
明确地测试
NULL

(而它们确实存在)时,事情会变
得很混乱。

  例如,回过头来看我们图
1

中的
EM-PLOYEES

表,可以看到
Indiana Jones

的工薪等级或年薪值都是未知的。这两个列都包含
NULL

。可以想象运行如下的查询:

  
SELECT * FROM
EMPLOYEES

  
WHERE GRADE
<= SALARY;

  此时,
Indiana Jones

应该出现在结果表中。因为
NULL

都是相等的,所以可以想象它们是能够通过
GRADE

小于等于
SALARY

的检查的。这其实是一个毫无疑义的查询,但是并没有关系。
SQL

允许进行这样的比较,只要两个列都是数字类型的。然而,
Indiana Jones

并没有出现在查询的结果中,为什么?

  正如我们早先提到过的,
NULL

表示未知的值(而不是象某些人所想象的那样表示一个为
NULL

的值)。对于
SQL

来说意味着这个值是未知的,而只要这个值为未知,就不能将其与其他值比较(即使其他值也是
NULL

)。所以
SQL

允许除了在
true


false

之外还有第三种类型的真值,称之为“非确定”(
unknown

)值。

  如果比较的两边都是
NULL

,整个断言就被认为是非确定的。将一个非确定断言取反或使用
AND


OR

与其他断言进行合并之后,其结果仍是非确定的。由于结果表中只包括断言值为“真”的行,所以
NULL

不可能满足该检查。从而需要使用特殊的操作符
IS NULL


IS NOT NULL



  
UPDATE

语句

  
UPDATE

语句允许用户在已知的表中对现有的行进行修改。

  例如,我们刚刚发现
Indiana Jones

的等级为
16

,工资为
$40,000.00

,我们可以通过下面的
SQL

语句对数据库进行更新(并清除那些烦人的
NULL

)。

  
UPDATE
EMPLOYEES

  
SET GRADE = 16,
SALARY = 40000

  
WHERE
FIRST_NAME = 'Indiana'

  
AND LAST_NAME =
'Jones';

  上面的例子说明了一个单行更
新,但是
UPDATE

语句可以对多行进行操作。满

WHERE

条件的所有行都将被更新。如果,你想让
Boston

办事处中的所有职员搬到
New York

,你可以使用如下语句:

  
UPDATE
EMPLOYEES

  
SET
BRANCH_OFFICE = 'New York'

  
WHERE
BRANCH_OFFICE = 'Boston';

  如果忽略
WHERE

子句
,

表中所有行中的部门值都将被更新为
'New York'



  
UPDATE

语句的语法流图如下面所示:

  
UPDATE table

  
SET column =
value [{, column = value}]

  
[ WHERE
predicate [ { logical-connector predicate}]];

  
DELETE

语句

  
DELETE

语句用来删除已知表中的行。如同
UPDATE

语句中一样,所有满足
WHERE

子句中条件的行都将被删除。由于
SQL

中没有
UNDO

语句或是

“你确认删除吗?”之类的警告,在执行这条语句时千万
要小心。如果决定取消
Los Angeles

办事处并解雇办事
处的所有职员,这一卑鄙的工作可以由以下这条语句来实现:

  
DELETE FROM
EMPLOYEES

  
WHERE
BRANCH_OFFICE = 'Los Angeles';

  如同
UPDATE

语句中一样,省略
WHERE

子句将使得操作施加到表中所有的行。

  
DELETE

语句的语法流图如下面所示:

  
DELETE FROM
table

  
[WHERE
predicate [ { logical-connector predicate} ] ];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: