MySQL学习笔记4:MySQL的WHERE与JOIN语句

1、前言

学习视频源自:【狂神说Java】MySQL最新教程通俗易懂

B站视频链接:https://www.bilibili.com/video/BV1NJ411J79W

【狂神说Java】MySQL最新教程通俗易懂

笔记为看视频自行撰写,仅限学习交流使用

1.1、上一篇文章

MySQL学习笔记3:MySQL的增删改与基本查询语句

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

模糊查询:比较运算符

运算符语法描述
IS NULLa IS NULL如果操作符为NULL则结果为真
IS NOT NULLa IS NOT NULL如果操作符为NOT NULL则结果为真
BETWEEN ANDa BETWEEN b AND c若a在b和c之间,则结果为真
LIKEa LIKE bSQL匹配,如果a匹配b,则结果为真
INa 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
5.4、联表查询

JOIN 对比

image-20200527201103643

u=4057843062,2771292381&fm=26&gp=0

联表查询 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
操作描述
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  以右边表为基准

自连接

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','办公信息')

自己的表和自己的表连接,核心:一张表拆为两张一样的表即可

父类

categoryidcategoryName
2信息技术
3软件开发
5美术设计

子类

pidcategoryidcategoryName
34数据库
28办公信息
36web开发
57ps技术

操作:查询父类对应的子类关系

父类子类
信息技术办公信息
软件开发数据库
软件开发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'
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值