• 15
  • 14
分享
  • SQL教程子查询——软件测试圈
  • 饭团🍙 2021-02-03 10:48:27 字数 3952 阅读 2090 收藏 14

子查询

含义:

出现在其它语句中的select语句,称为子查询、内查询、嵌套查询

外部的查询语句,称为为主查询或外查询 

分类:

案子查询出现的位置:

  • select后面      仅支持标量子查询

  • from后面       支持表子查询

  • ※where或having后面    标量子查询※、列子查询※、行子查询(较少)

  • exists后面(相关子查询)

按结果集的行列数不同:

  • 标量子查询(结果集只有一行一列)

  • 行子查询(结果集只有一行多列)

  • 列子查询(结果集只有一列多行)

  • 表子查询(结果集一般为多行多列) 

一、where或having后面

  1. 标量子查询(单行子查询)

  2. 列子查询(多行子查询)

  3. 行子查询(单行多列) 

特点:

  1. 子查询放在小括号内

  2. 子查询一般放在条件的右侧

  3. 标量子查询,一般搭配着单行操作符使用> < >= <= = <>

  4. 子查询的执行优先于主查询执行,主查询的条件使用到了子查询的结果 

列子查询,一般搭配着多行操作符的使用

in、any/some、all 

1、标量子查询

#案例1:谁的工资比Abel高? 
select last_name
from employees 
where salary > ( 
    select salary 
     from employees  
    where last_name = 'Abel' 
);
 
#案例2:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资 
select last_name, job_id, salary 
from employees 
where job_id = (
     select job_id 
    from employees 
    where employee_id = 141 
) and salary > ( 
    select salary 
    from employees 
    where employee_id = 143 
);
   
#案例3:返回公司工资最少的员工的last_name, job_id和salary 
select last_name, job_id, salary 
from employees 
where salary = ( 
    select min(salary) 
    from employees 
);
  
#案例4:查询最低工资大于50号部门最低工资的部门的部门id和其最低工资 
select department_id, min(salary) 
from employees 
group by department_id
having min(salary) > ( 
    select min(salary) 
    from employees
    where department_id = 50 
);

2、列子查询

11.png

#案例1:返回location_id是1400或1700的部门中所有的员工姓名
#使用表连接
select location_id, last_name
from employees e 
join departments d 
on e.department_id = d.department_id 
where location_id in (1400, 1700); 
#使用子查询(in关键字) 
select last_name
from employees 
where department_id in ( 
    select distinct department_id 
    from departments 
    where location_id in (1400, 1700) 
);  
 
#案例2:返回其它工种的,比job_id为‘IT_PROG’工种任一员工工资低的员工的:工号、姓名、job_id以及salary(any关键字)
select employee_id, last_name, job_id, salary 
from employees 
where department_id != 'IT_PROG'
and salary < any (
    select distinct salary 
    from employees 
    where job_id = 'IT_PROG' 
);
   
#案例3:返回其它工种的,比job_id为‘IT_PROG’工种所有员工工资都低的员工的:工号、姓名、job_id以及salary(all关键字)
select employee_id, last_name, job_id, salary
from employees 
where department_id != 'IT_PROG' 
and salary < all ( 
    select distinct salary 
    from employees 
    where job_id = 'IT_PROG'
); 
 
#案例4:问题同案例1,但是要用any或all            in 和 =any 等效 !!!       not in 和 != null等效 
select last_name 
from employees 
where department_id  = any ( 
    select distinct department_id
    from departments
    where location_id in (1400, 1700) 
);

3、行子查询 

#案例:查询员工编号最小,并且工资最高的员工的信息  
select * 
from employees 
where (employee_id, salary) = (
    select min(employee_id), max(salary) 
    from employees 
);

二、select后面

#案例1:查询每个部门的员工个数 
select d.*, (
    select count(*) 
    from employees e 
    where e.department_id = d.department_id 
) 个数 
from departments d; 
 
#案例2:查询员工号=102的部门名 
select (
    select department_name
    from departments d
    inner join employees e 
    on d.department_id = e.department_id 
    where e.employee_id = 102 
) 部门名;

三、from后面

#案例1:查询每个部门的平均工资的工资等级 
select ag_dep.*, g.grade_level
from (
    select department_id, avg(salary) ag
    from employees 
    group by department_id 
) ag_dep 
inner join job_grades g 
on ag_dep.ag between lowest_sal and highest_sal;

四、exists后面(相关子查询)

语法:

exists(完整的查询语句)

结果:

1或0

select exists(select employee_id from employees);

#案例1:查询有员工的部门名 
select department_name 
from departments d
where exists(
    select *
    from employees e
    where d.department_id = e.department_id 
);
   
