前一段时间在和一个程序员同行闲聊的时候,谈到了MySQL的一些东西。谈完之后他说你对MySQL真是了解啊!我愣了一下,表面故作谦虚说:”where, where!”,实际心里暗暗吃惊:“我勒个去,我才知道一点皮毛啊。。。”。
他说他一直没有弄明白MySQL中的多表联查,特别是对于JOIN、INNER JOIN、LEFT JOIN以及RIGHT JOIN的概念很是模糊。这里就整理一下。
先建立两张表并初始化一点数据:
dancer:
mysql> select * from dancer;
+—-+——-+——+
| id | name | age |
+—-+——-+——+
| 1 | Lily | 22 |
| 2 | PSY | 46 |
| 3 | Jolin | 26 |
+—-+——-+——+
review:
mysql> select * from review;
+—-+———–+——-+
| id | dancer_id | score |
+—-+———–+——-+
| 1 |2 |3 |
| 2 |1 |4 |
| 3 |5 |2 |
+—-+———–+——-+
以上数据的特点就是dancer中的Jolin没有review,而review中的第三条没有对应的dancer。也就是说数据并不是一一对应的,这种情况在实际情况中是一种普遍的存在。
那么现在我要获得dancer以及其review的数据,就可以用JOIN来实现多表联查。
1. JOIN
SELECT d.id, d.name, d.age, r.score FROM dancer AS d JOIN review AS r ON d.id=r.dancer_id;
+—-+——+——+——-+
| id | name | age | score |
+—-+——+——+——-+
| 2 | PSY | 46 |3 |
| 1 | Lily | 22 |4 |
+—-+——+——+——-+
2. INNER JOIN
SELECT d.id, d.name, d.age, r.score FROM dancer AS d INNER JOIN review AS r ON d.id=r.dancer_id;
+—-+——+——+——-+
| id | name | age | score |
+—-+——+——+——-+
| 2 | PSY | 46 |3 |
| 1 | Lily | 22 |4 |
+—-+——+——+——-+
INNER JOIN和JOIN是一样的,会查询出两个表中一一关联的记录,舍去没有对应数据的记录。
3. LEFT JOIN
SELECT d.id, d.name, d.age, r.score FROM dancer AS d LEFT JOIN review AS r ON d.id=r.dancer_id;
+—-+——-+——+——-+
| id | name | age | score |
+—-+——-+——+——-+
| 1 | Lily | 22 |4 |
| 2 | PSY | 46 |3 |
| 3 | Jolin | 26 | NULL |
+—-+——-+——+——-+
LEFT JOIN保留了左边的表dancer的记录,不管右边的表review是否有对应的数据。
4. RIGHT JOIN
SELECT d.id, d.name, d.age, r.score FROM dancer AS d RIGHT JOIN review AS r ON d.id=r.dancer_id;
+——+——+——+——-+
| id | name | age | score |
+——+——+——+——-+
| 2 | PSY | 46 |3 |
| 1 | Lily | 22 |4 |
| NULL | NULL | NULL |2 |
+——+——+——+——-+
RIGHT JOIN就和LEFT JOIN相反。
其实就这么简单。
SQL JOIN
原文链接:
原创文章,作者:筱凯,如若转载,请注明出处:https://www.jingyueyun.com/ask/515.html