当前位置:嗨网首页>书籍在线阅读

08-查询表中的若干记录

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

8.2.5 查询表中的若干记录

1.清除取值重复的行

表中的记录没有重复,但查询后结果可能有相同的行,可以使用关键字DISTINCT来消除重复行。

【范例8-4】

查询学生来自哪些系。

MySQL> select sdept -> from student;

执行上面的语句,结果如下。

+--------+ |sdept | +--------+ | 计算机 | | 计算机 | |经贸 | |信管 | +--------+

查询结果包含重复的系的名称,如果想去掉结果中的重复行,必须使用DISTINCT关键字,SQL语句如下。

MySQL> select distinct sdept -> from student;

执行上面的语句,结果如下。

+--------+ |sdept | +--------+ | 计算机 | |经贸 | |信管 | +--------+

2.查询表中满足条件的记录

在查询过程中,可能只需要查询表中特定的数据,即满足一定条件的数据,该要求可以通过WHERE子句来实现,即在WHERE子句中指出查询的条件。

⑴比较大小。

下表为操作符列表,可用于 WHERE 子句中。下表中实例假定 A为5 、B为10。

Figure-0226-193.jpg 【范例8-5】

查询全体女生的学号和姓名。

mysql> select sno,sname -> from student -> where ssex='女';

结果如下:

+-----+-------+ | sno | sname | +-----+-------+ | 1|刘敏 | | 4|孟欣 | +-----+-------+ 2 rows in set (0.03 sec)

【范例8-6】

查询分数大于80分的学生编号。

MySQL> select distinct sno -> from sc -> where grade>80;

在该查询中需要注意的是,每个学生选修多门课,可能有多门课程的成绩大于80,如果不加DISTINCT关键字,该学生的学号会重复多次,所有要使用DISTINCT来消除重复,结果如下。

+------+ |sno | +------+ | 1| | 2| +------+ 2 rows in set (0.04 sec)

⑵确定范围。

如果查询条件为某字段在或不在某个范围,可以使用谓词BETWEEN…AND或NOT BETWEEN…AND,其中BETWEEN后面为下限,AND后面为上限。

【范例8-7】

查询年龄在20~22岁之间的学生的学号、姓名和性别。

MySQL> select sno,sname,ssex -> from student -> where sage between 20 and 22;

结果如下。

+-----+-------+------+ | sno | sname | ssex | +-----+-------+------+ | 2|周松 |男 | | 3|张明 |男 | | 4|孟欣 |女 | +-----+-------+------+ 3 rows in set (0.03 sec)

⑶带IN关键字的查询。

使用谓词IN来确定查找的字段属于指定的集合记录。

【范例8-8】

查询年龄为18、20、23的学生信息。

MySQL> select * -> from student -> where sage in(18,20,23);

结果如下。

+-----+-------+------+------+-------+ | sno | sname | ssex | sage | sdept | +-----+-------+------+------+-------+ | 3|张明 |男 | 20|经贸 | +-----+-------+------+------+-------+ 1 row in set (0.03 sec)

与之相反,可以使用 NOT IN来查找不属于指定集合的记录。

【范例8-9】

查询年龄不为18、20、23的学生信息。

MySQL> select * -> from student -> where sage not in(18,20,23);

结果如下。

+-----+-------+------+------+--------+ |sno|sname|ssex|sage|sdept | +-----+-------+------+------+--------+ | 1|刘敏 |女 | 19|计算机| | 2|周松 |男 | 21|计算机| | 4|孟欣 |女 | 21|信管 | +-----+-------+------+------+--------+ 3 rows in set (0.00 sec)

⑷带LIKE的字符匹配查询。

可以使用“=”进行精确比较,但如果想查询姓“刘”的同学信息,简单的比较便不适用了。谓词LIKE可以用来进行字符串的匹配,其语法格式如下。

[not] like '<匹配串>' [escape '<换码字符>']

