idea内置数据库DataGrip + 多表查询sql语句 -- 内连接与外连接与子查询
多表查询
内连接与外连接与子查询
-- ——————————多表查询 -- 用的是多表设计中一对多的表与数据 -- 单表 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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通