一,子查询概念
概念:sql语句中嵌套select语句,称为嵌套查询,又称子查询。
select * from 表名 where columnl=(select columnl form 表2);
外部可以是查询语句也可以是增删改查(insert,update,delete,select)
根据结果不同分为四类
1,标量子查询:子查询返回的是一个值只有一行一列
2,列子查询: 子查询返回结果有一列
3,行子查询: 子查询返回结果有一行
4,表字查询: 子查询返回多行多列
也根据查询位置,分为:where之后,from之后,select之后
二,标量子查询
标量子查询:返回的是一个值只有一行一列。
常用的符号基本就是比较运算符:<> > >= < <=(根据需求写关系)
例子1,查询销售部所有员工信息。
分析:员工表里没有部门信息,只有部门id,部门外键连接到部门表的主键id。
第一步:查到销售部id
select id from 部门表名 where name=‘销售部’
就是查询部门表的id字段,过滤条件是只查出叫销售部的id。即可得出销售部id
第二步:根据部门id查出员工信息
select * from 员工表名 where 部门id=4;
就是查询员工表所有字段(也就是员工所有信息),加上过滤条件是只查出部门id为4(上一步查出销售部id为4)的员工信息。即可查出所有销售部员工信息
但是这种方法要两步,麻烦。今天学的子查询就是把两句sql连在一起,可以用子查询一条命令搞点。
select * from 员工表名 where 部门id=(select id from 部门表名 where name=‘销售部’)
因为后面括号里的子查询的结果只有一个值,所以也称标量子查询。
等于命令基本一样,就是揉到一句了,本身id等于4,不写4了,直接连上算出4的过程。
三,列子查询
返回结果有一列(可以是多行),这种子查询称之为列子查询
第二个例子的子查询来说,查工资一个字段,只有一列,不同的员工组成不同行。所以例子1,2都是列子查询,子查询结果只有一列(多行但是正常)
常用的操作符:in、notin、any、some、all
这些符号后面三个是新认识的,详细讲一讲
in 在指定的集合范围之内,符合任意一个就行
notin 不在指定的集合范围内
any 子查询返回结果,满足任意一个就行
some 与any等同,使用some的地方都可以用any
all 子查询返回的所有值必须都满足
例子1,查询销售部和市场部的员工信息
第一步:查询销售部和市场部的部门id
select id from 部门表名 where name =‘销售部’or name =‘市场部’;
就是查询部门表id字段,加上筛选条件 名字字段名 等于 销售部 和 名字字段 等于 市场部;就能查出销售部id=2和市场部id=4
第二步:根据部门id查员工
select * from 员工表名 where 部门id in(2,4);
就是查询员工表所有字段,加个过滤条件,部门id要等于2或4(上一步查出的两个部门id,并且调用in函数,两个条件满足一个即可)。就只查出销售部和市场部员工了
继续通过子查询揉成一句话(因为括号里子查询的结果是一列;同样的字段,只是有多个结果,就用列子查询)
select * from 员工表名 where 部门id in(select id from 部门表名 where name =‘销售部’or name =‘市场部’);
一样的,本身写in(2,4)现在不写2,4了。写2和4出来的过程。
四,行子查询
查多少字段有多少列,查多少员工有多少行。以例子1的子查询来说,只查张君杰一个人,的不同字段(工资和领导id),就代表只有一行,但是有多列。所以例子1是行子查询
行子查询常用操作符:=、<>、in、not in
例子1,查询张君杰(任意员工,为了方便理解,都以张君杰为例)的薪资相同,领导相同的员工。
第一步:查询张君杰的薪资和直属领导。
select 薪资字段名 领导id字段名 from 员工表 where name=’张君杰‘;(假设查询结果是薪资=15000;领导id=3)
就是查员工表的薪资字段和领导id字段,筛选名字字段=张君杰。就查出了张君杰的薪资和领导id
第二步:根据上一步结果,查询和张君杰相同的员工。
select * from 员工表名 where salary =15000 and 领导id = 3;
这就查询员工表所有字段(等于查员工详细信息),加个筛选条件调用了and,既满足前面薪资字段=15000又满足后面领导id字段=3
注意!!!这种调用and的语法无法使用子查询来揉成一句话
可以不用and,换种写法:
select * from 员工表名 where(薪资字段名,领导id字段名)=(15000,3)
这句和上面那句查询结果一模一样,就是语法不同,把where条件的字段名和定义,分别都用括号括起来,用逗号隔开,默认一 一对应。都是完成第二步的sql语句!!!但是这种语法可以用子查询把一二步揉成一句话
用行子查询揉成一句话
select * from 员工表名 where(薪资字段名,领导id字段名)=(select 薪资字段名 领导id字段名 from 员工表 where name=’张君杰‘);
其实这句前面和第二步第二种语法一模一样,区别就在where条件,前面的字段名也是一样的,就后面的定义括号不同,本身应该写15000和3,但是现在写算出这两个数的过程,也就是第一步。
本文介绍了MySQL中的子查询概念及其分类,包括标量子查询、列子查询、行子查询和表子查询。通过实例展示了如何利用子查询在查询中简化操作,如查询销售部和市场部的员工信息,以及找寻薪资和领导ID相同的员工等。
728

被折叠的 条评论
为什么被折叠?



