天天看點

1.子查詢知識體系,單行子查詢,多行子查詢

1查詢工資比scott高的員工資訊

A 第一步:查詢出scott這個員工的工資

select sal from emp

where ename = 'SCOTT';

1.子查詢知識體系,單行子查詢,多行子查詢

B 第二步:查詢出工資比scott高的員工資訊           

select * fromemp

where sal >3000;

1.子查詢知識體系,單行子查詢,多行子查詢

總結:

子查詢的本質:多個select語句的嵌套

2:子查詢的知識體系搭建

A 合理的書寫風格

B 子查詢外面()不要忘記

C 子查詢和主查詢能夠查詢的是同一張表,也能夠不是同一張表

     僅僅要子查詢傳回的結果,主查詢能夠用就可以。

D 在什麼地方能夠防止子查詢

select a,b,c                     ---OK,僅僅能存放單行子查詢,不能使多行子查詢

from tab1                  ---OK 能夠有子查詢

where col in(em1,em2)       ---能夠有子查詢

        col between a1 and a2

        col > 222

        col > ()

group by …                 ---不能夠有子查詢

having ….                  ---能夠有子查詢

order by …                 ---不能夠有子查詢

E 子查詢的分類

1.單行操作符相應單行子查詢。多行操作符相應多行子查詢。

2.依照子查詢傳回的條目數。分為:單行子查詢和多行子查詢

3.單行子查詢僅僅能使用單行比較操作符(=  >   >=  <  <=  <>)

4.多行子查詢僅僅能使用多行比較操作符(int any all)

3 單行子查詢

Eg:查詢員工資訊和141号工種一樣的,薪水比143号員工工資高的員工

SQL> conn hr/123456

已連接配接。

SQL> select last_name,job_id,salary

  2  FROM employees

  3  WHERE job_id =

  4                (SELECT job_id

  5                 FROM employees

  6                 WHERE employee_id = 141);

1.子查詢知識體系,單行子查詢,多行子查詢

Eg:查詢工資最低的員工資訊

select last_name,job_id,salary

FROM employees

WHERE salary =

              (SELECT MIN(salary)

               FROM employees);

1.子查詢知識體系,單行子查詢,多行子查詢

Eg:求各個部門編号和部門的最低工資(這個最低工資要比50号部門的最低工資要高)

思路分析:看子查詢 看group by 和 having條件檢索 看檢索對象

//子查詢:求50号部門的最低工資

à檢索 各部門的最低工資  比50号部門的最低工資 大的部門号和部門最小工資

SELECT department_id,MIN(salary)

GROUP By department_id

HAVING MIN(salary) >

                   (SELECT MIN(salary)

                    FROM employees

                    WHERE department_id = 50);

1.子查詢知識體系,單行子查詢,多行子查詢

4  查詢部門名稱是SALES的員工資訊(2中方式)

方法1:子查詢

SELECT *

FROM emp

WHERE DEPTNO = (SELECT deptno

                FROM dept

                WHERE dname = 'SALES');

1.子查詢知識體系,單行子查詢,多行子查詢

方法2:多表查詢

SELECT e.*

FROM emp e,dept d

WHERE e.deptno = d.deptno and d.dname = 'SALES';

1.子查詢知識體系,單行子查詢,多行子查詢

注意:另外一種(多表查詢的運作速度比子查詢的運作速度快。由于多表查詢是一次将資料讀到記憶體中進行讀取,消耗記憶體而加高速度)

      第一種(子查詢要進行兩次連接配接資料庫的操作。連接配接資料庫的操作是一個耗時操作,減低了速度)。

5 select後面要查詢的列中能夠是單行子查詢,不能夠是多行子查詢

錯誤案例:

select ename,empno,(select deptno from emp) AA from emp;

1.子查詢知識體系,單行子查詢,多行子查詢

正确案例:

select ename,empno,(select deptno from emp where EMPNO = 7369) AA from emp;

1.子查詢知識體系,單行子查詢,多行子查詢

6 查詢員工的姓名和薪水

select *

from (select ename,sal

     from emp);

1.子查詢知識體系,單行子查詢,多行子查詢

7 多行子查詢

多行子查詢僅僅能使用多行比較操作符(in any all)

    --eg 查詢部門名稱是*(不是)SALES 和 ACCOUNTING 的員工資訊  2種方法

          --eg 查詢薪水 比30号部門 随意一個員工薪高的員工資訊

          -eg 查詢薪水 比30号部門 全部員工 高的員工資訊

查詢部門名稱是*(不是)SALES 和 ACCOUNTING 的員工資訊  2種方法

from emp

where deptno in

              (select deptno

               from dept

               where dname = 'SALES' or dname = 'ACCOUNTING');

1.子查詢知識體系,單行子查詢,多行子查詢

操作符

含義

IN

等于清單中的不論什麼一個

ANY

和子查詢傳回的随意一個值比較

ALL

和子查詢傳回的全部值比較

SELECT employee_id,last_name,job_id,salary

 FROM employees

 WHERE salary < ANY

                  (SELECT salary

                   FROM employees

                   WHERE job_id = 'IT_PROG')

 AND job_id <> 'IT_PROC';

1.子查詢知識體系,單行子查詢,多行子查詢

WHERE salary < ALL

                 (SELECT salary

                  FROM employees

                  WHERE job_id = 'IT_PROG')

AND job_id <> 'IT_PROC'

1.子查詢知識體系,單行子查詢,多行子查詢

Eg: 比30号部門 随意一個員工薪高的員工資訊  大于集合中的最小值 any

where sal > all(select sal

                from emp

                where deptno = 30);

1.子查詢知識體系,單行子查詢,多行子查詢

等價于:

where sal > (select max(sal)

            from emp

            where deptno = 30);

1.子查詢知識體系,單行子查詢,多行子查詢

查詢是經理的員工資訊

分析:

WHERE empno in(經理的集合);

實際:

where empno in

             (

              select mgr from emp

             );

1.子查詢知識體系,單行子查詢,多行子查詢

where empno not in

(

select mgr

where mgr is not null

);

1.子查詢知識體系,單行子查詢,多行子查詢

本文轉自mfrbuaa部落格園部落格,原文連結:http://www.cnblogs.com/mfrbuaa/p/5193739.html,如需轉載請自行聯系原作者