ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL) Subquery
    SQL 2023. 3. 22. 16:18
    Subquery

    - 메인쿼리가 서브쿼리를 포함하는 종속적 관계

    - 서브쿼리는 메인쿼리의 칼럼 사용 가능(메인쿼리는 서브쿼리의 칼럼 사용 불가)

    - 서브쿼리는 괄호를 묶어서 사용

    - 단일 행, 복수 행 비교 연산자와 함께 사용 가능

    - 서브쿼리 내에서는 orber by 사용 불가

     

     

    subquery 종류

    - 스칼라 서브쿼리(scalar subquery) - select절에 사용

    - 인라인 뷰(inline view) - from 절에 사용

    - 중첩 서브쿼리 (nested subquery) - where절에 사용

     

    스칼라 서브쿼리
    SELECT column1, (SELECT column2 FROM table2 WHERE condition)
    FROM table1
    WHERE condition;

    🔔 서울은평경찰서의 강도 검거 건수와 서울시 경찰서 전체의 평균 강도 검거 건수 조회

    SELECT case_number,
    	(SELECT avg(case_number)
    	FROM crime_status
    	WHERE crime_type LIKE '강도' AND status_type LIKE '검거') avg
    FROM crime_status
    WHERE police_station LIKE '은평' AND crime_type LIKE '강도' AND status_type LIKE '검거';
    인라인 뷰 : 메인쿼리에서는 인라인뷰에서 조회한 컬럼만 사용 가능
    SELECT a.column, b.column
    FROM table1 a, (SELECT column1, column2 FROM table2) b
    WHERE condition;

    🔔 경찰서별로 가장 많이 발생한 범죄 건수와 범죄 유형 조회

    SELECT c.police_station, c.crime_type, c.case_number
    FROM crime_status c,
    	(SELECT police_station, max(case_number) count
    	FROM crime_status
    	WHERE status_type LIKE '발생'
    	GROUP BY police_station) m
    WHERE c.police_station = m.police_station
    	AND c.case_number = m.count;
    중첩 서브쿼리

    single row : 하나의 열 검색

    (서브쿼리가 비교연산자와 사용되는 경우, 서브쿼리의 검색 결과는 한 개의 결과값을 가져야 함)

    SELECT column_names
    FROM table_name
    WHERE column_name = (SELECT column_name FROM table_name WHERE condition)
    ORDER BY column_name;

    multiple row : 하나 이상의 열 검색

    - IN (join 쓰는 게 더 유리)

    SELECT column_names
    FROM table_name
    WHERE column_name IN (SELECT column_name FROM table_name WHERE condition)
    ORDER BY column_names;

    - EXISTS

    SELECT column_names FROM table_name
    WHERE EXISTS (SELECT column_name FROM table_name WHERE condition)
    ORDER BY column_names;

    - ANY : 서브쿼리 결과 중 하나라도 만족하면 조회(비교연산자 사용)

    SELECT column_names FROM table_name
    WHERE column_name = ANY (SELECT column_name FROM table_name WHERE condition)
    ORDER BY column_names;

    - ALL: 모두 만족(비교연산자 사용)

    SELECT column_names FROM table_name
    WHERE column_name = ALL (SELECT column_name FROM table_name WHERE condition)
    ORDER BY column_names;

     

    Multi Column Subquery(연관 서브쿼리)

    - 서브쿼리 내에 메인쿼리 컬럼이 같이 사용되는 경우

    SELECT column_names FROM tablename a
    WHERE (a.column1, a.column2, ...) IN (SELECT b.column1, b.column2, .. 
    					FROM tablename b WHERE a.column_name = b.column_name)
    ORDER BY column_names;

    🔔 강동원과 성별, 소속사가 같은 연예인의 이름, 성별, 소속사 조회

    SELECT name, sex, agency FROM celeb
    WHERE (sex, agency) IN (SELECT sex, agency FROM celeb WHERE name='강동원');

    'SQL' 카테고리의 다른 글

    SQL) Scalar Functions  (0) 2023.03.21
    SQL) 집계함수(Aggregate Functions)  (0) 2023.03.21
    SQL) PRIMARY KEY, FOREIGN KEY  (1) 2023.03.21
    SQL) Python with MySQL/CSV  (0) 2023.03.20
    SQL) RDS 접속, SQL FILE 실행, 백업  (0) 2023.03.17

    댓글

binlog