课程五 子查询
本课重点:
1、在条件未知的情况下采用嵌套子查询
2、用子查询做数据处理
3、子查询排序
注意:以下实例中标点均为英文半角
一、概述:
子查询是一种SELECT句式中的高级特性,就是一个SELECT语句作为另一个语句的一个段。我们可以利用子查询来在WHERE字段中引用另一个查询来攻取值以补充其无法事先预知的子结果。
子查询可以用在WHERE子句,HAING子句,SELECT或DELETE语句中的FROM 子句。
注意:
1、子查询必须在一对圆括号里。
2、比较符号:>, =, 或者 IN.
3、子查询必须出现在操作符的右边
4、子查询不能出现在ORDER BY里
二、子查询的执行过程:
NESTED QUERY
SQL> SELECT dept_id
FROM s_emp
WHERE UPPER(last_name)='BIRI';
MAIN QUERY
SQL> SELECT last_name, title
FROM s_emp
WHERE dept_id =
这里 ,每个查询只运行一次。当然,子查询要首先被执行,大家设想一下,如果子查询中有一个以上的人的LASTNAME为BIRI,会如何?-----会出错,因为不能用=来连接。
ORA-1427: single-row subquery returns more than one row
以上的查询也被称为单行子查询。
DELECT子查询实例:
delete from new_table where cata_time > to_date('19990901','yyyymmdd') and pro_name=(
select pro_name from new_product where pro_addr in ('bj','sh'))
三、子查询中的GROUP 函数的应用
实例 1:
SQL> SELECT last_name, title, salary
FROM s_emp
WHERE salary <
(SELECT AVG(salary)
FROM s_emp);
实例2:
选择出工资最高的员工的家庭住址:
select emp_addr from employees where salary =
(select max(salary) from employees);
这是一个简单实用的例子,可以衍生出很多情况,在实际应用经常出现,请大家多多思考。
实例3:
SQL> SELECT dept_id, AVG(salary)
FROM s_emp
GROUP BY dept_id
HAVING AVG(salary) >
(SELECT AVG(salary)
FROM s_emp
WHERE dept_id = 32);
子查询被多次执行,因为它出现在HAVING 子句中。
SQL> SELECT title, AVG(salary)
FROM s_emp
GROUP BY title
HAVING AVG(salary) =
(SELECT MIN(AVG(salary))
FROM s_emp
GROUP BY title);
对子查询,我们了解这么多在理论上已经覆盖了所有的知识点,对于UPDATE 和DELETE的子查询,不作为重点,但也要练习掌握。今天到这,谢谢大家。
本课重点:
1、在条件未知的情况下采用嵌套子查询
2、用子查询做数据处理
3、子查询排序
注意:以下实例中标点均为英文半角
一、概述:
子查询是一种SELECT句式中的高级特性,就是一个SELECT语句作为另一个语句的一个段。我们可以利用子查询来在WHERE字段中引用另一个查询来攻取值以补充其无法事先预知的子结果。
子查询可以用在WHERE子句,HAING子句,SELECT或DELETE语句中的FROM 子句。
注意:
1、子查询必须在一对圆括号里。
2、比较符号:>, =, 或者 IN.
3、子查询必须出现在操作符的右边
4、子查询不能出现在ORDER BY里
二、子查询的执行过程:
NESTED QUERY
SQL> SELECT dept_id
FROM s_emp
WHERE UPPER(last_name)='BIRI';
MAIN QUERY
SQL> SELECT last_name, title
FROM s_emp
WHERE dept_id =
这里 ,每个查询只运行一次。当然,子查询要首先被执行,大家设想一下,如果子查询中有一个以上的人的LASTNAME为BIRI,会如何?-----会出错,因为不能用=来连接。
ORA-1427: single-row subquery returns more than one row
以上的查询也被称为单行子查询。
DELECT子查询实例:
delete from new_table where cata_time > to_date('19990901','yyyymmdd') and pro_name=(
select pro_name from new_product where pro_addr in ('bj','sh'))
三、子查询中的GROUP 函数的应用
实例 1:
SQL> SELECT last_name, title, salary
FROM s_emp
WHERE salary <
(SELECT AVG(salary)
FROM s_emp);
实例2:
选择出工资最高的员工的家庭住址:
select emp_addr from employees where salary =
(select max(salary) from employees);
这是一个简单实用的例子,可以衍生出很多情况,在实际应用经常出现,请大家多多思考。
实例3:
SQL> SELECT dept_id, AVG(salary)
FROM s_emp
GROUP BY dept_id
HAVING AVG(salary) >
(SELECT AVG(salary)
FROM s_emp
WHERE dept_id = 32);
子查询被多次执行,因为它出现在HAVING 子句中。
SQL> SELECT title, AVG(salary)
FROM s_emp
GROUP BY title
HAVING AVG(salary) =
(SELECT MIN(AVG(salary))
FROM s_emp
GROUP BY title);
对子查询,我们了解这么多在理论上已经覆盖了所有的知识点,对于UPDATE 和DELETE的子查询,不作为重点,但也要练习掌握。今天到这,谢谢大家。
浙公网安备 33010602011771号