MySQL的多表查询
查询语法
select 列名列表 from 表名列表 where 查询条件;
基础准备:
创建表
1.创建部门表
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
2.创建员工表
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,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
#笛卡尔集
*有两个A,B集合,取这两个集合的所有组成情况
#多表查询(要完成多表查询,就需要消除笛卡尔集中的无用数据)
多表查询的分类:
1.内连接查询
*隐式内连接:使用where条件消除无用数据
*例:
--查询所有员工信息和对应的部门信息
select * from emp,dept where emp.dept_id=dept.id;
*显式内连接
*语法:select 字段列表 from 表1 [inner] join 表2 on 查询条件
*例:
-- 查询所有员工信息和对应的部门信息
select * from emp inner join dept on emp.dept_id=dept.id
*内连接查询关注:
1.从哪些表中获取数据
2.条件是什么
3.查询哪些字段
2.外连接查询:
1.左外连接
*语法: select 字段列表 from 表1 left [outer] join 表2
on 查询条件;
*例:
--查询所有员工信息,以及对应部门信息,如果无部门信息,则不显示部门信息为null
select t1.* ,t2.* from emp t1 left join dept t2 on t1.dept_id=t2.id;
2.右外连接
*语法:select 字段列表 from 表1 right [outer] join 表2 on 查询条件:
*例
--查询所有部门信息,以及对应的员工信息,如果无员工信息,则显示null
select t2.*,t1.* from emp t1 right join dept t2 on t1.dept_id=t2.id;
3.子查询
*概念:查询中的嵌套查询,称嵌套查询为子查询。
*子查询的不同情况
1.子查询的结果为单行单列。
*子查询可以作为条件,使用运算符进行判断。运算符:> >= < <= =
*例
-- 查询员工工资小与平均工资的人
select * from emp where emp.salary<(select AVG(salary) from emp);
2.子查询的结果为多行单列。
*子查询可以作为条件,使用运算符in来判断
*例:
-- 查询财务部和市场部所有的员工信息
select id from dept where name='财务部' or name='市场部';
select * from emp where dept_id=3 or dept_id=2;
--利用子查询
select * from emp where dept_id in (select id from dept where name='财务部' or name='市场部';);
3.子查询的结果为多行多列
*子查询的可以作为一张虚拟表参与查询
--查询员工入职日期是2011-11-11日之后的员工信息和部门信息
*子查询
select t1.*,t2.* form dept t1,(select * from emp where emp.joindate> '2011-11-11') t2 where t1.id=t2.dept_id;
*内连接查询
select * from emp t1 left join dept t2 on t1.dept_id=t2.id and t1.joindate >'2011-11-11';