0
点赞
收藏
分享

微信扫一扫

《MySQL——连接查询》

内连接:
inner join 或者 join
外连接
1、左连接 left join 或 left outer join
2、右连接 right join 或 right outer join
3、完全外连接 full join 或 full outer join

图示理解

《MySQL——连接查询》_mysql
《MySQL——连接查询》_数据库_02
《MySQL——连接查询》_mysql_03

全连接
《MySQL——连接查询》_数据库_04

创建person表和card表

CREATE DATABASE testJoin;

CREATE TABLE person (
id INT,
name VARCHAR(20),
cardId INT
);

CREATE TABLE card (
id INT,
name VARCHAR(20)
);

插入数据

INSERT INTO card VALUES (1, '饭卡'), (2, '建行卡'), (3, '农行卡'), (4, '工商卡'), (5, '邮政卡');
SELECT * FROM card;
+------+-----------+
| id | name |
+------+-----------+
| 1 | 饭卡 |
| 2 | 建行卡 |
| 3 | 农行卡 |
| 4 | 工商卡 |
| 5 | 邮政卡 |
+------+-----------+

INSERT INTO person VALUES (1, '张三', 1), (2, '李四', 3), (3, '王五', 6);
SELECT * FROM person;
+------+--------+--------+
| id | name | cardId |
+------+--------+--------+
| 1 | 张三 | 1 |
| 2 | 李四 | 3 |
| 3 | 王五 | 6 |
+------+--------+--------+

分析两张表,​​person​​​ 表并没有为 ​​cardId​​​ 字段设置一个在 ​​card​​​ 表中对应的 id 外键。如果设置了的话,​​person​​​ 中 ​​cardId​​​ 字段值为 6 的行就插不进去,因为该 ​​cardId​​​ 值在 ​​card​​ 表中并没有。

inner join 查询

要查询这两张表中有关系的数据,可以使用 ​​INNERJOIN​​ ( 内连接 ) 将它们连接在一起。

-- INNER JOIN: 表示为内连接,将两张表拼接在一起。
-- on: 表示要执行某个条件(连接条件)。
SELECT * FROM person INNER JOIN card on person.cardId = card.id;
+------+--------+--------+------+-----------+
| id | name | cardId | id | name |
+------+--------+--------+------+-----------+
| 1 | 张三 | 1 | 1 | 饭卡 |
| 2 | 李四 | 3 | 3 | 农行卡 |
+------+--------+--------+------+-----------+
--card 的整张表被连接到了右边。

内连查询,其实就是两张表中的数据通过某个字段相对应,查询出相关记录数据。
inner去掉也是一样的。

left join 查询

完整显示左边的表 ( person ) ,右边的表如果符合条件就显示,不符合则补 NULL 。

SELECT * FROM person LEFT JOIN card on person.cardId = card.id;
+------+--------+--------+------+-----------+
| id | name | cardId | id | name |
+------+--------+--------+------+-----------+
| 1 | 张三 | 1 | 1 | 饭卡 |
| 2 | 李四 | 3 | 3 | 农行卡 |
| 3 | 王五 | 6 | NULL | NULL |
+------+--------+--------+------+-----------+

right join 查询

完整显示右边的表 ( card ) ,左边的表如果符合条件就显示,不符合则补 NULL 。

SELECT * FROM person RIGHT JOIN card on person.cardId = card.id;
+------+--------+--------+------+-----------+
| id | name | cardId | id | name |
+------+--------+--------+------+-----------+
| 1 | 张三 | 1 | 1 | 饭卡 |
| 2 | 李四 | 3 | 3 | 农行卡 |
| NULL | NULL | NULL | 2 | 建行卡 |
| NULL | NULL | NULL | 4 | 工商卡 |
| NULL | NULL | NULL | 5 | 邮政卡 |
+------+--------+--------+------+-----------+

full join 查询

MySQL 不支持这种语法的全外连接:

SELECT * FROM person FULL JOIN card on person.cardId = card.id;

这样会报错:

ERROR 1054 (42S22): Unknown column 'person.cardId' in 'on clause'

MySQL的全连接是通过left join和right join合在一起。

SELECT * FROM person LEFT JOIN card on person.cardId = card.id
UNION
SELECT * FROM person RIGHT JOIN card on person.cardId = card.id;
+------+--------+--------+------+-----------+
| id | name | cardId | id | name |
+------+--------+--------+------+-----------+
| 1 | 张三 | 1 | 1 | 饭卡 |
| 2 | 李四 | 3 | 3 | 农行卡 |
| 3 | 王五 | 6 | NULL | NULL |
| NULL | NULL | NULL | 2 | 建行卡 |
| NULL | NULL | NULL | 4 | 工商卡 |
| NULL | NULL | NULL | 5 | 邮政卡 |
+------+--------+--------+------+-----------+

参考

​​一天学会MySQL​​​​某Github​​


举报

相关推荐

0 条评论