SQL 基础之使用子查询检索数据(二十二)

多列子查询

where (manager_id, department_id) in

子查询

100 90

102 60

124 50

主查询的每行都与多行和多列的子查询进行比较

列的比较

多列的比较,包含子查询可以是:

不成对比较

成对比较

成对比较子查询
1、显示与员工名为“John”同部门且同一个经理的其它员工信息

select employee_id, manager_id, department_id from empl_demo

where (manager_id, department_id) IN

(select manager_id, department_id from empl_demo

where first_name = ‘John‘)

AND first_name <> ‘John‘;

不成对比较

1、显示名字不为 “John”员工的经理ID和部门ID的员工号、经理号、部门号

select employee_id, manager_id, department_id

from empl_demo

where manager_id in

(select manager_id

from empl_demo

where first_name = ‘john‘)

and department_id in

(select department_id

from empl_demo

where first_name = ‘john‘)

and first_name <> ‘john‘;

标量子查询表达式

标量子查询是从一行中返回一列的子查询

标量子查询可在下列情况下使用:

– DECODE 和 CASE 条件和表达式的一部分

– SELECT 中除 GROUP BY 子句以外的所有子句中

– UPDATE 语句的 SET 子句和 WHERE 子句

CASE 表达式中的标量子查询:

select employee_id, last_name, department_id,

(case

when department_id =

(select department_id

from departments

where location_id = 1800)

then ‘canada‘ else ‘usa‘ end) location

from employees;

ORDER BY 子句中的标量子查询:

select employee_id, last_name,department_id

from employees e

order by (select department_name

from departments d

where e.department_id = d.department_id);

相关子查询

相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询

子查询中使用主查询中的列

select column1, column2, ...

from table1 Outer_table

where column1 operator

(selecT column1, column2

from table2

where expr1 = Outer_table.expr2);

2、查找所有的员工信息,谁的薪金超过其部门的平均工资

select last_name, salary, department_id

from employees outer_table

where salary >

(selecT AVG(salary)

from employees inner_table

where inner_table.department_id =

outer_table.department_id);

3、显示哪些员工工作变更过至少两次

select e.employee_id, last_name,e.job_id from employees e

where 2 <= (select count(*) from job_history

where employee_id = e.employee_id);

使用 EXISTS 运算符

EXISTS操作符检查在子查询中是否存在满足条件的行。

如果在子查询中存在满足条件的行:

– 不在子查询中继续查找

– 条件返回 TRUE

如果在子查询中不存在满足条件的行:

– 条件返回 FALSE

– 继续在子查询中查找

1、使用 EXISTS 操作符查找领导

select employee_id, last_name, job_id, department_id

from employees outer

where exists ( select ‘x‘

from employees

where manager_id =

outer.employee_id);

查找没有任何员工的部门

select department_id, department_name

from departments d

where not exists (select ‘x‘

from employees

where department_id = d.department_id);

相关UPDATE

使用相关子查询依据一个表中的数据更新另一个表的数据。

update table1 alias1 set column = (select expression from table2 alias2

where alias1.column = alias2.column);

违反范式的表 EMPL6 添加字段存储部门名称(添加字段以后违反范式)

使用相关子更新填充表

alter table empl6 add(department_name varchar2(25));

update empl6 e

set department_name =

(select department_name

from departments d

where e.department_id = d.department_id);

相关DELETE

使用相关子查询依据一个表中的数据删除另一个表的数据

delete from table1 alias1

where column operator

(select expression

from table2 alias2

where alias1.column = alias2.column);

1、使用相关子查询删除EMPL6存在同时也存在于EMP_HISTORY表中的数据。

delete from empl6 e

where employee_id =

(select employee_id

from emp_history

where employee_id = e.employee_id);

WITH 子句

使用 WITH 子句, 可以避免在 SELECT 语句中重复书写相同的语句块

WITH 子句将该子句中的语句块执行一次 并存储到用户的临时表空间中

使用 WITH 子句可以提高查询效率

1、使用WITH子句编写一个查询,来显示部门名称和这些部门员工的工资总额大于跨部门的平均工资的部门及工资总额

with

dept_costs as (

select d.department_name, sum(e.salary) as dept_total

from employees e join departments d

on e.department_id = d.department_id

group by d.department_name),

avg_cost as (

select sum(dept_total)/count(*) as dept_avg

from dept_costs)

select *

from dept_costs

where dept_total >

(select dept_avg

from avg_cost)

