mysql之内连接,外连接(左连接,右连接),union,union all的区别

内连接,外连接,左连接,右连接,全连接

测试数据:
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;

insert into a_table values(1,"老潘","总裁部"),(2,"老王","秘书部"),(3,"老张","设计部"),(4,"老李","运营部");
select * from a_table;

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 b_table values(2,"老王","秘书部"),(3,"老张","设计部"),(5,"老刘","人事部"),(6,"老黄","生产部");
select * from b_table;
内连接 :

inner join...on

join...on

cross join...on

以上三种都是内连接语法

mysql> select * from a_table;
+------+--------+-----------+
| a_id | a_name | a_part    |
+------+--------+-----------+
|    1 | 老潘   | 总裁部    |
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    4 | 老李   | 运营部    |
+------+--------+-----------+
4 rows in set (0.00 sec)

mysql> select * from b_table;
+------+--------+-----------+
| b_id | b_name | b_part    |
+------+--------+-----------+
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    5 | 老刘   | 人事部    |
|    6 | 老黄   | 生产部    |
+------+--------+-----------+
4 rows in set (0.00 sec)

# 内连接
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.02 sec)

# 同时可以使用以下的三种方法:
mysql> select * from a_table, b_table where a_table.a_id = b_table.b_id;

mysql> select * from a_table a cross join b_table b on a.a_id=b.b_id;

mysql> select * from a_table a  join b_table b on a.a_id=b.b_id;

组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。

左连接(左外连接)

left join ... on ...

mysql> select * from a_table;
+------+--------+-----------+
| a_id | a_name | a_part    |
+------+--------+-----------+
|    1 | 老潘   | 总裁部    |
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    4 | 老李   | 运营部    |
+------+--------+-----------+
4 rows in set (0.00 sec)

mysql> select * from b_table;
+------+--------+-----------+
| b_id | b_name | b_part    |
+------+--------+-----------+
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    5 | 老刘   | 人事部    |
|    6 | 老黄   | 生产部    |
+------+--------+-----------+
4 rows in set (0.00 sec)

# 左连接
mysql> select * from a_table a left 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 | 老张   | 设计部    |
|    1 | 老潘   | 总裁部    | NULL | NULL   | NULL      |
|    4 | 老李   | 运营部    | NULL | NULL   | NULL      |
+------+--------+-----------+------+--------+-----------+
4 rows in set (0.04 sec)

说明:left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。
左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

右连接(右外连接)

right join ... on ...

mysql> select * from a_table;
+------+--------+-----------+
| a_id | a_name | a_part    |
+------+--------+-----------+
|    1 | 老潘   | 总裁部    |
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    4 | 老李   | 运营部    |
+------+--------+-----------+
4 rows in set (0.00 sec)

mysql> select * from b_table;
+------+--------+-----------+
| b_id | b_name | b_part    |
+------+--------+-----------+
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    5 | 老刘   | 人事部    |
|    6 | 老黄   | 生产部    |
+------+--------+-----------+
4 rows in set (0.00 sec)

mysql> select * from a_table a right 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 | 老张   | 设计部    |
| NULL | NULL   | NULL      |    5 | 老刘   | 人事部    |
| NULL | NULL   | NULL      |    6 | 老黄   | 生产部    |
+------+--------+-----------+------+--------+-----------+
4 rows in set (0.00 sec)

说明:right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。
与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。

union

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

mysql> select * from a_table;
+------+--------+-----------+
| a_id | a_name | a_part    |
+------+--------+-----------+
|    1 | 老潘   | 总裁部    |
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    4 | 老李   | 运营部    |
+------+--------+-----------+
4 rows in set (0.00 sec)

mysql> select * from b_table;
+------+--------+-----------+
| b_id | b_name | b_part    |
+------+--------+-----------+
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    5 | 老刘   | 人事部    |
|    6 | 老黄   | 生产部    |
+------+--------+-----------+
4 rows in set (0.00 sec)

mysql> select * from a_table union  select * from b_table;
+------+--------+-----------+
| a_id | a_name | a_part    |
+------+--------+-----------+
|    1 | 老潘   | 总裁部    |
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    4 | 老李   | 运营部    |
|    5 | 老刘   | 人事部    |
|    6 | 老黄   | 生产部    |
+------+--------+-----------+
6 rows in set (0.00 sec)

一张表中显示了两张表的数据(不重复的数据),先查询的表,其结果放在前面。

union all
mysql> select * from a_table;
+------+--------+-----------+
| a_id | a_name | a_part    |
+------+--------+-----------+
|    1 | 老潘   | 总裁部    |
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    4 | 老李   | 运营部    |
+------+--------+-----------+
4 rows in set (0.00 sec)

mysql> select * from b_table;
+------+--------+-----------+
| b_id | b_name | b_part    |
+------+--------+-----------+
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    5 | 老刘   | 人事部    |
|    6 | 老黄   | 生产部    |
+------+--------+-----------+
4 rows in set (0.00 sec)

mysql> select * from a_table union all select * from b_table;
+------+--------+-----------+
| a_id | a_name | a_part    |
+------+--------+-----------+
|    1 | 老潘   | 总裁部    |
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    4 | 老李   | 运营部    |
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    5 | 老刘   | 人事部    |
|    6 | 老黄   | 生产部    |
+------+--------+-----------+
8 rows in set (0.00 sec)

