当前位置: 移动技术网 > IT编程>数据库>MSSQL > SQL学习笔记

SQL学习笔记

2019年03月04日  | 移动技术网IT编程  | 我要评论

沭阳,www50888,神乐心眼

sql语句面试题目:一般查询和高级子查询

 本文转载 https://blog.csdn.net/csdn_terence/article/details/78002154

几个表

employees 表: 

employee_id              number(6) 

first_name                varchar2(20) 

last_name                 varchar2(25) 

email                               varchar2(25) 

phone_number       varchar2(20) 

hire_date                  date 

job_id                            varchar2(10) 

salary                         number(8,2) 

commission_pct     number(2,2) 

manager_id              number(6) 

department_id       number(4)  

jobs 表: 

job_id                   varchar2(10) 

job_title            varchar2(35) 

min_salary       number(6) 

max_salary     number(6)

departments 表: 

department_id      number(4) 

department_name varchar2(30) 

manager_id              number(6) 

location_id           number(4)

 locations 表:

 

location_id

 

number(4)

 

street_address

varchar2(40)

 

postal_code

varchar2(12)

 

city

varchar2(30)

 

state_province

varchar2(25)

            

country_id

char(2)

 

job_grades 表: 

grade_level      varchar2(3) 

lowest_sal         number 

highest_sal      number

1 一般查询

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 

************************answers*********************

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

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

2. 查询出 last_name 为 'chen' 的 manager 的信息.

 1). 通过两条 sql 查询:

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

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

  1.  
    select m.*
  2.  
    from employees e, employees m
  3.  
    where e.manager_id = m.employee_id and e.last_name= 'chen' 

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

  1.  
    select *
  2.  
    from employees
  3.  
    where employee_id = (
  4.  
    select manager_id
  5.  
    from employees
  6.  
    where last_name = 'chen'
  7.  
    )

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

  1.  
    select department_id, avg(salary)
  2.  
    from employees e
  3.  
    group by department_id
  4.  
    having avg(salary) > 8000 

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

  1.  
    select last_name, salary
  2.  
    from employees
  3.  
    where salary = ( select min(salary) from employees )

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

  1.  
    select *
  2.  
    from departments
  3.  
    where department_id =(
  4.  
    select department_id
  5.  
    from employees
  6.  
    group by department_id
  7.  
    having avg(salary) =(
  8.  
    select min(avg(salary))
  9.  
    from employees
  10.  
    group by department_id )
  11.  
    )

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

  1.  
    select d.*, (select avg(salary)
  2.  
    from employees
  3.  
    where department_id = d.department_id)
  4.  
    from departments d
  5.  
    where d.department_id = (
  6.  
    selectdepartment_id from employees
  7.  
    group by department_id having avg(salary) =(
  8.  
    select min(avg(salary)) from employees
  9.  
    group by department_id )
  10.  
    )

7.查询平均工资最高的 job 信息

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

  1.  
    select max(avg(salary))
  2.  
    from employees
  3.  
    group by job_id 

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

  1.  
    select job_id
  2.  
    from employees
  3.  
    group byjob_id
  4.  
    having avg(salary) = (
  5.  
    select max(avg(salary))
  6.  
    from employees
  7.  
    group by job_id
  8.  

 

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

  1.  
    select *
  2.  
    from jobs
  3.  
    where job_id = (
  4.  
    select job_id
  5.  
    from employees
  6.  
    group by job_id
  7.  
    having avg(salary) = (
  8.  
    select max(avg(salary))
  9.  
    from employees
  10.  
    group by job_id )
  11.  
    )

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

1). 查询出公司的平均工资      

  1.  
    select avg(salary)
  2.  
    from employees

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

  1.  
    select department_id
  2.  
    from employees
  3.  
    group by department_id
  4.  
    having avg(salary) > ( select avg(salary) fromemployees)

9.查询出公司中所有 manager的详细信息.(in关键字) 

1). 查询出所有的 manager_id     

