Oracle查询语句练习(一)

表结构及数据

SELECT *
  FROM employees;


SELECT *
  FROM departments;

   
SELECT *
  FROM locations;


SELECT *
  FROM jobs;


SELECT *
  FROM job_grades;

SELECT *
  FROM job_history;

SELECT *
  FROM employees;
SELECT *
  FROM departments;
SELECT *
  FROM locations;
SELECT *
  FROM jobs;
SELECT *
  FROM manager;
SELECT *
  FROM job_grades;

--1显示在1997年后被录取的员工的所有数据
SELECT *
  FROM employees
 WHERE hire_date >= to_date('1-JAN-1997');
--select to_date('1-JAN-1997') from dual;
--2显示姓、工作ID,薪水,佣金(commission) ,然后按薪水降序排列
SELECT last_name,
       job_id,
       salary,
       commission_pct
  FROM employees
 ORDER BY salary DESC;
--3给那些commission为0 的员工加10%的工资
UPDATE employees
   SET salary = salary * 1.1
 WHERE commission_pct = 0;
--4显示姓、工龄、工作的月数,如果月数小于当前月数则该月数加上12再与sysdate相减?
SELECT last_name,
       trunc(months_between(SYSDATE,
                            hire_date) / 12) YEAR,
       MOD(trunc(months_between(SYSDATE,
                                hire_date)),
           12) mon
  FROM employees;
--5显示名字还有J、K、L、M的雇员姓名
SELECT first_name || ' ' || last_name
  FROM employees
 WHERE first_name || last_name LIKE '%J%'
    OR first_name LIKE '%K%'
    OR first_name LIKE '%L%'
    OR first_name LIKE '%M%';
--6显示姓名、薪水、是否收到commission
SELECT last_name,
       salary,
       nvl2(commission_pct,
            'yes',
            'no')
  FROM employees;
--7显示部门名字,位置、姓名、工作代号、薪水。位置ID为1800
SELECT dept.department_name,
       loca.location_id,
       last_name,
       job_id,
       salary
  FROM employees emp
  JOIN departments dept
    ON emp.department_id = dept.department_id
  JOIN locations loca
    ON dept.location_id = loca.location_id
 WHERE loca.location_id = '1800';
--8有多少雇员的名字以n结尾,写出两种方法
SELECT COUNT(*)
  FROM employees
 WHERE last_name LIKE '%n';
SELECT COUNT(*)
  FROM employees
 WHERE substr(last_name,
              length(last_name)) = 'n';
--select substr('last_name',length('last_name')) from dual;

--9 显示所有部门的编号、名字、工作在每个部门的员工,包括没有员工的部门
SELECT dept.department_id,
       dept.department_name,
       COUNT(emp.employee_id)
  FROM employees emp
  JOIN departments dept
    ON emp.department_id(+) = dept.department_id
 GROUP BY dept.department_id,
          dept.department_name;

--部门编号为10和20的工作编号是什么 
SELECT j.job_id
  FROM jobs j
  JOIN employees emp
    ON j.job_id = emp.job_id
  JOIN departments dept
    ON dept.department_id = emp.department_id
 WHERE dept.department_id IN (10,
                              20);
--11哪些工作是管理岗位的(Administration 和Executive ),按降序排列显示工作ID和员工
SELECT j.job_id,
       COUNT(emp.employee_id)
  FROM employees emp
  JOIN jobs j
    ON emp.job_id = j.job_id
 WHERE j.job_title LIKE 'Administration%'
    OR j.job_id LIKE 'Executive'
 GROUP BY j.job_id
 ORDER BY j.job_id DESC;
--12
--显示在每月上旬被雇佣的员工
SELECT last_name,
       hire_date
  FROM employees emp
 WHERE to_number(to_char(emp.hire_date,
                         'DD')) < 15;
--13
--显示姓名,薪水,然后将薪水以“千”为单位显示
SELECT emp.last_name,
       trunc(salary / 1000)
  FROM employees emp;
--14
--显示员工姓名,上司姓名,上司的薪水,薪水等级。要求上司的薪水大于15000
SELECT emp1.last_name,
       emp2.last_name,
       emp2.salary,
       jg.grade_level
  FROM employees emp1
  LEFT JOIN employees emp2
    ON emp1.manager_id = emp2.employee_id
  JOIN job_grades jg
    ON emp2.salary BETWEEN jg.lowest_sal AND jg.highest_sal
 WHERE emp2.salary > 15000;
