sql中select语句详解及用途

sql中select语句详解及用途
sql中select语句详解及用途

sql中select语句详解及用途

1 2 3 4 5 6 7 8 9

10

11

SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]

* | expression [ AS output_name ] [, ...]

[ FROM from_item [, ...] ]

[ WHERE condition ]

[ GROUP BY expression [, ...] ]

[ HAVING condition [, ...] ]

[ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]

[ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ] [ FOR UPDATE [ OF tablename [, ...] ] ]

[ LIMIT { count | ALL } ]

[ OFFSET start ]

这里from_item 可以是:

?

1 2 3 4 5 6 7 8 [ ONLY ] table_name [ * ]

[ [ AS ] alias [ ( column_alias_list ) ] ]

|

( select )

[ AS ] alias [ ( column_alias_list ) ]

|

from_item [ NATURAL ] join_type from_item

[ ON join_condition | USING ( join_column_list ) ]

输入

expression

表的列/字段名或一个表达式.

output_name

使用AS 子句为一个列/字段或一个表达式声明另一个名称.这个名称主要用于标记输出列用于显示。它可以在ORDER BY 和GROUP BY 子句里代表列/字段的值.但是output_name 不能用于WHERE 或HAVING 子句;用表达式代替.

from_item

一个表引用,子查询,或者JOIN 子句.详见下文.

condition

一个布尔表达式,给出真或假的结果.参见下面描述的WHERE 和HAVING 子句.

select

一个选择语句,可以有除ORDER BY,FOR UPDATE,和LIMIT 子句以外的所有特性(甚至在加了括弧的情况下那些语句也可以用).

FROM 项可以包括:

table_name

一个现存的表或视图的名字.如果声明了ONLY,则只扫描该表.如果没有声明ONLY,该表和所有其派生表(如果有的话)都被扫描.可以在表名后面跟一个* 来表示扫所有其后代表,但在目前的版本里,这是缺省特性.(在PostgreSQL 7.1 以前的版本里,ONLY 是缺省特性.)

alias

用于于前面的table_name. 的替换名字,用于缩写或消除一个表自连接时的含混.(此时同一个表要扫描好几次.)如果写了别名,那么你也可以写一个字段别名列表,为表的一个或者几个字段提供替换名字.select

一个在FORM 子句里出现的子查询.它的输出作用好象是为这条SELECT 命令在其生存期里创建一个临时表.请注意这个子查询必须用园括弧包围.并且必须给它加别名.

join_type

[ INNER ] JOIN,LEFT [ OUTER ] JOIN,RIGHT [ OUTER ] JOIN,FULL [ OUTER ] JOIN,或CROSS JOIN. 之一.就INNER 和OUTER 连接类型,必须出现NATURAL ON join_condition,或USING ( join_column_list ) 之一.对于CROSS JOIN,上面的项都不能出现.

join_condition

一个条件限制.类似WHERE 条件,只不过它只应用于在这条JOIN 子句里连接的两个from_item.join_column_list

一个USING 字段列表(a, b, ... ) 是ON 条件left_table.a = right_table.a AND left_table.b = right_table.b ... 的缩写.输出

Rows

你声明的查询返回的所有结果集的行.

count

查询返回的行的计数.

描述

SELECT 将从一个或更多表中返回记录行。选择的侯选行是满足WHERE 条件的所有行。或者如果省略了WHERE 语句则选择表中的所有行.(参阅WHERE 子句).

实际上,返回的行并不是由FROM/WHERE/GROUP BY/HAVING 子句直接生成的行;其实,输出行是通过给每个选出的行计算SELECT 输出表达式形成的.你可以在输出列表上写一个* 表示选出的行的所有列.同样我们可以拿table_name.* 表示来自该表的所以行.

DISTINCT 将从选择出来的结果集中删除所有的重复的行。ALL (缺省)将返回所有侯选行,包括重复的行。

DISTINCT ON 删除匹配所有你声明的表达式的行,只保留每个重复集的第一行。DISTINCT ON 表达式是用和ORDER BY 项一样的规则来解释的,见下文.注意这里每个重复集的"第一行"是不可预料的,除非我们用ORDER BY 来保证我们希望的行最先出现。例如,

SELECT DISTINCT ON (location) location, time, report

FROM weatherReports

ORDER BY location, time DESC;

检索出每个地区的最近的天气预报。但是如果我们没有使用ORDER BY 来强制每个地区按时间值降续排列,我们得到的将是每个地区的不可预料的时间的报告。

GROUP BY 子句允许用户把表分成匹配一个或多个数值的不同行的组.(参考GROUP BY 子句.)HAVING 允许只选择那些满足声明条件的行组(参阅HAVING 子句.)

ORDER BY 导致返回的行按照声明的顺序排列.如果没有给出ORDER BY,输出的行的顺序将以系统认为开销最小的顺序产生.(参阅ORDER BY 子句.)

多个SELECT 查询可以用UNION,INTERSECT,和EXCEPT 操作符组合起来.必要时请使用圆括弧确定这些操作符的顺序.

UNION 操作符计算是那些参与的查询所返回的行的集合。如果没有声明ALL,那么重复行被删除.(参阅UNION 子句.)

INTERSECT 给出两个查询公共的行。如果没有声明ALL,那么重复行被删除.(参阅INTERSECT 子句.)EXCEPT 给出存在于第一个查询而不存在于第二个查询的行。如果没有声明ALL,那么重复行被删除.(参阅EXCEPT 子句.)

FOR UPDATE 子句允许SELECT 语句对选出的行执行排他锁。

LIMIT 子句允许给用户返回一个查询生成的结果的子集。(参阅LIMIT 子句.)

你必须有SELECT 权限用来从表中读取数值(参阅GRANT/REVOKE语句.)

FROM 子句

FROM 子句为SELECT 声明一个或多个源表.如果声明了多个源表,则概念上结果是所有源表所有行的迪卡尔积--- 不过通常会增加限制条件以把返回的行限制为迪卡尔积的一个小子集.

如果FROM 项是一个简单表名字,它隐含包括来自该表子表(继承子表)的行.ONLY 将消除从该表的子表来的行.在PostgreSQL 7.1 以前,这是缺省结果,而获取子表的行是通过在表名后面附加* 实现的.这种老式性质可以通过命令SET SQL_Inheritance TO OFF; 获取.

FROM 项也可以是一个加了圆括弧的子查询(请注意子查询需要一个别名子句!).这个特性非常实用,因为这是在一条查询中获得多层分组,聚集,或者排序的唯一方法.

