MySQL 数据库总结day2 7.14-三.连接查询

3.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 
);
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);

3.2 交叉查询【了解】

语法
select A.列,A.列,B.列,B.列 from A,B; 
-- 或者 
select A.*,B.* from A,B ; 
-- 或者 
select * from A,B;
练习 : 使用交叉查询部门和员工
select * from dept,emp; 
select dept.*,emp.* from dept,emp;

以上数据其实是左表的每条数据和右表的每条数据组
合。左表有 3 条,右表有 5 条,最终组合后 3*5=15 条数
据。
交叉查询其实是一种错误 . 数据大部分是无用数据 , 叫笛卡
尔积 .

3.3 内连接查询【重点】

交叉查询产生这样的结果并不是我们想要的,那么怎么
去除错误的,不想要的记录呢,当然是通过条件过滤。
通常要查询的多个表之间都存在关联关系,那么就通过
关联关系 ( 主外键关系 ) 去除笛卡尔积。
3.3.1 隐式内连接
select [字段,字段,字段][*] from A,B where 连接 条件 --(A表里面的主键 = B表里面的外键)
3.3.2 显示内连接
显示里面是有 inner 关键字的
select [字段,字段,字段][*] from A [inner] join B on 连接条件 [ where 其它条件]

-- 隐式内连接 -- 语法:select [字段,字段,字段][*] from A,B 
where 连接条件 --(A表里面的主键 = B表里面的外键)

select * from dept,emp where dept.id = emp.dept_id; -- 显示所有信息

-- 内连接:显示部门名称,员工名称,工资,性别 
select dept.name,emp.name,emp.salary,emp.gender from dept,emp where dept.id = emp.dept_id;

-- 简化: 取别名 工作中常见 
select d.name,e.name,e.salary,e.gender from dept as d,emp as e where d.id = e.dept_id; 
-- 简化: 取别名 省略as关键字 
select d.name,e.name,e.salary,e.gender from dept d,emp e where d.id = e.dept_id;

-- 显示内连接查询 -- 语法:select [字段,字段,字段][*] from A [inner] join B on 连接条件 [ where 其它条件]
 select * from dept inner join emp on dept.id=emp.dept_id; 
 select d.name,e.name,e.salary,e.gender from dept d inner join emp e on d.id=e.dept_id;
注意事项:
内连接查询的是公共部分 , 满足连接条件 ( 主外键关系 )
的部分
使用主外键关系做为条件来去除无用信息 . 抓住主外

键的关系,用主外键作为连接条件,B表里面的外键A

里面的主键 .
显示内连接里面的 ,on 只能用主外键关联作为条件 ,
果还有其它条件 , 后面加 where