hi mate, lets recall the bloody “JOIN“

补补数据库基础

上图中,表A的记录是123,表B的记录是ABC,颜色表示匹配关系。返回结果中,如果另一张表没有匹配的记录,则用null填充。

注意:多表连接查询会比直接使用自带的API查询表中的一个属性,再根据属性查询另一个表,一个一个查询来得快。所以,我们要善用多表连接查询。

举个例子:

学生表:


s_id:学生学号
s_name:学生名称
s_class:学生班级

老师表:


t_id:老师id
t_class:老师管理的班级
t_name:老师名称

内连接(INNER JOIN)

内连接:,,JOIN,INNER JOIN
如果输入JOIN,那么默认就是INNER JOIN内连接

/* 内连接 */
SELECT * FROM student INNER JOIN teacher ON s_class=t_class
 
/* 我比较喜欢这种,但是上面那种效率会更高,因为 JOIN 的优先级高于 逗号,,所以如果可以的话,尽量使用上面的 */
SELECT * FROM student,teacher WHERE s_class=t_class

补充:
在使用 join 时,on 和 where 条件的区别如下:
1、on 条件是在生成临时表时使用的条件,它不管 on 上的条件是否为真都会返回 left 或 right 表中的记录,full 则具有 left 和 right 的特性的并集。
2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边或者右边表的记录)了,条件不为真的就全部过滤掉。

而 inner jion 没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。

 外连接(OUTERJOIN)

        左外连接(LEFT JOIN)

左外连接:LEFT JOIN,LEFT OUTER JOIN
/* 左连接 */
SELECT * FROM student LEFT JOIN teacher ON s_class=t_class

         右外连接(RIGHT JOIN)

右外连接:RIGHT JOIN,RIGHT OUTER JOIN
/* 右连接 */
SELECT * FROM student RIGHT JOIN teacher ON s_class=t_class

 全外连接(FULL JOIN) 

全外连接:FULL JOIN,FULL OUTER JOIN

注意:Oracle数据库支持full join,mysql是不支持full join的,但仍然可以同过左外连接+union+右外连接实现。 

/* 全连接(不适用于MYSQL) */
SELECT * FROM student FULL JOIN teacher ON s_class=t_class
 
/* 全连接 */
SELECT * FROM student LEFT JOIN teacher ON s_class=t_class
UNION
SELECT * FROM student RIGHT JOIN teacher ON s_class=t_class

 交叉连接(笛卡尔积)(CROSS JOIN)

笛卡尔积:对所有元素一一映射,排列组合

/* 交叉连接 */
SELECT * FROM student CROSS JOIN teacher 

自链接 

 

自连接作为一种特例,可以将一个表与它自身进行连接,称为自连接。
若要在一个表中查找具有相同列值的行,则可以使用自连接
使用自连接时需为表指定两个别名,且对所有列的引用均要用别名限定。

SELECT a.学号, a.课程号, b.课程号, a.成绩
 FROM student a  JOIN  student b 
   ON  a.成绩=b.成绩 AND  a.学号=b.学号 AND  a.课程号!=b.课程号

 

REFERENCE:

【SQL】JOIN 连接:内连接、外连接、交叉连接、自连接、等值连接、自然连接 - Nemo& - 博客园

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

董厂长

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

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

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

打赏作者

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

抵扣说明:

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

余额充值