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;
复制代码

 

posted @   椰子灰  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示