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 基础--> 子查询--========================= /*一、子查询 子查询就是位于SELECT、UPDATE、或DELETE语句中内部的查询 二、子查询的分类 单行子查询 返回零行或一行 多行子查询 返回一
子查询
是在一个完整的查询语句中,嵌套不同功能的小查询,从而完成复杂查询的一种编写形式。本部分主要介绍非关联
子查询
,关联
子查询
的适用场景,语句写法,执行逻辑及相对应的注意事项。
1.非关联
子查询
1.1执行逻辑
1.2在WHERE子句中使用
子查询
1.2.1
子查询
返回一个具体数据
1.2.2
子查询
返回一条数据
1.2.3
子查询
返回多行单列数据
1.3在HAVING子句中使用
子查询
1.4在FROM子句中使用
子查询
2.关联
子查询
2.1在细分的组内进行比较
2.2使用EXISTS
子查询
允许把一个查询嵌套在另一个查询当中。
子查询
,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询。
子查询
可以包含普通select可以包括的任何子句,比如:distinct、 group by、order by、limit、join和union等;但是对应的外部查询必须是以下语句之一:select、insert、update、delete、set或 者do。
子查询
一、为什么会使用
子查询
二、什么是
子查询
三、
子查询
的具体使用+实例1、WHERE子句后使用
子查询
2、FROM子句后使用
子查询
一、为什么会使用
子查询
虽然可以通过连接查询来实现多表查询数据记录,但不建议使用,因为连接查询的性能很差,为什么呢?我们来进行分析,例如 我们要查询部门表dept 和雇员表employee中的数据记录,一般可能会写成:
SELECT * FROM Course c1,Scroe c2
WHERE c1.c_id=c2.c_id;
对于这条
SQL
语句,在
数据库
执行的时候,会先对
### 回答1:
SAP HANA
数据库
是一种面向内存的关系型
数据库
,具有高速的数据处理和查询能力。
SQL
(Structured Query Language)是一种用于
数据库
管理的标准化语言,用于查询、添加、删除和修改
数据库
中的数据。
SAP HANA
数据库
SQL
参考手册为用户提供了详细的
SQL
语法和语句用法,使得用户能够充分利用 SAP HANA
数据库
的强大功能和高效性能。这个手册提供了丰富的语句和函数,是 SAP HANA
数据库
操作者必备的工具之一,可以让用户根据自己的需求和数据特点,编写出高效、精确的
SQL
语句。
手册包含了基本的
SQL
语法和数据类型,包括数据的增删改查等常用操作。同时,它还提供了高级的特性和函数,如聚合函数、窗口函数、数据挖掘函数等,可以应用于数据分析、数据处理和数据建模等方面。
该手册还解释了 SAP HANA
数据库
语句执行过程的细节,包括语句优化、执行计划和性能调优等方面。通过深入了解 SAP HANA
数据库
SQL
参考手册,用户可以更好地理解
数据库
内部的工作原理,从而进一步优化
SQL
语句的性能。
总之,SAP HANA
数据库
SQL
参考手册是 SAP HANA
数据库
用户的重要工具,可以帮助用户更好地理解
数据库
的功能和性能,编写高效、准确的
SQL
语句,提高
数据库
的效率和性能。
### 回答2:
SAP HANA
数据库
SQL
参考手册是专门为SAP HANA
数据库
设计的一份指南。该手册包含了SAP HANA
数据库
所支持的各种
SQL
语句和函数,帮助用户更好地了解和使用该
数据库
。
SAP HANA
数据库
是一款高性能的内存
数据库
,可以帮助企业快速处理海量数据。为了发挥其最大的潜力,需要熟练使用SAP HANA
数据库
的各种
SQL
语句和函数。而这正是该手册的目的所在。
该手册详细介绍了
SQL
语句的语法和用法,包括SELECT、INSERT、UPDATE、DELETE等常用语句,还涉及到数据类型、索引、触发器、存储过程等高级主题。此外,手册还提供了各种函数的介绍,如聚合函数、日期函数、文本函数、数值函数等,以及如何创建和使用用户定义函数、视图和游标等。
需要说明的是,SAP HANA
数据库
SQL
参考手册不是用于入门学习的教材。用户需要有一定的
数据库
基础
和编程知识,并了解
SQL
的一般原理和用法。只有在此
基础
上,才能更好地理解和使用该手册。
总之,SAP HANA
数据库
SQL
参考手册是一份非常重要的工具,对于想要熟练使用SAP HANA
数据库
的开发人员和
数据库
管理员非常有用。
### 回答3:
SAP-HANA
数据库
SQL
参考手册是一本非常有用的工具,它为用户提供了丰富的语法和查询操作,以帮助他们更有效地使用SAP-HANA
数据库
。该手册覆盖了广泛的主题,包括数据建模、查询以及事务处理等方面,也提供了详细的语法和示例,以便用户在使用时可以轻松理解操作。
在手册中,用户可以找到各种不同类型的操作和函数,包括基本的查询操作、
子查询
、搭配联接使用的查询、排序函数、聚合函数、数据分析函数以及窗口函数等。除此之外,该手册还提供了许多计算、数据转换以及条件函数等,这些都是在
数据库
中十分有用和常见的操作。
另外,在手册中还提供了对SAP-HANA中特定功能的解释和指导,例如如何使用SAP-HANA中的新型模型,如何使用视图和数据封装技术等。无论用户是在处理大量的数据还是在执行复杂的分析操作,该手册都可以为他们提供有用的参考和指导。
总之,SAP-HANA
数据库
SQL
参考手册是一本非常重要的工具,它可以帮助用户更高效地使用SAP-HANA
数据库
,并帮助他们在处理大量数据和执行复杂的分析操作时提高工作效率。