SQL语句大全正如大多数现代的关系语言一样,SQL 是基于记录关系微积分(TRC)的。
结果是每个可以用记录关系微积分(TRC)表示的查询(相等地,或者是关系演算),同样也可以用SQL 表示。
不过,还有一些超出关系演算或者微积分的能力。
下面是一个SQL 提供的并非关系演算或者关系微积分的内容的一个列表:∙插入,删除或者更改数据的命令。
∙算术能力:在SQL 里,我们可以和比较功能一样进行算术运算,例如∙ A < B + 3。
要注意+ 或者其他算术操作符从未在关系演算或者关系微积分里面出现过。
∙分配和打印命令:我们可以打印一条查询构造的关系以及给一个被计算的关系分配关系名。
∙聚集函数:象average,sum,max,等操作符可以应用于一个关系的列以获取单一的量。
1.4.1. Select(选择)SQL 里面最常用的命令是SELECT 语句,用于检索数据。
语法是:SELECT [ ALL | DISTINCT [ ON ( expression[, ...] ) ] ]* | expression[ AS output_name] [, ...][ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table][ 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 class_name[, ...] ] ][ LIMIT { count| ALL } [ { OFFSET | , } start]]现在我们将通过不同的例子演示SELECT 语句复杂的语法。
用于这些例子的表在供应商和部件数据库里定义。
1.4.1.1. 简单的Select这里是一些使用SELECT 语句的简单例子:Example 1-4. 带有条件的简单查询要从表PART 里面把字段PRICE 大于10 的所有记录找出来,我们写出下面查询:SELECT * FROM PARTWHERE PRICE > 10;然后得到表:PNO | PNAME | PRICE-----+---------+--------3 | Bolt | 154 | Cam | 25在SELECT语句里使用"*" 将检索出表中的所有属性。
如果我们只希望从表PART 中检索出属性PNA ME 和PRICE,我们使用下面的语句:SELECT PNAME, PRICEFROM PARTWHERE PRICE > 10;这回我们的结果是:PNAME | PRICE--------+--------Bolt | 15Cam | 25请注意SQL 的SELECT 语句对应关系演算里面的"projection" (映射),而不是"selection"(选择)(参阅关系演算获取详细信息)。
WHERE 子句里的条件也可以用关键字OR,AND,和NOT 逻辑地连接起来:SELECT PNAME, PRICEFROM PARTWHERE PNAME = 'Bolt' AND(PRICE = 0 OR PRICE <= 15);这样将生成下面的结果:PNAME | PRICE--------+--------Bolt | 15目标列表和WHERE 子句里可以使用算术操作。
例如,如果我们想知道如果我们买两个部件的话要多少钱,我们可以用下面的查询:SELECT PNAME, PRICE * 2 AS DOUBLEFROM PARTWHERE PRICE * 2 < 50;这样我们得到:PNAME | DOUBLE--------+---------Screw | 20Nut | 16Bolt | 30请注意在关键字AS 后面的DOUBLE 是第二个列的新名字。
这个技巧可以用于目标列表里的每个元素,给它们赋予一个在结果列中显示的新的标题。
这个新的标题通常称为别名。
这个别名不能在该查询的其他地方使用。
1.4.1.2. Joins(连接)下面的例子显示了SQL 里是如何实现连接的。
要在共同的属性上连接三个表SUPPLIER,PART 和SELLS,我们通常使用下面的语句:SELECT S.SNAME, P.PNAMEFROM SUPPLIER S, PART P, SELLS SEWHERE S.SNO = SE.SNO ANDP.PNO = SE.PNO;而我们得到的结果是:SNAME | PNAME-------+-------Smith | ScrewSmith | NutJones | CamAdams | ScrewAdams | BoltBlake | NutBlake | BoltBlake | Cam在FROM 子句里,我们为每个关系使用了一个别名,因为在这些关系间有着公共的命名属性(SNO 和PNO)。
现在我们可以区分不同表的公共命名属性,只需要简单的用每个关系的别名加上个点做前缀就行了。
联合是用与一个内部联接里显示的同样的方法计算的。
首先算出笛卡儿积SUPPLIER ×PART ×SELLS 。
然后选出那些满足WHERE 子句里给出的条件的记录(也就是说,公共命名属性的值必须相等)。
最后我们映射出除S.SNAME 和P.PNAME 外的所有属性。
另外一个进行连接的方法是使用下面这样的SQL JOIN 语法:select sname, pname from supplierJOIN sells USING (sno)JOIN part USING (pno);giving again:sname | pname-------+-------Smith | ScrewAdams | ScrewSmith | NutBlake | NutAdams | BoltBlake | BoltJones | CamBlake | Cam(8 rows)一个用JOIN 语法创建的连接表,是一个出现在FROM 子句里的,在任何WHERE,GROUP BY 或HAVING 子句之前的表引用列表项.其它表引用,包括表名字或者其它JOIN 子句,如果用逗号分隔的话,可以包含在FROM 子句里.连接生成的表逻辑上和任何其它在FROM 子句里列出的表都一样.SQL JOIN 有两种主要类型,CROSS JOIN (无条件连接) 和条件连接.条件连接还可以根据声明的连接条件(ON,USING,或NATURAL)和它应用的方式(INNER 或OUTER 连接)进一步细分.连接类型CROSS JOIN{ T1}CROSS JOIN { T2}一个交叉连接(cross join)接收两个分别有N 行和M 行的表T1 和T2,然后返回一个包含交叉乘积NxM 条记录的连接表.对于T1 的每行R1,T2 的每行R2 都与R1 连接生成连接的表行JR,JR 包含所有R1 和R2 的字段.CROSS JOIN 实际上就是一个INNER JOIN ON TRUE.条件JOIN{ T1} [ NATURAL ] [ INNER | { LEFT | RIGHT | FULL } [ OUTER ] ]JOIN { T2} { ON search condition| USING ( join column list) }一个条件JOIN 必须通过提供一个(并且只能有一个) NATURAL,ON,或者USING 这样的关键字来声明它的连接条件.ON 子句接受一个search condition,它与一个WHERE 子句相同.USING 子句接受一个用逗号分隔的字段名列表,连接表中必须都有这些字段,并且用那些字段连接这些表,生成的连接表包含每个共有字段和两个表的所有其它字段.NATURAL 是USING 子句的缩写,它列出两个表中所有公共的字段名字.使用USING 和NATURAL 的副作用是每个连接的字段都只有一份拷贝出现在结果表中(与前面定义的关系演算的JOIN 相比较).[ INNER ]JOIN对于T1 的每行R1,连接成的表在T2 里都有一行满足与R1 一起的连接条件.对于所有JOIN 而言,INNER 和OUTER 都是可选的.INNER 是缺省.LEFT,RIGHT,和FULL 只用于OUTER JOIN.LEFT [ OUTER ]JOIN首先,执行一次INNER JOIN.然后,如果T1 里有一行对任何T2 的行都不满足连接条件,那么返回一个连接行,该行的T2 的字段为null.小技巧: 连接成的表无条件地包含T1 里的所有行.RIGHT [ OUTER ]JOIN首先,执行一次INNER JOIN.然后,如果T2 里有一行对任何T1 的行都不满足连接条件,那么返回一个连接行,该行的T1 的字段为null.小技巧: 连接成的表无条件地包含T2 里的所有行.FULL [ OUTER ]JOIN首先,执行一次INNER JOIN.然后,如果T1 里有一行对任何T2 的行都不满足连接条件,那么返回一个连接行,该行的T1 的字段为null.同样,如果T2 里有一行对任何T1 的行都不满足连接条件,那么返回一个连接行,该行的T2 的字段为null.小技巧: 连接成的表无条件地拥有来自T1 的每一行和来自T2 的每一行.所有类型的JOIN 都可以链接在一起或者嵌套在一起,这时T1和T2都可以是连接生成的表.我们可以使用圆括弧控制JOIN 的顺序,如果我们不主动控制,那么连接顺序是从左到右.1.4.1.3. 聚集操作符SQL 提供以一些聚集操作符(如,AVG,COUNT,SUM,MIN,MAX),这些聚集操作符以一个表达式为参数。
只要是满足WHERE 子句的行,就会计算这个表达式,然后聚集操作符对这个输入数值的集合进行计算.通常,一个聚集对整个SELECT 语句计算的结果是生成一个结果.但如果在一个查询里面声明了分组,那么数据库将对每个组进行一次独立的计算,并且聚集结果是按照各个组出现的(见下节).Example 1-5. 聚集果我们想知道表PART 里面所有部件的平均价格,我们可以使用下面查询:SELECT AVG(PRICE) AS AVG_PRICEFROM PART;结果是:AVG_PRICE-----------14.5如果我们想知道在表PART 里面存储了多少部件,我们可以使用语句:SELECT COUNT(PNO)FROM PART;得到:COUNT-------41.4.1.4. 分组聚集SQL 允许我们把一个表里面的记录分成组。