数据库|多表联查

多表联查

✨内联 查询(只有完全满足主键和外键关系的数据才会有结果)

什么是子表,什么是主表?

回答:在表中引用了别的表的主键保持数据的一致性,则该表为子表

非等值联查(笛卡尔积)
select * from student, class 
等值联查( 使用where连接主键 外键)

🌈使用where and连接进行等值查询

where:对表中的所有数据进行一遍筛选

select * from student, class where student.classid = class.classid	

使用五张表进行连表查询

select * from student, class, course, teacher, sc 
where student.classid = class.classid 
and course.Tid = teacher.Tid 
and sc.cid = course.cid
⭐️ ✅题目!查出学过张三张三老师课程的所有学生
select student.* from student, course, teacher, sc 
where course.Tid = teacher.Tid 
and sc.cid = course.cid
and teacher.Tname='张三'

🔥内联查询(1️⃣inner join)

定义:(返回两个表中都满足记录的条件)

1️⃣使用inner join 进行链接

inner join的介绍➡:

用于将两个或多个表中的记录根据某个条件进行匹配,并返回匹配的记录。它只返回那些在两个表中都有匹配的记录

  • 五张表进行联查,使用inner join

    select * from student 
    inner join class on student.classid = class.classid
    inner join sc on student.Sid = sc.Sid
    INNER JOIN course on sc.Cid = course.cid
    inner join teacher on course.Cid = teacher.Tid
    
  • – 每门课程的平均成绩,课程名称,老师名称,平均成绩

-- 每门课程的平均成绩,课程名称,老师名称,平均成绩
select avg(score), course.Cname, teacher.Tname from sc
inner join course on sc.Cid = course.Cid
inner join teacher on course.Tid = teacher.Tid
group by course.Cid

⭐️题目:inner join on和 where 连表查询 哪个好?
  • 非常适合表多,表的数据量不大,笛卡尔积 ,io少,但是内存占用大

  • 浪费内存,效率高✔

    select *from student ,class where student.classid = classid.classid

    and seex = '男'

  • 表少,每张表的数据大,内存占用少,每次拿表都需要判断,io多

  • 通过第一张表的结果进行on的条件匹配,符合条件的放入,不符合则不要了

  • 节省内存,效率低❗

select *from student inner join class on syudent.classid = class.classid where ssex = '男'

🐱‍👤外联查询(2️⃣left join | 3️⃣ right join |4️⃣union)

知道自己,主查什么?

2️⃣left join

3️⃣right join

👀规范:数据量小的表放在左边,之后再判断使用left还是right

  • 每门课的平均成绩,课程名称,老师名字,平均成绩
-- student作为主查询表
select * from student
left join class on student.classid = class.classid

-- class作为主查询表
select * from student
right join class on student.classid = class.classid
  • 所有学生学了多少门课程? 学生名 课程数
select sname, count(cid)  from student
left join sc ON student.Sid = sc.Sid
group by student.Sid
  • – 没有班级的学生
select * from Student 
right join class on class.classid = student.classid
where student.Sid is null

4️⃣UNION(连个结果的并集)

  • 两个表中有重复的则只显示一个名字 ,有去除重复的机制,完全一样才会去重
  • 去除重复distinct一样
  • 不同类型字段可以合并
  • 别名设置,给到第一个结果集才会有用
  • 不同列数量的结果集不允许合并
select sname 姓名, Ssex 性别, classid from student
UNION
select tname, tsex, temail from teacher
  • 没有班级的学生
select * from Student 
left join class on student.classid = class.classid
where class.classid is null
union
没有学生的班级
select * from class 
left join student on student.classid = class.classid
where student.Sid is null
  • 全连接使用了union去重复,获取没有学生的班级和没有班级的学生都有,两者全都要
select * from Student 
left join class on student.classid = class.classid
UNION
-- 没有学生的班级
select * from Student 
right join class on student.classid = class.classid
  • union all不去重 进行查询
select * from Student 
left join class on student.classid = class.classid
UNION all
-- 没有学生的班级
select * from Student 
right join class on class.classid = student.classid
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

银河流浪家007

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

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

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

打赏作者

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

抵扣说明:

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

余额充值