最新SQL 面试用题

版权声明:原创博文,共同进步,转载需备注作者和出处 https://blog.csdn.net/qq_37939251/article/details/83214936

SQL 面试用题实战训练

SQL 面试用题是面试中最常见的题型 ,围绕五张表深入了解SQL面试题型,提升SQL编写水平
 
 

 
1. 查询每个月倒数第 2 天入职的员工的信息.  
2. 查询出 last_name 为 'Chen' 的 manager 的信息. 
3. 查询平均工资高于 8000 的部门 id 和它的平均工资. 
4. 查询工资最低的员工信息: last_name, salary  
5. 查询平均工资最低的部门信息 
6. 查询平均工资最低的部门信息和该部门的平均工资 
7. 查询平均工资最高的 job 信息 
8. 查询平均工资高于公司平均工资的部门有哪些? 
9. 查询出公司中所有 manager 的详细信息. 

10. 各个部门中 最高工资中最低的那个部门的 最低工资是多少 
11. 查询平均工资最高的部门的 manager 的详细信息: last_name, 
department_id, email, salary 
12. 查询 1999 年来公司的人所有员工的最高工资的那个员工的信息. 
13. 返回其它部门中比 job_id 为‘IT_PROG’部门所有工资都低的员工的
员工号、姓名、job_id 以及 salary 
 


************************对应答案********************* 


1. 查询每个月倒数第 2 天入职的员工的信息.  

select last_name, hire_date  from employees  where hire_date = last_day(hire_date) – 1 
 
 


2. 查询出 last_name 为 'Chen' 的 manager 的信息. 
1). 通过两条 sql 查询: 
 


 
 
  1.     select manager_id     from employees 
  2.     where lower(last_name) = 'chen' --返回的结果为 108 
  3.         select *     from employees     where employee_id = 108     


 2). 通过一条 sql 查询(自连接): 
   

    select m.*    from employees e, employees m    where e.manager_id = m.employee_id and e.last_name = 'Chen'       
 
 


          
 3). 通过一条 sql 查询(子查询):  
     

  select *    from employees   where employee_id = ( select manager_id  from employees  where last_name = 'Chen' )  
 
 


3. 查询平均工资高于 8000 的部门 id 和它的平均工资. 

SELECT department_id, avg(salary) FROM employees e  GROUP BY department_id HAVING avg(salary) > 8000 
 
 


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

  SELECT last_name, salary  FROM employees  WHERE salary = (  SELECT min(salary)  FROM employees   ) 
 
 


 
5. 查询平均工资最低的部门信息 
   


 
 
  1.   SELECT *   FROM departments WHERE department_id = ( SELECT department_id   FROM
  2. employees    GROUP BY department_id     HAVING avg(salary) = ( SELECT min( avg(salary))
  3.     FROM employees   GROUP BY department_id  )  ) 


 
6. 查询平均工资最低的部门信息和该部门的平均工资 
 


 
 
  1. select d.*, ( select avg(salary) from employees where department_id = d.department_id)
  2. from departments d where d.department_id = ( SELECT department_id   FROM employees GROUP
  3. BY department_id   HAVING avg(salary) = ( SELECT min( avg(salary)) FROM employees
  4.     GROUP BY department_id      )        )    


7. 查询平均工资最高的 job 信息 
 
 1). 按 job_id 分组, 查询最高的平均工资  

 SELECT max(avg(salary))  FROM employees  GROUP BY job_id   
 
 


 2). 查询出平均工资等于 1) 的 job_id 


 
 
  1.   SELECT job_id   FROM employees   GROUP BY job_id   HAVING avg(salary) = ( SELECT
  2. max( avg(salary))   FROM employees   GROUP BY job_id  )   


 3). 查询出 2) 对应的 job 信息 


 
 
  1.   SELECT *   FROM jobs 
  2.   WHERE job_id = (   SELECT job_id   FROM employees   GROUP BY job_id   HAVING avg(salary)
  3. = (   SELECT max( avg(salary))    FROM employees     GROUP BY job_id   )  ) 


8. 查询平均工资高于公司平均工资的部门有哪些? 
 
 1). 查询出公司的平均工资 

 SELECT avg(salary)  FROM employees   
 
 


 2). 查询平均工资高于 1) 的部门 ID 


 
 
  1.   SELECT department_id   FROM employees   GROUP BY department_id   HAVING avg(salary) > (  
  2. SELECT avg(salary)   FROM employees  )   


 
