SQL提供了下列聚合函数:
COUNT(*) | 计算元组的个数 |
---|---|
COUNT(<列名>) | 对一列中的值计算个数 |
SUM(<列名>) | 求某一列值的总和(此列的值必须是数值型) |
AVG(<列名>) | 求某一列的平均值(此列的值必须是数值型) |
MAX(<列名>) | 求某一列的最大值 |
MIN(<列名>) | 求某一列的最小值 |
SELECT<目标表的列名或列表达序列> FORM<基本表名 或/和 视图序列> [ WHARE <行条件表达式>] [ GROUP BY <列名序列> [ HAVING <组条件表达式> ] ] [ORDER BY <列名[ ASC | DESC ]>, ... ]
整个语句的执行过程如下:
例:求每一教师每门课程的学生选修人数(超过50人),要求显示教师工号、课程号和学生人数。显示时,查询结果按人数升序排列,人数相同按工号升序、课程号降序排列。
SELECT T#,C.C#,COUNT(S#)
FROM C,SC
WHERE C.C# = SC.C#
GROUP BY T#,C.C#
HAVING COUNT(*)>50
ORDER BY 3,T#,C.C# DESC;
ORDER BY 语句中的 3 表示对SECECT子句的第三个属性(学生人数)进行升序排列,若人数相同,则按照教师工号升序,课程号降序排列。
SELECT子句用于描述查询输出的表格结构。其形式如下:
SELECT [ ALL | DISTINCT ] <列名或列表达式序列> | *
列和基本表的改名操作:
使用AS可以给列和基本表进行改名。有时一个基本表在多个SELECT中出现或用户要求输出的列名和基本表中的不一致,就可以给基本表或列改名。
SELECT SNAME AS STUDENT_NAME
FORM S AS STUDENT
集合的并、交、差操作:
当两个子查询的结构完全一致时,可以将这两个子查询进行并、交、差等操作。并、交、差的运算符是:UNION、INTERSECT、EXCEPT。三个关键字后面带上ALL,则不消除重复元组,不带ALL,则返回的结果消除重复元组。
(SELECT 查询语句1) UNION [ ALL ] (SELECT 查询语句2) | (SELECT 查询语句1) INTERSECT [ ALL ] (SELECT 查询语句2) | (SELECT 查询语句1) EXCEPT [ ALL ] (SELECT 查询语句2) |
---|
上述操作不带关键字ALL, 返回结果中消除了重复元组;带ALL,不消除重复元组。
在WHERE子句中的条件表达式F中可以使用下列运算符:
字符串匹配操作:
字符串匹配操作符是“LIKE", 在表达式中可以使用两个通配符:
//匹配S中以字母D打头的学生姓名SELECT SNAME
FORM S
WHERE SNAME LIKE'D%';
为了使字符串中包含特殊字符(%和_),SQL允许定义转义字符。转义字符紧靠特殊字符并放在前面,表示该特殊字符将被当作普通字符。在LIKE中使用ESCAPE关键字来定义转义字符。
LIKE 'ab\%cd%' ESCAPE'\' //匹配所有以ab%cd开头的字符串
SQL还允许在字符上使用多种函数,例如连接(”||“),提取子串,计算字符串长度,大小写转换等操作。
空值的比较操作:
SQL允许列值为空,空值用NULL表示,NULL不占用空间。
空值的存在增加了算术操作和比较操作的复杂性。SQL中规定,涉及+,-,*,/的算术表达式中有一个值是空值时,表达式的值也是空值。涉及空值的比较操作的结果认为是”false“。
在聚合函数中遇到空值时,除了COUNT(*)外,都跳过空值去处理非空值。
集合成员资格的比较:
判断元组是否在查询的结果(即集合)中的操作,叫做”集合成员资格的比较“。其形式为:
<元组> [NOT] IN (<集合>)
这里的元组和集合的形式应该相同。IN操作符表示,如果远足在集合内,则返回true。
//在S和SC中检索至少不学C2和C4两门课的学生学号SELECT S#
FORM SWHERE S# NOT IN (SELECT S#
FORM SC
WHERE C# IN ('C2','C4'));
集合成员算术的比较:
其形式如下:
<元组> θ ALL | SOME | ANY (<集合>)
θ是算术比较运算符”θ ALL"表示左边那个元组和右边集合中每一个元组满足θ运算;“θ SOME"和”θ ANY“意义一样,表示左边那个元组和右边集合中至少一个元组满足θ运算。
这里应该注意,元组的比较操作和字符串的比较操作类似。例如:
(a1, a2) = (b1, b2),其意义是(a1<b1) OR (a1=b1) AND (a2<=b2)
集合中重复元组是否存在测试:
SELECT T#, TNAME
FORM TWHERE UNIQUE (SELECT T#
FORM C
WHERE C.T# = T.T#);
SQL语句允许在FORM中使用子查询。如果在FROM中使用了子查询,那么要为查询的结果起一个表名和相应的列名。
//在基本表SC中检索平均成绩最高的学生学号
SELECT SC.S#
FROM SC,(SELECT AVG(SCORE)
FROM SC
GROUP BY S#) AS RESULT(AVG_SCORE)
GROUP BY SC.S#
HAVING AVG(SC.SCORE)>=ALL(RESULT.AVG_SCORE);
SQL允许用户用WITH语句定义一个临时视图(即子查询),置于SELECT语句的开始处。而临时视图本身是用SELECT语句定义的。
WITH RESULT(AVG_SCORE)AS
SELECT AVG(SCORE)
FROM SC
GROUP BY S#
SELECT S#
FROM SC.RESULT
GROUP BY S#
HAVING AVG(SCORE)>=ALL(RESULT.AVG_SCORE);