MySql 多表查询

多表查询必然要用到多表关联

多表关联 分三类:

A:内部连接  join  或inner join

B:外部链接  外部连接又分为两类   :左外连接 left join 和右外连接 right join

C:交叉连接 cross  join 

以下 举例说明  有两张表

格 一张学生的   一张老师的  一张中间表的

 

 

 

一、内部链接 应用场景 

 

 

 这种条件下是得到 A B  共同的数据 同时满足AB 的条件   称之为内部连接

代码 是 :

SELECT *FROM stu_tea st JOIN student s ON st.学生=s.name

结果是:

 

   

 

从表中清楚 看出,studnet表中的信息会按照规定的规则(中间表中的“学生字段”=student表中的name 字段)拼接在关联的后面,并且仔细看 可以发现 少了学生陈建和李涛的信息,因为陈建和李涛这两个学生在两个表中并不同时存在

 

如果要对结果表中的学生和name重复的 只显示一行,可以对代码以下处理

SELECT st.`学生`,st.`老师`,s.`birth`FROM stu_tea st JOIN student s ON st.学生=s.name

结果如下:

还可以对s.birth中文化处理,在后面加上别名显示:

SELECT st.`学生`,st.`老师`,s.`birth` '生日' FROM stu_tea st JOIN student s ON st.学生=s.name

结果如下:

注意:以上代码中的中文字段,加不加引号都可以,系统一般默认加单引号;

 

二、外部链接 应用场景 

左外连接

这种场景是得到A的所有数据和B满足一定条件的部分数据

 

代码是:SELECT *FROM stu_tea st LEFT JOIN student s ON st.`学生`=s.`name`

结果为:

    

从表中可以看出,左外连接完全以左边的中间表为模板,学生表接在中间标的后面,,没有数据用null补齐,学生表有的而中间表没有的数据则不会显示

 对以上结果,还可以用where 从句 进一步筛选

 比如要去掉没有学生信息的数据:SELECT *FROM stu_tea st LEFT JOIN student s ON st.`学生`=s.`name` WHERE s.`name`IS NOT NULL 

结果是:

我们还查询一下,去掉了哪些学生信息:SELECT *FROM stu_tea st LEFT JOIN student s ON st.`学生`=s.`name` WHERE s.`name`IS NULL 

结果是:

注意:MySQL 只能用 is 不能用”=“

右外连接

这种场景是得到B的所有数据和A满足一定条件的部分数据

 右外部连接与左外部连接 完全相反,不具体介绍

 

 

三、交叉连接

 实际应用中还有这样一种情形,想得到A,B记录的排列组合,即笛卡儿积,这个就不好用集合和元素来表示了。需要用到cross join

代码是:SELECT *FROM stu_tea st CROSS JOIN student

结果是:

 

 可以发现student表中一共有5行数据 ,stu_tea表中 有12行数据,60=12*5;

此代码也可以写成SELECT *FROM stu_tea st  JOIN student

 

注意事项:

1.连接表格使用的是逗号,会被解释为交叉连接;

即SELECT *FROM stu_tea st,student   SELECT *FROM stu_tea st  JOIN student      SELECT *FROM stu_tea st CROSS JOIN student  是等价的

2.一般内连接都需要加上on限定条件,如果不加会被解释为交叉连接

3.一般交叉连接(, cross join join 都可以)后面加上where条件,也可以写成on

转载于:https://www.cnblogs.com/shilei182/p/7274981.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值