9)子查询

Posted xuan01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9)子查询相关的知识,希望对你有一定的参考价值。

1、子查询:

  如果一个select语句嵌入到一个SQL语句,(select、insert、update、delete等)中,那么该select语句称为 “子查询”,包含子查询的语句称为“主查询”;通常将其写小括号内;

子查询可以用在主查询的where子句、having子句、select子句、from子句;

 2、where子句中的子查询:

1)子查询返回单值:

例如,我们在choose表中返回低于平均值的信息;

select avg(score) from choose;
select student_no,course_no,score from choose
    where score < (select avg(score) from choose);

 可以看到这儿我们的子查询只是返回了单值;

2)子查询返回多值:

例如,我们查询没有开设课程老师的所有信息;

首先我们新建一个老师信息,让其没有开设课程;若是使用左外连接的话:

insert into teacher values(\'005\',\'林老师\',\'1110000005\');
select t.*
    from teacher t left join course c 
    on t.teacher_no = c.teacher_no
    where c.teacher_no is null;

 我们可以使用子查询得到相同的结果:

select * from teacher
    where teacher_no not in (select teacher_no from course);

 同样,对于查询没有学生的班级:

select * from classes
    where class_no not in (select distinct class_no from student where class_no is not null);

这儿注意我们要将子查询的结果使用 distinct 关键字去重,因为,班级里面有许多学生,导致班级号的结果会重复出现;

 其中,子查询的结果如下:

 3、from子句中的子查询:

from子句中,select语句可以看成一个是虚拟的内存表,在此基础上进一步筛选;

1)之前写过一个group by子句的例子:得到系统数据库中的表数量;

select table_schema, count(*) cnt 
    from information_schema.tables
    group by table_schema
    having cnt > 50;

我们可以写成子查询形式:

select * from
    (select table_schema, count(*) cnt from information_schema.tables
    group by table_schema) db
    where cnt > 50;

可以看到整个 from 子句中,使用select子句作为from的数据表,此处要注意,必须用别名;上述中 的db 就是子查询的结果集 的别名;

这儿不同于之前的where子句,不能用别名,此处 cnt 就是数据表中的字段列表;

 2)得到低于自己平均分的课程、成绩:

select c.student_no,c.course_no,c.score,a.avg_score 
    from (select student_no,avg(score) avg_score from choose
     group by student_no) a, choose c
    where c.student_no = a.student_no
    and c.score < a.avg_score;

 在上述中,将子查询得到的结果集作为一个数据表,与另一张表choose 连接;使用where子句内连接的方法,得到低于自己平均分的课程;

SQL中的子查询

z子查询就是将一个查询(子查询)的结果作为另一个查询(主查询)的数据来源或判断条件的查询。常见的子查询有WHERE子查询,HAVING子查询,FROM子查询,SELECT子查询,EXISTS子查询,子查询要使用小括号();

WHERE子查询

在WHERE子句中进行使用查询

SELECT *
FROM EMP
WHERE SAL < (SELECT AVG(SAL) FROM EMP);
  • 查询薪资比平均薪资低的员工信息

HAVING子查询

HAVING子句是对分组统计函数进行过滤的子句,也可以在HAVING子句中使用子查询

SELECT JOB,AVG(SAL)
FROM EMP
GROUP BY JOB
HAVING AVG(SAL) = (SELECT MAX(AVG(SAL)) FROM EMP GROUP BY JOB);
  • 查询平均薪资最高的职位及其平均薪资

FROM子查询

FROM子查询就是将一个查询结构(一般多行多列)作为主查询的数据源

SELECT JOB,AVG(SAL)
FROM (SELECT JOB,AVG(SAL) AS AVGSAL FROM EMP GROUP BY JOB)TEMP
WHERE TEMP.AVGSAL>2000;
  • 查询平均薪资高于2000的职位以及该职位的平均薪资

SELECT子查询

SELECT子查询在SELECT子句中使用查询的结果(一般会和dual空表一起使用)

SELECT (SELECT COUNT(*) FROM EMP WHERE JOB = 'SALESMAN')/(SELECT COUNT(*) FROM EMP)
FROM DUAL;
  • 职位是SALESMAN的员工占总员工的比例

EXISIT子查询

将主查询的数据带到子查询中验证,如果成功则返回true,否则发水false。主查询接收true是就会显示这条数据,flase就不会显示。

SELECT *
FROM EMP E
WHERE EXISIT (
    SELECT *
    FROM DEPT D
    WHERE E.DEPTNO = D.DEPTNO);
  • 查询有部门的员工信息

查询薪资排名的员工信息(面试)

SELECT *
FROM EMP
WHERE SAL = (SELECT MIN(SAL) 
            FROM (SELECT ROWNUM,SAL 
                 FROM (SELECT SAL FROM EMP GROUP BY SAL ORDER BY SAL DESC)
                 WHERE ROWNUM<=n));
  • 查询薪资排名第n个员工的信息(包括并列排名)

思路:
1.先按薪资降序分组
2.再取前n名薪资中最低的薪资,即第n名的薪资。
3.最后在原表中找出薪资与最低薪资相同的员工信息。


以上
@Fzxey

以上是关于9)子查询的主要内容,如果未能解决你的问题,请参考以下文章

python学习-----9.14-----完整查询语句关键字单表查询多表查询子查询

sql学习笔记2

SQL Fundamentals: 子查询 || 分析函数

MySQL 查询和子查询

组和子查询问题

访问报告子组求和