SQL版本:
数据准备:
#创建一个数据库company
CREATE 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;
显式内连接 --(不显示没有匹配记录的数据)
select 列名 from 左表 inner join 右表 on 主表.主键=从表.外键
案例:查询小龙的信息,显示员工id,姓名,地址,年龄和所在的部门名称,我们发现需要联合2张表同时才能查询出需要的数据,使用内连接。
SELECT e.id,e.name,e.address,e.age,d.name
FROM employee e INNER JOIN dept d
ON d.id = e.dept_id
WHERE 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_id
UNION --union 是并集的意思
SELECT * FROM dept d RIGHT JOIN employee e ON d.id =e.dept_id;