9. 查询出公司中所有 manager 的详细信息. 
 1). 查询出所有的 manager_id 

 SELECT distinct manager_id  FROM employeess   
 
 


 2). 查询出 employee_id 为 1) 查询结果的那些员工的信息 


 
 
  1.   SELECT employee_id, last_name   FROM employees
  2.   WHERE employee_id in (   SELECT distinct manager_id  FROM employees  )     


10. 各个部门中 最高工资中最低的那个部门的 最低工资是多少 
 1). 查询出各个部门的最高工资 

 SELECT max(salary)  FROM employees  GROUP BY department_id   
 
 


 2). 查询出 1) 对应的查询结果的最低值: 各个部门中最低的最高工
资(无法查询对应的 department_id) 

 SELECT min(max(salary))  FROM employees  GROUP BY department_id   
 
 


 3). 查询出 2) 所对应的部门 id 是多少: 各个部门中最高工资等于 
2) 的那个部门的 id 


 
 
  1.   SELECT department_id   FROM employees   GROUP BY department_id  
  2. HAVING max(salary) = (   SELECT min( max(salary))   FROM employees
  3.   GROUP BY department_id  )   


 4). 查询出 3) 所在部门的最低工资 


 
 
  1.   SELECT min(salary)   FROM employees   WHERE department_id = (   SELECT department_id
  2.   FROM employees   GROUP BY department_id     HAVING max(salary) = ( 
  3.                       
  4.     SELECT min( max(salary))     FROM employees     GROUP BY department_id   )   ) 


 
11. 查询平均工资最高的部门的 manager 的详细信息: last_name, 

department_id, email, salary   
 
 


 1). 各个部门中, 查询平均工资最高的平均工资是多少 

 SELECT max(avg(salary))  FROM employees  GROUP BY department_id   
 
 


 2). 各个部门中, 平均工资等于 1) 的那个部门的部门号是多少 


 
 
  1.   SELECT department_id   FROM employees   GROUP BY department_id
  2.   HAVING avg(salary) = (   SELECT max( avg(salary))   FROM employees
  3.  
  4. GROUP BY department_id  )   


 3). 查询出 2) 对应的部门的 manager_id 


 
 
  1.   SELECT manager_id   FROM departments   WHERE department_id = (   SELECT department_id
  2.  
  3. FROM employees   GROUP BY department_id   HAVING avg(salary) = (     SELECT
  4. max( avg(salary))     FROM employees     GROUP BY department_id   )   )   


 4). 查询出 employee_id 为 3) 查询的 manager_id 的员工的 


 
 
  1. last_name, department_id, email, salary   SELECT last_name, department_id, email, salary  
  2. FROM employees   WHERE employee_id = (   SELECT manager_id   FROM departments
  3.   WHERE department_id = (     SELECT department_id     FROM employees     GROUP BY
  4. department_id     HAVING avg(salary) = ( SELECT max( avg(salary)) FROM employees  
  5.   GROUP BY department_id    )    )   )   


12. 查询 1999 年来公司的人所有员工的最高工资的那个员工的信息. 
  1). 查询出 1999 年来公司的所有的员工的 salary 
 

SELECT salary   FROM employees   WHERE to_char(hire_date, 'yyyy') = '1999'    
 
 


  2). 查询出 1) 对应的结果的最大值 

  SELECT max(salary)   FROM employees   WHERE to_char(hire_date, 'yyyy') = '1999'    
 
 


  3). 查询工资等于 2) 对应的结果且 1999 年入职的员工信息 
   


 
 
  1. SELECT *   FROM employees   WHERE to_char(hire_date, 'yyyy') = '1999' AND salary = (  
  2.   SELECT max(salary)   FROM employees     WHERE to_char(hire_date, 'yyyy') = '1999'   )    


13. 返回其它部门中比 job_id 为‘IT_PROG’部门所有工资都低的员工的员
工号、姓名、job_id 以及 salary 


 
 
  1. SELECT employee_id, last_name, job_id, salary FROM   employees WHERE  salary < ALL
  2.       ( SELECT salary    FROM   employees    WHERE  job_id = 'IT_PROG') AND    job_id <>
  3. 'IT_PROG'


******************高级子查询****************** 


