在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;
以上两组查询的效果一样(右连接和右外连接表位置调换后,如果不调换则和内连接效果一样),如图。