用于返回主查询需要的数据,或者对检索到的数据做进一步的限制。通常,一个查询(子查询)的结果作为另一个查询(主查询)的数据源或判断条件,常见的子查询有WHERE子查询、HAVING子查询、FROM子查询、SELECT子查询、EXISTS子查询。子查询是嵌套在另一个SQL查询的WHERE子句中的查询,可以与SELECT、INSERT、UPDATE和DELETE语句中的逻辑运算符一起使用。示例工具:MySQL8.0、NavicatPremium12本文内容:SQL子查询适用范围:子查询在SQL数据分析中的应用使用子查询必须遵循以下规则:子查询必须用括号括起来。子查询的SELECT子句中只能有一列,除非主查询中有多列供子查询选择。子查询不能使用ORDERBY,但主查询可以。在子查询中,GROUPBY可以起到和ORDERBY一样的作用。返回多行数据的子查询只能与多值运算符一起使用,例如IN运算符。SELECT列表不能包含对BLOB、ARRAY、CLOB或NCLOB类型的值的任何引用。不能在聚合函数中直接使用子查询。BETWEEN运算符不能与子查询一起使用,但BETWEEN运算符可以在子查询中使用。创建数据表子查询通常与SELECT语句一起使用,其基本语法如下:数据演示创建两张表,一张是salary表,一张是job表,并插入数据。#创建工资表SALARYCREATETABLESALARY(IDVARCHAR(10),NAMEVARCHAR(10),AGEVARCHAR(10),ADDRESSVARCHAR(10),SALINT(10));向工资表中插入数据,数据内容如下:#向工资表中插入数据INSERTINTOSALARY(ID,NAME,AGE,ADDRESS,SAL)VALUES('C001','Rmesh',35,'Ahmedab??ad',2000),('C002','Khilan',25,'德里',1500),('C003','Kaushik',23,'Kota',2000),('C004','Chaitali',25,'孟买',6500),('C005','Hardik',27,'博帕尔',8500),('C006','Komal',22,'MP',4500),('C007','Tom',26,'MP',5500),('C008','Muffy',24,'Indore',10000);查询所有工资数据如下:SELECT*FROMSALARY;类似地创建一个作业表。#创建作业表JOBCREATETABLEJOB(JIDVARCHAR(10),JBVARCHAR(10));向job表插入数据,数据内容如下:#向job表插入数据INSERTINTOJOB(JID,JB)VALUES('C001','Teacher'),('C002','Docter'),('C003','老师'),('C004','工人'),('C005','护士'),('C006','老师'),('C007','医生'),('C008','老师');查询所有job数据如下:SELECT*FROMJOB;子查询过滤子查询最常见的用途是在WHERE子句IN运算符中,用于填充计算列。我们先看一个简单的例子。查询所有医生的工资,首先查询job表中所有医生的JID,查询结果如下:SELECTJIDFROMJOBWHEREJB='Docter';然后在salary表中查询ID为'C002','C007的工资情况',查询结果如下:SELECTSALFROMSALARYWHEREIDIN('C002','C007');这里使用子查询比较方便,子查询是从内到外依次处理的。在下面的SELECT语句中,MySQL实际上执行了两个Operation,第一个查询返回两个ID号:C002和C007。然后,将这两个值以IN运算符要求的逗号分隔格式传递给外层查询的WHERE子句。可以看到输出结果是正确的,与前面WHERE子句返回的值相同。SELECTSALFROMSALARYWHEREIDIN(SELECTJIDFROMJOBWHEREJB='Docter');使用子查询查询所有工资大于8000的员工信息,先在内部查询工资大于8000的ID,再在外部使用WHERE查询得到结果。SELECT*FROMSALARYWHEREIDIN(SELECTIDFROMSALARYWHEREIDIN(SELECTIDFROMSALARYWHERERESAL>8000);子查询作为计算字段的另一种方式是创建计算字段。创建计算字段需要使用聚合函数,如count,sum,avg,max,min等,这里先计算平均工资作为内查询,然后WHERE子句外查询得到所有低于平均工资的员工信息SELECT*FROMSALARYWHERESAL<(SELECTAVG(SAL)FROMSALARY);除了使用WHERE过滤,还可以使用HAVING过滤,HAVING子句可以过滤分组统计功能,也可以在HAVING子句中使用子查询查询工资最高的人至于薪水情况,先查询内部最高薪水,然后使用HAVING子句按名称过滤外部group,查询结果如下SELECTNAME,SALFROMSALARYGROUPBYNAMEHAVINGSAL=(SELECTMAX(SAL)FROMSALARY;本文转载自微信公众号《大话数据分析》,作者“尚天强”。您可以通过以下二维码关注。转载本文请联系大华数据分析公众号。
