CREATE table dept(dept1 VARCHAR(6),dept_name VARCHAR(20)) default charset=utf8;
INSERT into dept VALUES (‘101’,‘财务’); INSERT into dept VALUES (‘102’,‘销售’);
INSERT into dept VALUES (‘103’,‘IT技术’);
INSERT into dept VALUES (‘104’,‘行政’);
CREATE table emp (sid VARCHAR(6),name VARCHAR(20),age TINYINT(2),woektime_start VARCHAR(10),incoming SMALLINT(10),dept2 VARCHAR(6))default charset=utf8;
insert into emp VALUES (‘1789’,‘张三’,35,‘1980/1/1’,4000,‘101’);
insert into emp VALUES (‘1674’,‘李四’,32,‘1983/4/1’,3500,‘101’);
insert into emp VALUES (‘1776’,‘王五’,24,‘1990/7/1’,2000,‘101’);
insert into emp VALUES (‘1568’,‘赵六’,57,‘1970/10/11’,7500,‘102’); insert into emp VALUES (‘1564’,‘荣七’,64,‘1963/10/11’,8500,‘102’);
insert into emp VALUES (‘1879’,‘牛八’,55,‘1971/10/20’,7300,‘103’);
insert into emp VALUES (‘1880’,‘老九’,55,‘1971/10/20’,7200,‘105’);
– drop table dept ; – drop table emp ; select * from dept; select * from emp ; 员工表:
sid 员工编号 name 员工姓名 age 年龄 woektime_start 入职时间 incomming 工资 dept2 部门编号
部门表: depr1 部门编号 dept_name 部门名称 emp:部门编号dept2 = dept 部门编号dept1
==================== 二、 多表查询
1、什么是多表关联查询? 从2个表或者更多的表中查询我们需要的数据
2、多表链接的关系 (1)内连接:inner join on (2)左连接: left join on (3)右链接: right join on (4)全外链接: (5)左独有数据 (6)右独有数据
备注: 多行注释:ctrl+/ 多行取消注释:shfit +ctrl+/
详解:多表
1、内连接 (普通内链接,隐藏内连接) 定义:查询两个表共有的关联的数据 (1)普通内连接 格式:select * from 表1 INNER JOIN 表2 on 表1.关联字段1=表2.关联字段2 ; 案例:select * from dept INNER JOIN emp on emp.dept2=dept.dept1 ; (2)隐藏内链接
格式:select * from 表1,表2 where 表1.关联字段1=表2.关联字段2 案例:select * from dept,emp where emp.dept2=dept.dept1;
2、左连接 以左表为主(整个左表全部显示),右表有关联的数据就显示,没有关联的数据就以null显示 格式:SELECT * from 表1 left join 表2 on 表1.关联字段1= 表2.关联字段2; 案例:SELECT * from dept left join emp on emp.dept2=dept.dept1;
3、右连接 以右表为主(整个右表全部显示),左表右关联的数据就显示,没有的数据就以null 显示 格式:SELECT * from 表1 right join 表2 on 表1.关联字段1= 表2.关联字段2 ; 案例:SELECT * from dept right join emp on emp.dept2=dept.dept1 ; (4)左独有数据 定义:左独有的数据在左连接的基础上,以右表显示null来取独有数据; 格式:SELECT * from 表1 left join 表2 on 表1.关联字段1= 表2.关联字段2 where 右表字段 is null ; 案例:SELECT * from dept left join emp on emp.dept2=dept.dept1 where name is null;
(5)右独有数据 定义:右独有的数据在左连接的基础上,以左表显示null来取独有数据; 格式:SELECT * from 表1 rigt join 表2 on 表1.关联字段1= 表2.关联字段2 where 左表字段 is null ; 案例:select * from dept right join emp on emp.dept2=dept.dept1 where dept_name is null ; (6)全外连接: union 方法1:内连接+左独有+右独有 方法2:左连接+右独有 方法3:右连接+左独有
方法一详解:内连接+左独有+右独有 SELECT * from dept inner join emp on emp.dept2=dept.dept1 #内连接 UNION SELECT * from dept left join emp on emp.dept2=dept.dept1 where name is null #左独有 union select * from dept right join emp on emp.dept2=dept.dept1 where dept_name is null ; #右独有
方法二:详解 左连接+右独有 SELECT * from dept left join emp on emp.dept2=dept.dept1 #左连接 UNION select * from dept right join emp on emp.dept2=dept.dept1 where dept_name is null ; #右独有
方法三:右连接+左独有
select * from dept right join emp on emp.dept2=dept.dept1 #右连接 UNION SELECT * from dept left join emp on emp.dept2=dept.dept1 where name is null ; #左独有数据
普通内连接:select * from 表1 inner join 表2 on 表 1.关联字段=表2.关联字段 隐藏内连接:select * from 表1,表2 where 表 1.关联字段=表2.关联字段 左连接:select * from 表1 left join 表2 on 表 1.关联字段=表2.关联字段 右连接 :select * from 表1 right join 表2 on 表 1.关联字段=表2.关联字段 左独有数据:select * from 表1 left join 表2 on 表 1.关联字段=表2.关联字段 where 表2中的字段 is null 右独有数据:select * from 表1 right join 表2 on 表 1.关联字段=表2.关联字段 where 表1 中的字段 isnull 全外连接:union (1)内连接+左独有+右独有 (2)左连接+右独有 (3)右连接+左独有
================================= 作业:
1.求出IT技术部门所有的员工姓名和员工编号? 结果:name ,sid emp 条件:dept_name=IT技术 dept 方法: select name,sid from dept inner join emp on dept.dept1=emp.dept2 WHERE dept_name=‘IT技术’ ;
2、求出财务部门的收入总和? 结果:sum(incomming) emp 条件: dept_name=“财务” dept 方法1:select sum(incoming) from dept inner join emp on dept.dept1=emp.dept2 where dept_name= “财务” ; 方法2: select sum(incoming) from dept,emp where dept.dept1=emp.dept2 and dept_name= “财务”;
|