hyeonga_code

Database_42_SUB QUERY_다중 행 연산자 IN, OUT, AN 본문

Oracle Database

Database_42_SUB QUERY_다중 행 연산자 IN, OUT, AN

hyeonga 2023. 8. 2. 08:59
반응형

   -- 다중 행 연산자 
        -- IN
SELECT last_name, hire_date, department_id
FROM employees
WHERE hire_date IN (
                    SELECT MAX(hire_date)
                    FROM employees
                    GROUP BY department_id);
    /*
    LAST_NAME    HIRE_DATE   DP_ID        
    -------------------------------------------------
    De Haan          08/01/13          90
    Lorentz           14/02/07           60
    Mourgos          14/11/16           50
    Zlotkey            15/01/29           80
    Grant               14/05/24         ( null )
    Whalen            02/09/17          10
    Fay                  12/08/17          20
    Higgins           09/06/07          110
    Gietz               09/06/07         110
    */



        -- ANY
SELECT salary
FROM employees
WHERE department_id=80;
    /*
    SALARY
    ---------
    10500
    11000
    8600
    */



/*
SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE salary > (
                SELECT salary
                FROM employees
                WHERE department_id=80);
    - 다중 행을 반환하므로 오류가 발생합니다.
    <오류>----------------------------------------------------------------
    ORA-01427: single-row subquery returns more than one row
    01427. 00000 -  "single-row subquery returns more than one row"
    *Cause:    
    *Action:
    ------------------------------------------------------------------------
*/


SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE salary > ANY (
                SELECT salary
                FROM employees
                WHERE department_id=80);



SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE salary > ALL (
                SELECT salary
                FROM employees
                WHERE department_id=80);



    -- IIN/NOT IN 의 주의사항
SELECT last_name, manager_id
FROM employees
WHERE manager_id IN(100, 101, NULL);
        -- NULL 값이 출력되지 않는 이유는 IN에 '='의 의미가 들어있기 때문입니다.
        -- OR 가 됩니다.
/*
LAST_NAME  M_ID        
-----------------------------
Kochhar         100
De Haan         100
Mourgos         100
Zlotkey           100
Whalen          101
Hartstein        100
Higgins          101
*/



SELECT last_name, manager_id
FROM employees
WHERE manager_id NOT IN(100, 101, NULL);
        -- 어떠한 값도 출력되지 않습니다.
        -- AND가 됩니다.



        -- 정상출력됩니다.
SELECT last_name, manager_id
FROM employees
WHERE manager_id NOT IN(100, 101);



SELECT last_name, manager_id
FROM employees
WHERE employee_id IN (SELECT manager_id FROM employees); 
    /*
    LAST_NAME   M_ID
    -------------------------------
    King               ( null )
    Kochhar         100
    De Haan         100
    Hunold           102
    Mourgos         100
    Zlotkey           100
    Hartstein        100
    Higgins          101
    */

 

반응형