SQL语句知识总结(三)

2014-11-24 11:12:58 · 作者: · 浏览: 2
4聚集函数
计数:
COUNT([DISTINCT|ALL] *) 统计元组个数
COUNT([DISTINCT|ALL] <列名>) 统计一列中值的个数
计算总和:
SUM([DISTINCT|ALL] <列名>) 计算一列中值的总和
计算平均值:
AVG([DISTINCT|ALL] <列名>) 计算一列值的平均值
最大最小值:
MAX([DISTINCT|ALL] <列名>) 求一列值中的最大值
MIN([DISTINCT|ALL] <列名>) 求一列值中的最小值
注意:WHERE子句中不能用聚集函数作为条件表达式
1.5 GROUP BY子句
语句格式:
SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组。
例:查询选修了3门以上课程的学生学号。
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >3;
先用GROUP BY字句按Sno进行分组
再用聚集函数COUNT对每一组计数
HAVING短语给出了选择组的条件,只有满足条件
(元组个数>3),表示此学生选修超过3门,才会被选出来。
HAVING短语与WHERE子句的区别:
§ 作用对象不同
§ WHERE子句作用于基表或视图,从中选择满足条件的元组
§ HAVING短语作用于组,从中选择满足条件的组。
2、 连接查询
v 连接查询:同时涉及多个表的查询
v 连接条件或连接谓词:WHERE子句中用来连接两个表的条件
一般格式:
n [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
n [<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
v 连接字段:连接谓词中的列名称
n 连接条件中的各连接字段类型必须是可比的,但名字不必是相同的
3、 嵌套查询
一个SELECT-FROM-WHERE语句称为一个查询块
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
§ SQL语言允许多层嵌套查询
§ 子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序。
§ 层层嵌套方式反映了 SQL语言的结构化
§ 有些嵌套查询可以用连接运算替代
常见的子查询有以下几种:
1、 带IN谓词的子查询
2、 带有比较运算符的子查询
3、 带有ANY(SOME)或ALL谓词的子查询
4、 带有EXISTS谓词的子查询
5、 需要配合使用比较运算符:
6、 > ANY 大于子查询结果中的某个值
7、 > ALL 大于子查询结果中的所有值
8、 < ANY 小于子查询结果中的某个值
9、 < ALL 小于子查询结果中的所有值
10、 >= ANY 大于等于子查询结果中的某个值
11、 >= ALL 大于等于子查询结果中的所有值
12、 <= ANY 小于等于子查询结果中的某个值
13、 <= ALL 小于等于子查询结果中的所有值
14、 = ANY 等于子查询结果中的某个值
15、 =ALL 等于子查询结果中的所有值(通常没有实际意义)
16、 !=(或<>)ANY 不等于子查询结果中的某个值
17、 !=(或<>)ALL 不等于子查询结果中的任何一个值
例:查询至少选修了学生200215122选修的全部课程的学生号码。
解题思路:
n 用逻辑蕴函表达:查询学号为x的学生,对所有的课程y,只要200215122学生选修了课程y,则x也选修了y。
n 形式化表示:
用P表示谓词 “学生200215122选修了课程y”
用q表示谓词 “学生x选修了课程y”
则上述查询为: ("y) p q
n 等价变换:
("y)p q ≡ ($y ( (p q ))
≡ ($y ( ( p∨ q) ))
≡ $y(p∧ q)
n 变换后语义:不存在这样的课程y,学生200215122选修了y,而学生x没有选。
n 不存在这样的课程y,学生200215122选修了y,而学生x没有选。用NOT EXISTS谓词表示:
n SELECT DISTINCT Sno
n FROM SC SCX
n WHERE NOT EXISTS
n (SELECT *
n FROM SC SCY
n WHERE SCY.Sno = ' 200215122 ' AND
n NOT EXISTS
n (SELECT *
n FROM SC SCZ
n WHERE SCZ.Sno=SCX.Sno AND
n SCZ.Cno=SCY.Cno));
4、 集合查询
集合查询指多个SELECT语句的结果进行集合操作
集合操作的种类:
a) 并操作UNION
b) 交操作INTERSECT
c) 差操作EXCEPT
参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同
八、数据更新
1、 插入数据
两种插入数据方式
1. 插入元组
2. 插入子查询结果
可以一次插入多个元组
v 语句格式
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>] … )
v INTO子句
n 属性列的顺序可与表定义中的顺序不一致
n 没有指定属性列
n 指定部分属性列
v VALUES子句
n 提供的值必须与INTO子句匹配
值的个数
值的类型
2、 插入子查询结果
v 语句格式
INSERT
INTO <表名> [(<属性列1> [,<属性列2>… )]
子查询;
v 功能
将子查询结果插入指定表中