Oracle查询细节与对象
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 通常与大小写符号搭配使用,不单独使用。可以是
分别代表着下面的含义