目录
3.4.1 单表查询
1.选择表中的若干列
(1)查询指定列
(2)查询全部列
(3)查询经计算的值
2.选择表中的若干元组
(1)消除取值重复的行 distinct
(2)查询满足条件的元组
3.ORDER BY子句
4.聚集函数 count sum avg max min
3.4.2 连接查询
1.等值与非等值连接查询 =
2.自身连接
3.外连接
4.多表查询 两个以上的表
3.4.3 嵌套查询
1.带有IN谓词的子查询
2.带有比较运算符的子查询
3.带有ANY(SOME)或ALL谓词的子查询
4.带有EXISTS谓词的子查询
3.4.4 集合查询
3.4.5 基于派生表的查询
SELECT Sno,Sname
FROM Student;
SELECT *
FROM Student;
SELECT Sname,2014-Sage /*查询结果的第2列是一个算数表达式*/
FROM Student;
指定别名来改变查询结果的列标题。
SELECT Sname NAME,'Year of Birth;' BIRTH,2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;
SELECT DISTINCT Sno
FROM SC;
如果没有指定DISTINCT关键字,则默认为ALL。
通过WHERE子句实现
①比较大小
SELECT Sname,Sage
FROM Student
WHERE Sage<20;
②确定范围
BETWEEN...AND...
NOT BETWEEN...AND...
BETWEEN后面是范围的下限(即低值),AND后面是范围的上限(即高值)
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23
③确定集合
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');
④字符匹配
[NOT] LIKE '<匹配串>' [ESCAPE '<换码字符>']
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE'\';
"_"转义为普通的"_"。
⑤涉及空值的查询
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL; /*分数Grade是空值*/
⑥多重条件查询
逻辑运算符AND和OR可以用来连接多个查询条件。AND的优先级高于OR,但是可以用括号改变优先级。
SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20;
升序(ASC)降序(DESC),默认为升序(下小上大)。
SELECT Sco,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;
WHERE子句作用于基本表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno; /*将Student与SC中同一学生的元组连接起来*/
连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.Cno;
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno);
/*也可以使用USING来去掉结果中的重复值:FROM Student LEFT OUTER JOIN SC USING(Sno); */
两个以上的表进行连接。
将一个查询块(SELECT-FROM-WHERE)嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname='刘晨');
子查询的查询条件不依赖于父查询,称为不相关查询。
子查询的查询条件依赖于父查询,称为相关查询。
SELECT Sno,Cno
FROM SC x
WHERE Grade>=(SELECT AVG(Grade) /*某学生的平均成绩*/
FROM SC y
WHERE y.Sno=x.Sno);
内层查询返回的是单个值时,可以用比较运算符代替IN。
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno='1');
并操作(UNION)、交操作(INTERSECT)和差操作(EXCEPT)
SELECT *
FROM Student
WHERE Sdept='CS'
UNION
SELECT *
FROM Student
WHERE Sage<=19;
SELECT Sname
FROM Student,(SELECT Sno FROM SC WHERE Cno='1')AS SC1
WHERE Student.Sno=SC1.Sno;