#案例2:查询没有女朋友的男神信息 
#in 
select bo.* 
from boys bo 
where bo.id not in( 
    select boyfriend_id 
    from beauty b
)  
 
select bo.* 
from boys bo 
where not exists(
    select * 
    from beauty b
    where b.boyfriend_id = bo.id
);
 
#Test1:查询各部门中工资比本部门平均工资高的员工的员工号,姓名和工资
 select employee_id, last_name, salary,e.department_id
 from (
     select avg(salary) ag, department_id 
    from employees 
    group by department_id 
) ag_dep 
inner join employees e 
on e.department_id = ag_dep.department_id 
where salary > ag;     
 
#Test2:查询工资最高德员工的姓名,要求first_name和last_name显示为一列,列名为 姓.名
 select max(salary), concat(first_name, '.', last_name)
 from employees;

 

作者:请保持优秀。

原文链接:https://blog.csdn.net/IT_TIfarmer/article/details/110389287


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   前言  不管怎样,面试或者被面试和简历有着理不清的关系,面试官要通过简历了解面试者的基本信息、过往经历等。  面试者希望通过简历把自己最好的一面体现给面试官,所以在这场博弈中,作为面试者,需要掌握一定的技巧,写出一个高质量的简历,才能抓住面试官的眼光。  假如你是网上发出简历,你的简历必然会经过 HR 的筛选,一张简历 HR 可能也就花费 10 秒钟看一下,然后 HR 就会决定你这一关是 Fail 还是 Pass。  假如你是内推,如果你的简历没有什么优势的话,就算是内推你的人再用心,也无能为力。  一份好的简历  一份好的简历,可以给人的第一印象大大提升,那么我们如何准备一份高质量的简历...
            0 0 646
            分享
          •   测试负责人经常要做的事情之一就是安排需求。那么如何合理分配这些需求呢?当然,它不是给任何自由的人。需求划分也是一种艺术活动。  首先需要与业务、项目经理、开发确认背景、目标、变更点、影响范围、计划等。  其次要结合这群学生的考试计划,了解大家目前的需求和进度。如果是紧急重要的需求,尽量给熟悉这个业务和模块的同学优先,保证功能的交付和上线的稳定性。  如果需求不急,可以和其他同学一起练手。一开始可以带旧带新,就是熟悉的同学会和不熟悉的同学一起考,重点地方可以控制。当所有的学生都开始了,你就不需要以旧换新了。  你可能会想,如果需求很迫切,而熟悉这个功能的同学都是工作满满,没有精力去满足新的需...
            0 0 955
            分享
          •   很多人不知道写测试用例有什么用,而仅仅是像工具人一样,在每次提测之前,把测试用例照着需求文档抄一遍,仿佛像是走个过场。  开发提测之后,就照着测试用例点点点,可能一天就走完用例了,开发代码写得真好,测试用例执行完毕都没有测出bug,然后美其名曰:测试完了,达到上线标准。  测完之后,测试用例毫无价值,像随手仍垃圾一样,随地保存,终于无迹可寻。  在他们眼里,从事测试工作,和去东莞进厂打工没什么区别。  反正测试用例写久了,都能成为人人爱戴的熟练工,想着到了35岁,光荣下岗,回老家享受荣华富贵。  最后上线之后,bug一大堆,反而还怪写测试用例浪费时间,且没有用。  一、为什么要写测试用例?...
            12 12 2089
            分享
          • 混迹于测试行业这么长时间了,一直想写一篇关于软件测试的经验分享的文章,但苦于工作原因迟迟未下笔。最近终于有了些闲余时间,遂决定把自己的心路历程及所感所想记录下来,与各位同行共勉。软件测试究竟是做什么的呢?软件测试是为了发现错误而执行程序的过程。或者说,软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误的过程。简而言之就是证明程序的正确性,检察系统是否满足用户需求,发现bug,证明程序有错。(划重点:找bug不是改bug哦~)软件测试前景又如何?软件测试工程师行业前景好、职业寿命长:根据相关招...
            0 0 1075
            分享
          •   测试报告作为沟通测试活动结果的重要文档,其撰写效率和质量直接影响团队的决策和产品的改进。以下是三个可以显著提升测试报告效率的技巧,每个技巧均配有真实的使用场景案例。  1. 测试报告模板  概述:  侧重于模板的通用性和可定制性,使其既能够适应不同项目的需求,又能够保持报告的核心结构。创建一个测试报告模板,确保每次报告都包含关键信息,如测试目的、范围、方法、结果、问题和建议。模板的标准化有助于提高报告的一致性和可读性。  使用场景案例:  每个项目都需要定期提交测试报告。团队开发了一个通用的测试报告模板,包括以下几个部分:  - 测试摘要:快速了解测试活动的关键指标。  - 测试环境和配置...
            0 0 1026
            分享
      • 51testing软件测试圈微信