🔥🔥🔥前言
本系列为MySql基础,将分为四篇来进行对MYSQL的了解与操作第一篇为对MySQL的了解与DBeaver操作MySQL;第二篇为MySQL增删改查第三篇为MySQL的单表查询操作;第四篇为MYSQL的复杂查询操作;
本篇为第四篇MySQL的复杂查询的了解,前篇我们了解了单表查询的相关操作,这篇将学习子查询与多表联查,快来一探究竟吧
前期准备:导入表如下图所示:
🚀子查询
嵌在大的查询里的小的查询称之为子查询。
查询嵌套,指的是select句子(父查询)里面包含select句子(子查询)。
例如:
1️⃣查询KING所在部门的所有员工姓名与员工编号
本查询所用的表为:emp
思路:两步走:
第一步:找出KING所在部门
第二步:查询该部门的员工姓名与员工编号
select ename,empno from emp where deptno =(select deptno from emp where ename='KING');
2️⃣查询JAVA语言这门课程的平均成绩
本查询所用表:kcb,cjb
思路:两步走:
第一步、在课程表中查出Java课程对应的序号
第二步、根据序号做平均成绩
select avg(cj) from cjb where kch=(select kch from kcb where kcm='java语言')
3️⃣查询一班张三的数据库的成绩
本查询所用表:xsb,kcb,cjb
思路:三步走:
1、查询一班张三的学号
2、查询数据库的课程号
3、查询成绩表成绩
select cj from cjb where kch =(select kch from kcb where kcm='数据库') and xh =(select xh from xsb where bj='1班' and xm='张三');
注:
(1)子查询要用小括号括起来;
(2)子查询最常见的用法是用在where子句里做条件的一部分;
(3)如果子查询返回多个值,做等值比较的时候要用in,不能用=,否则报错。
🚀联表查询
在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,即关联查询。
1️⃣通过笛卡尔积来连接表
在SQL里,from xsb,cjb 做了笛卡尔积运算,生成了一张大的表
select * from xsb,cjb;
2️⃣清除非关联的数据
select * from kcb,cjb where kcb.kch = cjb.kch; select * from kcb inner join cjb on kcb.kch = cjb.kch;
3️⃣查询1班和2班学员的学号、姓名、选修的课程号、成绩:
select x.xh,x.xm,c.kch,c.cj from xsb x,cjb c where x.xh=c.xh and x.bj in('1班','2班')
注:
- 对于同名字段(例如xh),我们在使用的时候必须加上表名做前缀以示区分,对于非同名字段可以不加表名做前缀,建议初学者都加上以避免不必要的错误;
- 当你看到from子句后不止一张表的时候,就要反应出这是在做笛卡尔积运算,会合并成一张大的表,这张大的表里有大量的垃圾数据,需要添加关联条件来消除垃圾数据,常见的关联条件是同名字段关联;
- 在联表查询里,通常会给表取别名来简化代码的编写。一旦给表去了别名,那么就要使用别名做字段的前缀,否则报错:
表的内连接与外连接
- 内连接:【inner】 join 返回的是满足关联条件的数据集
- 外连接:展示某个表的完整数据不仅仅是满足关联条件的数据集:
left join展示连接左表
right join展示连接右表
union 并集(因为MYSQL不能用full join所以就是去左连接和右连接的并集)展示全连接表
查询全部学员的学号,姓名,选修的课程号和成绩(学生表完整展示)。
select x.xh,x.xm,cjb.kch,cjb.cj from xsb x join left cjb c on x.xh=c.xh
查询全部学员的学号,姓名,选修的课程号和成绩(两表都完整展示)
为了体现出效果,先在cjb里插入含有空学号的值:
insert into cjb(xh,kch,cj)values(null,'02','80'):
再全连接查询:
select x.xh,x.xm,c.kch,c.cj from xsb x left join cjb c on x.xh=c.xh union select x.xh,x.xm,c.kch,c.cj from xsb x right join cjb c on x.xh=c.xh;
三表连接
分页查询
限制展示的记录数量
关键字:limit
🚀相关报错处理
1️⃣已经创建了数据库又创建同名的数据库:
2️⃣创建表前没有use数据库
3️⃣构成主外键的两张表,不能先删主表
4️⃣使用子查询时,子查询返回多个值要用in而不能用=号
5️⃣联合查询时,两个表都有的相同属性值(列)需要加表前缀名
⭐️⭐️⭐️总结
四篇MYSQL基础训练结束了,从第一篇的MySQL的了解与DBeaver操作MySQL;到第二篇的MySQL增删改查再到第三篇的MySQL的单表查询操作;最后第四篇的MYSQL的复杂查询操作;
但这并不是数据库学习的结束,而是数据库学习的开始!!!