select语句的限定一:
SELECT子句中的规定
1)SELECT子句描述查询输出的表格结构,即输出值的列名或表达式。其形式如下: SELECT [ ALL|DISTINCT ] <列名或列表达式序列> | * 条件表达式中的算术比较操作
例 ①在表SC中检索男同学选修的课程号。 SELECT DISTINCT C# FROM S,SC WHERE S.S# =SC.S# AND SEX ='M'; ②检索每个学生的出生年份。 SELECT S#,SNAME,2014-AGE FROM S;
2)条件表达式中可出现算术比较运算符(<,<=,>,>=,=,!=),也可以用“BETWEEN … AND …”比较运算符限定一个值的范围。
例 ①检索18~20岁的学生姓名。SELECT SNAME FROM S WHERE AGE>=18 AND AGE<=20; 或 SELECT SNAME FROM S WHERE AGE BETWEEN 18 AN
3)列和基本表的改名操作
例 ①在表S中检索每个学生的出生年份,输出的列名为STUDENT_NAME和BIRTH_YEAR。 SELECT SNAME AS STUDENT_NAME,2014-AGE AS BIRTH_YEAR FROM S;
select语句的限定二:
字符串的匹配操作
条件表达式中字符串匹配操作符是“LIKE”。在表达式中可使用两个通配符: 百分号(%):与零个或多个字符组成的字符串匹配。 下划线(_):与单个字符匹配。
例 ①检索以字母D打头的学生姓名。 SELECT SNAME FROM S WHERE SNAME LIKE 'D%'; ②检索以字母T打头,以M结束的三个字母组成的学生姓名。 SELECT SNAME FROM S WHERE SNAME LIKE 'T_M';
集合的并、交、差操作 当两个子查询结果的结构完全一致时,可以让这两个子查询执行并、交、差操作。并、交、差的运算符为UNION、INTERSECT和EXCEPT。
例 (SELECT 查询语句1)
UNION [ALL]
(SELECT 查询语句2)
[ALL]未消除重复元组
(SELECT 查询语句1)
INTERSECT [ALL]
(SELECT 查询语句2)
(SELECT 查询语句1)
EXCEPT [ALL]
(SELECT 查询语句2)
空值的比较操作 SQL中允许列值为空,空值用保留字NULL表示。
例 检索年龄为空值的学生姓名。
SELECT SNAME
FROM S
WHERE AGE IS NULL;
select语句的限定三:
集合的比较操作
SQL提供SELECT语句的嵌套子查询机制。子查询是嵌套在另一个查询中的SELECT语句。
(1)集合成员资格的比较 元组 [NOT] IN (集合)
例 检索至少不学C2和C4两门课程的学生学号。
SELECT S# FROM S
WHERE S# NOT IN(SELECT S#
FROM SC
WHERE C# IN ('C2','C4'));
(2)集合成员的算术比较 元组θSOME[ALL] (集合)
例 ①检索学习C2课程的学号与姓名。
SELECT S#,SNAME FROM S WHERE S# =SOME(SELECT S# FROM SC
WHERE C# ='C2');
②检索至少有一门成绩超过学生S4一门成绩的学生学号。
SELECT DISTINCT S# FROM SC WHERE SCORE>SOME(SELECT SCORE FROM SC
WHERE S# ='S4');
③检索不学C2课程的学生姓名和年龄。
SELECT SNAME,AGE FROM S 注意:
WHERE S# < > ALL(SELECT S# IN与“=SOME”等价 FROM SC NOT IN与“< >ALL”等价
WHERE C# =‘C2’);
④检索平均成绩最高的学生学号。
SELECT S# select max(avg(grade))
FROM SC from sc FROM SC GROUP BY S# group by s#;此种写法错误, HAVING AVG(SCORE)>=ALL(SELECT AVG(SCORE) 聚合函数不能进行复合运算。 GROUP BY S#);
(3)空关系的测试 [NOT] EXISTS (集合)
例:检索学习课程号为C2的学生学号与姓名。
SELECT S#,SNAME
FROM S
WHERE EXISTS
(SELECT *
FROM SC
WHERE C#='C2' AND S.S# =SC.S#);
(4)重复元组的测试 [NOT] UNIQUE (集合)
例 检索平均成绩超过80分的学生学号和平均成绩。
SELECT S#,AVG(SCORE)
FROM SC
GROUP BY S#
HAVING AVG(SCORE) >80;
导出表形式:
SELECT S#,AVG_SCORE
FROM (SELECT S#,AVG(SCORE)
FROM SC
GROUP BY S#)
AS RESULT(S#,AVG_SCORE)
WHERE AVG_SCORE>80;
导出表的使用 SQL2允许在FROM子句中使用子查询。如果在FROM子句中使用了子查询,那么要给子查询的结果起个表名和相应的列名。