mysql数据库之子查询

一、概念。

sql语句中嵌套select语句,称为嵌套查询,又称子查询。

格式:select * from t1 where column1=(select column1 from t2);

子查询外部的语句可以是SELECT/INSERT/UPDATE/DELETE任何一个。

二、分类。

根据子查询结果不同,分为标量子查询(子查询结果为单个值)、列子查询(子查询 结果为一列)、行子查询(子查询结果为一行)、表子查询(子查询结果为多行多列)。

根据子查询位置不同,分为WHERE之后、FROM之后、SELECT之后。 

三、标量子查询

1、子查询返回的结果是单个值(数字,字符串 ,日期等),最简单的形式,这种子查询成为标量子查询。

2、常用的操作符:= <>  <  <=  >  >=

3、示例1:查询销售部员工的所有信息。

梳理

a.查询销售部门id。

select id from dept where name=‘销售部’ 

b.根据销售部门员工id查询员工信息。

select * from emp where dept_id=4; 

 优化后的子查询

select * from emp where dept_id=(select id from dept where name=‘销售部’) ; 

 4、示例:查询在“方东白”入职后的员工信息。

梳理

a.查询房东白的入职日期。

select entrydate from emp where name='方启白';

b.查询指定入职日期之后的员工信息。

select * from emp where entrydate > '2009-02-12';

优化后的子查询

select * from emp where entrydate > (select entrydate from emp where name='方启白';);

四、列子查询。

1、子查询返回的结果是一列(也可以是多行),这种子查询称为列子查询。

2、常用操作符:IN、NOTIN、ANY、SOME、ALL

3、示例1:查询销售部和市场部的所有员工信息。

梳理

a.先查询销售部和市场部的部门id。

select id from dept where name="销售部" or name="市场部";

b.再根据部门id查询所有员工信息。

select * from emp where dept_id in (2,4);

优化后的子查询

select * from emp where dept_id in (select id from dept where name="销售部" or name="市场部");

4、示例2:查询比财务部所有人工资都高的员工信息。

梳理

a.查询财务部所有人的工资

select id from dept where name='财务部';

selecr salary from emp where dept_id=3;

#优化后
selecr salary from emp where dept_id=(select id from dept where name='财务部');

b. 比财务部所有人工资都高的员工信息

select * from emp where salary > all (select salary from emp where dept_id=(select id from dept where name='财务部'));

5、示例3:查询比研发部任意一人工资都高的员工信息。

梳理

a.查询研发部所有人的工资。

select salary from emp where dept_id=(select id from dept where name='研发部');

b.查询比研发部任意一人工资都高的员工信息。

select * from emp where salary > any (select salary from emp where dept_id=(select id from dept where name='研发部'));

五、行子查询。

1、子查询返回的结果是一行(也可以是多列),这种子查询称为行子查询。

2、常用操作符:=、<>、IN、NOTIN

3、示例:查询与张无忌的薪资及直属领导相同的员工信息。

梳理

a.查询张无忌的薪资和直属领导。

select salary,managerid from emp where name='张无忌';

b.查询与张无忌的薪资及直属领导相同的员工信息。

select * from emp (salary,managerid) = (12500,1);

select * from emp (salary,managerid) = (select salary,managerid from emp where name='张无忌');

六、表子查询。 

1、子查询返回的结果是多行多列,这种查询称为表子查询。

2、常用操作符:IN

3、示例1:查询与鹿杖客、宋远桥职位相同的员工信息。

梳理

a.查询鹿杖客和宋远桥的职位和薪资。

select job,salary from emp name = '鹿杖客' or name = '宋远桥';

b.查询与鹿杖客、宋远桥职位相同的员工信息。

select * from emp where (job,salary) in (select job,salary from emp name = '鹿杖客' or name = '宋远桥');

4、示例2:查询入职日期是“2006-01-01”之后的员工信息及部门信息。

梳理

a.查询入职日期是“2006-01-01”之后的员工信息。

select * from emp where entrydate > '2006-01-01';

b.查询这部分员工对应的部门信息。

select e.*,d* from (select * from emp where antrydate > '2006-01-01') e left join dept d on e.dept_id=d.id;

多表联查总结

1、多表关系

一对多:在多的一方设置外键,关联一的一方的主键。

多对多:建立中间表,中间表包含两个外键,关联两张表的主键。

一对一:用于表结构拆分,在其中任何一方设置外键unique,关联另一方的主键。

2、多表关系

内连接

隐式:SELECT ... FROM 表A,表B WHERE 条件...

显示:SELECT ... FROM 表A INNER JOIN 表B 条件...

外连接

左外:SELECT ... FROM 表A LEFT JOIN 表B ON 条件...

右外:SELECT ... FROM 表A RIGHT JOIN 表B ON 条件...

自连接:SELECT ... FROM 表A 别名1,表A 别名2 WHERE 条件... 

子查询:标量子查询、列子查询、行子查询、表子查询

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小格子衬衫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值