SQL 基础之子查询(十一)

简介:

子查询:类型、语法、和注意事项


使用子查询能解决哪些问题?

wKioL1jHqvaAi5l5AABtYPakz2M348.jpg


子查询语法:

select select_list from table where expr operator (select select_list from table);

  • 子查询(内查询)在主查询(外查询)之前执行。

  • 主查询使用子查询结果。

  • 位置:select,where,from,having


1、查询谁的工资比Abel高

select last_name, salary from employees 

where salary >

(select salary

from employees

where last_name = 'Abel');

wKiom1jHsNqjz0PkAABsK2VriWA397.jpg


使用子查询注意事项

  • 子查询要包含在括号内。

  • 将子查询放在比较条件的右侧增强可读性(子查询可以出现在比较运算符的两侧)

  • 单行操作符对应单行子查询,多行操作符对应多行子查询


单行子查询:

– 子查询中的组函数

– HAVING 子句中的子查询


  • 只返回一行

  • 使用单行比较操作符


操作符 含义
= 等于
> 大于
>= 大于等于
< 小于
<= 小于等于
<> 不等于


select last_name, job_id, salary from employees

where job_id  in  (select job_id from employees

where last_name like  'Taylor')

and salary in

(select salary

from employees

where last_name like 'Taylor');

wKiom1jHtBOQ7GOyAABwuTaqM_M121.jpg


在子查询中使用组函数

select last_name, job_id, salary from employees where 

salary = (select min(salary) from employees);

wKiom1jHtGeRiG-7AAA9uqj_8nk378.jpg



子查询中的HAVING 子句

  • 首先执行子查询

  • 向主查询中的 HAVING 子句返回结果

select department_id, min(salary)

from employees

group by department_id

having min(salary) >

(select min(salary)

from employees

where department_id = 50);

wKiom1jHtS7h4McRAABdKCs5ddg593.jpg


多行子查询使用单行比较符,以下为错误写法

select employee_id, last_name

from employees

where salary =

(select min(salary)

from employees

group by department_id);


子查询中的空值问题

wKioL1jHteXjowVRAAAq6WRkNzU513.jpg

select last_name, job_id from employees

where job_id =

(select job_id from employees

where last_name = 'haas');



多行子查询

– 使用 ALL 或 ANY


  • 返回多行。

  • 使用多行比较操作符。

操作符 含义
IN 等于列表中的任何一个值
ANY 必须在=, !=, >, <, <=, >= 操作符之前使用,与列表中每个值进行比较,如果没有返回任何行,说明计算结果为FALSE
ALL 必须在=, !=, >, <, <=, >=操作符之前使用,与列表中每个值进行比较,如果没有任何行返回,说明计算结果为TRUE


使用范例:

在多行子查询中使用 ANY 

select employee_id, last_name, job_id, salary

from employees  where salary < any

(select salary

from employees

where job_id = 'IT_PROG')

and job_id < > 'IT_PROG';

wKiom1jHt8LTA-IiAADQ_EwqKZw542.jpg


在多行子查询中使用 ALL  操作符

select employee_id, last_name, job_id, salary

from employees

where salary < all

(select salary

from employees

where job_id = 'IT_PROG')

and job_id <> 'IT_PROG';

wKioL1jHt6DD9JYjAADE2eDGWKo847.jpg


子查询中的空值

select emp.last_name

from employees emp

where emp.employee_id not in

(select mgr.manager_id

from employees mgr);



1、HR 部门的同事想要你帮忙写一个 SQL 语句,该 SQL 语句可以传入一个值(员工的 last_name),然后返回结果是该员工同一部门同事的 last_name 和 hire_date,且要求该员工不在返回结果中。

举个例子,如果用户输入”Zlotkey”,结果就会返回除了 Zlotkey 之外的同一部门的其他同事的

last_name 和 hire_date.


select last_name,hire_date

from employees

where department_id =(select department_id from employees

where last_name= '&&enter_name')