一张表中显示了两张表的所有数据,先查询的表,其结果放在前面。

原文地址:https://www.cnblogs.com/plf-Jack/p/11185154.html

时间: 2024-10-13 13:48:20

mysql之内连接,外连接(左连接,右连接),union,union all的区别的相关文章

inner join(内连接)、left join(左连接)、right join(右连接)、full join(全连接)区别

sql中的连接查询有inner join(内连接).left join(左连接).right join(右连接).full join(全连接)四种方式,它们之间其实并没有太大区别,仅仅是查询出来的结果有所不同.例如我们有两张表: Orders表通过外键Id_P和Persons表进行关联. 1.inner join(内连接),在两张表进行连接查询时,只保留两张表中完全匹配的结果集. 我们使用inner join对两张表进行连接查询,sql如下: SELECT p.LastName, p.First

【数据库】浅显易懂地理解左、右连接

之前一直对数据库里面的外连接有些疑惑,理解的不是很透彻,今天总算自己建了个表,详细地对照了几种写法,总算彻底搞清楚了. 基本概念 左连接.右连接就是数据库里面的关键字  left join 和 right join, 当然在oracle里面也可以在某个字段的后面加上(+)来表示外连接 左连接保留出现在left join左边的关系中的元组,也就是允许右边关系中为空:通俗一点:Left join 会从左表中返回所有的行,即便在右表中没有找到匹配的项. 同理右连接保留出现在right join右边的关

linq to entity 左联接 右连接 以及内连接写法的区别(转)

linq to entity 左连接 右连接 以及内连接写法的区别  还有就是用lambda表达式怎么写,那个效法效率高些? [解决办法]左连右连还是内连这个其实你不需要关心.只需要根据实体的映射关系写查询,框架会自动帮你生成的.至于linq查询语法与扩展方法的效率,应该是一样的,比如: C# code var users=(from u in db.Users where u.UserRoleId==1 select u) .ToList(); var users2=db.Users.Wher

左连接,右连接,内连接,外连接, join, left join, right join ,mysql ,oracle

2016-6-12 22:35:51 工作用了一年多的oracle,最近在学mysql, 仔细想想 各种连接,感觉这些概念还是蛮烦人的! 最近整理了一下,分享一下自己的理解,有些东西是借鉴网上并自己吸收了的. 1.不管是什么连接,oracle和mysql的原理是一模一样的,只是有些写法不一样而已.说到写法,这里提一下, select * from A, B where a.filed1=b.filed2; --这是第1种写法, 内连接,这样写,很方便, oracle和mysql通用 select

MySQL的左连接、右连接和全连接的实现

表student:+----+-----------+------+| id | name | age |+----+-----------+------+| 1 | Jim | 18 || 2 | Lucy | 16 || 3 | Lily | 16 || 4 | Lilei | 17 || 5 | Hanmeimei | 16 |+----+-----------+------+表mark:+----+---------+-------+| 1 | English | 90 || 1 | M

Oracle表与表之间的连接方式(内连接:inner join 、外连接 全连接: full outer join、左连接:left outer join 、右连接:right outer join、自然连接:natural join)

1 --内连接:INNER JOIN 它表示返回两个表或记录集连接字段的匹配记录,表示两个表中相互包含的部分 2 select * from student inner join sc on student.sno=sc.sno; 3 --外连接(全连接):包含左.右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行.不符合条件的,以空值代替. 4 --全连接:表示两个表组合在一起,左右不相匹配时使用空值替换 5 select * from student full outer join

Mysql之左连接右连接内连接——示例 (转)

下面是两张表 表stu 表tech 1.右连接 当使用右连接语句查询时,返回结果如下: 1 SELECT stu.id,stu.name,stu.classe_name,tech.id,tech.name FROM stu RIGHT JOIN tech on stu.classe_name=tech.classe_name; 从结果中可以看出,tech表中被查询的字段会被全部显示出来,而stu表中,只有与表tech的classe_name相同的条目的相应字段才会被显示出来. 右连接即:返回右边

SQL Server 2008 R2——内连接 左连接 右连接 全连接 交叉连接

SELECT * FROM Table_A GO SELECT * FROM Table_B GO --内连接 SELECT a.*, b.* FROM Table_A a JOIN Table_B b ON a.ID = b.ID SELECT a.*, b.* FROM Table_A a INNER JOIN Table_B b ON a.ID = b.ID GO --内连接等价直接多表from的形式 SELECT a.*, b.* FROM Table_A a INNER JOIN Ta

Oracle 左连接 left join、右连接right join说明

Oracle 左.右连接 + 在等号 左边表示右连接  获取右表所有记录,即使左表没有对应匹配的记录. + 在等号 右边表示左连接  获取左表所有记录,即使右表没有对应匹配的记录. 例子: select e.empno,e.name,d.deptno,d.dname,d.loc from emp e,dept d where e.deptno(+) = d.deptno 右连接 已知  emp表中没有40,dept表中有40,部门编号为40的没有员工. 使用右连接  from emp e rig

Netruon 理解(11):使用 NAT 将 Linux network namespace 连接外网

学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GRE/VxLAN 虚拟网络 (4)Neutron OVS OpenFlow 流表 和 L2 Population (5)Neutron DHCP Agent (6)Neutron L3 Agent (7)Neutron LBaas (8)Neutron Security Group (9)Neutro