比較常見的SQL面試題集


<iframe id="cproIframe_u788097" src="http://pos.baidu.com/acom?adn=3&amp;at=38&amp;aurl=&amp;cad=1&amp;ccd=24&amp;cec=UTF-8&amp;cfv=15&amp;ch=0&amp;col=zh-CN&amp;conOP=0&amp;cpa=1&amp;dai=1&amp;dis=0&amp;ltr=http%3A%2F%2Fwww.mianwww.com%2Fhtml%2Fcategory%2Fit-interview%2Fdatabase&amp;ltu=http%3A%2F%2Fwww.mianwww.com%2Fhtml%2F2014%2F03%2F19943.html&amp;lunum=6&amp;n=62027028_cpr&amp;pcs=1280x875&amp;pis=10000x10000&amp;ps=247x886&amp;psr=1280x1024&amp;pss=1280x875&amp;qn=48cccb2a839f5514&amp;rad=&amp;rsi0=336&amp;rsi1=280&amp;rsi5=4&amp;rss0=%23FFFFFF&amp;rss1=%23FFFFFF&amp;rss2=%230000FF&amp;rss3=%23444444&amp;rss4=%23008000&amp;rss5=&amp;rss6=%23e10900&amp;rss7=&amp;scale=&amp;skin=&amp;td_id=788097&amp;tn=text_default_336_280&amp;tpr=1414418008401&amp;ts=1&amp;xuanting=0&amp;dtm=BAIDU_DUP2_SETJSONADSLOT&amp;dc=2&amp;di=u788097" marginwidth="0" marginheight="0" scrolling="no" allowtransparency="true" align="center,center" frameborder="0" height="280" width="336"></iframe>


 

 

 

 

 


 

 

 


 

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 天入職的員工的信息.

  selectlast_name, hire_date from employees wherehire_date = last_day(hire_date) – 1

 

2.查詢出last_name ‘Chen’ manager 的信息.

1). 通過兩條sql查詢:

   select manager_id  from employees where lower(last_name) = ‘chen’ –返回的結果爲 108

  select * from employees whereemployee_id = 108

2). 通過一條sql查詢(自連接):

       select m.*from employees e, employees m wheree.manager_id = m.employee_id and                e.last_name = ‘Chen’        

3). 通過一條sql查詢(子查詢):    

     select * from employees whereemployee_id = (

            select manager_idfrom employees wherelast_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. 查詢平均工資最低的部門信息

 SELECT * FROM departments WHERE department_id = (

 SELECT department_id FROM employees GROUP BY department_id

    HAVING avg(salary) = (SELECT min(avg(salary)) FROM employees

                        GROUP BY department_id

                           )

                 )

 

6. 查詢平均工資最低的部門信息和該部門的平均工資

 

select d.*, (select avg(salary) from employees where department_id = d.department_id)

from departments d

whered.department_id = (

SELECT department_id FROM employees GROUP BY department_id HAVING avg(salary) = (

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

             )

)

        

7. 查詢平均工資最高的 job 信息

 

    1). job_id分組, 查詢最高的平均工資    

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

    2). 查詢出平均工資等於 1) job_id

    SELECT job_id FROM employees GROUP BY job_id HAVING avg(salary) = (

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

    )

    3). 查詢出 2) 對應的 job 信息

    SELECT * FROM jobs WHERE job_id = (

        SELECT job_id FROM employees GROUP BY job_id

        HAVING avg(salary) = (

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

        )

    )

8. 查詢平均工資高於公司平均工資的部門有哪些?

    1). 查詢出公司的平均工資

    SELECT avg(salary) FROM employees

    2). 查詢平均工資高於 1) 的部門 ID

    SELECT department_id FROM employees

    GROUP BY department_id HAVING avg(salary) > (

        SELECT avg(salary) FROM employees

    )