and last_name < > '&enter_name';


2、请查询出所有高于平均工资的员工的 employee_id,last_name,salary,并将最终结果根据salary 降序排列。

select employee_id,last_name,salary 

from employees 

where salary > (select avg(salary) 

            from employees) 

order by salary;


3、请写一条 SQL 语句,要求查询出那些同一部门员工 last_name 里面包含字母”u”的员工的employee_id,last_name。

select employee_id,last_name from employees where department_id in (select department_id from employees where last_name like '%u%');



4、请帮助HR部门的同事查出所有部门location_id是1700的员工的last_name,department_id,job_id。

select last_name,department_id,job_id

from employees

where department_id in(select department_id

from departments

where location_id=1700);


让用户可以选择输入一个 location_id,然后输出结果。

select last_name,department_id,job_id

from employees

where department_id in(select department_id

from departments

where location_id=&enter_location);


5、请查出所有需要向 King 汇报的员工的 last_name 以及 salary

select last_name,salary,manager_id

from employees

where manager_id = (select employee_id

from employees

where last_name like 'King' and manager_id is null);


6、请查出所有是执行部(Executive)的员工的 department_id,last_name,job_id

select department_id,last_name,job_id

from employees

where department_id in(select department_id

from departments

where department_name like 'Executive');


7、请查出比 department_id 是 60 的任何员工薪水高的所有的员工的 last_name。

select department_id,last_name,salary from employees 

where salary > any 

(select salary from employees

where department_id=60);


8、查询所有高于平均工资,并且同一部门员工 last_name 里面包含字母”u”的员工的 employee_id,last_name,salary。

select employee_id,last_name,salary

from employees

where department_id in(select department_id

from employees

where last_name like '%u%')

and salary > (select avg(salary) from employees);




本文转自 yuri_cto 51CTO博客,原文链接:http://blog.51cto.com/laobaiv1/1906425,如需转载请自行联系原作者

相关文章
|
4月前
|
SQL 数据库
SQL Server 连接查询和子查询
SQL Server 连接查询和子查询
91 0
|
7月前
|
SQL
sql语言之子查询语句
sql语言之子查询语句
|
3月前
|
SQL Oracle 关系型数据库
七、SQL子查询
七、SQL子查询
32 0
|
9月前
|
SQL
SQL进阶之疯狂的子查询
今天我们不谈子查询的执行效率,只谈子查询功能。对于SQL语句来说,编程开发人员应该都不会陌生,其实各种复杂的逻辑最终落地也就是那么几个基本的招式,增删改查,然而我们经常听到武功招式中又各种连招,那就是了,子查询就是这么个意思。很多SQL简单查询完成不了的查询,子查询都可以很疯狂地完成。当然有的需要一个子查询就够了,有的甚至可能需要嵌套多个子查询来完成。
54 0
SQL进阶之疯狂的子查询
|
9月前
|
SQL 数据库
SQL中字段跟子查询结果判等,子查询结果为null的处理办法
前言:今天写功能的时候遇到一个问题,SQL中字段跟子查询结果判等,子查询结果为null,查询不到数据
|
9月前
|
SQL Oracle 关系型数据库
update时 单行子查询返回多个行 SQL 错误 [1427] 处理方案
我遇到此错误是在多表关联update的
411 0
|
SQL Oracle 关系型数据库
【SQL系列】标量子查询
嵌套在 SELECT 子句中的 SELECT 子句被称为标量子查询,它们只能返回一个值。
250 0
|
SQL 关系型数据库 MySQL
SQL实战:子查询的应用实例
SQL实战:子查询的应用实例
84 0
|
SQL 数据库
基础SQL——DDL
基础SQL——DDL
82 0
基础SQL——DDL
|
SQL 关系型数据库 MySQL
SQL优化--关联子查询的前世今生
SQL优化--关联子查询的前世今生
188 0
SQL优化--关联子查询的前世今生