最后,FROM 项可以是一条JOIN 子句,它把两个简单的FROM 项组合在一起.(必要时使用圆括弧来描述嵌套顺序.)

CROSS JOIN 或INNER JOIN 是简单的迪卡尔积,和你在顶层FROM 里列出这两个项得到的一样.CROSS JOIN 等效于INNER JOIN ON (TRUE),也就是说,不会有任何行被条件删除.这些连接类型只是符号上的便利,因为它们做得一点不比你只利用FROM 和WHERE 来的多.

LEFT OUTER JOIN 返回所有符合条件的迪卡尔积(也就是说,所有符合它的ON 条件的组合了的行),另外加上所有没有右手边行符合ON 条件的左手边表中的行.这样的左手边行通过向右手边行插入NULL 扩展为全长.请注意,当判断哪些行合格的时候,只考虑JOIN 自己的ON 或USING.然后才考虑外层的ON 或WHERE 条件.

相反,RIGHT OUTER JOIN 返回所有连接的行,另外加上所有未匹配右手边行(左手边插入NULL 扩展为全长).这个字句只是符号方便,因为你可以调换左右输入而改用LEFT OUTER JOIN.FULL OUTER JOIN 返回所有连接行,加上所有未匹配的左手边行(右边插入NULL 扩展为全长),再加上所有未匹配的右手边行(左手边插入NULL 扩展为全长).

除了CROSS JOIN 以外的所有JOIN 类型,你必须写ON join_condition,USING ( join_column_list ),和NATURAL 中的一个.大多数情况下会是ON:你可以写涉及两个连接表的任何条件表达式.USING 字段列表(a, b, ...)是ON 条件left_table.a = right_table.a AND left_table.b = right_table.b ... 的缩写.另外,USING 假设两对等式中只有一个包含在JOIN 输出中,而不是两个.NATURAL 是提及表中所有相似名字字段的USING 列表的缩写.

WHERE 子句

可选的WHERE 条件有如下常见的形式:

WHERE boolean_expr

boolean_expr 可以包含任意个得出布尔值的表达式。通常表达式会是

expr cond_op expr

log_op expr

这里cond_op 可以是:=,<,<=,>,>= 或<>,或条件操作符象ALL,ANY,IN,LIKE 等,或者用户定义的操作符,而log_op 可以为:AND,OR,NOT.SELECT 将忽略所有WHERE 条件不为TRUE 的行.GROUP BY 子句

GROUP BY 声明一个分了组的表,该表源于应用使用下面的子句:

GROUP BY expression [, ...]

GROUP BY 将把所有在组合了的列上共享同样的值的行压缩成一行。如果存在聚集函数,这些聚集函数将计算每个组的所有行,并且为每个组计算一个独立的值(如果没有GROUP BY,聚集函数对选出的所有行计算出一个数值)。存在GROUP BY 时,除了在聚集函数里面,SELECT 输出表达式对任何非组合列的引用都是非法的,因为对一个非组合列会有多于一个可能的返回值。

一个在GROUP BY 里面的条目还可以是输出列的名称或者序号(SELECT 表达式),或者是一个从输入列的数值形成的任意表达式.当存在语义模糊时,一个GROUP BY 名称将被解释成一个输入列/字段名称而不是一个输出列/字段名称.

HAVING 子句

可选的HAVING 条件有如下形式:

HAVING boolean_expr

这里boolean_expr 和为WHERE 子句里声明的相同.

HAVING 子句声明一个从前面的子句的结果集中去除了一些不符合boolean_expr. 组后分组的表.HAVING 与WHERE 不同:WHERE 在应用GROUP BY 之前过滤出单独的行,而HAVING 过滤由GROUP BY 创建的行.

在boolean_expr 里引用的每个列/字段应该清晰地指明一个组的列/字段,除非引用在一个聚集函数里。

ORDER BY 子句

ORDER BY expression [ ASC | DESC | USING operator ] [, ...]

一个ORDER BY 项可以是一个输出列(SELECT 表达式)的名字或者序数,或者它也可以是任何来自输入列值形成的表达式.在出现混淆的场合下,ORDER BY 名字将被解释成一个输出名字.

序数指的是列/字段按顺序(从左到右)的位置.这个特性可以使得对没有一个合适名称的列/字段的排序成为可能.这一点可能永远没有用,因为总是可以通过AS 子句给一个要计算的列/字段赋予一个名称,例如:SELECT title, date_prod + 1 AS newlen FROM films ORDER BY newlen;

还可以ORDER BY 任意表达式(一个对SQL92 的扩展),包括那些没有出现在SELECT 结果列表里面的域。因此下面的语句现在是合法的:

SELECT name FROM distributors ORDER BY code;

这个特性的一个局限就是应用于UNION,INTERSECT,或者EXCEPT 查询的ORDER BY 子句只能在一个输出字段名或者数字上声明,而不能在一个表达式上声明.

请注意如果一个ORDER BY 条目是一个匹配结果列和输入列的简单名称,ORDER BY 将把它解释成结果列名称.这和GROUP BY 在同样情况下做的选择正相反.这样的不一致是由SQL92 标准强制的.我们可以给ORDER BY 子句里每个列/字段加一个关键字DESC (降序)或ASC(升序).如果不声明,ASC 是缺省.我们还可以声明一个排序操作符来实现排序。ASC 等效于使用'<' 而DESC 等效于使用'>'。

在一个域里,空值排序时排在其它数值前面.换句话说,升序排序时,空值排在末尾,而降序排序时空值排在开头.

UNION 子句

?

1 2 3 table_query UNION [ ALL ] table_query

[ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ] [ LIMIT { count | ALL } [ { OFFSET | , } start ]]

这里table_query 表明任何没有ORDER BY,FOR UPDATE,或者LIMIT 子句的选择表达式.(如果用圆括弧包围,ORDER BY 和LIMIT 可以放在子表达式里.如果没有圆括弧,这些子句将交给UNION 的结果使用,而不是给它们右手边的输入表达式.)

UNION 操作符的结果集是那些涉及到的所有查询所返回结果的集合。两个做为UNION 直接操作数的SELECT 必须生成相同数目的字段,并且对应的字段必须有兼容的数据类型。

缺省地,UNION 的结果不包含任何重复的行,除非声明了ALL 子句.ALL 制止了消除重复的动作.同一SELECT 语句中的多个UNION 操作符是从左向右计算的,除非用圆括弧进行了标识).

目前,FOR UPDATE 不能在UNION 的结果或输入中声明.

