--=========================
--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 Server 2012 T-SQL基础教程——源码与示例数据库》 本教程专注于Microsoft SQL Server 2012中的Transact-SQL(T-SQL)语言,这是SQL Server的主要查询语言,用于数据操作、查询、存储过程和数据库对象的编程...
#### 二、SQL基础知识 - **SQL的重要性**:对于从事网站开发或维护数据库的人来说,熟练掌握SQL是至关重要的技能之一。无论是在ActiveServerPages中还是其他环境中,都需要使用SQL来访问和操作数据库。 - **数据存储...
在这个部分,你会学习如何编写复杂的查询,包括联接、子查询、聚合函数和窗口函数,以及如何使用视图和索引来提高查询效率。 接下来,"T-SQL程序设计"则更侧重于利用T-SQL进行数据库应用程序的开发。这部分内容涵盖...
- 插入数据:`INSERT INTO`用于向表中插入新记录,可插入常量或子查询结果。 - 更新数据:`UPDATE`用于修改表中已有数据,`WHERE`子句用于指定更新条件。 - 删除数据:`DELETE FROM`用于删除满足特定条件的记录。...
- 子查询:嵌套在其他查询中的查询,用于获取满足特定条件的子集数据。 - 分页查询:LIMIT和OFFSET组合使用,实现查询结果的分页显示。 3. SQL示例程序: Mick的教程可能包含各种实际操作示例,如创建数据库模型...
4. **子查询**(learn-sql-the-hard-waych12.html) - 内部子查询和外部子查询 - 使用IN、NOT IN、ANY、ALL操作符 - 作为FROM子句的子查询 - 使用子查询进行多表操作 5. **插入、更新与删除**(learn-sql-the-...
第1章 数据库与sql基础 1 1.1 数据库的基本概念 1 1.1.1 数据库的由来 1 1.1.2 数据库系统的概念 3 1.2 数据库系统的结构、组成及工作流程 3 1.2.1 数据库的体系结构 3 1.2.2 数据库系统的组成 4 1.2.3 ...
主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决...
- **子查询**:在主查询内部嵌套一个查询,通常用于获取满足特定条件的子集数据。 - **聚合函数**:如COUNT、SUM、AVG、MAX和MIN,用于计算一组数据的总和、平均值、最大值和最小值。 - **窗口函数**:如RANK、ROW...
* 子查询:在WHERE子句中使用SELECT语句 * 连接表格:使用JOIN语句连接多个表格 * 数据聚合:使用GROUP BY和HAVING语句对数据进行聚合 SQL语法详解 ------------- ### SELECT指令 SELECT指令是SQL语言的基础,...
2. **子查询与联接**:深入讲解嵌套查询的使用,以及各种类型的联接(内连接、外连接、交叉连接)和自连接,帮助读者处理多表数据。 3. **集函数**:如COUNT、SUM、AVG、MIN和MAX等,用于对一组值进行统计计算。 4...
这个压缩包"sql---基本练习.rar"显然包含了一些SQL基础练习,旨在帮助初学者掌握和巩固SQL的基本概念和操作。让我们详细探讨一下SQL的核心知识点: 1. 数据库与表: SQL主要用于操作数据库,其中数据库是由一张或...
Microsoft SQL Server 2008技术内幕:T-SQL语言基础(子查询)练习sql文件
2. **子查询嵌套**:通过嵌套子查询,可以解决复杂的数据关联问题。比如,你可以先用一个子查询找出满足特定条件的记录,然后在外部查询中进一步处理这些记录。 3. **联接艺术**:熟练掌握各种联接类型(如内联接、...
3. **子查询**:子查询可以在SELECT、FROM和WHERE子句中嵌套,用于检索满足特定条件的数据子集。理解子查询的运行机制和性能影响至关重要。 4. **集合函数**:COUNT、SUM、AVG、MIN和MAX等函数可以对一组值进行计算...
它涵盖了SQL的基本语法,如SELECT语句、JOIN操作、聚合函数、子查询以及窗口函数等,同时也深入讨论了高级话题,如存储过程、触发器和索引的使用。 SQL优化是数据库管理员和开发人员的重要技能,因为它直接影响到...
- **子查询**:嵌套在其他查询中的查询,常用于临时生成中间结果集。 - **联接查询优化**:考虑索引、查询计划和执行效率,避免全表扫描。 ### 4. 分组与聚合函数 - **GROUP BY和HAVING**:GROUP BY用于按一列或...
2. **子查询与联接**:讲解如何使用子查询进行嵌套查询,以及各种类型的联接操作,如内连接(INNER JOIN)、外连接(LEFT JOIN、RIGHT JOIN、FULL JOIN)和交叉连接(CROSS JOIN)。 3. **集合操作**:可能涉及到...
子查询是嵌套在其他查询中的查询,用于提供临时的结果集。它们可以出现在FROM、WHERE和HAVING子句中,用于复杂查询逻辑的构建。 4. **窗口函数**: SQL Server 2008引入了窗口函数,如RANK()、ROW_NUMBER()、LAG...
此外,还有子查询和联接查询,用于处理更复杂的查询需求。 2. **数据插入、更新与删除**:INSERT语句用于向表中插入新记录,UPDATE用于修改现有记录,DELETE则用于删除记录。这些操作都需要谨慎执行,因为它们会...