--15
--显示部门编号、部门名字、该部门的员工数、每个部门的平均工资,部门内的员工信息 包括姓名、薪水、职业
--select dept.department_id,dept.department_name,count(emp.employee_id) emps,avg(emp.salary) avg,emp2.last_name ,emp2.salary,emp2.job_id from employees emp join departments dept on emp.department_id=dept.department_id join employees emp2 on dept.department_id=emp2.department_id group by dept.department_id,dept.department_name order by dept.department_id asc;

SELECT t.t_id,
       t.t_name,
       t.emps,
       t.avg,
       emp2.last_name,
       emp2.salary,
       emp2.job_id
  FROM (SELECT dept.department_id t_id,
               dept.department_name t_name,
               COUNT(emp.employee_id) emps,
               AVG(emp.salary) AVG
          FROM employees emp
          JOIN departments dept
            ON emp.department_id = dept.department_id
         GROUP BY dept.department_id,
                  dept.department_name
         ORDER BY dept.department_id ASC) t
  JOIN employees emp2
    ON t.t_id = emp2.department_id
 ORDER BY t_id;
--16
--显示拥有最高平均工资的部门编号和具体工资
SELECT *
  FROM (SELECT dept.department_id t_id,
               AVG(emp.salary) AVG
          FROM employees emp
          JOIN departments dept
            ON emp.department_id = dept.department_id
         GROUP BY dept.department_id
         ORDER BY AVG DESC)
 WHERE rownum = 1;
--17
--显示部门编号、部门名称、位置、经理的编号,要求该部门没有销售代表
SELECT *
  FROM departments dept2
 WHERE dept2.department_id NOT IN (SELECT dept.department_id
                                     FROM employees emp
                                     JOIN departments dept
                                       ON emp.department_id = dept.department_id
                                    WHERE emp.job_id = 'SA_REP'
                                    GROUP BY dept.department_id);
--18
--a小于三个员工
SELECT dept.department_id,
       dept.department_name,
       COUNT(emp.employee_id)
  FROM employees emp
  JOIN departments dept
    ON emp.department_id = dept.department_id
 GROUP BY dept.department_id,
          dept.department_name
HAVING COUNT(emp.employee_id) < 3;
--b员工数最多
SELECT *
  FROM (SELECT dept.department_id,
               dept.department_name,
               COUNT(emp.employee_id) counts
          FROM employees emp
          JOIN departments dept
            ON emp.department_id = dept.department_id
         GROUP BY dept.department_id,
                  dept.department_name
         ORDER BY counts DESC)
 WHERE rownum = 1;
--优先使用
SELECT *
  FROM (SELECT dept.department_id,
               dept.department_name,
               COUNT(emp.employee_id) counts,
               dense_rank() over(ORDER BY COUNT(emp.employee_id) DESC) ranks
          FROM employees emp
          JOIN departments dept
            ON emp.department_id = dept.department_id
         GROUP BY dept.department_id,
                  dept.department_name) t
 WHERE t.ranks = 1;
         
--c员工数最少
SELECT *
  FROM (SELECT dept.department_id,
               dept.department_name,
               COUNT(emp.employee_id) counts
          FROM employees emp
          JOIN departments dept
            ON emp.department_id = dept.department_id
         GROUP BY dept.department_id,
                  dept.department_name
         ORDER BY counts ASC)
 WHERE rownum = 1;
 
--另一方法
SELECT dept.department_id,
       dept.department_name,
       COUNT(emp.employee_id) counts
  FROM employees emp
  JOIN departments dept
    ON emp.department_id = dept.department_id
 GROUP BY dept.department_id,
          dept.department_name
HAVING COUNT(emp.employee_id) = (SELECT MIN(COUNT(*))
                                   FROM employees
                                  GROUP BY department_id);
--19
--显示工号、姓名、薪水、部门编号、所在部门的平均工资
SELECT emp2.employee_id,
       emp2.last_name,
       emp2.department_id,
       t.avg
  FROM employees emp2
  JOIN (SELECT dept.department_id t_id,
               AVG(emp.salary) AVG
          FROM employees emp
          JOIN departments dept
            ON emp.department_id = dept.department_id
         GROUP BY dept.department_id) t
    ON emp2.department_id = t.t_id;
--20
--周几录取的人数最多,显示人名和日期
/*SELECT to_number(to_char(to_date('2018-7-15',
                                 'yyyy-MM-DD'),
                         'day'))
  FROM dual;
SELECT to_char(to_date('2018-7-15',
                       'yyyy-MM-DD'),
               'day')
  FROM dual;*/
