使用SELECT的WHERE条件查询数据——MySQL数据库学习笔记(四)

292 阅读4分钟

「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战

在上篇文章: 使用SQL插入数据、查询数据——MySQL数据库学习笔记(三) 中。

我们通过SQL的INSERT INTO语句为学生表(Student)、课程表(Course)以及学生选修课表(SC)插入了一些数据,以供我们来学习SQL的SELECT语句。然后我们又学习一些简单的SELECT查询语句。

本篇文章将继续学习SELECT语句的更多使用方法。

SELECT语句

去除相同的行DISTINCT

1.在选课(SC)表中查询哪些学生选修了课程,列出选课学生的学号。

SELECT Sno FROM SC;

image.png

从查询结果可以看到有很多重复的学号,这是因为一个学生他可以选择多门课程,所以学号就会重复多次。

这时我们就需要去除重复的数据,因为重复的数据是没有意义的。

我们通过SQL的DISTINCT关键字来去掉查询结果中的重复数据。加上DISTINCT关键字的SQL语句:

SELECT DISTINCT Sno FROM SC;

image.png

可以发现,重复的数据不见了。

查询条件

查询条件一般是通过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 = '计算机系';

image.png

3.查询所有年龄在20岁以下的学生的姓名和年龄

SELECT Sname, Sage FROM Student WHERE Sage < 20;

image.png

4.查询考试成绩有不及格的学生的学号。

因为一个学生有多门课程不及格时,应该只出现一次学号,所以应该使用DISTINCT来去除重复的数据。

SELECT DISTINCT Sno FROM SC WHERE Grade < 60;

image.png

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;

image.png

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;

image.png

7.查询信息系、数学系和计算机系学生的姓名和性别。

SELECT Sname, Ssex FROM Student WHERE Sdept IN ('信息系', '数学系', '计算机系');

或者使用

SELECT Sname, Ssex FROM Student WHERE Sdept = '信息系' OR Sdept = '数学系' OR Sdept = '计算机系';

image.png

8.查询既不是信息系、数学系,也不是计算机系的学生姓名和性别。

SELECT Sname, Ssex FROM Student WHERE Sdept NOT IN ('信息系', '数学系', '计算机系');

或者使用

SELECT Sname, Ssex FROM Student WHERE Sdept != '信息系' AND Sdept != '数学系' AND Sdept != '计算机系';

image.png

由于没有满足条件的数据,所以没有返回任何的数据。

LIKE运算符

LIKE运算符的使用方式一般如下:

[NOT] LIEK <匹配串>

在匹配串中可以包含字符常量,也可以包含如下4种通配符:

  • _(下划线):匹配任意一个字符
  • %(百分号):匹配0个或多个字符

下面我们通过例子还学习他们。

9.查询姓“张”的学生的详细信息。

SELECT * FROM Student WHERE Sname LIKE '张%';

image.png

MySQL的REGEXP正则匹配方式

通过REGEXP我们可以通过正则表达式来筛选数据。

以下是可用于随REGEXP操作符的表的模式。

10.查询学生表中姓“张”、“李”、“刘”的学生详细信息。

SELECT * FROM Student WHERE Sname REGEXP '^(张|李|刘).+$';

或者使用LIKE实现:

SELECT * FROM Student WHERE Sname LIKE '张%' OR Sname LIKE '李%' OR Sname LIKE '刘%';

image.png

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 '王_';

image.png

13.查询姓“王”且名字只有3个字的学生信息。

SELECT * FROM Student WHERE Sname LIKE '王__';

image.png

14.查询没有考试成绩的学生学号和课程号。

SELECT Sno, Cno FROM SC WHERE Grade IS NULL;

image.png

15.查询所有有考试成绩的学生学号和课程号。

SELECT Sno, Cno FROM SC WHERE Grade IS NOT NULL;

image.png

结尾

本篇文章主要使用了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语句查询数据的更多用法。