MySQL之内连接、左连接、右连接

  • 建立表
CREATE TABLE `a_table` (
  `a_id` int(11) DEFAULT NULL,
  `a_name` varchar(10) DEFAULT NULL,
  `a_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `b_table` (
  `b_id` int(11) DEFAULT NULL,
  `b_name` varchar(10) DEFAULT NULL,
  `b_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
  • 插入数据
INSERT INTO a_table (a_id,a_name,a_part) VALUES (1,'老潘','总裁部');
INSERT INTO a_table (a_id,a_name,a_part) VALUES (2,'老王','秘书部');
INSERT INTO a_table (a_id,a_name,a_part) VALUES (3,'老张','设计部');
INSERT INTO a_table (a_id,a_name,a_part) VALUES (4,'老李','运营部');
INSERT INTO b_table (b_id,b_name,b_part) VALUES (2,'老王','秘书部');
INSERT INTO b_table (b_id,b_name,b_part) VALUES (3,'老张','设计部');
INSERT INTO b_table (b_id,b_name,b_part) VALUES (5,'老刘','人事部');
INSERT INTO b_table (b_id,b_name,b_part) VALUES (6,'老黄','生产部');
  • 不加任何条件查询会出现笛卡尔乘积
select  字段1,字段2... from 表1,表2... [where 条件]

注意: 如果不加条件直接进行查询,则会出现以下效果,这种结果我们称之为 笛卡尔乘积

mysql> SELECT * FROM a_table,b_table;
+------+--------+--------+------+--------+--------+
| a_id | a_name | a_part | b_id | b_name | b_part |
+------+--------+--------+------+--------+--------+
|    1 | 老潘   | 总裁部 |    2 | 老王   | 秘书部 |
|    2 | 老王   | 秘书部 |    2 | 老王   | 秘书部 |
|    3 | 老张   | 设计部 |    2 | 老王   | 秘书部 |
|    4 | 老李   | 运营部 |    2 | 老王   | 秘书部 |
|    1 | 老潘   | 总裁部 |    3 | 老张   | 设计部 |
|    2 | 老王   | 秘书部 |    3 | 老张   | 设计部 |
|    3 | 老张   | 设计部 |    3 | 老张   | 设计部 |
|    4 | 老李   | 运营部 |    3 | 老张   | 设计部 |
|    1 | 老潘   | 总裁部 |    5 | 老刘   | 人事部 |
|    2 | 老王   | 秘书部 |    5 | 老刘   | 人事部 |
|    3 | 老张   | 设计部 |    5 | 老刘   | 人事部 |
|    4 | 老李   | 运营部 |    5 | 老刘   | 人事部 |
|    1 | 老潘   | 总裁部 |    6 | 老黄   | 生产部 |
|    2 | 老王   | 秘书部 |    6 | 老黄   | 生产部 |
|    3 | 老张   | 设计部 |    6 | 老黄   | 生产部 |
|    4 | 老李   | 运营部 |    6 | 老黄   | 生产部 |
+------+--------+--------+------+--------+--------+
16 rows in set (0.12 sec)
  • 内连接
    在MySQL FROM 子句中使用关键字 INNER JOIN 连接两张表,并使用 ON 子句来设置连接条件。内连接是通过在查询中设置连接条件的方式,来移除查询结果集中某些数据行后的交叉连接。简单来说,就是利用条件表达式来消除交叉连接的某些数据行。
SELECT <列名1,列名2 …>
FROM <表名1> INNER JOIN <表名2> [ ON子句]
mysql> SELECT * FROM a_table a INNER JOIN b_table b ON a.a_id = b.b_id;
+------+--------+--------+------+--------+--------+
| a_id | a_name | a_part | b_id | b_name | b_part |
+------+--------+--------+------+--------+--------+
|    2 | 老王   | 秘书部 |    2 | 老王   | 秘书部 |
|    3 | 老张   | 设计部 |    3 | 老张   | 设计部 |
+------+--------+--------+------+--------+--------+
2 rows in set (0.10 sec)

在这里插入图片描述

  • 左连接
mysql> SELECT * FROM a_table AS a INNER JOIN b_table AS b ON a.a_id = b.b_id;
+------+--------+--------+------+--------+--------+
| a_id | a_name | a_part | b_id | b_name | b_part |
+------+--------+--------+------+--------+--------+
|    2 | 老王   | 秘书部 |    2 | 老王   | 秘书部 |
|    3 | 老张   | 设计部 |    3 | 老张   | 设计部 |
+------+--------+--------+------+--------+--------+
2 rows in set (0.09 sec)

在这里插入图片描述

  • 右连接
mysql> SELECT * FROM a_table AS a RIGHT JOIN b_table AS b ON a.a_id=b.b_id;
+------+--------+--------+------+--------+--------+
| a_id | a_name | a_part | b_id | b_name | b_part |
+------+--------+--------+------+--------+--------+
|    2 | 老王   | 秘书部 |    2 | 老王   | 秘书部 |
|    3 | 老张   | 设计部 |    3 | 老张   | 设计部 |
| NULL | NULL   | NULL   |    5 | 老刘   | 人事部 |
| NULL | NULL   | NULL   |    6 | 老黄   | 生产部 |
+------+--------+--------+------+--------+--------+
4 rows in set (0.10 sec)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值