order by department_name;

递归 WITH 子句

递归WITH子句:

Enables formulation of recursive queries.

Creates query with a name, called the Recursive WITH element name

Contains two types of query blocks member: anchor and a recursive

Is ANSI-compatible

with reachable_from (source, destin, totalflighttime) as

(

select source, destin, flight_time

from flights

union all

select incoming.source, outgoing.destin,

incoming.totalflighttime+outgoing.flight_time

from reachable_from incoming, flights outgoing

where incoming.destin = outgoing.source

)

select source, destin, totalflighttime

from reachable_from;

时间: 2024-12-23 17:05:58

SQL 基础之使用子查询检索数据(二十二)的相关文章

7、SQL基础整理(子查询)

子查询 (用来进行两表等之间的查询) ***括号里面的查询只能显示一个列的信息 select *from haha where age in ( select MAX(age) from haha where bumen = '销售部' )and bumen in ( select bumen from haha group by bumen having COUNT(*)>5 ) --练习:按年龄从小到大排序后第..人的信息 select top 3 *from haha where code

SQL Server调优系列基础篇(子查询运算总结)

原文:SQL Server调优系列基础篇(子查询运算总结) 前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴趣的童鞋可以点击查看. 本篇我们介绍关于子查询语句的一系列内容,子查询一般是我们形成复杂查询的一些基础性操作,所以关于子查询的应用方式就非常重要. 废话少说,开始本篇的正题. 技术准备 数据库版本为SQL Server2008R2,利用微软

【T-SQL基础】03.子查询

本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式 [T-SQL基础]05.集合运算 [T-SQL基础]06.透视.逆透视.分组集 [T-SQL基础]07.数据修改 [T-SQL基础]08.事务和并发 [T-SQL基础]09.可编程对象 ----------------------------------------------------

Bootstrap &lt;基础二十二&gt;超大屏幕(Jumbotron)

Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: 创建一个带有 class .jumbotron. 的容器 <div>. 除了更大的 <h1>,字体粗细 font-weight 被减为 200px. 下面的实例演示了这点: <!DOCTYPE html> <html> <head> <tit

数据库开发基础-教案-6 子查询

子查询,又叫做嵌套查询. 将一个查询语句做为一个结果集供其他SQL语句使用,就像使用普通的表一样,被当作结果集的查询语句被称为子查询. 子查询有两种类型: 一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数: 另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的数据表. 新建一个部门表,一个员工表,员工表中每个人员的部门列用部门的编号. 子查询示例: 练习一: 练习二: 练习三: 分页查询语句示例: 查看总共可以分为多

sql 在not in 子查询有null值情况下经常出现的陷阱

如果下:Table_A表和Table_B表,要求查询出在Table_A表中不在Table_B表中的记录. CREATE TABLE [dbo].[Table_A]( [ID] [nchar](10) NULL, [Name] [nchar](10) NULL ) ON [PRIMARY] GO ID Name 001 张三 002 李四 003 王五 CREATE TABLE [dbo].[Table_B]( [ID] [nchar](10) NULL, [Name] [nchar](10) N

11-03C#基础--数据库之子查询语句

一.子查询--查询的嵌套(重点记忆) select bumen,COUNT(*) from haha group by bumen having COUNT(*)>=5 select MAX(age)from haha where bumen='销售部' select*from haha where bumen='销售部'and age =35 --汇总-- select MAX(age)from haha where bumen in ( select bumen from haha grou

SQL复习三(子查询)

子查询 子查询就是嵌套查询,即select中包含这select,如果一条语句中存在着两个,或者两个以上的select,那么就是子查询语句了. 子查询出现的位置 where后,作为条件的一部分: from后,作为被查询的一条表: 当子查询出现在where 后作为条件时,还可以使用以下的关键字: any all 子查询结果集的形式: 单行单列(用于条件) 单行多列(用于条件) 多行单列(用于条件) 多行多列(用于表) 1.工资高于Allen的员工. 分析: 查询条件:工资>Allen工资,其中All

SQL 基础之多表查询(十)

JOINS 类型和它的语法 Natural joins(自然连接): – NATURAL JOIN 子句 – USING 子句 – ON 子句 自连接 非等值连接 Outer joins(外连接): – LEFT OUTER JOIN(左外连接) – RIGHT OUTER JOIN(右外连接) – FULL OUTER JOIN(全外连接) 笛卡尔积 – Cross join(交叉连接) 语法: select table1.column, table2.column from table1 [