INTERSECT 子句

?

1 2 3 4 table_query INTERSECT [ ALL ] table_query

[ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ] [ LIMIT { count | ALL } ]

[ OFFSET start ]

这里table_query 声明任何没有ORDER BY,FOR UPDATE,或者LIMIT 子句的选择表达式。

INTERSECT 类似UNION,只不过它给出在两个查询中都出现的行,而不是两个查询的所有行.

INTERSECT 的结果不包含任何重复行,除非你声明了ALL 选项.用了ALL 以后,一个在L 里有m 个重复而在R 里有n 个重复的行将出现min(m,n) 次.

除非用圆括号指明顺序,同一SELECT 语句中的多个INTERSECT 操作符是从左向右计算的。INTERSECT 比UNION 绑定得更紧--- 也就是说A UNION B INTERSECT C 将读做A UNION (B INTERSECT C),除非你用圆括弧声明.

EXCEPT 子句

?

1 2 3 table_query EXCEPT [ ALL ] table_query

[ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ] [ LIMIT { count | ALL } ]

4 [ OFFSET start ]

这里table_query 声明任何没有ORDER BY,FOR UPDATE,或者LIMIT 子句的选择表达式。

EXCEPT 类似于UNION,只不过EXCEPT 给出存在于左边查询输出而不存在于右边查询输出的行。

EXCEPT 的结果不包含任何重复的行,除非声明了ALL 选项.使用ALL时,一个在L 中有m 个重复而在R 中有n 个重复的行将出现max(m-n,0) 次.

除非用圆括弧指明顺序,同一SELECT 语句中的多个EXCEPT 操作符是从左向右计算的。EXCEPT 和UNION 绑定级别相同.

LIMIT 子句

LIMIT { count | ALL }

OFFSET start

这里count 声明返回的最大行数,而start 声明开始返回行之前忽略的行数。

LIMIT 允许你检索由查询其他部分生成的行的某一部分。如果给出了限制计数,那么返回的行数不会超过哪个限制。如果给出了一个偏移量,那么开始返回行之前会忽略那个数量的行。

在使用LIMIT 时,一个好习惯是使用一个ORDER BY 子句把结果行限制成一个唯一的顺序。否则你会得到无法预料的查询返回的子集--- 你可能想要第十行到第二十行,但以什么顺序?除非你声明ORDER BY,否则你不知道什么顺序。

从PostgreSQL 7.0 开始,查询优化器在生成查询规划时把LIMIT 考虑进去了,所以你很有可能因给出的LIMIT 和OFFSET 值不同而得到不同的规划(生成不同的行序)。因此用不同的LIMIT/OFFSET 值选择不同的查询结果的子集将不会产生一致的结果,除非你用ORDER BY 强制生成一个可预计的结果顺序。这可不是毛病;这是SQL 生来的特点,因为除非用了ORDER BYE 约束顺序,SQL 不保证查询生成的结果有任何特定的顺序。

用法

将表films 和表distributors 连接在一起:

?

1 2 3 4 5 6 7 8 9

10

11

12 SELECT f.title, f.did, https://www.360docs.net/doc/b217701737.html,, f.date_prod, f.kind

FROM distributors d, films f

WHERE f.did = d.did

title | did | name | date_prod | kind

---------------------------+-----+------------------+------------+---------- The Third Man | 101 | British Lion | 1949-12-23 | Drama

The African Queen | 101 | British Lion | 1951-08-11 | Romantic

Une Femme est une Femme | 102 | Jean Luc Godard | 1961-03-12 | Romantic Vertigo | 103 | Paramount | 1958-11-14 | Action

Becket | 103 | Paramount | 1964-02-03 | Drama

48 Hrs | 103 | Paramount | 1982-10-22 | Action

13

14

15

16

17

18

19

20

21

22

23

24

War and Peace | 104 | Mosfilm | 1967-02-12 | Drama

West Side Story | 105 | United Artists | 1961-01-03 | Musical Bananas | 105 | United Artists | 1971-07-13 | Comedy

Yojimbo | 106 | Toho | 1961-06-16 | Drama

There's a Girl in my Soup | 107 | Columbia | 1970-06-11 | Comedy Taxi Driver | 107 | Columbia | 1975-05-15 | Action

Absence of Malice | 107 | Columbia | 1981-11-15 | Action

Storia di una donna | 108 | Westward | 1970-08-15 | Romantic The King and I | 109 | 20th Century Fox | 1956-08-11 | Musical Das Boot | 110 | Bavaria Atelier | 1981-11-11 | Drama

Bed Knobs and Broomsticks | 111 | Walt Disney | | Musical

(17 rows)

统计用kind 分组的所有电影和组的列/字段的len(长度)的和:

?

1 2 3 4 5 6 7 8 9 10

SELECT kind, SUM(len) AS total FROM films GROUP BY kind;

kind | total

----------+-------

Action | 07:34

Comedy | 02:58

Drama | 14:28

Musical | 06:42

Romantic | 04:38

(5 rows)

统计所有电影(films),组的列/字段len(长度)的和,用kind 分组并且显示小于5小时的组总和:

?

1 2 3 4 5 6 7 8 9 10

SELECT kind, SUM(len) AS total

FROM films

GROUP BY kind

HAVING SUM(len) < INTERVAL '5 hour';

kind | total

----------+-------

Comedy | 02:58

Romantic | 04:38

(2 rows)

下面两个例子是根据第二列(name)的内容对单独的结果排序的经典的方法:

?

1 2 3 4 5 6 7 8 SELECT * FROM distributors ORDER BY name; SELECT * FROM distributors ORDER BY 2;

did | name

-----+------------------

109 | 20th Century Fox

110 | Bavaria Atelier

101 | British Lion

9

10

11

12

13

14

15

16

17

18

19

107 | Columbia

102 | Jean Luc Godard

113 | Luso films

104 | Mosfilm

103 | Paramount

106 | Toho

105 | United Artists

111 | Walt Disney

112 | Warner Bros.

108 | Westward

(13 rows)

这个例子演示如何获得表distributors 和actors的连接,只将每个表中以字母W 开头的取出来.因为只取

了不相关的行,所以关键字ALL 被省略了:?

1 2 3 4 5 6 7 8 9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

distributors: actors:

did | name id | name

-----+-------------- ----+---------------- 108 | Westward 1 | Woody Allen

111 | Walt Disney 2 | Warren Beatty

112 | Warner Bros. 3 | Walter Matthau ... ...

SELECT https://www.360docs.net/doc/b217701737.html,