• 书写多列子查询 
• 在 FROM 子句中使用子查询 
• 在 SQL 中使用单列子查询 
• 书写相关子查询 
• 使用 EXISTS 和 NOT EXISTS 操作符 
• 使用子查询更新和删除数据 
• 使用 WITH 子句 
--多列子查询(不成对比较 & 成对比较) 1. 查询与 141 号或 174 号员工的 manager_id 和 department_id 相同的
其他员工的 employee_id, manager_id, department_id   
[方式一] 


 
 
  1. SELECT  employee_id, manager_id, department_id FROM    employees WHERE   manager_id IN  
  2.         
  3. ( SELECT  manager_id    FROM    employees     WHERE   employee_id IN ( 174, 141)) AND  
  4.   department_id IN  ( SELECT  department_id    FROM    employees    WHERE   employee_id IN
  5. ( 174, 141)) AND employee_id NOT IN( 174, 141); 


[方式二] 


 
 
  1. SELECT employee_id, manager_id, department_id FROM employees WHERE  (manager_id,
  2. department_id) IN   SELECT manager_id, department_id    FROM   employees  
  3.   WHERE  employee_id IN ( 141, 174)) AND employee_id NOT IN ( 141, 174); 


 
--在 FROM 子句中使用子查询 
2. 返回比本部门平均工资高的员工的 last_name, department_id, 
salary 及平均工资 


 
 
  1. [方式一] select last_name,department_id,salary, ( select avg(salary) from employees e3
  2.   where e1.department_id = e3.department_id   group by department_id) avg_salary from
  3. employees e1 where salary >  ( select avg(salary)   from employees e2  
  4.           where e1.department_id = e2.department_id   --group by department_id           ) 
  5. [方式二] SELECT  a.last_name, a.salary,  a.department_id, b.salavg 
  6.                          
  7. FROM    employees a, ( SELECT   department_id,     AVG(salary) salavg  
  8.  
  9. FROM     employees GROUP BY department_id) b WHERE   a.department_id = b.department_id
  10. AND     a.salary > b.salavg; 
  11.  


--单列子查询表达式 
• Oracle8i 只在下列情况下可以使用, 例如: 
– SELECT 语句 (FROM 和 WHERE 子句) 
– INSERT 语句中的 VALUES 列表中 
• Oracle9i 中单列子查询表达式可在下列情况下使用: 
– DECODE  和 CASE 
– SELECT 中除 GROUP BY 子句以外的所有子句中 
3. 显式员工的 employee_id,last_name 和 location。其中,若员工
department_id 与 location_id 为 1800 的 department_id 相同,则
location 为’Canada’,其余则为’USA’。 


 
 
  1. SELECT employee_id, last_name, ( CASE department_id   WHEN  ( SELECT department_id FROM
  2. departments WHERE location_id = 1800) THEN 'Canada' ELSE 'USA' END) location FROM  
  3. employees; 
  4.  


4. 查询员工的 employee_id,last_name, 要求按照员工的
department_name 排序 


 
 
  1. SELECT   employee_id, last_name FROM     employees e 
  2.               
  3. ORDER BY ( SELECT department_name       FROM departments d       WHERE e.department_id =
  4. d.department_id); 


 
--相关子查询 
 
 


5.查询员工中工资大于本部门平均工资的员工的 last_name, 
salary 和其 department_id 


 
 
  1. SELECT last_name, salary, department_id FROM   employees outer WHERE  salary > 
  2.  
  3. ( SELECT AVG(salary)   FROM   employees   WHERE  department_id =  
  4.  
  5.       outer.department_id) ; 


 
6. 若 employees表中 employee_id与 job_history表中 employee_id
相同的数目不小于 2,输出这些相同 id 的员工的 employee_id,last_name
和其 job_id 


 
 
  1. SELECT e.employee_id, last_name,e.job_id FROM   employees e   WHERE   2 <= ( SELECT COUNT(*)
  2.   FROM   job_history   WHERE  employee_id = e.employee_id); 
  3.  


--EXISTS 操作符 
• EXISTS 操作符检查在子查询中是否存在满足条件的行 
• 如果在子查询中存在满足条件的行: 
– 不在子查询中继续查找 
– 条件返回 TRUE 
7. 查询公司管理者的 employee_id,last_name,job_id, 
department_id 信息 


 
 
  1. SELECT employee_id, last_name, job_id, department_id FROM   employees outer WHERE   EXISTS
  2. ( SELECT 'X'   FROM   employees     WHERE  manager_id =   outer.employee_id);                       
  3.  


8. 查询 departments 表 中, 不存 在于 employees 表 中的 部门 的

department_id 和 department_name 


 
 
  1. SELECT department_id, department_name FROM departments d WHERE NOT EXISTS
  2. ( SELECT 'X'   FROM   employees   WHERE  department_id = d.department_id); 
  3.  


