多表查询
内连接与外连接
-- ——————————多表查询 -- 用的是多表设计中一对多的表与数据 -- 单表 select * from tb_dept; select * from tb_emp; -- 多表 select * from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.id ; -- ==============内链接 没有联系的查询不出来 -- a.查询员工的姓名和所属的部门名称 隐式内连接实现 select tb_emp.name , tb_dept.name from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.id; -- 别名 起别名之后后边只能用别名 select e.name , d.name from tb_emp e ,tb_dept d where e.dept_id = d.id; -- b.查询员工的姓名和所属的部门名称 显式内连接实现 inner可以省略 select tb_emp.name , tb_dept.name from tb_emp inner join tb_dept on tb_emp.dept_id = tb_dept.id; -- ==============外链接 显示所有数据 outer可以省略 -- 以下员工表为左表,部门表为右表 -- a.查询员工表所有员工姓名和对应的部门名称 (左外链接) select e.name , d.name from tb_emp e left outer join tb_dept d on e.dept_id = d.id; -- b.查询部门表所有部门信息和对应的员工名称 (有外链接) select e.name , d.name from tb_emp e right outer join tb_dept d on e.dept_id = d.id; -- 内连接(显式、隐式)只是方法不同,结果是一样的,外连接(左外链接、右外连接)结果不同(左外包含左表所有内容,右外同理) -- ==============子查询 -- -----------------标量子查询 子查询的返回结果是单行单列的值 -- a.查询教研部所有员工信息 -- 步骤1:查询教研部的部门id - demp select id from tb_dept where name = '教研部'; -- 步骤2:再查询该部门id下在员工信息 - emp select * from tb_emp where dept_id = 2; -- 最终: select * from tb_emp where dept_id = (select id from tb_dept where name = '教研部'); -- b.查询在六入职之后的员工信息 -- 步骤1:查询六的入职时间 select entrydate from tb_emp where name = '六'; -- 步骤2:查询六入职之后的员工信息 select * from tb_emp where entrydate > '2010-01-01'; -- 最终: select * from tb_emp where entrydate > (select entrydate from tb_emp where name = '六'); -- -----------------列子查询 子查询的返回结果是一列(可多行 -- a.查询教研部和咨询部的所有员工信息 -- 步骤1:查询教研部和咨询部的id select id from tb_dept where name = '教研部' or name = '咨询部'; -- 步骤2:根据部门id查询该部门下的员工信息 select * from tb_emp where dept_id in (2,3); -- 最终: select * from tb_emp where dept_id in (select id from tb_dept where name = '教研部' or name = '咨询部'); -- -----------------行子查询 子查询的返回结果是一行(可多列 -- a.查询和六入职日期和职位都相同的员工 -- 步骤1:查询六入职日期和职位 select entrydate , job from tb_emp where name = '六'; -- 步骤2:与其入职日期和职位都相同的员工 select * from tb_emp where entrydate = '2010-01-01' and job = 3; -- 最终? select * from tb_emp where entrydate = (select entrydate from tb_emp where name = '六') and job = (select job from tb_emp where name = '六'); -- 优化1: select * from tb_emp where (entrydate , job) = ('2010-01-01' , 3); -- 优化2: select * from tb_emp where (entrydate , job) = (select entrydate , job from tb_emp where name = '六'); -- -----------------表子查询 多行多列 -- a.查询入职日期是 2010-01-01 之后的员工信息及其部门名称 -- 步骤1:查询查询入职日期是 2010-01-01 之后的员工信息 select * from tb_emp where entrydate > '2010-01-01'; -- 步骤2:查询这部分的员工信息及其部门名称 将上一个查询结果作为一张临时表来查询 select e.* , d.name from (select * from tb_emp where entrydate > '2010-01-01') e ,tb_dept d where e.dept_id = d.id;
标签:多表,--,where,dept,emp,tb,连接,select From: https://www.cnblogs.com/yansans/p/18313021