FROM distributors

WHERE https://www.360docs.net/doc/b217701737.html, LIKE 'W%'

UNION

SELECT https://www.360docs.net/doc/b217701737.html,

FROM actors

WHERE https://www.360docs.net/doc/b217701737.html, LIKE 'W%'

name

----------------

Walt Disney

Walter Matthau

Warner Bros.

Warren Beatty

Westward

Woody Allen

兼容性

扩展

PostgreSQL 允许我们在一个查询里省略FROM 子句。这个特性是从最初的PostQuel 查询语言里保留下来的它的最直接用途就是计算简单的常量表达式的结果:

SELECT 2+2;

?column?

----------

4

其它有些DBMS 不能这么做,除非引入一个单行的伪表做select 的from.这个特性的另外一个不太明显的用途是把一个普通的从一个或多个表的select 缩写:

SELECT distributors.* WHERE https://www.360docs.net/doc/b217701737.html, = 'Westward';

did | name

-----+----------

108 | Westward

这样也可以运行是因为我们给查询中引用了但没有在FROM 中提到的每个表都加了一个隐含的FROM 项.尽管这是个很方便的写法,但它却容易误用.比如,下面的查询

SELECT distributors.* FROM distributors d;

可能就是个错误;用户最有可能的意思是

SELECT d.* FROM distributors d;

而不是下面的他实际上得到的无约束的连接

SELECT distributors.* FROM distributors d, distributors distributors;

为了帮助检测这种错误,PostgreSQL 7.1 以及以后的版本将在你使用一条即有隐含FROM 特性又有明确的FORM 子句的查询的时候给出警告.

SQL92

SELECT 子句

在SQL92 规范里,可选的关键字"AS" 是多余的,可以忽略掉而不对语句产生任何影响.PostgreSQL 分析器在重命名列/字段时需要这个关键字,因为类型扩展的特性会导致上下文语意不清.不过,"AS" 在FROM 项里是可选的.

DISTINCT ON 语法不是SQL92 的标准。LIMIT 和OFFSET 也不是。

在SQL92里,一个ORDER BY 子句只可以使用在结果列名称或者序号上,而GROUP BY 子句只能用于输入列/字段上.PostgreSQL 把这两个子句都扩展为允许另一种选择(但是如果出现冲突则使用标准的解释).PostgreSQL 还允许两个子句声明任意的表达式.请注意,在表达式里出现的名称将总是被当做输入列/字段的名称,而不是结果列/字段名称.

?

1 2 3 4 5 6 UNION/INTERSECT/EXCEPT 子句

SQL92 的 UNION/INTERSECT/EXCEPT 语法允许一个附加的 CORRESPONDING BY 选项:

table_query UNION [ALL]

[CORRESPONDING [BY (column [,...])]]

7 table_query

CORRESPONDING BY 目前还不被PostgreSQL支持.

SQL语句(inner join,left out join,right out join三者的不同用法)

jion 语句有三种,inner join, left outer join 和right outer join 都可以简写,分别为jion,left join,right jion。

jion语句可以用来组合两个表中的记录,只要在公共字段之中有相符的值即可,该语句联合两个表查询得到的结果是可以添加新的数据,可以把它看成将两个具有相关内容的表联

接在一起新生成的表,而一般的select 语句没有这个功能。

1) 内连接,inner join ... on

语句格式:

FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表X

ON Member.字段号=表X.字段号

例子:

?

1 2 3 4 5 6 7 SELECT *

FROM (((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOI INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity) INNER JO ORDER BY MemberDate DESC

内连接的功能是,把两个表相关联的记录列出来,必须是相关联的记录。

2) 左外连接,left outer join ... on

语句格式:

FROM [表名1] LEFT JOIN [表名2]

ON [表名1.字段A] 〈关系运算符〉[表名2.字段B]

其实LEFT JOIN 的功能就是将LEFT左边的表名1中的所有记录全部保留,而将右边的表名2中的字段B与

表名1.字段A相对应的记录显示出来(当使用SELECT * 时)。而RIGHT JOIN

和LEFT JOIN 相反。

外连接的功能是,把LEFT左边的表中的所有记录保留,而右边表只保留相关联的记录,也就是先执行一次INNER JOIN,然后把LEFT左边的表中的与右边表没有任何关联的记录也

保留,而右边表的字段为null.

使用左向外联接

假设在city 列上联接authors 表和publishers 表。结果只显示在出版商所在城市居住的作者(本例中为Abraham Bennet 和Cheryl Carson)。

若要在结果中包括所有的作者,而不管出版商是否住在同一个城市,请使用SQL-92 左向外联接。下面是Transact-SQL 左向外联接的查询和结果:

?

1 2 3 4 5 USE pubs

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors a LEFT OUTER JOIN publishers p

ON a.city = p.city

ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC

【也就是先把authors表中的所有数据列出,由于authors表中没有pub_name字段,所以为null 】下面是结果集:

?

1 2 3 4 5 6 7 8 9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27 au_fname au_lname pub_name

-------------------- ------------------------------ ----------------- Reginald Blotchet-Halls NULL

Michel DeFrance NULL

Innes del Castillo NULL

Ann Dull NULL

Marjorie Green NULL

Morningstar Greene NULL

Burt Gringlesby NULL

Sheryl Hunter NULL

Livia Karsen NULL

Charlene Locksley NULL

Stearns MacFeather NULL

Heather McBadden NULL

Michael O'Leary NULL

Sylvia Panteley NULL

Albert Ringer NULL

Anne Ringer NULL

Meander Smith NULL

Dean Straight NULL

Dirk Stringer NULL

Johnson White NULL

Akiko Yokomoto NULL

Abraham Bennet Algodata Infosystems

Cheryl Carson Algodata Infosystems

(23 row(s) affected)

不管是否与publishers 表中的city 列匹配,LEFT OUTER JOIN 均会在结果中包含authors 表的所有行。注意:结果中所列的大多数作者都没有相匹配的数据,因此,这些行的

pub_name 列包含空值。

3) 右外连接,right outer join ... on

与left join左右相反。

假设在city 列上联接authors 表和publishers 表。结果只显示在出版商所在城市居住的作者(本例中为Abraham Bennet 和Cheryl Carson)。SQL-92 右向外联接运算符

RIGHT OUTER JOIN 指明:不管第一个表中是否有匹配的数据,结果将包含第二个表中的所有行。

若要在结果中包括所有的出版商,而不管城市中是否还有出版商居住,请使用SQL-92 右向外联接。下面是Transact-SQL 右向外联接的查询和结果:

