Oracle查询细节与对象

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle查询细节与对象

一oracle查询细节

1.1 子查询

1.1.1 什么是子查询

定义:当一个查询的结果是另一个查询的条件时,称之为子查询。

把一个查询结果当做一个新的表来使用

在使用select语句查询数据时,有时候会遇到这样的情况,在where查询条件中的限制条件不是一个确定的值,而是一个来自于另一个查询的结果。

如:查询公司工资最低的员工信息

1.1.2 子查询案例

题目:查询大于公司平均工资的员工姓名

第一种方式(分两步)

1.先查询出公司的平均工资

2.然后在进行查询

运用子查询(我们现在可以写一条sql就搞定):

select first_name,salary from employees

where salary>(select avg(salary)from employees)

特点:子查询在主查询前执行一次/主查询使用子查询的结果

思考:查询'Jones'的部门同事姓名(这个题用子查询是否会更加简单)

select first_name from employees

where department_id =

(select department_id from employees where last_name='Jones')

and last_name <>'Jones'

1.1.3 使用子查询的注意事项

子查询要用括号括起来

将子查询放在比较运算符的右边(增强可读性)

只有在执行Top-N分析时,子查询中才需要使用Order by子句

在Oracle8i之前的版本中,子查询不能包含Order by子句

对单行子查询使用单行运算符

对多行子查询使用多行运算符

1.1.4 子查询的分类

单行单列子查询:只包含一个字段的查询,返回的查询结果也只包含一行数据

多行单列子查询:只包含了一个字段,但返回的查询结果可能多行或者零行

多行多列子查询:包含多个字段的返回,查询结构可能是单行或者多行。

1.1.4.1 单行单列子查询

特点:

子查询只返回一行一列的记录(只查询出一个数据)

使用单行记录比较运算符= > >= < <= <>

和单行运行符比较,只允许返回一个数据

咱们现在使用的很多都是子查询,比如下面这个题:

案例题:查询所有比Luis工资高的员工:

select*from employees t

where t.salary >(select salary from employees where first_name ='Luis')

注意:这里的子查询就是单行单列,我们最后查询出来的结果只能有一个数据。

思考1:如果有多个名称叫Luis的这个查询就会有问题(我的工资到底比哪一个Luis高) 思考2:如果我们即查出工资又查询员工,t.salary > (‘Luis’,6900),明显语法错误

思考题1:下面这个SQL有什么问题?

SELECT employee_id, last_name

FROM employees

WHERE salary =

(SELECT MIN(salary)

FROM employees

GROUP BY department_id);

答案:对多行子查询使用了单行比较操作符.

思考题2:下面这个SQL会返回结果嘛?

SELECT last_name, job_id

FROM employees

WHERE job_id =

(SELECT job_id

FROM employees

WHERE last_name = 'Haas');

子查询不返回任何值

1.1.4.2 多行单列子查询

特点:

返回多行单列

使用多行比较运算符

多行运行符:

IN:与列表中的任意一个值相等(用得最多,要求掌握)

ANY:与子查询返回的任意一个值比较(理解即可) - OR -比较任意一个满足即可

ALL:与子查询返回的每一个值比较(理解即可) - AND - 比较的所有条件都要满足

下面咱们依然使用一个要求来完成单行多列子查询

案例题一:请查询David与James的所有部门的所有员工

分析:现在咱们就不是查询一个员工的部分,而是两个员工,他们是有可能在不同的部门那咱们不用子查询依然可以分两步:先查两个员工的部门id,再查员工。

不过咱们也可以做单行多列的查询,怎么完成这条SQL呢?

select first_name,department_Id from employees

where department_id in

(select department_id from employees where first_name='David'or first_name='James')

特别注意in这个多行运行符

案例题二:Any的使用分析下图SQL的结果

SELECT employee_id, last_name, job_id, salary

FROM employees

WHERE salary < ANY

(SELECT salary

FROM employees

WHERE job_id = 'IT_PROG')

AND job_id <> 'IT_PROG';

只要工资小于IT部门任何一个人的都显示出来

注:

ANY 通常与大小写符号搭配使用,不单独使用。可以是ANY :

分别代表着下面的含义

相关文档
最新文档