SQL版本:多表连接查询(两张表为例)

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;

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

  • 概念:无论是显式内连接还是隐式内连接其查询结果是一样的,只是写法不同。显式内连接使用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 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;

你可能感兴趣的:(数据库专栏,数据库,sql,mysql)