MySQL学习笔记4:MySQL的WHERE与JOIN语句
# 1、前言
学习视频源自:【狂神说Java】MySQL最新教程通俗易懂
B站视频链接:https://www.bilibili.com/video/BV1NJ411J79W
[video(video-4IYyPI1C-1589717216258)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=83395424)(image-https://ss.csdn.net/p?http://i0.hdslb.com/bfs/archive/efacc6aa636d653b8b5c2984988eaed4f428132c.jpg)(title-【狂神说Java】MySQL最新教程通俗易懂)]
笔记为看视频自行撰写,仅限学习交流使用
# 1.1、上一篇文章
MySQL学习笔记3:MySQL的增删改与基本查询语句 (opens new window)
# 5、DQL查询数据
# 5.3、where条件子句
作用:检索数据中符合条件
的值
搜索的条件由一个或者多个表达式组成,结果 布尔值
逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
AND && | a AND b a&&b | 逻辑与,两个都为真,结果为真 |
OR || | a OR b a||b | 逻辑或,一个为真,结果为真 |
NOT ! | NOT a !a | 逻辑非,真为假,假为真 |
尽量使用英文字母
SELECT `studentno`,`studentresult` FROM result
-- 查询考试成绩在95到100分之间的
SELECT `studentno`,`studentresult` FROM result WHERE `studentresult`>=95 AND `studentresult`<=100
-- and &&
SELECT `studentno`,`studentresult` FROM result WHERE `studentresult`>=95 && `studentresult`<=100
-- 模糊查询(区间)
SELECT `studentno`,`studentresult` FROM result WHERE `studentresult` BETWEEN 95 AND 100
-- 除了1000号学生之外的同学的成绩
SELECT `studentno`,`studentresult` FROM result WHERE studentno!=1000
-- != NOT
SELECT `studentno`,`studentresult` FROM result WHERE NOT studentno = 1000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
模糊查询:比较运算符
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a IS NULL | 如果操作符为NULL则结果为真 |
IS NOT NULL | a IS NOT NULL | 如果操作符为NOT NULL则结果为真 |
BETWEEN AND | a BETWEEN b AND c | 若a在b和c之间,则结果为真 |
LIKE | a LIKE b | SQL匹配,如果a匹配b,则结果为真 |
IN | a IN (a1,a2,a3...) | 假设a在a1,a2,a3...其中的某一个值之中,则结果为真 |
-- 查询姓张的同学
-- LIKE结合 %(代表0到任意个字符) _(一个字符)
SELECT `studentno`,`studentname` FROM student WHERE `studentname` LIKE '张%'
-- 查询姓张的同学,名字后面只带一个字的
SELECT `studentno`,`studentname` FROM student WHERE `studentname` LIKE '张_'
-- 查询姓张的同学,名字后面只带两个字的
SELECT `studentno`,`studentname` FROM student WHERE `studentname` LIKE '张__'
-- 查询名字中间有伟字的同学 %伟%
SELECT `studentno`,`studentname` FROM student WHERE `studentname` LIKE '%伟%'
-- IN(具体的一个或多个值)
-- 查询1001,1002,1003号学生信息
SELECT `studentno`,`studentname` FROM student WHERE `studentno` IN (1000,1001,1002)
-- 查询在北京的学生
SELECT `studentno`,`studentname` FROM student WHERE `address` IN ('北京朝阳')
-- NULL NOT NULL
-- 查询地址为空的学生 null ''
SELECT `studentno`,`studentname` FROM student WHERE address IS NULL OR address = ''
-- 查询有出生日期的同学 不为空
SELECT `studentno`,`studentname` FROM student WHERE borndate IS NOT NULL
-- 查询没有出生日期的同学 为空
SELECT `studentno`,`studentname` FROM student WHERE borndate IS NULL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 5.4、联表查询
JOIN 对比
联表查询 JOIN
-- 查询参加了考试的同学(学号、姓名、科目编号、分数)
SELECT * FROM student
SELECT * FROM result
/*思路
1.分析需求,分析查询的字段来自哪个表,(连接查询)
2.确定使用哪种连接查询? 7种
确定交叉点(这两个表哪个数据相同)
判断的条件:学生表中的studentno = 成绩表中的studentno
*/
-- JOIN(连接的表) ON(判断的条件) 连接查询
-- WHERE 等值查询
SELECT s.studentno,studentname,subjectno,studentresult FROM student AS s INNER JOIN result AS r ON s.studentno = r.studentno
-- RIGHT JOIN
SELECT s.studentno,studentname,subjectno,studentresult FROM student s RIGHT JOIN result r ON s.studentno = r.studentno
-- LEFT JOIN
SELECT s.studentno,studentname,subjectno,studentresult FROM student s LEFT JOIN result r ON s.studentno = r.studentno
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
操作 | 描述 |
---|---|
INNER JOIN | 如果表中至少有一个匹配,就返回行 |
LEFT JOIN | 会从左表中返回所有的值,即使右表中没有匹配 |
RIGHT JOIN | 会从右表中返回所有的值,即使左表中没有匹配 |
-- 查询缺考的同学
SELECT s.studentno,studentname,subjectno,studentresult FROM student s LEFT JOIN result r ON s.studentno = r.studentno WHERE studentresult IS NULL
-- 思考题(查询了参加考试的同学信息:学号、学生姓名、科目名称、分数)
/*思路
1.分析需求,分析查询的字段来自哪个表,student、result、subject(连接查询)
2.确定使用哪种连接查询? 7种
确定交叉点(这两个表哪个数据相同)
判断的条件:学生表中的studentno = 成绩表中的studentno
*/
SELECT s.studentno,studentname,subjectname,studentresult
FROM student s
RIGHT JOIN result r
ON s.studentno = r.studentno
INNER JOIN subject sub
ON r.subjectno = sub.subjectno
-- 我要查询哪些数据 SELECT...
-- 从哪几个表中查 FROM 表 XXX JOIN 连接的表 ON 交叉条件
-- 假设存在一种多张表查询,慢慢来,先查询两张表然后再慢慢增加
-- FROM a LEFT JOIN b 以左边表为基准
-- FROM a RIGHT JOIN b 以右边表为基准
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
自连接
USE school;
CREATE TABLE `category`(
`categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id',
`pid` INT (10) NOT NULL COMMENT '父id',
`categoryName` VARCHAR (50) NOT NULL COMMENT '主题名字',
PRIMARY KEY(`categoryid`)
)ENGINE = INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
INSERT INTO `category` (`categoryid`,`pid`,`categoryName`)
VALUES ('2','1','信息技术'),
('3','1','软件开发'),
('4','3','数据库'),
('5','1','美术设计'),
('6','3','web开发'),
('7','5','ps技术'),
('8','2','办公信息')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
自己的表和自己的表连接,核心:一张表拆为两张一样的表即可
父类
categoryid | categoryName |
---|---|
2 | 信息技术 |
3 | 软件开发 |
5 | 美术设计 |
子类
pid | categoryid | categoryName |
---|---|---|
3 | 4 | 数据库 |
2 | 8 | 办公信息 |
3 | 6 | web开发 |
5 | 7 | ps技术 |
操作:查询父类对应的子类关系
父类 | 子类 |
---|---|
信息技术 | 办公信息 |
软件开发 | 数据库 |
软件开发 | web开发 |
美术设计 | ps技术 |
-- 查询父子信息:把一张表看为两个一模一样的表
SELECT a.`categoryName` AS '父栏目',b.`categoryName` AS ‘子栏目’
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.`pid`
-- 查询学员所属的年纪(学号、学生姓名、年纪名称)
SELECT studentno,studentname,gradename
FROM student s
INNER JOIN grade g
ON s.gradeid = g.gradeid
-- 查询科目所属的年级(科目名称,年纪名称)
SELECT subjectname,gradename
FROM subject sub
INNER JOIN grade g
ON sub.gradeid = g.gradeid
-- 思考题(查询了参加高等数学-1考试的同学信息:学号、学生姓名、科目名称、分数)
SELECT s.studentno,studentname,subjectname,studentresult
FROM student s
INNER JOIN result r
ON s.studentno = r.studentno
INNER JOIN subject sub
ON r.subjectno = sub.subjectno
WHERE subjectname = '高等数学-1'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
编辑 (opens new window)
上次更新: 2022/08/26, 15:52:02