/*SELECT emp2.last_name,
       to_char(emp2.hire_date,
               'day')
  FROM employees emp2
 WHERE to_char(emp2.hire_date,
               'day') IN (SELECT t.d
                            FROM (SELECT to_char(emp.hire_date,
                                                 'day') d,
                                         COUNT(*) counts
                                    FROM employees emp
                                   GROUP BY to_char(emp.hire_date,
                                                    'day')
                                   ORDER BY counts DESC) t
                           WHERE rownum = 1);*/

SELECT emp2.last_name,
       to_char(emp2.hire_date,
               'day')
  FROM employees emp2
 WHERE to_char(emp2.hire_date,
               'day') IN (SELECT to_char(emp.hire_date,
                                         'day')
                            FROM employees emp
                           GROUP BY to_char(emp.hire_date,
                                            'day')
                          HAVING COUNT(*) = (SELECT MAX(COUNT(*))
                                              FROM employees
                                             GROUP BY to_char(hire_date,
                                                              'day')));
--21
--显示雇员的姓名,周年纪念日期(月—日)升序排列
SELECT emp.last_name,
       to_char(hire_date,
               'mon DD')
  FROM employees emp
 ORDER BY to_char(hire_date,
                  'DDD');
--22
--23 显示工资涨幅,员工编号,原来的工资和增加的工资
   --部门号10、50、110的有5%的涨幅,部门号为60的涨10%的工资
   --部门号为20和80涨幅为15%,部门为90的不涨工资
SELECT decode(emp.department_id,
              '10',
              '05%raise',
              '50',
              '05%raise',
              '110',
              '05%raise',
              '60',
              '10%raise',
              '20',
              '15%raise',
              '80',
              '15%raise',
              '90',
              'no raise') paise,
       emp.employee_id,
       emp.salary,
       decode(emp.department_id,
              '10',
              emp.salary * 0.05,
              '50',
              emp.salary * 0.05,
              '110',
              emp.salary * 0.05,
              '60',
              emp.salary * 0.1,
              '20',
              emp.salary * 0.15,
              '80',
              emp.salary * 0.15,
              '90',
              0) new_salary
  FROM employees emp;
--24
select to_char(current_date,'DD-MON-YYYY HH:MI:SS') from dual;
--25
--a
--写出一个查询方法来显示下列时区的时间偏移量  澳大利亚/悉尼

select tz_offset('Australia/Sydney') from dual;
select tz_offset('Chile/EasterIsland') from dual;
--b
--根据据澳大利亚/悉尼的时区偏移量,通过改变会话来设定TIME_ZONE参数值
alter session set time_zone = 'Australia/Sydney';
ALTER SESSION SET TIME_ZONE = '+10:00';
--c 
--.显示这个会话的 SYSDATE, CURRENT_DATE, CURRENT_TIMESTAMP和LOCALTIMESTAMP
   --提示:当命令执行时基于日期的输出应该是不同的

select sysdate,current_date,current_timestamp,localtimestamp from dual;
--d
--根据智利/复活节岛的时区偏移量,通过改变会话来设定TIME_ZONE参数值
     --提示:上述问题的结果基于不同的日期,并且在某些情况下该结果不会和学生得到的实际结果相匹配。而且不同城市的时区偏移量应该有所不同,并且应该考虑到夏令时的情况。

ALTER SESSION SET TIME_ZONE = '-06:00';
--e
--对于此会话显示系统时间,现在的时间,现在的时间戳和当地的时间戳
--提示:当命令被执行的时候基于数据的输出应该不同。

select sysdate,current_date,current_timestamp,localtimestamp from dual;
--f
--修改会话使日期格式变成DD-MON-YYYY
select to_char(current_date,'DD-MON-YYYY') from dual;
--26

--28
--写一个查询,按以下要求分组
   -- 部门和工作编号
   -- 工作和老大编号
   --计算每一个组的最低工资和最高工资

SELECT emp.department_id,
       emp.job_id,
       emp.manager_id,
       MAX(emp.salary),
       MIN(emp.salary)
  FROM employees emp
 GROUP BY GROUPING SETS((emp.department_id, emp.job_id),(emp.job_id, emp.manager_id));
--29
-- 员工表内工资排行前三的员工姓和薪水
select * from (SELECT rownum rn,
       t.* from (SELECT emp.last_name,
                   emp.salary
              FROM employees emp
             ORDER BY emp.salary DESC) t) where rn <=3;
--30
-- 工作在加利福尼亚州的员工编号和姓
SELECT emp.employee_id,
       emp.last_name
  FROM employees emp
  JOIN departments dept
    ON emp.department_id = dept.department_id
  JOIN locations loca
    ON dept.location_id = loca.location_id
 WHERE loca.state_province = 'California';
