八、MySQL基础系列笔记之SQL DQL7种连接查询

作者: 温新

分类: 【MySql】

阅读: 3097

时间: 2020-10-11 06:57:45

连接是关系数据库模型的主要特点。

连接查询是关系数据库中最主要的查询,包含内连接、外连接等。

准备工作

新建2张表,数据如下

mysql> select * from user;
+----+-----------+------------------+
| id | name      | email            |
+----+-----------+------------------+
|  1 | 李四      | 123456@qq.com    |
|  2 | 王五      | 124568@qq.com    |
|  3 | 张三      | zhangsan@163.com |
|  4 | 王美丽    | meili@163.com    |
|  5 | 你真帅    | 7788641@qq.com   |
|  6 | 刘一      | liuyi@163.com    |
|  7 | 陈二      | 782372340@qq.com |
|  8 | 吴九      | 8193730-@qq.com  |
+----+-----------+------------------+
8 rows in set (0.00 sec)

mysql> select * from info;
+----+---------+-----------+
| id | user_id | hobby     |
+----+---------+-----------+
|  1 |       1 | 篮球      |
|  2 |       4 | 乒乓球    |
|  3 |       2 | 排球      |
|  4 |       6 | 棒球      |
|  5 |       3 | 溜溜球    |
|  6 |       9 | 足球      |
+----+---------+-----------+
6 rows in set (0.00 sec)

笛卡尔积

将出现48条记录,由于太长,不列出。

mysql> select * from user,info;

inner join - 内连接查询

inner join查询交集,也就是两表公有部分结果集。

mysql> select * from user as a inner join info as b on a.id = b.user_id;
+----+-----------+------------------+----+---------+-----------+
| id | name      | email            | id | user_id | hobby     |
+----+-----------+------------------+----+---------+-----------+
|  1 | 李四      | 123456@qq.com    |  1 |       1 | 篮球      |
|  4 | 王美丽    | meili@163.com    |  2 |       4 | 乒乓球    |
|  2 | 王五      | 124568@qq.com    |  3 |       2 | 排球      |
|  6 | 刘一      | liuyi@163.com    |  4 |       6 | 棒球      |
|  3 | 张三      | zhangsan@163.com |  5 |       3 | 溜溜球    |
+----+-----------+------------------+----+---------+-----------+

left join - 左连接查询

left join 返回左表中所有的记录和右表中与连接字段相等的记录,右表中没有的记录补null。

mysql> select * from user as a left join info as b on a.id = b.user_id;
+----+-----------+------------------+------+---------+-----------+
| id | name      | email            | id   | user_id | hobby     |
+----+-----------+------------------+------+---------+-----------+
|  1 | 李四      | 123456@qq.com    |    1 |       1 | 篮球      |
|  4 | 王美丽    | meili@163.com    |    2 |       4 | 乒乓球    |
|  2 | 王五      | 124568@qq.com    |    3 |       2 | 排球      |
|  6 | 刘一      | liuyi@163.com    |    4 |       6 | 棒球      |
|  3 | 张三      | zhangsan@163.com |    5 |       3 | 溜溜球    |
|  5 | 你真帅    | 7788641@qq.com   | NULL |    NULL | NULL      |
|  7 | 陈二      | 782372340@qq.com | NULL |    NULL | NULL      |
|  8 | 吴九      | 8193730-@qq.com  | NULL |    NULL | NULL      |
+----+-----------+------------------+------+---------+-----------+
8 rows in set (0.00 sec)

right join - 右连接查询

right join 返回右表中所有的记录和左表中与连接字段相等的记录,左表中没有的记录补null。

mysql> select * from user as a right join info as b on a.id = b.user_id;
+------+-----------+------------------+----+---------+-----------+
| id   | name      | email            | id | user_id | hobby     |
+------+-----------+------------------+----+---------+-----------+
|    1 | 李四      | 123456@qq.com    |  1 |       1 | 篮球      |
|    4 | 王美丽    | meili@163.com    |  2 |       4 | 乒乓球    |
|    2 | 王五      | 124568@qq.com    |  3 |       2 | 排球      |
|    6 | 刘一      | liuyi@163.com    |  4 |       6 | 棒球      |
|    3 | 张三      | zhangsan@163.com |  5 |       3 | 溜溜球    |
| NULL | NULL      | NULL             |  6 |       9 | 足球      |
+------+-----------+------------------+----+---------+-----------+
6 rows in set (0.00 sec)

left join b.key is null 查询左表度有部分

mysql> select * from user as a left join info as b on a.id = b.user_id where b.user_id is null;
+----+-----------+------------------+------+---------+-------+
| id | name      | email            | id   | user_id | hobby |
+----+-----------+------------------+------+---------+-------+
|  5 | 你真帅    | 7788641@qq.com   | NULL |    NULL | NULL  |
|  7 | 陈二      | 782372340@qq.com | NULL |    NULL | NULL  |
|  8 | 吴九      | 8193730-@qq.com  | NULL |    NULL | NULL  |
+----+-----------+------------------+------+---------+-------+
3 rows in set (0.00 sec)

right join a.key is null查询右表独有

mysql> select * from user as a right join info as b on a.id = b.user_id where a.id is null;
+------+------+-------+----+---------+--------+
| id   | name | email | id | user_id | hobby  |
+------+------+-------+----+---------+--------+
| NULL | NULL | NULL  |  6 |       9 | 足球   |
+------+------+-------+----+---------+--------+
1 row in set (0.00 sec)

全连接查询

mysql> select * from user as a left join info as b on a.id = b.user_id
    -> union
    -> select * from user as a right join info as b on a.id = b.user_id;
+------+-----------+------------------+------+---------+-----------+
| id   | name      | email            | id   | user_id | hobby     |
+------+-----------+------------------+------+---------+-----------+
|    1 | 李四      | 123456@qq.com    |    1 |       1 | 篮球      |
|    4 | 王美丽    | meili@163.com    |    2 |       4 | 乒乓球    |
|    2 | 王五      | 124568@qq.com    |    3 |       2 | 排球      |
|    6 | 刘一      | liuyi@163.com    |    4 |       6 | 棒球      |
|    3 | 张三      | zhangsan@163.com |    5 |       3 | 溜溜球    |
|    5 | 你真帅    | 7788641@qq.com   | NULL |    NULL | NULL      |
|    7 | 陈二      | 782372340@qq.com | NULL |    NULL | NULL      |
|    8 | 吴九      | 8193730-@qq.com  | NULL |    NULL | NULL      |
| NULL | NULL      | NULL             |    6 |       9 | 足球      |
+------+-----------+------------------+------+---------+-----------+
9 rows in set (0.00 sec)

单a与独b查询

mysql> select * from user as a left join info as b on a.id = b.user_id where b.user_id is null
    -> union
    -> select * from user as a right join info as b on a.id = b.user_id where a.id is null;
+------+-----------+------------------+------+---------+--------+
| id   | name      | email            | id   | user_id | hobby  |
+------+-----------+------------------+------+---------+--------+
|    5 | 你真帅    | 7788641@qq.com   | NULL |    NULL | NULL   |
|    7 | 陈二      | 782372340@qq.com | NULL |    NULL | NULL   |
|    8 | 吴九      | 8193730-@qq.com  | NULL |    NULL | NULL   |
| NULL | NULL      | NULL             |    6 |       9 | 足球   |
+------+-----------+------------------+------+---------+--------+
4 rows in set (0.00 sec)

2020-10-11

请登录后再评论