连接查询
环境准备
-- 创建部门表
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
);
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);
知识点-交叉查询【了解】
1.目标
- 了解交叉查询
2.分析
交叉查询把若干张表(>=2)没有条件的连接在一起,进行展示
3.讲解
- 语法
select ... from 表1,表2 ;
2.练习: 使用交叉查询部门和员工
-- 练习: 使用交叉查询部门和员工的所有信息
select * from emp,dept;
select * from dept,emp;
select emp.*,dept.* from emp,dept;
-- 练习: 使用交叉查询部门的名称和员工id,名称,salary,join_date信息
select dept.name,emp.id,emp.name,emp.salary,emp.join_date from emp,dept;
-- 取别名
select d.name,e.id,e.name,e.salary,e.join_date from emp e,dept d;
以上数据其实是左表的每条数据和右表的每条数据组合。左表有3条,右表有5条,最终组合后3*5=15条数据。
左表的每条数据和右表的每条数据组合,这种效果称为笛卡尔积
-内连接查询【重点】
1.目标
- 掌握内连接查询
2.分析
交叉查询产生这样的结果并不是我们想要的,那么怎么去除错误的,不想要的记录呢,当然是通过条件过滤。通常要查询的多个表之间都存在关联关系,那么就通过==关联关系(主外键关系)==去除笛卡尔积。
3.讲解
3.1 隐式内连接
隐式里面是没有inner关键字的
select ... from 表1,表2 where 连接条件 [and 其他条件] --(外键的值等于主键的值)
练习:查询员工的id,姓名,性别,薪资,加入日期,所属部门
select emp.id,emp.name,emp.gender,emp.salary,emp.join_date,dept.name from emp,dept where emp.dept_id = dept.id;
结果
显示内连接
显示里面是有inner关键字的
select ... from a [inner] join b on 连接条件 [ where 其它条件]
select * from emp inner join dept on emp.dept_id = dept.id
练习
查询所有部门下的员工信息,如果该部门下没有员工则不展示.
-- 隐式内连接查询
select * from emp e,dept d where e.dept_id = d.id;
-- 显示内连接查询
select * from emp e inner join dept d on e.dept_id = d.id;
小结
- 内连接的特点(查的是什么东西)
内连接查询的是公共部分,满足连接条件(主外键关系)的部分 - 使用内连接的关键点
- 从表外键的值等于主表主键的值,过滤无用数据
- 显示内连接里面的,on只能用主外键关联作为条件,如果还有其它条件,后面加where
- 语法
-- 隐式(不出现inner)
select * from a,b where a.主键=b.外键 [and 其它条件]
-- 显示(出现inner)
select * from a [inner] join b on a.主键=b.外键 [where 其它条件]