--31
--在工作历史表里面找到并删除资历最浅而且换了至少两次工作的员工
DELETE FROM employees
 WHERE employee_id IN (SELECT emp.employee_id
                         FROM employees emp
                        WHERE 2 <= (SELECT COUNT(*)
                                      FROM job_history jh
                                     WHERE emp.employee_id = jh.employee_id) 
                          AND emp.employee_id = (SELECT employee_id
                                                   FROM job_history
                                                  WHERE start_date IN (SELECT MIN(start_date)
                                                                         FROM job_history)));
              
--select employee_id from job_history where start_date = (select min(start_date) from job_history);
--32
--33
--找出哪个工作的最大工资大于整个公司内最大的工资的一半,使用
    --with子句,显示出工作名,最大工资
WITH aa AS
 (SELECT MAX(salary)
    FROM employees),
bb AS
 (SELECT j.job_title,
         MAX(emp.salary) job_salary
    FROM employees emp join jobs j on emp.job_id = j.job_id
   GROUP BY emp.job_id,j.job_title)
SELECT *
  FROM bb
 WHERE bb.job_salary > (SELECT *
                          FROM aa) / 2;
--34显示员工编号,姓,开始上班的时间,工资
-- a De Haan的下属
SELECT emp.employee_id,
       emp.last_name,
       emp.hire_date,
       emp.salary
  FROM employees emp
 WHERE emp.manager_id IN (SELECT emp2.employee_id
                            FROM employees emp2
                           WHERE emp2.last_name = 'De Haan');
-- b De Haan组织树(下属、下属的下属......)
SELECT last_name
  FROM employees emp where level >1
 START WITH emp.last_name='De Haan'
CONNECT BY PRIOR emp.employee_id = emp.manager_id;
--35
-- De Haan下属的下属的员工编号、上级、等级、姓
SELECT emp.employee_id,emp.manager_id,level, emp.last_name
  FROM employees emp where level >2 
 START WITH emp.last_name = 'De Haan'
CONNECT BY PRIOR emp.employee_id = emp.manager_id;
--36
--显示员工编号、上司、等级、姓,要求姓前面加上下划线,等级越低横线越长
SELECT emp.employee_id,emp.manager_id,level,lpad(emp.last_name,level+length(emp.last_name)-1,'_')
  FROM employees emp
 START WITH emp.last_name = 'King'
CONNECT BY prior emp.employee_id = emp.manager_id;
--37
--显示员工编号、入职时间、薪水、上司的编号,要求员工编号大于等于200
   --如果薪水小于5000,将员工编号和薪水插入到SPECIAL_SAL表里
   --将员工编号、入职时间、薪水插入到SAL_HISTORY表
   --将员工编号、上司编号、薪水插入到MGR_HISTORY表

--create table cux_special_sal_19874 as select * from special_sal;
--create table cux_sal_history_19874 as select * from sal_history;
--create table cux_mgr_history_19874 as select * from mgr_history;

INSERT ALL WHEN salary > 5000 THEN INTO cux_special_sal_19874
VALUES
  (employee_id, salary) WHEN 1 = 1 THEN INTO cux_sal_history_19874
VALUES
  (employee_id, hire_date, salary) WHEN 1 = 1 THEN INTO cux_mgr_history_19874
VALUES
  (employee_id, manager_id, salary)
  SELECT emp.employee_id,
         emp.manager_id,
         emp.hire_date,
         emp.salary
    FROM employees emp
   WHERE emp.employee_id > 200;
--38 
-- 查询SPECIAL_SAL, SAL_HISTORY 和 MGR_HISTORY 表查看添加信息
select * from cux_special_sal_19874;
select * from cux_sal_history_19874;
select * from cux_mgr_history_19874;
--39
--基于下列示意图创建一个LOCATIONS_NAMED_INDEX表,将主键列作为索引并起名为LOCATIONS_PK_IDX

/*create table locations_hao_index (
deptno number(4),
dname varchar(30)
);
select * from cux_locations_19874;*/
--alter table cux_locations_19874 add constraint LOCATIONS_PK primary key(deptno);
--alter table cux_locations_19874 drop constraint LOCATIONS_PK;
create index LOCATIONS_PK_IDX on cux_locations_19874(deptno);
--drop index LOCATIONS_PK_IDX;
--40
--查询USER_INDEXES表,显示LOCATIONS_NAMED_INDEX 表的索引名字
SELECT index_name,
       table_name
  FROM user_indexes where table_name ='CUX_LOCATIONS_19874';


猜你喜欢

转载自blog.csdn.net/qq_32445015/article/details/81137747