关注微信公众号 太平洋学习网 扫描二维码
最新消息:关注【太平洋学习网】微信公众号,可以获取全套资料,【全套Java基础27天】【JavaEE就业视频4个月】【Android就业视频4个月】

mysql多表查询内连接_左连接_右连接_左外连接_右外连接的区别

数据库 太平洋学习网 浏览 评论

在mysql多表查询中,左连接和左外连接,右连接和右外连接两组都是一样的,没有什么区别,而有些需求内连接是无法做到的,因此需要这两组来代替一下内连接,下面来用一个例子帮助大家理解。

我们来创建两张表,一张是员工表,一张部门表,mysql语句如下。

-- 部门表(主表)
CREATE TABLE dept(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
);
-- 员工表(副表)
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	deptId INT  -- 引用部门id
);

然后分别插入dept和employee表数据,其中有一条员工数据没有部门,如下。

-- 插入部门
INSERT INTO dept(NAME) VALUES('软件开发部');
INSERT INTO dept(NAME) VALUES('UI设计部');
-- 插入员工
INSERT INTO employee(NAME,deptId) VALUES('张三',1);
INSERT INTO employee(NAME,deptId) VALUES('李四',2);
INSERT INTO employee(NAME,deptId) VALUES('王五',1);
INSERT INTO employee(NAME) VALUES('赵六');

插入mysql表数据之后,看看效果吧,便于后面的理解,如图。


需求1:查询每个员工所在的部门,没有部门的数据不显示出来,使用mysql内连接查询可以实现这一点,内连接的效果就是只有满足了连接条件的数据才会被显示出来。

SELECT  e.name,d.name
	FROM employee e,dept d
		WHERE e.deptId=d.id;
		
-- 内连接另一种语法
SELECT e.name,d.name
	FROM employee e INNER JOIN 
		dept d
		ON e.deptId=d.id;

查询出来的效果如图,左边是员工姓名,右边是部门名称,赵六没有部门,所以没有显示出来:


需求2:查询所有员工的部门信息,没有部门的员工也要显示出来,这个时候我们就要用到左连接,左外连接,右连接,右外连接,其实前面两种和后面两种连接可以做到效果一样的,完全可以相互代替,他们的命令分别如下。

左连接和左外连接的原理:首先会以左边表为主,左表数据一定全部显示完整,然后用右表数据来逐个匹配左表数据,匹配成功,则显示对应数据;匹配不成功,则显示null。

//左连接比左外连接只是少了一个单词OUTER,效果完全一样
SELECT d.name,e.name
	FROM dept d LEFT JOIN
		employee e
		ON d.id=e.deptId;
//左外连接
SELECT d.name,e.name
	FROM dept d LEFT OUTER JOIN
		employee e
		ON d.id=e.deptId;

右连接和右外连接的原理:首先会以右边表为主,右表数据一定全部显示完整,然后用左表数据来逐个匹配右表数据,匹配成功,则显示对应数据;匹配不成功,则显示null。

//右连接,如果把employee e和dept d调换一下位置,则效果和左连接一样。
SELECT d.name,e.name
	FROM employee e RIGHT JOIN
		dept d
		ON d.id=e.deptId;
		
//右外连接,如果把employee e和dept d调换一下位置,则效果和左外连接一样。
SELECT d.name,e.name
	FROM employee e RIGHT OUTER JOIN
		dept d
		ON d.id=e.deptId;

以上两组查询的效果一样(右连接和右外连接表位置调换后,如果不调换则和内连接效果一样),如图。


来源网站:太平洋学习网,转载请注明出处:http://www.tpyyes.com/a/mysql_oracle/2017/0221/70.html