SQL版本:

数据准备:

#创建一个数据库companyCREATE DATABASE IF NOT EXISTS company;#创建部门表CREATE TABLE dept(id INT PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR(20));#往部门表中插入多条数据INSERT INTO dept(`name`) VALUES ('研发部'),('销售部'),('财务部');#查询部门表中数据SELECT * FROM dept;#创建员工表CREATE TABLE employee(id INT PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR(10),address VARCHAR(30),age INT,sex CHAR(1),dept_id INT,FOREIGN KEY (dept_id) REFERENCES dept(id)#外键,关联部门表(部门表的主键));#往员工表中插入多条员工信息INSERT INTO employee VALUES(NULL,'小明','南昌',24,'男',1),(NULL,'小红','九江',20,'女',1),(NULL,'小兰','抚州',19,'女',2),(NULL,'小龙','宜春',18,'男',2),(NULL,'小军','赣州',23,'男',3);#查询员工表中的数据SELECT * FROM employee;

显式内连接 –(不显示没有匹配记录的数据)

  • 概念:无论是显式内连接还是隐式内连接其查询结果是一样的,只是写法不同。显式内连接使用INNER JOIN …ON语句,可以省略INNER

select 列名 from 左表 inner join 右表 on 主表.主键=从表.外键

案例:查询小龙的信息,显示员工id,姓名,地址,年龄和所在的部门名称,我们发现需要联合2张表同时才能查询出需要的数据,使用内连接。

SELECT e.id,e.name,e.address,e.age,d.name FROM employee e INNER JOIN dept dON d.id = e.dept_idWHERE e.name = "小龙"; 

左外连接 –(显示没有匹配记录的数据)
左连接的概念:查询的数据以左表为准,即使在其他表中没有匹配的记录也会显示出来。

select 列名 from 左表 left join 右表 on 表连接条件

注:左外连接使用LEFT OUTER JOIN … ON,其中OUTER可以省略

案例:在部门表中增加一个行政部,需要查询所有的部门和员工,将部门表设置成左表,员工表设置成右表;比较内连接和左外连接的区别。

#左外连接SELECT * FROM dept d LEFT JOIN employee e ON d.id = e.dept_id

全连接
根据上面简述,我们知道左连接是无论如何左表的数据都能够显示全,右连接是右表的数据无论如何都能够显示全,那么如果我们希望左表和右表的数据都能够显示全面呢(在对方表中没有匹配的数据就以null补齐)?这种连接查询我们称之为全连接(full join),但是很遗憾,MySQL并没有提供全连接,但Oracle支持;

虽然MySQL不支持全连接,但是我们可以利用MySQL提供的其它功能来完成全连接的功能:left join + right join

SELECT * FROM dept d LEFT JOIN employee e ON d.id = e.dept_idUNION--union 是并集的意思SELECT * FROM dept d RIGHT JOIN employee e ON d.id =e.dept_id;