MySql基础四之【终篇复杂查询】

读者大大们好呀!!!☀️☀️☀️


博客头像
🔥 欢迎来到我的博客
👀期待大大的关注哦❗️❗️❗️
🚀欢迎收看我的主页文章➡️寻至善的主页

🔥🔥🔥前言

本系列为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班')

在这里插入图片描述
注:

  1. 对于同名字段(例如xh),我们在使用的时候必须加上表名做前缀以示区分,对于非同名字段可以不加表名做前缀,建议初学者都加上以避免不必要的错误;
  2. 当你看到from子句后不止一张表的时候,就要反应出这是在做笛卡尔积运算,会合并成一张大的表,这张大的表里有大量的垃圾数据,需要添加关联条件来消除垃圾数据,常见的关联条件是同名字段关联;
  3. 在联表查询里,通常会给表取别名来简化代码的编写。一旦给表去了别名,那么就要使用别名做字段的前缀,否则报错:

表的内连接与外连接

  • 内连接:【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的复杂查询操作;
但这并不是数据库学习的结束,而是数据库学习的开始!!!

✈️✈️✈️如果喜欢这篇文章的话

🙏大大们可以动动发财的小手:
👉👉👉 点赞:👍收藏:⭐️评论:✍️👈👈👈

  • 68
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻至善

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值