目录
语句格式
SELECT [ALL|DISTINCT] <目标列表达式>
[,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
选择表中的若干列
例子
查询全体学生的学号与姓名
SELECT Sno,Sname FROM Student
查询表中所有列
在SELECT关键字后面列出所有列名
将<目标列表达式>指定为 *
例子
查询全体学生的详细记录
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
OR
SELECT *
FROM Student;
选择表中的若干元组
消除取值重复的行
如果没有指定DISTINCT关键词,则缺省为ALL
例子
查询选修了课程的学生学号。
SELECT Sno FROM SC;
等价于
SELECT ALL Sno FROM SC;
指定DISTINCT关键词,去掉表中重复的行
SELECT DISTINCT Sno
FROM SC;
查询满足条件的元组
查 询 条 件 |
谓 词 |
比 较 |
=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符 |
确定范围 |
BETWEEN AND,NOT BETWEEN AND |
确定集合 |
IN,NOT IN |
字符匹配 |
LIKE,NOT LIKE |
空 值 |
IS NULL,IS NOT NULL |
多重条件(逻辑运算) |
AND,OR,NOT |
比较大小
例子
查询计算机科学系全体学生的名单
SELECT Sname
FROM Student
WHERE Sdept=‘CS’;
查询所有年龄在20岁以下的学生姓名及其年龄
SELECT Sname,Sage
FROM Student
WHERE Sage < 20;
确定范围
例子
查询年龄在20~23岁(包括20岁和23岁)之间的学生的 姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
查询年龄不在20~23岁之间的学生姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
确定集合
例子
查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( 'IS','MA','CS' );
查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别
SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN ( 'IS','MA','CS' );
字符匹配
例子
匹配串为固定字符串
SELECT *
FROM Student
WHERE Sno LIKE ‘200215121';
查询名字中第2个字为"阳"字的学生的姓名和学号
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE ‘__阳%’;
查询所有不姓刘的学生姓名。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE '刘%';
涉及空值的查询
例子
某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL
查所有有成绩的学生学号和课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
多重条件查询
例子
查询计算机系年龄在20岁以下的学生姓名
SELECT Sname
FROM Student
WHERE Sdept= 'CS' AND Sage<20
查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( 'IS','MA','CS' )
ORDRD BY子句
升序:ASC;降序:DESC;缺省值为升序
当排序列含空值时:
ASC:排序列为空值的元组最后显示
DESC:排序列为空值的元组最先显示
例子
查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
SELECT Sno,Grade
FROM SC
WHERE Cno= ' 3 '
ORDER BY Grade DESC;
查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;
聚集函数
- 计数:COUNT([DISTINCT|ALL] <列名>)
- 计算总和:SUM([DISTINCT|ALL] <列名>)
- 计算平均值:AVG([DISTINCT|ALL] <列名>)
- 计算最大值:MAX([DISTINCT|ALL] <列名>)
- 计算最小值:MIN([DISTINCT|ALL] <列名>)
例子
查询学生总人数
SELECT COUNT(*)
FROM Student;
查询选修了课程的学生人数
SELECT COUNT(DISTINCT Sno)
FROM SC;
计算1号课程的学生平均成绩
SELECT AVG(Grade)
FROM SC
WHERE Cno= '1'
查询选修1号课程的学生最高分数
SELECT MAX(Grade)
FROM SC
WHER Cno= '1';
查询学生200215012选修课程的总学分数
SELECT SUM(Ccredit)
FROM SC, Course
WHER Sno='200215012' AND SC.Cno=Course.Cno;
GROUP BY子句
细化聚集函数的作用对象
- 对查询结果分组后,聚集函数将分别作用于每个组
- 作用对象是查询的中间结果表
- 按指定的一列或多列值分组,值相等的为一组
例子
求各个课程号及相应的选课人数
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
查询选修了3门以上课程的学生学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >3;
HAVING短语与WHERE子句的区别
- 作用对象不同
- WHERE子句作用于基表或视图,从中选择满足条件的元组
- HAVING短语作用于组,从中选择满足条件的组。