「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」
在上篇文章: 使用SQL插入数据、查询数据——MySQL数据库学习笔记(三) 中。
我们通过SQL的INSERT INTO
语句为学生表(Student)、课程表(Course)以及学生选修课表(SC)插入了一些数据,以供我们来学习SQL的SELECT语句。然后我们又学习一些简单的SELECT查询语句。
本篇文章将继续学习SELECT语句的更多使用方法。
SELECT语句
去除相同的行DISTINCT
1.在选课(SC)表中查询哪些学生选修了课程,列出选课学生的学号。
SELECT Sno FROM SC;
从查询结果可以看到有很多重复的学号,这是因为一个学生他可以选择多门课程,所以学号就会重复多次。
这时我们就需要去除重复的数据,因为重复的数据是没有意义的。
我们通过SQL的DISTINCT关键字来去掉查询结果中的重复数据。加上DISTINCT关键字的SQL语句:
SELECT DISTINCT Sno FROM SC;
可以发现,重复的数据不见了。
查询条件
查询条件一般是通过WHERE
关键字来表示。
常用的查询条件有以下:
查询条件 | 关键字 |
---|---|
比较运算符 | =,>,>=,<,<=,<>(或!=),NOT |
范围 | BETWEEN, AND, NOT BETWEEN AND |
集合 | IN, NOT IN |
字符匹配 | LIKE, NOT LIKE |
空值 | IS NULL, IS NOT NULL |
多条件 | AND, OR |
正则表达式(MySQL) | REGEXP, NOT REGEXP |
下面通过一些例子来看他们的使用效果:
2.查询计算机系所有学生的姓名
SELECT Sname FROM Student WHERE Sdept = '计算机系';
3.查询所有年龄在20岁以下的学生的姓名和年龄
SELECT Sname, Sage FROM Student WHERE Sage < 20;
4.查询考试成绩有不及格的学生的学号。
因为一个学生有多门课程不及格时,应该只出现一次学号,所以应该使用DISTINCT
来去除重复的数据。
SELECT DISTINCT Sno FROM SC WHERE Grade < 60;
5.查询年龄正在20~23岁之间的学生的姓名、所在系和年龄。
SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23;
或者使用
SELECT Sname, Sdept, Sage FROM Student WHERE Sage >= 20 AND Sage <= 23;
6.查询年龄不在20~23岁之间的学生的姓名、所在系和年龄。
SELECT Sname, Sdept, Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;
或者使用
SELECT Sname, Sdept, Sage FROM Student WHERE Sage < 20 OR Sage > 23;
7.查询信息系、数学系和计算机系学生的姓名和性别。
SELECT Sname, Ssex FROM Student WHERE Sdept IN ('信息系', '数学系', '计算机系');
或者使用
SELECT Sname, Ssex FROM Student WHERE Sdept = '信息系' OR Sdept = '数学系' OR Sdept = '计算机系';
8.查询既不是信息系、数学系,也不是计算机系的学生姓名和性别。
SELECT Sname, Ssex FROM Student WHERE Sdept NOT IN ('信息系', '数学系', '计算机系');
或者使用
SELECT Sname, Ssex FROM Student WHERE Sdept != '信息系' AND Sdept != '数学系' AND Sdept != '计算机系';
由于没有满足条件的数据,所以没有返回任何的数据。
LIKE运算符
LIKE运算符的使用方式一般如下:
[NOT] LIEK <匹配串>
在匹配串中可以包含字符常量,也可以包含如下4种通配符:
- _(下划线):匹配任意一个字符
- %(百分号):匹配0个或多个字符
下面我们通过例子还学习他们。
9.查询姓“张”的学生的详细信息。
SELECT * FROM Student WHERE Sname LIKE '张%';
MySQL的REGEXP正则匹配方式
通过REGEXP我们可以通过正则表达式来筛选数据。
以下是可用于随REGEXP操作符的表的模式。
10.查询学生表中姓“张”、“李”、“刘”的学生详细信息。
SELECT * FROM Student WHERE Sname REGEXP '^(张|李|刘).+$';
或者使用LIKE实现:
SELECT * FROM Student WHERE Sname LIKE '张%' OR Sname LIKE '李%' OR Sname LIKE '刘%';
11.查询学生表中所有不姓“张”、“李”的学生详细信息。
SELECT * FROM Student WHERE Sname NOT REGEXP '^(王|张).+$';
或者使用LIKE实现:
SELECT * FROM Student WHERE Sname NOT LIKE '王%' AND Sname NOT LIKE '张%';
12.查询姓“王”且名字只有2个字的学生信息。
SELECT * FROM Student WHERE Sname LIKE '王_';
13.查询姓“王”且名字只有3个字的学生信息。
SELECT * FROM Student WHERE Sname LIKE '王__';
14.查询没有考试成绩的学生学号和课程号。
SELECT Sno, Cno FROM SC WHERE Grade IS NULL;
15.查询所有有考试成绩的学生学号和课程号。
SELECT Sno, Cno FROM SC WHERE Grade IS NOT NULL;
结尾
本篇文章主要使用了DISTINCT关键字对数据去重,以及下面各种常用运算符的应用:
查询条件 | 关键字 |
---|---|
比较运算符 | =,>,>=,<,<=,<>(或!=),NOT |
范围 | BETWEEN, AND, NOT BETWEEN AND |
集合 | IN, NOT IN |
字符匹配 | LIKE, NOT LIKE |
空值 | IS NULL, IS NOT NULL |
多条件 | AND, OR |
正则表达式(MySQL) | REGEXP, NOT REGEXP |
下篇文章将介绍更多SELECT语句查询数据的更多用法。