[ZB] SQL 05

SeriesWorld·2023년 12월 17일

ZB20-SQL

목록 보기
5/5
post-thumbnail

Subquery

  • SQL문 안에 포함된 또 다른 SQL문
    메인쿼리가 서브쿼리를 포함하는 종속적인 관계이다.
    - 서브쿼리는 메인쿼리의 칼럼 사용 가능
    - 메인쿼리는 서브쿼리의 칼럼 사용 불가
  • Subquery는 괄호로 묶어서 사용
  • 단일 행 혹은 복수 행 비교 연산자와 함께 사용 가능
  • Subquery에는 order by 사용 X

Subquery 종류

  • Scalar Subquery: SELECT 절에 사용
  • Inline View: FROM 절에 사용
  • Nested Subquery: WHERE 절에 사용

Scalar subquery

  • SELECT 절에 사용하며, 결과는 하나의 column이어야 한다.
SELECT column1, (SELECT column2
				 FROM tabe2
                 WHERE condition)
FROM table1
WHERE condition;

ex)

SELECT case_number 은평강도검거, (SELECT avg(case_number)
								 FROM crime_status
                                 WHERE crime_type LIKE '강도' AND status_type LIKE '검거') 평균강도검거
FROM crime_status
WHERE police_station LIKE '은평' AND crime_type LIKE '강도' AND status_type LIKE '검거';

Inline View

  • FROM 절에 사용하는 서브쿼리, 메인쿼리에서는 인라인 뷰에서 조회한 Column만 사용 가능
SELECT a.column, b.column
FROM table a, (SELECT column1, column2 FROM table2) b
WHERE condition

ex)

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;

활용예시

Nested Subquery

Single Row

-하나의 열을 검색하는 서브쿼리
서브쿼리가 비교연산자와 사용되는 경우, 서브쿼리의 검색 결과는 한 개의 결과값을 가져야 한다.(두 개 이상인 경우 에러)

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

ex)

SELECT 상호, 가격
FROM oil_price
WHERE 가격 > (SELECT host
			  FROM snl_show
              WHERE id=1);

활용예시

Multiple Row

  • 하나 이상의 열을 검색하는 서브쿼리
  • IN: 서브쿼리 결과 중에 포함될 때
SELECT column_names
FROM table_name
WHERE column_name IN (SELECT column_name
					  FROM column_name
                      WHERE condition)
ORDER BY column_names;

ex)

SELECT host
FROM snl_show
WHERE host IN (SELECT name
			   FROM celeb
               WHERE job_title LIKE '%영화배우%');

활용예시

  • EXISTS: 서브쿼리 결과에 값이 있으면 반환
SELECT column_names
FROM table_name
WHERE EXISTS (SELECT column_name
					  FROM column_name
                      WHERE condition)
ORDER BY column_names;

ex)

SELECT name
FROM police_station p
WHERE EXISTS (SELECT police_station
			  FROM crime_status c
              WHERE p.name=c.reference AND case_number > 2000);
  • ANY: 서브쿼리 결과 중 최소 하나라도 만족하면 (비교연산자 사용)
SELECT column_names
FROM table_name
WHERE column_name = ANY (SELECT column_name
			             FROM column_name
                      	 WHERE condition)
ORDER BY column_names;

ex)

SELECT name
FROM celeb
WHERE name = ANY (SELECT host
				  FROM snl_show);
  • ALL: 서브쿼리 결과를 모두 만족하면(비교연산자 사용)
SELECT column_name
FROM table_name
WHERE column_name = (SELECT column_name
			         FROM table_name
              	     WHERE condition)
ORDER BY column_name;

ex)

SELECT name
FROM celeb
WHERE name = ALL (SELECT host
			  FROM snl_show
              WHERE id=1);

Multiple ColumnL

  • 하나 이상의 행을 검색하는 서브쿼리
SELECT column_names
FROM tablename a
WHERE (a.column, column2, ...) IN (SELECT b.column1, column2, ...)
								   FROM tablename b
                                   WHERE a.columnname = b.columnname);

ex)

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

0개의 댓글