9. 查詢出公司中所有 manager 的詳細信息.

    1). 查詢出所有的manager_id

    SELECT distinct manager_id FROM employeess

    2). 查詢出employee_id 1) 查詢結果的那些員工的信息

    SELECT employee_id, last_name FROM employees

    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

    SELECT department_id FROM employees GROUP BY department_id

    HAVING max(salary) = (

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

    )

    4). 查詢出 3) 所在部門的最低工資

    SELECT min(salary)FROM employees WHERE department_id = (

        SELECT department_id FROM employees GROUP BY department_id

        HAVING max(salary) = (

            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) 的那個部門的部門號是多少

    SELECT department_id  FROM employees  GROUP BY department_id

    HAVING avg(salary) = (

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

    )

    3). 查詢出 2) 對應的部門的manager_id

    SELECT manager_id  FROM departments

    WHERE department_id = (

      SELECT department_id FROM employees GROUP BY department_id

        HAVING avg(salary) = ( SELECT max(avg(salary))FROM employees

            GROUP BY department_id

        )    

    )

    4). 查詢出employee_id 3) 查詢的manager_id的員工的last_name, department_id, email, salary

    SELECT last_name, department_id, email, salary FROM employees

    WHERE employee_id = (

        SELECT manager_id FROM departments

        WHERE department_id = (

            SELECT department_id  FROM employees GROUP BY department_id

            HAVING avg(salary) = (

                SELECT max(avg(salary))FROM employees 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 年入職的員工信息        

        SELECT * FROM employees

        WHERE to_char(hire_date, ‘yyyy’) = ’1999′ AND salary = (

            SELECT max(salary) FROM employees

            WHERE to_char(hire_date, ‘yyyy’) = ’1999′

        )

        

13.返回其它部門中比job_id‘IT_PROG’部門所有工資都低的員工的員工號、姓名、job_id以及salary

SELECT employee_id, last_name, job_id, salary FROM employees

WHERE salary< ALL(SELECT salary FROM employees WHERE job_id = ‘IT_PROG’)AND job_id<> ‘IT_PROG’;

******************高級子查詢******************

  • 書寫多列子查詢
  • FROM 子句中使用子查詢
  • SQL中使用單列子查詢
  • 書寫相關子查詢
  • 使用EXISTS NOT EXISTS 操作符
  • 使用子查詢更新和刪除數據
  • 使用WITH 子句

多列子查詢(不成對比較&成對比較)

1.查詢與141號或174號員工的manager_iddepartment_id相同的其他員工的employee_id, manager_id, department_id

[方式一]

SELECT employee_id, manager_id, department_id

FROM employees

WHERE manager_id IN
(SELECT manager_id

FROM employees

WHERE employee_id IN (174,141))

AND department_id IN
(SELECT department_id

FROM employees

WHERE employee_id IN (174,141))

AND    employee_id NOT IN(174,141);

[方式二]

SELECT    employee_id, manager_id, department_id

FROM    employees

WHERE (manager_id, department_id) IN

(SELECT manager_id, department_id

FROM employees

WHERE employee_id IN (141,174))

AND    employee_id NOT IN (141,174);

 

FROM 子句中使用子查詢

2.返回比本部門平均工資高的員工的last_name, department_id, salary及平均工資

[方式一]

selectlast_name,department_id,salary,

(selectavg(salary)from employees e3

where e1.department_id = e3.department_id

group by department_id) avg_salary

from employees e1

where salary >

(selectavg(salary)

from employees e2

where e1.department_id = e2.department_id

–group by department_id

)

[方式二]

SELECT a.last_name, a.salary,

a.department_id, b.salavg

FROM employees a, (SELECT department_id,

AVG(salary) salavg

FROM employees

GROUP BY department_id) b

WHERE a.department_id = b.department_id

AND a.salary>b.salavg;

 

單列子查詢表達式

  • Oracle8i只在下列情況下可以使用, 例如:
    • SELECT 語句(FROM WHERE 子句)
    • INSERT 語句中的VALUES列表中
  • Oracle9i中單列子查詢表達式可在下列情況下使用:
    • DECODE CASE
    • SELECT 中除GROUP BY 子句以外的所有子句中

3.顯式員工的employee_id,last_namelocation。其中,若員工department_idlocation_id1800department_id相同,則location‘Canada’,其餘則爲‘USA’

SELECT employee_id, last_name,

(CASE department_id

WHEN(SELECT department_id FROM departments

WHERE location_id = 1800)

THEN ‘Canada’ ELSE ‘USA’ END) location

FROM employees;

 

4.查詢員工的employee_id,last_name,要求按照員工的department_name排序

SELECT employee_id, last_name

FROM employees e

ORDER BY (SELECT department_name

                FROM departments d

                WHERE e.department_id = d.department_id);

 

相關子查詢

 

 

5.查詢員工中工資大於本部門平均工資的員工的last_name,

salary和其department_id

SELECT last_name, salary, department_id

FROM employees outer

WHERE salary>

(SELECT AVG(salary)

FROM employees

WHERE department_id =

outer.department_id) ;

 

6.employees表中employee_idjob_history表中employee_id相同的數目不小於2,輸出這些相同id的員工的employee_id,last_name和其job_id

SELECT e.employee_id, last_name,e.job_id

FROM employees e

WHERE 2<= (SELECT COUNT(*)

FROM job_history

WHERE employee_id = e.employee_id);

 

EXISTS 操作符

  • EXISTS 操作符檢查在子查詢中是否存在滿足條件的行
  • 如果在子查詢中存在滿足條件的行:
    • 不在子查詢中繼續查找
    • 條件返回TRUE

7.查詢公司管理者的employee_id,last_name,job_id,

department_id信息

SELECT employee_id, last_name, job_id, department_id

FROM employees outer

WHERE EXISTS ( SELECT ‘X’

FROM employees

WHERE manager_id =

outer.employee_id);

 

8.查詢departments表中,不存在於employees表中的部門的department_iddepartment_name

SELECT department_id, department_name

FROM departments d

WHERE NOT EXISTS (SELECT ‘X’

FROM employees

WHERE department_id

= d.department_id);

 

關於數據更新

9.修改表employees,添加department_name列,賦予department_id相應的部門名稱。

 

ALTER TABLE employees

ADD(department_name VARCHAR2(14));

 

UPDATE employees e

SET department_name =

(SELECT department_name

     FROM departments d

    WHERE e.department_id = d.department_id);

 

關於數據刪除

10.刪除表employees中,其與emp_history表皆有的數據

DELETE FROM employees E

WHERE employee_id in

(SELECT employee_id

FROM emp_history

WHERE employee_id = E.employee_id);

 

WITH 子句

11.查詢公司中各部門的總工資大於公司中各部門的平均總工資的部門信息

WITH
dept_costs AS (

SELECT d.department_name, SUM(e.salary) AS dept_total

FROM employees e, departments d

WHERE e.department_id = d.department_id

GROUP BY d.department_name),

avg_cost AS (

SELECT SUM(dept_total)/COUNT(*) AS dept_avg

FROM dept_costs)

SELECT *

FROM dept_costs

WHERE dept_total>

(SELECT dept_avg

FROM avg_cost)

ORDER BY department_name;

 

附加題目:

12.查詢員工的last_name, department_id, salary.其中員工的salary,department_id與有獎金的任何一個員工的salary,

department_id相同即可

 

selectlast_name,department_id,salary

fromemployees

where(salary,department_id)in(

selectsalary,department_id

fromemployees

wherecommission_pctisnotnull

)

 

13.選擇工資大於所有JOB_ID = ‘SA_MAN’的員工的工資的員工的last_name, job_id, salary

 

selectlast_name,job_id,salary

fromemployees

wheresalary>all(

selectsalary

fromemployees

wherejob_id=’SA_MAN’

)

 

14.選擇所有沒有管理者的員工的last_name

 

selectlast_name

fromemployeese1

wherenotexists(

select’A’

fromemployeese2

wheree1.manager_id=e2.employee_id

)

15.查詢105020號部門的job_iddepartment_id並且department_id105020的順序排列

Column dummy noprint;

selectjob_id , department_id ,1 dummy

from employees

wheredepartment_id = 10

union

selectjob_id , department_id , 2

from employees

wheredepartment_id = 50

union

selectjob_id , department_id , 3

from employees

wheredepartment_id= 20

order by 3


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章