`
fyd222
  • 浏览: 103950 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SQL 基础--> 子查询

 
阅读更多

--=========================

--SQL 基础--> 子查询

--=========================

/*

一、子查询

子查询就是位于SELECTUPDATE、或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 的比较

EXISTSIN的不同:

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

/*

注:子查询要包含在括号内

子查询一般放在比较条件的右侧

除非进行TOPN 分析,否则不要在子查询中使用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基础教程 源码和示例数据库

    《SQL Server 2012 T-SQL基础教程——源码与示例数据库》 本教程专注于Microsoft SQL Server 2012中的Transact-SQL(T-SQL)语言,这是SQL Server的主要查询语言,用于数据操作、查询、存储过程和数据库对象的编程...

    SQLServer-sql查询入门

    #### 二、SQL基础知识 - **SQL的重要性**:对于从事网站开发或维护数据库的人来说,熟练掌握SQL是至关重要的技能之一。无论是在ActiveServerPages中还是其他环境中,都需要使用SQL来访问和操作数据库。 - **数据存储...

    sqlserver2005-SQL查询-SQL程序设计-存储设计-查询调整优化

    在这个部分,你会学习如何编写复杂的查询,包括联接、子查询、聚合函数和窗口函数,以及如何使用视图和索引来提高查询效率。 接下来,"T-SQL程序设计"则更侧重于利用T-SQL进行数据库应用程序的开发。这部分内容涵盖...

    SQL基础--基础语句应用

    - 插入数据:`INSERT INTO`用于向表中插入新记录,可插入常量或子查询结果。 - 更新数据:`UPDATE`用于修改表中已有数据,`WHERE`子句用于指定更新条件。 - 删除数据:`DELETE FROM`用于删除满足特定条件的记录。...

    SQL基础教程-Mick-示例程序&习题答案

    - 子查询:嵌套在其他查询中的查询,用于获取满足特定条件的子集数据。 - 分页查询:LIMIT和OFFSET组合使用,实现查询结果的分页显示。 3. SQL示例程序: Mick的教程可能包含各种实际操作示例,如创建数据库模型...

    learn-sql-the-hard-way-笨方法学sql

    4. **子查询**(learn-sql-the-hard-waych12.html) - 内部子查询和外部子查询 - 使用IN、NOT IN、ANY、ALL操作符 - 作为FROM子句的子查询 - 使用子查询进行多表操作 5. **插入、更新与删除**(learn-sql-the-...

    精通SQL--结构化查询语言详解

    第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 ...

    Microsoft SQL Server 2008技术内幕:T-SQL查询

    主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决...

    sql学习-sql练习-SQL必知必会

    - **子查询**:在主查询内部嵌套一个查询,通常用于获取满足特定条件的子集数据。 - **聚合函数**:如COUNT、SUM、AVG、MAX和MIN,用于计算一组数据的总和、平均值、最大值和最小值。 - **窗口函数**:如RANK、ROW...

    SQL语句基础教程

    * 子查询:在WHERE子句中使用SELECT语句 * 连接表格:使用JOIN语句连接多个表格 * 数据聚合:使用GROUP BY和HAVING语句对数据进行聚合 SQL语法详解 ------------- ### SELECT指令 SELECT指令是SQL语言的基础,...

    Sql2008技术内幕-T-Sql查询

    2. **子查询与联接**:深入讲解嵌套查询的使用,以及各种类型的联接(内连接、外连接、交叉连接)和自连接,帮助读者处理多表数据。 3. **集函数**:如COUNT、SUM、AVG、MIN和MAX等,用于对一组值进行统计计算。 4...

    sql---基本练习.rar

    这个压缩包"sql---基本练习.rar"显然包含了一些SQL基础练习,旨在帮助初学者掌握和巩固SQL的基本概念和操作。让我们详细探讨一下SQL的核心知识点: 1. 数据库与表: SQL主要用于操作数据库,其中数据库是由一张或...

    sqlserver子查询练习.sql

    Microsoft SQL Server 2008技术内幕:T-SQL语言基础(子查询)练习sql文件

    创意sql--------

    2. **子查询嵌套**:通过嵌套子查询,可以解决复杂的数据关联问题。比如,你可以先用一个子查询找出满足特定条件的记录,然后在外部查询中进一步处理这些记录。 3. **联接艺术**:熟练掌握各种联接类型(如内联接、...

    Microsoft SQL Server 2008技术内幕:T-SQL查询.pdf

    3. **子查询**:子查询可以在SELECT、FROM和WHERE子句中嵌套,用于检索满足特定条件的数据子集。理解子查询的运行机制和性能影响至关重要。 4. **集合函数**:COUNT、SUM、AVG、MIN和MAX等函数可以对一组值进行计算...

    《收获,不止SQL--抓住SQL本质》PDF--超清带书签可编辑

    它涵盖了SQL的基本语法,如SELECT语句、JOIN操作、聚合函数、子查询以及窗口函数等,同时也深入讨论了高级话题,如存储过程、触发器和索引的使用。 SQL优化是数据库管理员和开发人员的重要技能,因为它直接影响到...

    MicroSoft Sql Server2005:T-Sql查询

    - **子查询**:嵌套在其他查询中的查询,常用于临时生成中间结果集。 - **联接查询优化**:考虑索引、查询计划和执行效率,避免全表扫描。 ### 4. 分组与聚合函数 - **GROUP BY和HAVING**:GROUP BY用于按一列或...

    sql server 2005 技术内幕t-sql查询源码

    2. **子查询与联接**:讲解如何使用子查询进行嵌套查询,以及各种类型的联接操作,如内连接(INNER JOIN)、外连接(LEFT JOIN、RIGHT JOIN、FULL JOIN)和交叉连接(CROSS JOIN)。 3. **集合操作**:可能涉及到...

    Microsoft SQL Server 2008技术内幕:T-SQL查询_源代码及附录.zip

    子查询是嵌套在其他查询中的查询,用于提供临时的结果集。它们可以出现在FROM、WHERE和HAVING子句中,用于复杂查询逻辑的构建。 4. **窗口函数**: SQL Server 2008引入了窗口函数,如RANK()、ROW_NUMBER()、LAG...

    SQL SERVER 2008 T-SQL 基础

    此外,还有子查询和联接查询,用于处理更复杂的查询需求。 2. **数据插入、更新与删除**:INSERT语句用于向表中插入新记录,UPDATE用于修改现有记录,DELETE则用于删除记录。这些操作都需要谨慎执行,因为它们会...

Global site tag (gtag.js) - Google Analytics