前言
前面我们学习了DQL,都是基于1张表的基本查询和条件查询,今天学习的内容是关于多表查询~
1、使用内连接进行多表查询
1.隐式内连接
2.显式内连接
2、用外连接进行多表查询
1.左外连接查询
2.右外连接查询
3、使用子查询进行多表查询
1.基本子查询
2.子查询的不同情况
(1)单行单列
(2)多行单列
(3)多行多列
4、关于多表查询的练习
一、多表查询
1、例子
- 1.创建两张表:
创建部门表:
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
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,'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);
-
2.查询emp员工表
select * from emp;
-
3.查询的dept部门表
select * from dept;
-
4.当我们同时查询两张表时select * from emp,dept;
为什么上面的是无用的数据呢?
dept_id 作为外键是需要与主键id一一对应的,所以标记的数据对我们来说是没有用的。 -
引入新概念
查询的这15条数据,有个专有的名词,叫笛卡尔积。
2、笛卡尔积
1.定义:有两个集合A,B ,取这两个集合的所有组成情况
~~所以应该怎样查询才不会出现这些无用数据呢?
3、多表查询的分类
1.内连接查询
(1)隐式内连接:使用where条件消除无用数据
语法:select 列名(即字段名) from 表1,表2 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 t1,-- 员工表起别名t1
dept t2 -- 部门表起别名t2
where t1.dept_id = t2.id;
运行结果:
(2)显式内连接
- 语法:
select 列名 from 表名1 [inner] join 表名2 on 条件;
例如:查询唐僧的信息,显示员工 id,姓名,性别,工资和所在的部门名称
- 分析:
1)确定查询哪些表?—员工 id,姓名,性别,工资在emp表,部门在dept表;
2)条件:emp.dept_id=dept.id
3)确定查询条件:唐僧的信息,emp.name=‘唐僧’
4)确定查询字段:查询唐僧的信息,显示员工 id,姓名,性别,工资和所在的部门名称
select
e.`id`,
e.`name`