MySQL-7:多表查询
2019-04-03 本文已影响0人
Deque
今日内容
1.多表查询
2.事务
3.DCL
多表查询:
- 查询语法:
select
列名列表
from
表名列表
where....
-
数据准备(数据库表以及数据的创建):
# 新增数据 INSERT INTO dept (NAME) VALUES('开发部'),('市场部'),('财务部'); # 创建员工表 CREATE TABLE emp( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), gender CHAR(1), -- 性别 salary DOUBLE, -- 工资 join_date DATE, -- 入职日期 dept_id INT, FOREIGN KEY(dept_id) REFERENCES dept(id) -- 外键 ); # 新增数据 INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2014-02-24',1); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',4200,'2015-03-15',2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('沙师弟','男',3600,'2013-02-24',2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2013-02-24',2); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','男',5400,'2018-08-08',3); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','男',6100,'2019-01-01',1);
-
笛卡尔积
- 有两个集合a,b,取这两个集合的所以组成情况
- 要完成多表查询,需要消除无用的数据
-
多表查询分类
1.内链接查询:
(1)隐式内链接:使用where
条件,消除无用的数据。- 例子:
-- 查询员工表的名称,性别。部门表的名称
-- 正规写法 方便添加注释(符合企业sql规范)
SELECT
t1.name, -- 员工表的姓名
t1.gender, -- 员工表的性别
t2.name -- 部门表的名称
FROM
emp t1,
dept t2
WHERE
t1.dept_id=t2.id;
(2)显式内链接
- 语法:
select 字段列表 from 表明 inner join 表明2 on 条件
- 例如:
-- 查询员工表的名称,性别。部门表的名称(使用显式内链接)
SELECT * FROM emp [INNER] JOIN dept ON emp.dept_id = dept.id;
-- INNER 是可选操作,可以直接使用 JOIN ON 如下:
SELECT * FROM emp JOIN dept ON emp.dept_id = dept.id;
(3)内链接查询注意事项:
- 从哪些表中查询数据
- 条件是什么?
- 查询哪些字段?
2.外链接查询:
(1)左外连接:
- 语法:
select 字段列表 from 表1 left [outer] join 表2 on 条件
-
查询的是左表所有数据以及其交集部分。
左外连接,图片来自互联网
-- 左外连接 (LEFT JOIN ON)
SELECT
t1.*,
t2.name
FROM
emp t1
LEFT JOIN
dept t2
ON
t1.dept_id = t2.id;
(2)右外连接:
- 语法:
select 字段列表 from 表1 right [outer] join 表2 on 条件
-
查询的是右表所有数据以及其交集部分。
右外连接,图片来自互联网
-- 右外连接 (RIGHT JOIN ON)
SELECT
t1.*,
t2.name
FROM
dept t2
RIGHT JOIN
emp t1
ON
t1.dept_id = t2.id;
3.子查询:
- 概念:查询中嵌套查询,称嵌套查询为子查询。
-- 子查询
-- 查询工资最高的员工的信息
-- 1、查询最高的工资是多少?
SELECT MAX(salary) FROM emp;
-- 查询的结果是 9000
-- 2.查询员工信息,并且工资等于最高的
SELECT * FROM emp WHERE emp.salary=9000;
-- 一条SQL就能完成
SELECT * FROM emp WHERE emp.salary=(
SELECT MAX(salary) FROM emp
);
- 子查询的不同情况
1、子查询的结果是单行单列的:- 子查询可以作为条件,使用运算符(
>、<、>=、<=、=
)去判断。
- 子查询可以作为条件,使用运算符(
-- 查询员工工资小于平均工资的人
SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
2、子查询的结果是多行单列的:
- 可以使用运算符
IN
来判断
-- 查询‘财务部’和'市场部'所有的员工信息
-- 1、先查询财务部的id
SELECT id FROM dept WHERE name='财务部' OR name='市场部';
-- 2、再根据ID查询信息
SELECT * FROM emp WHERE dept_id = 3 OR dept_id=2;
-- 其中第二条语句可以改写成如下:(相当与上面这条 )
SELECT * FROM emp WHERE dept_id IN(3,2);
-- 子查询
SELECT * FROM emp WHERE dept_id IN(SELECT id FROM dept WHERE name='财务部' OR name='市场部');
3、子查询的结果是多行多列的:
- 子查询可以作为一张虚拟表来进行查询
-- 多行多列
-- 例:查询员工入职日期是2015年-11-11之后的员工信息和部门信息(子查询)
-- 括号里的叫做虚拟表
SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.join_date > '2015-11-11') t2
WHERE t1.id = t2.dept_id;
-- 例:查询员工入职日期是2015年-11-11之后的员工信息和部门信息(普通内链接查询)
SELECT * FROM emp t1, dept t2
WHERE t1.dept_id = t2.id AND t1.join_date > '2015-11-11';