select   distinct  manager_id  from  employeess 

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

  1.  
    select employee_id, last_name
  2.  
    from employees
  3.  
    where employee_id in (
  4.  
    select distinct manager_id
  5.  
    from employees
  6.  

10.各个部门中 最高工资中最低的那个部门的最低工资是多少

1). 查询出各个部门的最高工资      

  1.  
    select max(salary)
  2.  
    from employees
  3.  
    group by department_id 

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

  1.  
    select min(max(salary))
  2.  
    from employees
  3.  
    group by department_id 

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

  1.  
    select department_id
  2.  
    from employees
  3.  
    group by department_id
  4.  
    having max(salary) =(
  5.  
    select min(max(salary))
  6.  
    from employees
  7.  
    group by department_id
  8.  

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

  1.  
    select min(salary)
  2.  
    from employees
  3.  
    where department_id = (
  4.  
    select department_id
  5.  
    from employees
  6.  
    group by department_id having max(salary) =(
  7.  
    select min(max(salary))
  8.  
    from employees
  9.  
    group by department_id )
  10.  
    )

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

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

  1.  
    select max(avg(salary))
  2.  
    from employees
  3.  
    group by department_id 

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

  1.  
    select department_id
  2.  
    from employees
  3.  
    group by department_id
  4.  
    having avg(salary) = (
  5.  
    select max(avg(salary))
  6.  
    from employees
  7.  
    group by department_id
  8.  

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

4). 查询出 employee_id 为 3) 查询的 manager_id的员工的last_name, department_id, email, salary 

  1.  
    select last_name, department_id, email,salary
  2.  
    from employees
  3.  
    where employee_id = (
  4.  
    select manager_id
  5.  
    from departments
  6.  
    where department_id = (
  7.  
    select department_id
  8.  
    from employees
  9.  
    group by department_id
  10.  
    having avg(salary) = (
  11.  
    select max(avg(salary))
  12.  
    from employees
  13.  
    group by department_id )
  14.  
    )
  15.  

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

1). 查询出 1999 年来公司的所有的员工的salary 

  1.  
    select salary
  2.  
    from employees
  3.  
    where to_char(hire_date,'yyyy') = '1999'  

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

  1.  
    select max(salary)
  2.  
    from employees
  3.  
    where to_char(hire_date, 'yyyy') = '1999' 

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

  1.  
    select *
  2.  
    from employees
  3.  
    where to_char(hire_date, 'yyyy') = '1999' and salary = (
  4.  
    select max(salary)
  5.  
    fromemployees
  6.  
    where to_char(hire_date, 'yyyy') = '1999' ) 

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

  1.  
    select employee_id, last_name, job_id,salary
  2.  
    from employees
  3.  
    where salary< all (select salary
  4.  
    from employees
  5.  
    where job_id = 'it_prog')
  6.  
    and job_id<> 'it_prog';

主要学会问题的拆分,由内而外 将大问题逐个拆分为小问题。 

2高级子查询

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

书写多列子查询 

在 from 子句中使用子查询 

在 sql 中使用单列子查询 

书写相关子查询 

使用 exists 和 not exists 操作符 

使用子查询更新和删除数据 

使用 with 子句

 

1.多列子查询(不成对比较& 成对比较)

1.查询与 141 号或 174 号员工的 manager_id 和 department_id 相同的其他员工的 employee_id, manager_id, department_id

[方式一]

  1.  
    select employee_id,manager_id, department_id
  2.  
    from employees
  3.  
    where manager_id in (
  4.  
    select manager_id
  5.  
    from employees
  6.  
    where employee_id in(174,141) )
  7.  
    and department_id in (
  8.  
    select department_id
  9.  
    from employees
  10.  
    where employee_id in(174,141))
  11.  
    and employee_id notin(174,141);

[方式二]

  1.  
    select employee_id,manager_id, department_id
  2.  
    from employees
  3.  
    where (manager_id,department_id) in (
  4.  
    selectmanager_id, department_id
  5.  
    from employees
  6.  
    where employee_id in (141,174))
  7.  
    and employee_id not in (141,174); 

2.在from 子句中使用子查询

2.返回比本部门平均工资高的员工的 last_name, department_id, salary 及平均工资

[方式一] 

  1.  
    select last_name,department_id,salary,
  2.  
    (select avg(salary)
  3.  
    from employees e3
  4.  
    where e1.department_id = e3.department_id
  5.  
    groupby department_id ) avg_salary
  6.  

    相关文章:

    验证码:
移动技术网