SQL 基础-- 子查询
--=========================
--SQL 基础--> 子查询
--=========================
/*
一、子查询
子查询就是位于SELECT、UPDATE、或DELETE语句中内部的查询
二、子查询的分类
单行子查询
返回零行或一行
多行子查询
返回一行或多行
多列子查询
返回多列
相关子查询
引用外部SQL语句中的一列或多列
嵌套子查询
位于其它子查询中的查询
三、子查询语法 */
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
/*
子查询(内部查询)在执行主查询之前执行一次
然后主查询(外部查询)会使用该子查询的结果
四、子查询的规则
将子查询括在括号中
将子查询放置在比较条件的右侧
只有在执行排序Top-N分析时,子查询中才需要使用ORDER BY 子句
单行运算符用于单行子查询,多行运算符用于多行子查询
五、单行子查询
仅返回一行
使用单行的表较运算符:= ,>, >= ,< , <= ,<>
在WHERE 子句中使用子查询 */
SQL> select ename,job from emp
2 where empno = (
3 select empno from emp
4 where mgr = 7902 );
ENAME JOB
---------- ---------
SMITH CLERK
--使用分组函数的子查询
SQL> select ename,job,sal
2 from emp
3 where sal >
4 (select avg(sal) from emp);
ENAME JOB SAL
---------- --------- ----------
JONES MANAGER 2975
BLAKE MANAGER 2850
CLARK MANAGER 2450
SCOTT ANALYST 3000
KING PRESIDENT 5000
FORD ANALYST 3000
--在HAVING子句中使用子查询
SQL> select deptno,min(sal)
2 from emp
3 group by deptno
4 having min(sal) >
5 (select min(sal)
6 from emp
7 where deptno = 20);
DEPTNO MIN(SAL)
---------- ----------
30 950
10 1300
--在FROM 子句中使用子查询
SQL> select empno,ename
2 from
3 (select empno,ename
4 from emp
5 where deptno = 20);
EMPNO ENAME
---------- ----------
7369 SMITH
7566 JONES
7788 SCOTT
7876 ADAMS
7902 FORD
--单行子查询中的常见错误
--子查询的结果返回多于一行
SQL> select empno,ename
2 from emp
3 where sal =
4 (select sal
5 from emp
6 where deptno = 20);
(select sal
*
ERROR at line 4:
ORA-01427: single-row subquery returns more than one row
--子查询中不能包含ORDER BY子句
SQL> select empno,ename
2 from emp
3 where sal >
4 (select avg(sal)
5 from emp
6 order by empno);
order by empno)
*
ERROR at line 6:
ORA-00907: missing right parenthesis
--子查询内部没有返回行,如下语句可以正确执行,但没有数据返回
SQL> select ename,job
2 from emp
3 where empno =
4 (select empno
5 from emp
6 where mgr = 8000);
no rows selected
/*
六、多行子查询
返回多个行
使用多行比较运算符IN ,ANY ,ALL
在多行子查询中使用IN 操作符 */
SQL> select empno,ename,job
2 from emp
3 where sal in
4 (select max(sal)
5 from emp
6 group by deptno);
EMPNO ENAME JOB
---------- ---------- ---------
7698 BLAKE MANAGER
7902 FORD ANALYST
7788 SCOTT ANALYST
7839 KING PRESIDENT
--在多行子查询中使用ANY 操作符
SQL> select empno,ename,job
2 from emp
3 where sal < any
4 (select avg(sal)
5 from emp
6 group by deptno);
EMPNO ENAME JOB
---------- ---------- ---------
7369 SMITH CLERK
7900 JAMES CLERK
7876 ADAMS CLERK
7521 WARD SALESMAN
7654 MARTIN SALESMAN
7934 MILLER CLERK
7844 TURNER SALESMAN
7499 ALLEN SALESMAN
7782 CLARK MANAGER
7698 BLAKE MANAGER
--在多行子查询中使用ALL 操作符
SQL> select empno,ename,job
2 from emp
3 where sal > all
4 (select avg(sal)
5 from emp
6* group by deptno)
EMPNO ENAME JOB
---------- ---------- ---------
7566 JONES MANAGER
7788 SCOTT ANALYST
7839 KING PRESIDENT
7902 FORD ANALYST
/*
七、相关子查询
子查询中使用了主查询中的某些字段,主查询每扫描一行都要执行一次子查询 */
--查询工资高于同一部门的员工的部门号,姓名,工资
SQL> select deptno,ename,sal
2 from emp outer
3 where sal >
4 (select avg(sal)
5 from emp inner
6 where inner.deptno = outer.deptno);
DEPTNO ENAME SAL
---------- ---------- ----------
30 ALLEN 1600
20 JONES 2975
30 BLAKE 2850
20 SCOTT 3000
10 KING 5000
20 FORD 3000
--查询负责管理其它员工的员工记录(使用exists)
SQL> select empno,ename
2 from emp outer
3 where exists
4 (select empno
5 from emp inner
6 where inner.mgr = outer.empno);
EMPNO ENAME
---------- ----------
7566 JONES
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7902 FORD
--查询不管理其它员工的职员(not exists)
SQL> l3
3* where exists
SQL> c /where/where not
3* where not exists
SQL> l
1 select empno,ename
2 from emp outer
3 where not exists
4 (select empno
5 from emp inner
6* where inner.mgr = outer.empno)
SQL> /
EMPNO ENAME
---------- ----------
7369 SMITH
7499 ALLEN
7521 WARD
7654 MARTIN
7844 TURNER
7876 ADAMS
7900 JAMES
7934 MILLER
EXISTS 和NOT EXISTS 与IN 和NOT IN 的比较
EXISTS与IN的不同:
EXISTS只检查行的存在性,IN 要检查实际值的存在性(一般情况下EXISTS的性能高于IN)
NOT EXISTS 和NOT IN
当值列表中包含空值的情况下,NOT EXISTS 则返回true,而NOT IN 则返回false.
--看下面的查询,查询部门号不在emp表中出现的部门名称及位置
SQL> select deptno,dname,loc
2 from dept d
3 where not exists
4 (select 1
5 from emp e
6* where e.deptno = d.deptno)
DEPTNO DNAME LOC
---------- -------------- -------------
40 OPERATIONS BOSTON
--IN与空值
SQL> SELECT *
2 FROM emp e
3 WHERE e.empno NOT IN (
4 SELECT 7369 FROM dual
5 UNION ALL
6 SELECT NULL FROM dual
7 )
8 ;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
SQL> SELECT *
2 FROM emp e
3 WHERE e.empno IN ('7369',NULL)
4 ;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980-12-17 800.00 20
/*
注:子查询要包含在括号内
子查询一般放在比较条件的右侧
除非进行TOP-N 分析,否则不要在子查询中使用ORDER BY。 */
/*
八、多列子查询
1、成对比较
查询工资为部门最高的记录 */
SQL> select * from scott.emp
2 where (sal,job) in
3 (select max(sal),job from scott.emp group by job);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7839 KING PRESIDENT 17-NOV-81 5000 10
7566 JONES MANAGER 7839 02-APR-81 2975 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
/*
2、非成对比较,实现了与上述类似的功能*/
SQL> select * from scott.emp
2 where sal in (select max(sal) from scott.emp group by job)
3 and job in (select distinct job from scott.emp);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
/*
九、嵌套子查询
即位于子查询内部的子查询,嵌套层数最多可达层。然而应尽量避免使用嵌套子查询,使用表连接的查询性能会更高*/
SQL> select deptno,Num_emp
2 from (select deptno,count(empno) as Num_emp from emp group by deptno) d
3 where Num_emp > 3;
DEPTNO NUM_EMP
---------- ----------
30 6
20 5
/*
注意:子查询对空值的处理
除了count(*)外,都会忽略掉空值 */
/*
十、更多*/
Oracle 数据库实例启动关闭过程
Oracle 10g SGA 的自动化管理
使用OEM,SQL*Plus,iSQL*Plus 管理Oracle实例
Oracle实例和Oracle数据库(Oracle体系结构)
SQL 基础-->常用函数
SQL基础-->过滤和排序
SQL 基础-->SELECT 查询
SQL 基础-- 子查询相关推荐
- SQL基础-子查询EXISTSUNION
一.子查询 1.使用子查询作为计算字段 子查询:嵌套在其他查询中的查询现在有两个表,student表和teacher表创建teacher表,并插入数据: CREATE TABLE `teacher` ...
- SQL基础--层次化查询(START BY ... CONNECT BY PRIOR)
为什么80%的码农都做不了架构师?>>> --====================================================== --SQL基础--& ...
- sql 标量子查询_SQL Server 2017:标量子查询简化
sql 标量子查询 Nowadays a lot of developers use Object-Relational Mapping (ORM) frameworks. ORM is a prog ...
- SQL Server子查询
SQL Server子查询 一. SQL Server子查询. 子查询是一个嵌套在另一个语句(如:[SELECT],[INSERT],[UPDATE]或[DELETE])语句或其他子查询中的查询.任何 ...
- SQL语句基础-子查询
子查询 在SQL语句中,一个select-from-where语句称为一个查询块.如果一个select语句嵌套在一个select,insert,update或delete语句中,则称之为子查询或者内存 ...
- 零基础自学SQL课程 | 子查询
大家好,我是宁一. 今天讲解SQL教程第18课:子查询. SQL语句可以嵌套,最常见的就是查询语句的嵌套. 基本语法: SELECT <字段名> FROM <表名> WHERE ...
- MySQL 基础 ———— 子查询
引言 承接<MySQL 基础 ---- 连接查询>,本文介绍和展示SQL中子查询的使用. 子查询是出现在其他语句中的select 语句,也称为内查询.外部的查询语句,称为主查询或外查询. ...
- 性能为王:SQL标量子查询的优化案例分析
本篇整理内容是黄廷忠在"云和恩墨大讲堂"微信分享中的讲解案例,SQL优化及SQL审核,是从源头解决性能问题的根本手段,无论是开发人员还是DBA,都应当持续深入的学习SQL开发技能, ...
- SQL Sever 子查询与嵌套查询
数据库表 1.带 in 的嵌套查询 查询Student表 并且 Sno 在 SC表中有 select * from Student where Sno in(select Sno from SC) 2 ...
最新文章
- flask https启动
- java,list遍历赋值
- WebView加载html页面
- 【渝粤教育】广东开放大学 个人与团队管理 形成性考核 (57)
- java mysql nullpointerexception_无法从Java连接到MySQL:MySQL驱动程序连接逻辑中的NullPointerException...
- Ubuntu 11.04下最流行的17款应用(linux在中国市场的占有率好像只有0.1几%)
- Java JDBC连接Oracle,java面试题,java初级笔试题
- C语言实现hello world代码
- 大学四年只学java_大学四年废了怎么办,不如来学java
- python 系统策略禁止这个安装_电脑无法安装软件提示设置了系统策略禁止此项安装怎么办?...
- Flink大数据计算的机遇与挑战
- PSP 版本6.60 破解 PRO-B10自制系统升级图文教程
- 变频器压频比的正确设置方法
- android toast显示在中间,android Toast 弹出在屏幕中间位置以及自定义Toast
- 双硬盘主机安装Ubuntu 18.04
- vue上传音视频文件并获取时长
- WKID对照表:Projected Coordinate Systems
- 电动汽车基于Origin的数据分析
- 学习编程一年需要花费多少?自学可以成为程序员吗?
- 实时渲染大赛太卷了,来看提前交卷的优秀参赛作品
热门文章
- 【Linux 内核】进程优先级与调度策略 ③ ( 设置、获取线程优先级的核心函数 | 修改线程调度策略函数 )
- 【C 语言】字符串模型 ( strstr-do…while 模型 )
- 【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )
- 【设计模式】责任链模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
- 【错误记录】Google Play 上架报错 ( 您的应用包含违反“元数据”政策的内容 | GP 政策中心 )
- 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )
- 【数据挖掘】高斯混合模型 ( 与 K-Means 每个步骤对比 | 初始参数设置 | 计算概率 | 计算平均值参数 | 计算方差参数 | 计算高斯分布概率参数 | 算法终止条件 )
- 【iOS 开发】Objective-C 入门 Xcode 环境详解
- [Spring cloud 一步步实现广告系统] 16. 增量索引实现以及投送数据到MQ(kafka)
- html字符实体和实体名称 lt;