该语法的含义是查找指定的字段值与匹配串相匹配的行的信息。匹配串可以是一个完整的字符串,也可以包含通配符“%”和“_”。

Figure-0229-194.jpg 【范例8-10】

查询姓“张”的学生编号和姓名。

MySQL> select sno,sname -> from student -> where sname like '张%';

姓张,即第1字符为“张”,而“张”后面有多少字符,不确定,所以“张”后面加通配符“%”,结果如下。

+-----+-------+ | sno | sname | +-----+-------+ | 3|张明 | +-----+-------+ 1 row in set (0.00 sec)

【范例8-11】

查询名字中第2个字符为“敏”的学生信息。

MySQL> select * -> from student -> where sname like '_敏%';

题目要求第2个字符为“敏”,即“敏”前面只有一个字符,所以“敏”字符前面加了“_”,而“敏”后面有多少字符,不确定,所以“敏”后面加了通配符“%”,结果如下。

+-----+-------+------+------+--------+ |sno|sname|ssex|sage|sdept | +-----+-------+------+------+--------+ | 1|刘敏 |女 | 19|计算机| +-----+-------+------+------+--------+ 1 row in set (0.00 sec)

若要对通配符的字符进行检验, 可将转义字符放在该字符前面。如果没有指定转义字符,则假设为“\”。

【范例8-12】

查询test表中aa列值以“a_”开头的行的信息。如果查询语句如下。

MySQL> select * -> from test -> where aa like 'a_%';

结果如下。

+-------+------+ |aa |bb | +-------+------+ |a_ddd| 1| |akddd| 2| +-------+------+

like 'a%'这种写法,系统会将“a”后面的“”作为通配符对待,因为上述两行均满足要求。可以使用转移字符将通配符的性质转变,MySQL 默认使用“\”作为通配符。

Figure-0230-195.jpg 【范例8-13】

查询要求正确的写法如下。

MySQL> select * -> from test -> where aa like 'a_%';

结果如下。

+-------+------+ |aa |bb | +-------+------+ |a_ddd| 1| +-------+------+

要指定一个不同的转义字符,可使用ESCAPE语句。

【范例8-14】

另一种查询写法如下。

MySQL> select -> from test -> where aa like 'a_%' escape '*';

(5)查询空值。

在WHERE子句中可以使用IS NULL来查询某字段内容为空的记录。

【范例8-15】

查询先行课为空的课程信息。

MySQL> select * -> from course -> where cpno is null;

结果如下。

MySQL> select * -> from course -> where cpno is null;

【范例8-16】

查询先行课不为空的课程信息。

MySQL> select * -> from course -> where cpno is not null;

结果如下。

+------+----------+------+ |cno |cname |cpno| +------+----------+------+ | 1|数据库 | 4| | 2|操作系统| 3| | 4|数据结构| 2| +------+----------+------+

提示 IS NULL不能换成=NULL,如果换成=NULL,没有语法错误,但结果为空。

(6)多重条件查询。

可以使用逻辑运算符AND或OR来连接多个查询条件。AND的优先级要高于OR,可以使用括号来改变优先级的顺序。

【范例8-17】

查询选修了1号课程并且分数在80分以上的学生编号。

MySQL> select * -> from sc -> where cno=1 and grade>80;

结果如下。

+------+------+-------+ |sno |cno |grade| +------+------+-------+ | 1| 1| 89| +------+------+-------+ 1 row in set (0.09 sec)

【范例8-18】

查询计算机系或经贸系的学生信息。

MySQL> select * -> from student -> where sdept='计算机' or sdept='经贸系';

结果如下。

+-----+-------+------+------+--------+ |sno|sname|ssex|sage|sdept | +-----+-------+------+------+--------+ | 1|刘敏 |女 | 19|计算机| | 2|周松 |男 | 21|计算机| +-----+-------+------+------+--------+ 2 rows in set (0.01 sec)