?

1 2 3 4 5 USE pubs

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors AS a RIGHT OUTER JOIN publishers AS p

ON a.city = p.city

ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC 下面是结果集:

?

1 2 3 4 5 6 7 8 9

10

11

12

13

au_fname au_lname pub_name

-------------------- ------------------------ --------------------

Abraham Bennet Algodata Infosystems

Cheryl Carson Algodata Infosystems

NULL NULL Binnet & Hardley

NULL NULL Five Lakes Publishing

NULL NULL GGG&G

NULL NULL Lucerne Publishing

NULL NULL New Moon Books

NULL NULL Ramona Publishers

NULL NULL Scootney Books

(9 row(s) affected)

使用谓词(如将联接与常量比较)可以进一步限制外联接。下例包含相同的右向外联接,但消除销售量低于50

本的书籍的书名:?

1 2 3 4 USE pubs

SELECT s.stor_id, s.qty, t.title FROM sales s RIGHT OUTER JOIN titles t ON s.title_id = t.title_id

5 6 AND s.qty > 50

ORDER BY s.stor_id ASC

4) 全连接,full join ... on(不常使用,只能用于outer)

功能结合了以上三种联军,先执行一次inner join,然后把两个表的多余字段都保留,但连接的对应字段为null. 如果想将几个表联接起来,在JOIN操作中我们可以进行嵌套操作,有三个表:表1、表2、表3,现在将三个

表联接起来:

FROM (表1 INNER JOIN 表2 ON 表1.序号=表2.序号)

INNER JOIN 表3 ON 表1.序号=表3.序号

使用完整外部联接

若要通过在联接结果中包括不匹配的行保留不匹配信息,请使用完整外部联接。Microsoft? SQL Server? 2000 提供完整外部联接运算符FULL OUTER JOIN,不管另一个表是否有

匹配的值,此运算符都包括两个表中的所有行。

假设在city 列上联接authors 表和publishers 表。结果只显示在出版商所在城市居住的作者(本例中为Abraham Bennet 和Cheryl Carson)。SQL-92 FULL OUTER JOIN 运

算符指明:不管表中是否有匹配的数据,结果将包括两个表中的所有行。

若要在结果中包括所有作者和出版商,而不管城市中是否有出版商或者出版商是否住在同一个城市,请使用完整外部联接。下面是Transact-SQL 完整外部联接的查询和结果:

?

1 2 3 4 5 USE pubs

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors a FULL OUTER JOIN publishers p

ON a.city = p.city

ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC 下面是结果集:

?

1 2 3 4 5 6 7 8 9

10

11

12

13 au_fname au_lname pub_name

-------------------- ---------------------------- -------------------- Reginald Blotchet-Halls NULL

Michel DeFrance NULL

Innes del Castillo NULL

Ann Dull NULL

Marjorie Green NULL

Morningstar Greene NULL

Burt Gringlesby NULL

Sheryl Hunter NULL

Livia Karsen NULL

Charlene Locksley NULL

Stearns MacFeather NULL

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

Heather McBadden NULL

Michael O'Leary NULL

Sylvia Panteley NULL

Albert Ringer NULL

Anne Ringer NULL

Meander Smith NULL

Dean Straight NULL

Dirk Stringer NULL

Johnson White NULL

Akiko Yokomoto NULL

Abraham Bennet Algodata Infosystems Cheryl Carson Algodata Infosystems NULL NULL Binnet & Hardley

NULL NULL Five Lakes Publishing NULL NULL GGG&G

NULL NULL Lucerne Publishing

NULL NULL New Moon Books

NULL NULL Ramona Publishers

NULL NULL Scootney Books

(30 row(s) affected)

附注:

select * from authors a,publishers p where a.city =p.city

本执行结果集中有两个列字段名为city的,因为前面没有指明那个表中的city例如:select a.city from authors a,publishers p where a.city =p.city

以下两个不同:

?

1 2 3 4 5 6 7 8 9

10

11

USE pubs

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors a LEFT OUTER JOIN publishers p

ON a.city = p.city

ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC

USE pubs

SELECT a.*, p.*

FROM authors a LEFT OUTER JOIN publishers p

ON a.city = p.city

ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC这个将会把authors 中所有显示出来,在每条记

录的后面凡是publishers 中的字段都为null除了city在authors中没有的字段

SQL查询语句大全集锦(超经典)

SQL查询语句大全集锦 MYSQL查询语句大全集锦 一、简单查询 简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 表或视图、以及搜索条件等。 例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 复制内容到剪贴板 代码:SELECT `nickname`,`email`FROM `testtable`WHERE `name`='张三' (一) 选择列表 选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。 1、选择所有列 例如,下面语句显示testtable表中所有列的数据: 复制内容到剪贴板 代码:SELECT * FROM testtable 2、选择部分列并指定它们的显示次序 查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 例如: 复制内容到剪贴板 代码:SELECT nickname,email FROM testtable 3、更改列标题 在选择列表中,可重新指定列标题。定义格式为: 列标题=列名 列名列标题 如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 标题:

复制内容到剪贴板 代码:SELECT 昵称=nickname,电子邮件=email FROM testtable 4、删除重复行 SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 5、限制返回的行数 使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 表示一百分数,指定返回的行数等于总行数的百分之几。 例如: 复制内容到剪贴板 代码:SELECT TOP 2 * FROM `testtable` 复制内容到剪贴板 代码:SELECT TOP 20 PERCENT * FROM `testtable` (二) FROM子句 FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, 它们之间用逗号分隔。 在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定: 复制内容到剪贴板 代码:SELECT `username`,citytable.cityid FROM `usertable`,`citytable` WHERE usertable.cityid=citytable.cityid在FROM子句中可用以下两种格式为表或视图指定别名: 复制内容到剪贴板 代码:表名 as 别名 表名别名例如上面语句可用表的别名格式表示为: 复制内容到剪贴板

数据库SQL查询语句大全修订稿

数据库S Q L查询语句 大全 公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]

经典SQL查询语句大全 一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\' --- 开始备份 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 definitio n 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 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1 11、说明:几个高级查询运算词 A:UNION 运算符

数据库SQL查询语句大全

