② 确定范围
谓词 BETWEEN…AND…
和NOT BETWEEN…AND…
可以用来查找属性值在(或不在)指定范围内的元组,其中 BETWEEN后是范围的下限(即低值),AND后是范围的上限(即高值)。
查询的结果包含下限和上限。
[ 例 3.25 ] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别、年龄
SELECT Sname, Sdept, Sage FROM mydb.Student WHERE Sage BETWEEN 20 AND 23;
[ 例 3.26 ] 查询年龄不在20~23岁(包括20岁和23岁)之间的学生的姓名、系别、年龄
SELECT Sname, Sdept, Sage FROM mydb.Student WHERE Sage NOT BETWEEN 20 AND 23;
③确定集合
谓词IN
可以用来查找属性值数据指定集合的元组,NOT IN
可以用于查找属性值不在指定集合的元组。
[ 例 3.27 ] 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别
SELECT Sname, Ssex FROM mydb.Student WHERE Sdept IN ( 'IS', 'MA', 'CS' );
[ 例 3.28 ] 查询不是信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别
SELECT Sname, Ssex FROM mydb.Student WHERE Sdept NOT IN ( 'IS', 'MA', 'CS' );
④ 字符匹配
LIKE
可以用于字符串匹配,可以进行完全匹配,也可以进行模糊匹配。
%
代表任意长度的字符串_
代表任意单个字符
例:查询学号为201215121的学生的详细情况
SELECT * FROM mydb.Student WHERE Sno LIKE '201215121'; SELECT * FROM mydb.Student WHERE Sno = '201215121';
如果LIKE
后面的匹配串中不含通配符,可以使用=
代替LIKE
,使用!=
或<>
代替NOT LIKE
。
例:查询所有姓刘学生的姓名、学号和性别
SELECT Sname, Sno, Ssex FROM mydb.Student WHERE Sname LIKE '刘%';
例:查询姓"欧阳"且全名为三个汉字的学生的姓名
SELECT Sname FROM mydb.Student WHERE Sname LIKE '欧阳_';
注意:数据库字符为ASCII,一个汉字需要两个_;如果为GBK只要一个。
例:查询名字中第2个字为"阳"字的学生的姓名和学号
SELECT Sname, Sno FROM mydb.Student WHERE Sname LIKE '_阳%';
例:查询所有不姓刘的学生姓名
SELECT Sname FROM mydb.Student WHERE Sname NOT LIKE '刘%';
如果查询的字符串本身就有通配符%
或_
,需要使用ESCAPE
指定转义符号,默认为\
。
SELECT Sname FROM mydb.Student WHERE Sname LIKE '\_%';
SELECT Sname FROM mydb.Student WHERE Sname LIKE '$_%' ESCAPE '$';
⑤ 涉及空值的查询
例:某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号
SELECT Sno, Cno FROM mydb.SC WHERE Grade IS NULL;
注意 IS 不能用 = 进行代替。
例:查所有有成绩的学生学号和课程号
SELECT Sno, Cno FROM mydb.SC WHERE Grade IS NOT NULL;
⑥ 多重条件查询
逻辑运算符 AND
OR
可以用来连接多个查询条件,AND
的优先级高于OR
。
例:查询计算机系年龄在20岁以下的学生姓名
SELECT Sname FROM mydb.Student WHERE Sdept = 'CS' AND Sage<20;
IN
谓词实际上是多个OR
运算符的缩写
例:查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别
SELECT Sname, Ssex FROM mydb.Student WHERE Sdept = 'IS' OR Sdept = 'MA' OR Sdept = 'CS'; # 等价于 SELECT Sname, Ssex FROM mydb.Student WHERE Sdept IN ( 'IS', 'MA', 'CS' );
3. ORDER BY 子句
可以使用ORDER BY
子句对查询结果按照一个或多个属性列的升序(ASC
)或降序(DESC
)排序,默认为升序。
例:查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列
SELECT Sno, Grade FROM mydb.SC WHERE Cno = '3' ORDER BY Grade DESC ;
例:查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
SELECT * FROM mydb.Student ORDER BY Sdept ASC , Sage DESC ;
对于空值,排序时显示的次序由具体系统实现来决定。 例如按升序排,含空值的元组最后显示;按降序排,空值的元组则最先显示。各个系统的实现可以不同,只要保持一致就行。
mysql中升序,空值最先显示;降序,空值最后显示。
在SC表中插入一条成绩为空的新数据
SELECT Sno, Grade FROM SC WHERE Cno = '3' ORDER BY Grade ASC ;
SELECT Sno, Grade FROM SC WHERE Cno = '3' ORDER BY Grade DESC ;