Chinaunix首页 | 论坛 | 博客
  • 博客访问: 981320
  • 博文数量: 358
  • 博客积分: 8185
  • 博客等级: 中将
  • 技术积分: 3751
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 16:27
个人简介

The views and opinions expressed all for my own,only for study and test, not reflect the views of Any Company and its affiliates.

文章分类

全部博文(358)

文章存档

2012年(8)

2011年(18)

2010年(50)

2009年(218)

2008年(64)

我的朋友

分类: Oracle

2009-07-19 20:48:56

■子查询
SELECT select_list
FROM table
WHERE expro perator (SELECT select_list 
   FROM table);
你可以将子查询放在许多的 SQL 子句中,包括:
:: WHERE 子句
:: HAVING 子句
:: FROM 子句
比较条件分为两个种类:单行运算符 (>, =, >=, <, <>, <=) 从内 SELECT 语句只返回一行的查询
     多行运算符 (IN, ANY, ALL)。从内 SELECT 语句返回多行的查询
子查询可以被放在 CREATE VIEW 语句中、CREATE TABLE 语句、UPDATE 语句、INSERT 语句的 INTO 子句和 UPDATE 语句的 SET 子句中。
首先执行子查询 (内查询) 显示子查询返回的值,然后用内查询返回的结果执行外查询,最后,执行整个查询 (包括子查询),显示相同的结果。
外和内查询可以从不同的表中取得数据。
・子查询错误
单行运算符用于多行子查询
eg:
select employee_id,last_name
from employees
where salary= //把=改成IN
(select min(salary)
from employees
group by department_id);
・子查询问题,语句正确
eg:
select last_name,job_id
from employees
where job_id=
(select job_id
from employees
where last_name='Haas');
no rows selected //子查询无返回值
如果job存在null值,也没有返回行,因为比较两个空值还是空,因此where子句的条件不为true.

■多行子查询
操作 含义
IN 等于列表中的任何成员
ANY 比较子查询返回的每个值
ALL 比较子查询返回的全部值
ANY 意思是大于最小值。 =ANY 等同于 IN。
ALL 意思是大于最大值。
当使用 SOME 或者 ANY 时,通常用 DISTINCT 关键字防止返回被多次选择的行。
NOT 运算符可以与 IN、ANY 和 ALL 运算符一起使用。
eg:
select emp.last_name
from employees emp
where emp.employee_id not in
(select mgr.manager_id
from employees mgr);
no rows selected
只要空值可能是子查询结果集的一部分,就不能用 NOT IN 运算符。NOT IN 运算符相当于 <> ALL。
注意到空值作为一个子查询结果集的一部分,如果你使用 IN 操作符的话,不是一个问题。IN 操作符相当于 =ANY。
eg:为了显示有下属的雇员 (即经理) 使用下面的SQL 语句:
SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id IN
(SELECT mgr.manager_id
FROM employees mgr);

作为选择,WHERE 子句也可以被指定在子查询中,以显示所有没有下属的雇员:
SELECT last_name FROM employees
WHERE employee_id NOT IN
(SELECT manager_id
FROM employees
WHERE manager_id IS NOT NULL);





阅读(531) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~