表结构及数据
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';