MySQL多表联查
前一段时间在和一个程序员同行闲聊的时候,谈到了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 reviewAS 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 JOINreview 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 JOINreview 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 JOINreview 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相反。
其实就这么简单。

浙公网安备 33010602011771号