经典SQL查询语句大全 一、基础 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 tab name(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的语法很精妙,查资料!

SQL语句大全实例

SQL语句实例 表操作 例 1 对于表的教学管理数据库中的表STUDENTS ,可以定义如下:CREATE TABLE STUDENTS (SNO NUMERIC (6, 0) NOT NULL SNAME CHAR (8) NOT NULL AGE NUMERIC(3,0) SEX CHAR(2) BPLACE CHAR(20) PRIMARY KEY(SNO)) 例 2 对于表的教学管理数据库中的表ENROLLS ,可以定义如下: CREATE TABLE ENROLLS (SNO NUMERIC(6,0) NOT NULL CNO CHAR(4) NOT NULL GRADE INT PRIMARY KEY(SNO,CNO) FOREIGN KEY(SNO) REFERENCES STUDENTS(SNO) FOREIGN KEY(CNO) REFERENCES COURSES(CNO) CHECK ((GRADE IS NULL) OR (GRADE BETWEEN 0 AND 100))) 例 3 根据表的STUDENTS 表,建立一个只包含学号、姓名、年龄的女学生表。 CREATE TABLE GIRL

AS SELECT SNO, SNAME, AGE FROM STUDENTS WHERE SEX=' 女'; 例 4 删除教师表TEACHER 。 DROP TABLE TEACHER 例 5 在教师表中增加住址列。 ALTER TABLE TEACHERS ADD (ADDR CHAR(50)) 例 6 把STUDENTS 表中的BPLACE 列删除,并且把引用BPLACE 列的所有视图和约束也一起删除。 ALTER TABLE STUDENTS DROP BPLACE CASCADE 例7 补充定义ENROLLS 表的主关键字。 ALTER TABLE ENROLLS ADD PRIMARY KEY (SNO,CNO) ; 视图操作(虚表) 例9 建立一个只包括教师号、姓名和年龄的视图FACULTY 。( 在视图定义中不能包含ORDER BY 子句) CREATE VIEW FACULTY AS SELECT TNO, TNAME, AGE FROM TEACHERS 例10 从学生表、课程表和选课表中产生一个视图GRADE_TABLE ,它包括学生姓名、课程名和成绩。 CREATE VIEW GRADE_TABLE AS SELECT SNAME,CNAME,GRADE FROM STUDENTS,COURSES,ENROLLS WHERE STUDENTS.SNO =ENROLLS.SNO AND https://www.360docs.net/doc/b217701737.html,O=https://www.360docs.net/doc/b217701737.html,O 例11 删除视图GRADE_TABLE DROP VIEW GRADE_TABLE RESTRICT 索引操作 例12 在学生表中按学号建立索引。 CREATE UNIQUE INDEX ST ON STUDENTS (SNO,ASC) 例13 删除按学号所建立的索引。 DROP INDEX ST 数据库模式操作

SQL查询语句大全集锦

SQL查询语句大全集锦 一、简单查询 简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 表或视图、以及搜索条件等。 例如,下面的语句查询testtable表中姓名为“张三”的nickname 字段和email字段。 代码:SELECT `nickname`,`email`FROM `testtable`WHERE `name`='张三' (一) 选择列表 选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。 1、选择所有列 例如,下面语句显示testtable表中所有列的数据: 代码:SELECT * FROM testtable 2、选择部分列并指定它们的显示次序 查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺 序相同。

代码:SELECT nickname,email FROM testtable 3、更改列标题 在选择列表中,可重新指定列标题。定义格式为: 列标题=列名 列名列标题 如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 标题: 代码:SELECT 昵称=nickname,电子邮件=email FROM testtable 4、删除重复行 SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 5、限制返回的行数 使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n 行,而TOP n PERCENT时,说明n是 表示一百分数,指定返回的行数等于总行数的百分之几。

实验4--SQL语言--SELECT查询操作

实验4--SQL语言--SELECT查询操作 1、基于?教学管理?数据库jxgl,试用SQL的查询语句表达下列查询。(1)--检索年龄大于23的男学生的学号和姓名-- select sno,sn from s where sex='男'and age > 23 (2)--检索至少选修一门课程的女学生姓名-- select sn from S,SC where sex='女' AND S.Sno=SC.Sno group by S.Sn having count(*)>=1; (3)--检索王同学没有选修的课程的课程号-- select cno from c where https://www.360docs.net/doc/b217701737.html,o not in (select cno from sc,s where sc.sno=s.sno and sn like'王%') (4)--检索至少选修两门课程的学生学号-- select distinct s.sno from s,sc where sc.sno=s.sno group by s.sno having count(*)>=2; (5)--检索全部学生都选修的课程的课程号与课程名-- select cno,cn from c where not exists (select*from s where not exists (select*from sc where s.sno=sc.sno and https://www.360docs.net/doc/b217701737.html,o=https://www.360docs.net/doc/b217701737.html,o)) (6)--检索选修了所有3学分课程的学生学号和姓名-- select distinct s.sno,s.sn from s,sc where exists (select*from c where ct='3'and s.sno=sc.sno and https://www.360docs.net/doc/b217701737.html,o=https://www.360docs.net/doc/b217701737.html,o) 2、基于“教学管理”数据库jxgl,试用SQL的查询语句表达下列查询。 (1)--统计有学生选修的课程门数-- select count(distinct https://www.360docs.net/doc/b217701737.html,o)from sc; (2)--查询选修4号课程的学生的平均年龄-- select avg(s.age) from s,sc where s.sno=sc.sno and cno='4';

SQL常用语句+举例

SQL 常用语句+举例 相关表: 1. distinct: 剔除重复记录 例:select distinct stroe_name from Store_information 结果: 2. And / or: 并且/或 例:在表中选出所有sales 高于$1000或是sales 在$275及$500之间的记录 Select store_name ,sales from Store_information Where sales>1000 Or (sales>275 and sales <500) 3. 例:在表中查找store_name 包含 Los Angeles 或San Diego 的记录 Select * from Store_information where store_name in (‘Los Angeles ’,’San Diego ’) 结果: 4. Between : 可以运用一个范围抓出表中的值

与in 的区别:in 依照一个或数个不连续的值的限制抓出表中的值 例:查找表中介于Jan-06-1999 及Jan-10-1999 中的记录 Select * from Store_information where date between ‘Jan-06-1999’ and ‘Jan-10-1999’ 结果: 5. Like : 让我们依据一个套式来找出我们要的记录 套式通常包含: ’A_Z ’: 所有以A 开头,中间包含一个字符,以Z 结尾的字串 ’ABC%’: 所有以ABC 起头的字串 ’%XYZ ’: 所有以XYZ 结尾的字串 ’%AN%’: 所有包含AN 的字串 例:Select * from Store_information where store_name like ‘%An%’ 结果: 6. Order by: 排序,通常与ASC (从小到大,升序)、DESC (从大到小,降序)结合使用 当排序字段不止一个时,先依据字段1排序,当字段1有几个值相同时,再依据字段2排序 例:表中sales 由大到小列出Store_information 的所有记录 Select Store_name, sales,date from Store_information order by sales desc 结果: 7. 函数:AVG (平均值)、COUNT (计数)、MAX (最大值)、MIN (最小值)、SUM(求和) 语句:select 函数名(字段名) from 表名 例:求出sales 的总和 Select sum(sales) from Store_information 结果 8. COUNT (计数) 例:找出Store_information 表中 有几个store_name 值不是空的记录

数据库经典SQL语句大全

数据库经典SQL语句大全 篇一:经典SQL语句大全 下列语句部分是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:mssql7backupMyNwind_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、说明: 删除新表: 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 注:索引是不可更改的,想更改必须删除重新建。

SQL数据库查询语句范例

推荐一、简单查询 简单的Transact-SQL查询只包括选择列表、FROM子句和Where子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。Select nickname,email FROM testtable Where n ame=’张三’ (一) 选择列表 选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。 1、选择所有列例如,下面语句显示testtable表中所有列的数据:Select * FROM testtable 2、选择部分列并指定它们的显示次序 查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 例如:Select nickname,email FROM testtable 3、更改列标题 在选择列表中,可重新指定列标题。定义格式为: 列标题=列名列名列标题 如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题: Select 昵称=nickname,电子邮件=email FROM testtable 4、删除重复行 Select语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINC T选项时,对于所有重复的数据行在Select返回的结果集合中只保留一行。 5、限制返回的行数 使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。例如: Select TOP 2 *FROM testtable Select TOP 20 PERCENT * FROM testtable (二) FROM子句 FROM子句指定Select语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。 在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和cityta ble表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定: Select username,citytable.cityid FROM usertable,citytable Where usertable.cityid=citytable.cityid 在FROM子句中可用以下两种格式为表或视图指定别名: 表名 as 别名表名别名

mysql中select简单查询

1.简单查询select语句(1) (1) create database chapter04; use chapter04; create table exam ( id int not null primary key default null auto_increment, name varchar(20) not null, Chinese double, math double, english double ); insert into exam values(null,'关羽',85,76,70); insert into exam values(null,'张飞',70,75,70); insert into exam values(null,'赵云',90,65,95); (2) select name,english from exam; (3) select distinct english from exam; 2.简单查询select语句(2) (1)select Chinese+10,math+10,english+10 from exam; (2)select sum(Chinese+math+english) from exam where name='关羽’;

select sum(Chinese+math+english) from exam where name='张飞’; select sum(Chinese+math+english) from exam where name='赵云’; (3)select sum(Chinese+math+english) as score from exam; 3.简单查询select语句(3) (1)select name,score from exam where name='张飞'; (2)select name,english from exam where english>90; (3)select name,score from exam where score>230; 4.简单查询select语句(4) (1)select name,english from exam where english between 80 and 100; (2)select name,math from exam where math in (75,76,77); (3)insert into exam values(null,'张三',80,70,78); select score,name from exam where name like'张%'; (4)select name,score from exam where math>70 and Chinese>80; 5.聚合函数-count (1)select count (*) from exam; (2)select count (*) from exam where math>70;

50个常用sql语句实例(学生表 课程表 成绩表 教师表)

Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 create table Student(S# varchar(20),Sname varchar(10),Sage int,Ssex varchar(2)) 前面加一列序号: if exists(select table_name from information_schema.tables where table_name='Temp_Table') drop table Temp_Table go select 排名=identity(int,1,1),* INTO Temp_Table from Student go select * from Temp_Table go drop database [ ] --删除空的没有名字的数据库 问题: 1、查询“”课程比“”课程成绩高的所有学生的学号; select a.S# from (select s#,score from SC where C#='001') a,(select s#,score from SC where C#='002') b where a.score>b.score and a.s#=b.s#; 2、查询平均成绩大于分的同学的学号和平均成绩; select S#,avg(score) from sc group by S# having avg(score) >60; 3、查询所有同学的学号、姓名、选课数、总成绩; select Student.S#,Student.Sname,count(SC.C#),sum(score) from Student left Outer join SC on Student.S#=SC.S# group by Student.S#,Sname 4、查询姓“李”的老师的个数; select count(distinct(Tname)) from Teacher where Tname like '李%'; 5、查询没学过“叶平”老师课的同学的学号、姓名; select Student.S#,Student.Sname from Student

sql查询语句大全

SQL查询语句大全 《SQL语句的基本语法》 一.Select语句的完整语法为: Select[ALL|DISTINCT|DISTINCTROW|TOP] {*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]} FROM tableexpression[,…][IN externaldatabase] [Where…] [GROUP BY…] [HAVING…] [ORDER BY…] [WITH OWNERACCESS OPTION] 说明: 用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。 1 FROM子句 FROM子句指定了Select语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或 由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。 例:下列SQL语句返回所有有定单的客户: Select orderID,Customer.customerID FROM orders Customers Where orders.CustomerID=Customers.CustomeersID 2 ALL、DISTINCT、DISTINCTROW、TOP谓词 (1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。 例:Select ALL FirstName,LastName FROM Employees (2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。 (3) DISTINCTROW 如果有重复的记录,只返回一个 (4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比) 例:返回5%定货额最大的定单 Select TOP 5 PERCENT* FROM [ order Details] orDER BY UnitPrice*Quantity*(1-Discount) DESC 3 用 AS 子句为字段取别名 如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。 例:返回FirstName字段取别名为NickName Select FirstName AS NickName ,LastName ,City

数据库sql查询语句上机练习1_习题_结果(单世民)

习题1 请根据给出的数据库表结构来回答相应问题: DEPT (DEPTNO INT, DNAME VARCHAR(14),LOC VARCHAR(13)); EMP (EMPNO INT,ENAME VARCHAR(10), JOB VARCHAR(9), MGR INT, HIREDATE DATE, SAL FLOAT, COMM FLOAT, DEPTNO INT); BONUS (ENAME VARCHAR(10), JOB VARCHAR(9), SAL INT, COMM INT); SALGRADE ( GRADE INT, LOSAL INT, HISAL INT); 其中表中包含如下数据: DEPT表: EMP表: SALGRADE表:

BONUS表: 无数据 根据上面描述完成下面问题: (注意:注意保存脚本,尤其是DDL和DML,以便进行数据还原) DDL 1. 写出上述表的建表语句。此外,在DEPT上创 建名为”PK_DEPT”的主键约束,在EMP表上 创建名为”PK_EMP”的主键约束以及指向表 DEPT的外键约束”FK_DEPTNO”。 命令: Create table DEPT (DEPTNO INT NOT NULL,DNAME VARCHAR(14),LOC VARCHAR(13)); Alter table DEPT add constraint PK_DEPT PRIMARY KEY (DEPTNO); create table EMP(EMPNO INT NOT NULL,ENAME VARCHAR(10),JOB VARCHAR(9),MGR INT,HIREDATE DATE, SAL FLOAT,COMM FLOAT,DEPTNO INT); alter table EMP add constraint PK_EMP PRIMARY KEY (EMPNO); alter table EMP add constraint FK_DEPTNO foreign key(DEPTNO) references DEPT(DEPTNO);

常用SELECT语句汇总

常用SELECT语句汇总 一、单表查询 (一)按照条件查询相关记录 Select 字段1,字段2……字段N from 表 where 条件含义:从表中根据where 条件查询记录,每条记录显示的字段按照字段1、字段2….字段N的设置显示 注:select语句中的标点符号及运算符必须使用英文半角字符。 例1:从凭证库中查询2004年1月31日的凭证,每条凭证只显示凭证日期、凭证号、科目名称、借方金额、贷方金额、会计月份 6个字段 Select 凭证日期,凭证号,科目名称,借方金额,贷方金额,会计月份 From 凭证库 where 凭证日期=’2004-1-31’ 例2:根据业务_个人基本情况表,找出缴存状态为”正常”的记录,查出的记录只显示姓名、身份证号、单位账号及个人账号 4个字段 Select 个人姓名,身份证号,单位账号,个人账号 from 业务_个人基本情况表 where 账户状态=’1’ 例3:从科目余额表中查询出2010年借方金额大于50万或2010年借方金额小于10万的记录,每条记录只显示摘要、科目编码、借方金额、贷方金额、年度5个字段 Select摘要,科目编码,借方金额,贷方金额,年度 From 科目余额 where(借方金额>500000 and 年度=2010) or (借方金额<100000 and 年度=2010) Select top 100 字段1,字段2……字段N from 表 where 条件含义:从表中根据where 条件查询记录,显示前100条记录,每条记录按照字段1、字段2….字段N的设置显示 例1:从凭证库中查询2004年1月31日的前100条凭证,每条 2 凭证只显示凭证日期、凭证号、科目名称、借方金额、贷方金额、会计月份 6个字段Select top 100凭证日期,凭证号,科目名称,借方金额,贷方金额,会计月份 From 凭证库where 凭证日期=’2004-1-31’ 例2:根据业务_个人基本情况表,找出缴存状态为”正常”的前100条记录 Select top 100个人姓名,身份证号,单位账号,个人账号 from 业务_个人基本情况表where 账户状态=’1’ (二)通配符的使用 *表示将全部的字段内容都显示出来 例1:从业务_电子警察表中筛选出无车号或者车牌号小于3位的记录 Select * from 业务_电子警察 where 车号=’’ or Len(车号)<3 例2:从科目余额表中查询出2002年收入大于50万的记录 Select * from 科目余额 where 借方金额>500000 and 年度=2002 %表示零或多个字符 例1:从凭证库中查询2003年各月的房租收入情况 Select month(凭证日期) as 月份, sum(贷方金额) as 房租金额 from 凭证 where 摘要 like ‘%房租%’ and 年度=2003 例2:从凭证库中查询 2008年包含税的记录 Select * from 凭证库 where摘要 like ‘%税%’ and 年度=2008 _表示任何一个字符 例1:根据科目余额表查询出目编码为10开头的一级科目记录 Select * from 科目余额

数据库sql查询语句练习2_习题_结果(单世民)

现在有一教学管理系统,具体的关系模式如下:Student (no, name, sex, birthday, class) Teacher (no, name, sex, birthday, prof, depart) Course (cno, cname, tno) Score (no, cno, degree) 其中表中包含如下数据: Course表: Score表: Student表:

Teacher表: 根据上面描述完成下面问题: (注意:注意保存脚本,尤其是DDL和DML,以便进行数据还原)DDL 1.写出上述表的建表语句。 2.给出相应的INSERT语句来完成题中给出数据的插入。 单表查询 3.以class降序输出student的所有记录(student表全部属性) 命令:select*from Student order by class desc;

4.列出教师所在的单位depart(不重复)。 命令:select distinct depart from Teacher; 5.列出student表中所有记录的name、sex和class列 命令:select name,sex,class from Student; 6.输出student中不姓王的同学的姓名。 命令:select name from Student except select name from Student where name like'王%';或

select name from Student where name not like'王%'; 7.输出成绩为85或86或88或在60-80之间的记录(no,cno,degree) 命令:select no,cno,DEGREE from Score where degree=85 or degree=86 or degree=88 or degree between 60 and 80; 8.输出班级为95001或性别为‘女’的同学(student表全部属性) 命令:select*from Student where class=95001 or sex='女';

Sql练习答案,sql常用实例一写就会

------1.列出至少有一个员工的所有部门。 select count(*),deptno from emp group by deptno having count(*)>1; ------2.列出薪金比“SMITH”多的所有员工。 select * from emp where sal>(select sal from emp where ename='SMITH'); ------3.列出所有员工的姓名及其直接上级的姓名。 select ename,(select ename from emp where empno=a.mgr) from emp a; select a.ename,b.ename from emp a,emp b where a.mgr=b.empno(+); ------4.列出受雇日期晚于其直接上级的所有员工。 select ename from emp a where hiredate>(select hiredate from emp where empno=a.mgr); 列出受雇日期早于其直接上级的所有员工。 select ename from emp a where hiredate<(select hiredate from emp where empno=a.mgr); ------5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。 select dname,ename from dept left join emp on dept.deptno=emp.deptno; select dname,ename from dept a,emp b where a.deptno = b.deptno(+); ------6.列出所有“CLERK”(办事员)的姓名及其部门名称。 select dname,ename from dept a,emp b where a.deptno=b.deptno and job='CLERK'; select (select dname from dept where deptno=a.deptno) as dname ,ename from emp a where job='CLERK'; ------7.列出最低薪金大于1500的各种工作。 select job,min(sal) msal from emp group by job having min(sal)>1500; ------8.列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。select ename from emp where deptno=(select deptno from dept where dname='SALES');

相关文档
最新文档