--关于数据更新 
9.修改表 employees,添加 department_name 列,赋予 department_id
相应的部门名称。 
 


 
 
  1. ALTER TABLE employees ADD(department_name VARCHAR2( 14)); 
  2.  
  3. UPDATE employees e SET    department_name =  ( SELECT department_name     FROM
  4.   departments d   WHERE  e.department_id = d.department_id); 


 
--关于数据删除 
10.删除表 employees 中,其与 emp_history 表皆有的数据 


 
 
  1. DELETE FROM employees E WHERE employee_id in  ( SELECT employee_id   FROM
  2.  
  3. emp_history WHERE  employee_id = E.employee_id); 
  4.  


--WITH 子句 
11. 查询公司中各部门的总工资大于公司中各部门的平均总工资的部门信息 WITH  
 


 
 
  1. dept_costs  AS (     SELECT  d.department_name, SUM(e.salary) AS dept_total     FROM
  2.    employees e, departments d     WHERE   e.department_id = d.department_id     GROUP BY
  3. d.department_name), avg_cost     AS (     SELECT SUM(dept_total)/ COUNT(*) AS dept_avg  
  4.   FROM   dept_costs) SELECT *   FROM   dept_costs   WHERE  dept_total >
  5. ( SELECT dept_avg           FROM avg_cost) ORDER BY department_name; 


 
附加题目: 
12.查询员工的 last_name, department_id, salary.其中员工的
salary,department_id 与有奖金的任何一个员工的 salary, 
department_id 相同即可 
 


 
 
  1. select last_name, department_id, salary from employees   where
  2. (salary,department_id) in ( select salary,department_id from employees where
  3. commission_pct is not null   ) 
  4.  


13.选择工资大于所有 JOB_ID = 'SA_MAN'的员工的工资的员工的
last_name, job_id, salary 
 


 
 
  1. select last_name, job_id, salary from employees where salary > all(  
  2. select salary  from employees   where job_id = 'SA_MAN'


 
14.选择所有没有管理者的员工的 last_name 
 
 


 
 
  1. select last_name from employees e1 where not exists (  
  2. select 'A'   from employees e2   where e1.manager_id = e2.employee_id  )

15. 查询 10,50,20 号部门的 job_id,department_id 并且
department_id 按 10,50,20 的顺序排列 
Column dummy noprint; 
 


 
 
  1. select job_id , department_id , 1 dummy from employees where department_id = 10 union
  2. select job_id , department_id , 2 from employees where department_id = 50 union
  3. select job_id , department_id , 3 from employees where department_id= 20 order by 3 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在进行软件实施SQL面试笔试题之前,需要先了解SQL的基本知识和概念。 SQL(Structured Query Language)是一种用于管理和操作关系数据库的编程语言。在软件实施过程中,SQL常用于查询、插入、更新和删除数据库中的数据。面试题通常涉及SQL语句的编写和运行。 面试中可能遇到的问题包括: 1. 查询数据:可以使用SELECT语句从数据库中检索所需数据。常见的SELECT子句用于指定要检索的列,FROM子句用于指定要检索的数据表。 2. 插入数据:使用INSERT语句向数据库中添加新数据。INSERT INTO语句指定要插入数据的表和要插入的值。 3. 更新数据:使用UPDATE语句更新数据库中的数据。UPDATE语句具有SET子句,用于指定要更新的列和新的数据值,还可以使用WHERE子句指定更新的条件。 4. 删除数据:使用DELETE语句从数据库中删除数据。DELETE FROM语句指定要从中删除数据的表和要删除的条件。 为了成功完成软件实施SQL面试笔试题,以下是几点建议: 1. 熟悉SQL语法和常见的SQL语句用法,理解SELECT、INSERT、UPDATE和DELETE等基本操作的语法结构和使用方法。 2. 掌握常见的SQL函数和运算符,如COUNT、SUM、AVG、MAX、MIN、LIKE、BETWEEN等,以便能够高效地查询和操作数据。 3. 注意理解问题的要求并准确地理解数据库架构和表之间的关系,从而能够写出正确和高效的SQL语句。 4. 在进行笔试之前,可以进行一些练习和模拟测试,以检验自己的理解和熟练程度。 总之,软件实施SQL面试笔试题需要对SQL语法和常用操作有深入的理解。熟悉基本的SQL语句和函数,并具备正确的问题解读和数据操作能力将有助于成功完成面试

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值