SQL用于多表查询语句的准备
-- SQL的准备
-- 创建部门表
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO dept(NAME) VALUE('开发部'),('市场部'),('财务部');
-- 创建员工表
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
gender CHAR(1),
salary DOUBLE,
join_date DATE,
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表的主键id
);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUE ('孙悟空','男',7200,'2013-02-04',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUE ('猪八戒','男',3600,'2010-12-24',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUE ('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUE ('白骨精','女',5000,'2015-10-17',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUE ('蜘蛛精','女',4500,'2011-03-14',1);
一、笛卡尔积
1、有两个集合A和B,取这两个集合的所有组成情况。
2、要完成多表查询,需要消除无用的数据。
-- 产生一个笛卡尔积
SELECT *FROM emp,dept;
二、分类
1、内连接查询:
注意: 从那些表中查数据 ,条件是什么, 查询哪些字段
1.1 隐式内连接:使用where条件消除无用的数据
-- 查询所有的员工信息和对应的部门信息
SELECT *FROM emp,dept WHERE emp.dept_id=dept.id;
-- 查询员工表的姓名,性别,部门表的名称
SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.dept_id=dept.id;
多表查询的简化写法
SELECT
t1.name,t1.gender,t2.name
FROM
emp AS t1,dept AS t2
WHERE
t1.dept_id = t2.id;
1.2 显示内连接
-- 显示内连接
SELECT * FROM emp INNER JOIN dept ON emp.dept_id =dept.id;
2、外连接查询:
-- 在emp表填加一行数据,只是填写id、姓名、性别
-- 查询多有员工信息,如果员工有部门,则查询部门的名称,没有部门,则不显示部门的名称
SELECT
t1.*,t2.name
FROM
emp t1,dept t2
WHERE
t1.dept_id=t2.id;
-- 不能查询新添加的信息,因为他的外键是空的,数据不合法
左外连接
– 解决办法 外连接
– 左外连接: 查询的是左表的所有数据以及其交集的部分
SELECT
t1.*,t2.name
FROM
emp t1
LEFT JOIN
dept t2
ON
t1.dept_id=t2.id;
右外连接
– 右外连接 :查询的是右表的所有记录与及其交集的部分
SELECT
*
FROM
dept t2 -- 左表
RIGHT JOIN
emp t1 -- 右表
ON
t1.dept_id=t2.id;