oracle子查询(有难度)

oracle基础
oracle单行函数
oracle多表查询
oracle分组函数
oracle子查询

-- 子查询
-- 子查询 在主查询之前一次执行完成
-- 子查询的结果被主查询使用
-- 单行子查询 ,子查询返回一条结果 可以用比较运算符与子查询的结果进行比较
-- 多行子查询 , 子查询返回多条结果 用 in / any/ all

--谁的工资比Abel高
-- 10条
SELECT LAST_NAME,SALARY
FROM EMPLOYEES
WHERE SALARY > ( SELECT SALARY 
								 FROM EMPLOYEES
								 WHERE LAST_NAME = 'Abel')

--查询员工名为'Chen'的manage信息

SELECT LAST_NAME,EMPLOYEE_ID
FROM EMPLOYEES
WHERE EMPLOYEE_ID = ( SELECT MANAGER_ID
											FROM EMPLOYEES
											WHERE LAST_NAME = 'Chen')

-- 返回job_id 与141号员工相同,salary比143号员工多的员工姓名,job_id和工资

SELECT LAST_NAME,JOB_ID,SALARY
FROM EMPLOYEES
WHERE JOB_ID = ( SELECT JOB_ID 
								 FROM EMPLOYEES
								 WHERE EMPLOYEE_ID = 141)
AND
SALARY > (  SELECT SALARY 
						FROM EMPLOYEES
						WHERE EMPLOYEE_ID = 143 )

-- 返回工资最少的员工的last_name,job_id和salary

SELECT LAST_NAME,JOB_ID,SALARY
FROM EMPLOYEES
WHERE SALARY = (SELECT MIN(SALARY)
								FROM EMPLOYEES)


-- 查询最低工资大于50号部门最低工资的部门id和其最低工资

