Oracle数据库学习(二)

本文通过多个实战案例详细讲解了SQL中的子查询用法,包括高级子查询、相关子查询等,展示了如何利用子查询进行复杂的数据库操作,如条件筛选、更新记录、删除重复项等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--高级子查询
--查询与141号或174号员工的manager_id和department_id
--相同的其他员工的employee_id,manager_id,department_id
select employee_id,manager_id,department_id
from employees e1
where(manager_id,department_id) in(
                   select manager_id,department_id
                   from employees
                   where employee_id in (141,174)
                   )
and employee_id not in(141,174)
--返回比本部门平均工资高的员工的last_name,department_id,salary及平均工资        
select last_name,departmnet_id,salary,avgsalary
from employees e1,(
select department_id,avg(salary) avgsalary from employees group by department_id
)e2
where e1.department = e2.department_id
--显示员工的employee_id,last_name和location
--其中,若员工department_id与location_id为1800的department 相同时,则location为‘Canada’,其余为‘USA’
select employee_id,last_name,
(
       case department_id when(select department_id from department where location_id=1800)
         then 'Canada'
       else 
          'USA'
        end
) location
from employees
--查询员工employee_id,last_name,要求按照员工的department_name排序
select employee_id,last_name
from employees e1
order by (select department_name
         from departments d
         where e1.department_id = d.department_id
)
--相关子查询
--若employees表中employee_id与job_history表中employee_id相同的数目不小于2,
--输出这些相同id的员工的employee_id,last_name和其job_id
select employee_id,last_name,job_id
from employees e1
where 2 <= (
      select count(*)
      from job_history
      where employee_id = e1.employee_id
)
--查询公司管理者的employee_id,last_name,job_id,department_id的信息
select employee_id,last_name,job_id,department_id
from employees e1
where exists ( --不关心管理者是谁,当能找到管理者时就为true (not exists)
      select 'A' --查询的结果随意
      from employees e2
      where e1.employee_id = e2.employee_id
)
--与上面相反的是 not exists

--查询部门名称 给新添加的字段 department_name
--添加列
alter table emp 
add (department_name varchar(20))

update 
    emp
set department_name=(
    select department_name
    from departments
    where department_id=emp.department_id
    )
--删除employee中,其与emp_history表中相同的数据
delete from emp
where department_id in (
      select department_id 
      from emp1
      where department = emp.department_id
)
--WITH子句
--1.使用WITH子句,可以避免在select语句中重复书写相同的语句块
--2.WITH子句将该子句中的语句块执行一次并存储到用户的临时表空间中
--3.使用with子句可以提高查询效率
--查询公司中工资比Abel高的员工的信息
with Abel_sal as (
     select salary
     from employees 
     where last_name = 'Abel'
)

select  employee_id,last_name
from employees
where
     salary >(
            select salary
            from Abel_sal
     )
--查询公司中各部门的总工资大于公司中各部门的平均总工资的部门信息

with dept_sumsal as(
select sum(salary) sumsalary,department_name
from departments d,employees e
where d.department_id = e,department_id
group by department_name
)
dept_avgsal as(
     select sum(sumsalary)/count(*) sum_al1
     from dept_sumsal
)

select * from dept_sumsal
where sumsalary > (
      select sum_al1
      from dept_avgsal
)
order by department_name













来自优快云用户 nothing 地址http://blog.youkuaiyun.com/u011687186
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值