从学习MySQL开始join的用法都一直弄地不是很清楚,今天重新梳理一遍。
建表
建立老师表(teacher)与学生表(student),一个老师对应多个学生。使用tid做外键。
1 | CREATE TABLE `student` ( |
1 | CREATE TABLE `teacher` ( |
插入数据:
SELECT语句顺序
首先复习一下SELECT语句的编写顺序:
1 | select(distinct) from join on where group by having union order by limit |
CROSS JOIN(笛卡尔积)
笛卡尔积会将两个表强行凭借,不管两表是否有对应关系。也就是说如果A表有m条记录,B表有n条记录,则执行CROSS JOIN后会查出m*n条记录。
1 | SELECT * FROM student (CROSS JOIN) teacher |
1 | id name age tid id name(1) |
七种JOIN理论
左外连接
左外连接:LEFT (OUTER) JOIN,其中OUTER可以省略,是外连接的一种。左外连接会将左边的记录全部显示出来,右表只显示符合条件的记录,右表记录不足
的地方均为空。
1 | SELECT * FROM student s LEFT JOIN teacher t ON s.tid = t.id; |
执行结果:
1 | id name age tid id name(1) |
右外连接
right (outer) join,与左外连接相反,右外连接会将右表所有记录显示出来,左表只显示符合条件的记录。
1 | SELECT * FROM student s RIGHT JOIN teacher t ON s.tid = t.id |
执行结果:
1 | id name age tid id name(1) |
左连接
左连接即左表独有的部分。需要在左外连接的基础上加where语句实现。
1 | SELECT * FROM student s LEFT JOIN teacher t ON s.tid=t.id WHERE t.id IS NULL; |
1 | id name age tid id name(1) |
右连接
与左连接相反,右连接即为右表独有的部分。需要在右外连接的基础上加上where语句实现。
1 | SELECT * FROM student s RIGHT JOIN teacher t ON s.tid=t.id WHERE s.id IS NULL; |
1 | id name age tid id name(1) |
内连接
inner join on,返回符合条件的记录,即返回图中交集。
1 | SELECT * FROM student s INNER JOIN teacher t ON s.tid = t.id; |
1 | id name age tid id name(1) |
全连接
MySQL不提供全连接的关键字,但可通过union联合去重的特性模拟,即联合左外连接与右外连接。
1 | SELECT * FROM student s LEFT JOIN teacher t ON s.tid=t.id UNION |
1 | id name age tid id name(1) |
差集:
差集即两表全连接去除重合部分,可以利用union联合左连接右连接实现。
1 | SELECT * FROM student s LEFT JOIN teacher t ON s.tid=t.id WHERE t.id IS NULL |
1 | id name age tid id name(1) |
参考:
https://www.cnblogs.com/fudashi/p/7491039.html
https://blog.csdn.net/plg17/article/details/78758593
注:文中表格中的空格均表示null