SELECT DEPARTMENT_ID,MIN(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING MIN(SALARY) > ( SELECT MIN(SALARY) 
											 FROM EMPLOYEES
											 WHERE DEPARTMENT_ID = 50 )

-- 返回其他部门中比job_id为'IT_PROG'部门任一工资都低的员工的员工号,姓名,job_id以及salary
-- any 比其中任意一个 
-- 在这里 比其中任意一个小 最大的是9000 比9000小就行

SELECT EMPLOYEE_ID,LAST_NAME,JOB_ID,SALARY
FROM EMPLOYEES
WHERE JOB_ID <> 'IT_PROG' AND SALARY < ANY ( SELECT SALARY   -- 9000 6000 4800 4200
																						 FROM EMPLOYEES 
																						 WHERE JOB_ID = 'IT_PROG' )

-- 返回其他部门中比job_id为'IT_PROG'部门所有工资都低的员工的员工号,姓名,job_id以及salary
-- 在这里所有工资最小的是 4200 比 4200小就行


SELECT EMPLOYEE_ID,LAST_NAME,JOB_ID,SALARY
FROM EMPLOYEES
WHERE JOB_ID <> 'IT_PROG' AND SALARY < ALL ( SELECT SALARY   -- 9000 6000 4800 4200
																						 FROM EMPLOYEES 
																						 WHERE JOB_ID = 'IT_PROG' )
																						 
 -- in 是或者的意思 																						 
------------------------------------------------------------
-- 练习 难度挺大啊!

-- 41. 查询工资最低的员工信息: last_name, salary	

SELECT LAST_NAME,SALARY
FROM EMPLOYEES
WHERE SALARY = (
								SELECT MIN(SALARY)
								FROM EMPLOYEES
								)


--42. 查询平均工资最低的部门信息
SELECT *
FROM DEPARTMENTS
WHERE DEPARTMENT_ID = (
												SELECT DEPARTMENT_ID 
												FROM EMPLOYEES
												HAVING AVG(SALARY) = (
																							SELECT MIN(AVG(SALARY))
																							FROM EMPLOYEES
																							GROUP BY DEPARTMENT_ID
																							)
												GROUP BY DEPARTMENT_ID
												)

-- 43*. 查询平均工资最低的部门信息和该部门的平均工资
-- 方式1
SELECT d.DEPARTMENT_ID "d_id",d.DEPARTMENT_NAME "d_name",Round(AVG(e.SALARY),2) "avg_sala"
FROM DEPARTMENTS d,EMPLOYEES e
WHERE d.DEPARTMENT_ID = (
											SELECT  DEPARTMENT_ID
											FROM EMPLOYEES
											GROUP BY DEPARTMENT_ID
											HAVING AVG(SALARY) = (
																						SELECT MIN(AVG(SALARY)) 
																						FROM EMPLOYEES 
																						GROUP BY DEPARTMENT_ID
																						)
											)
AND e.DEPARTMENT_ID = d.DEPARTMENT_ID(+)
GROUP BY d.DEPARTMENT_ID,d.DEPARTMENT_NAME
-- 方式2
-- 记住先查内循环后查外循环,所以才可以用内循环的值拿到外循环用
SELECT  d.*,(SELECT AVG(SALARY) FROM EMPLOYEES WHERE DEPARTMENT_ID = d.DEPARTMENT_ID)
FROM DEPARTMENTS d
WHERE d.DEPARTMENT_ID = (
											SELECT  DEPARTMENT_ID
											FROM EMPLOYEES
											GROUP BY DEPARTMENT_ID
											HAVING AVG(SALARY) = (
																						SELECT MIN(AVG(SALARY)) 
																						FROM EMPLOYEES 
																						GROUP BY DEPARTMENT_ID
																						)
											)

44. 查询平均工资最高的 job 信息
SELECT *
FROM JOBS
WHERE JOB_ID in  (
									SELECT JOB_ID
									FROM EMPLOYEES
									HAVING AVG(SALARY) = (
																				SELECT MAX(AVG(SALARY))
																				FROM EMPLOYEES
																				GROUP BY JOB_ID
																			 )
									GROUP BY JOB_ID
								)

--45. 查询平均工资高于公司平均工资的部门有哪些?
-- 8 条
SELECT DEPARTMENT_ID,AVG(SALARY)
FROM EMPLOYEES
HAVING AVG(SALARY) > (
											SELECT AVG(SALARY)
											FROM EMPLOYEES
											)
GROUP BY DEPARTMENT_ID



-- 46. 查询出公司中所有 manager 的详细信息.
-- 18条
SELECT *
FROM EMPLOYEES
WHERE EMPLOYEE_ID in (
											SELECT DISTINCT MANAGER_ID
											FROM EMPLOYEES
											WHERE MANAGER_ID is not null 
											)

-- 47. 各个部门中 最高工资中最低的那个部门的 最低工资是多少
SELECT MIN(SALARY)
FROM EMPLOYEES
WHERE DEPARTMENT_ID = (
												SELECT DEPARTMENT_ID 
												FROM EMPLOYEES 
												HAVING MAX(SALARY) = (
																							SELECT MIN(MAX(SALARY))  
																							FROM EMPLOYEES
																							GROUP BY DEPARTMENT_ID
																							)
												GROUP BY DEPARTMENT_ID
												)
GROUP BY DEPARTMENT_ID

--48. 查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary

SELECT LAST_NAME,DEPARTMENT_ID,EMAIL,SALARY
FROM EMPLOYEES
WHERE EMPLOYEE_ID in (
											SELECT DISTINCT MANAGER_ID
											FROM EMPLOYEES
											WHERE DEPARTMENT_ID = (
																							SELECT DEPARTMENT_ID
																							FROM EMPLOYEES 
																							HAVING  AVG(SALARY)  = (
																																	SELECT MAX(AVG(SALARY)) 
																																	FROM EMPLOYEES
																																	GROUP BY DEPARTMENT_ID
																																 )
																							GROUP BY DEPARTMENT_ID
																							)
										  AND MANAGER_ID is not null
											)





-- 49. 查询 1999 年来公司的人所有员工的最高工资的那个员工的信息.

SELECT *
FROM EMPLOYEES
WHERE SALARY =  (
								SELECT MAX(SALARY) 
								FROM EMPLOYEES 
								WHERE TO_CHAR(HIRE_DATE,'yyyy') = '1999'
								)
AND TO_CHAR(HIRE_DATE,'yyyy') = '1999'



-- 1.	查询和Zlotkey相同部门的员工姓名和雇用日期
-- 33条
SELECT LAST_NAME,HIRE_DATE
FROM EMPLOYEES 
WHERE DEPARTMENT_ID = (
												SELECT DEPARTMENT_ID
												FROM EMPLOYEES
												WHERE LAST_NAME = 'Zlotkey'
												)

AND LAST_NAME <> 'Zlotkey'


-- 2.	查询工资比公司平均工资高的员工的员工号,姓名和工资。
--51条
SELECT EMPLOYEE_ID,LAST_NAME,SALARY
FROM EMPLOYEES
WHERE SALARY > (
								SELECT AVG(SALARY)
								FROM EMPLOYEES
								)

-- 3.	查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
--38条
SELECT EMPLOYEE_ID,LAST_NAME,SALARY
FROM EMPLOYEES e1
WHERE SALARY > (
								SELECT AVG(SALARY)
								FROM EMPLOYEES e2
								WHERE e1.DEPARTMENT_ID = e2.DEPARTMENT_ID
								GROUP BY e2.DEPARTMENT_ID
								)
-- 4.	查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名
--72条
SELECT EMPLOYEE_ID,LAST_NAME
FROM EMPLOYEES
WHERE DEPARTMENT_ID in(
												SELECT DEPARTMENT_ID
												FROM EMPLOYEES
												WHERE LAST_NAME LIKE '%u%'
												)
AND LAST_NAME NOT LIKE '%u%'


--  5.查询在部门的location_id为1700的部门工作的员工的员工号
-- 18条
SELECT EMPLOYEE_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (
												SELECT DEPARTMENT_ID
												FROM DEPARTMENTS
												WHERE LOCATION_ID = '1700'
												)


-- 6.查询管理者是King的员工姓名和工资
--14条
SELECT LAST_NAME,SALARY
FROM EMPLOYEES
WHERE MANAGER_ID IN (
											SELECT EMPLOYEE_ID
											FROM EMPLOYEES 
											WHERE LAST_NAME = 'King'
											)


	
	
																						 

猜你喜欢

转载自blog.csdn.net/qq_38188047/article/details/107200194