SQL 심화_4

YJ·2023년 4월 22일
0

▷ 오늘 학습 계획: SQL 강의(심화9~10)

📖 07_SQL Subquery

1) About Subquery

하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문
메인쿼리가 서브쿼리를 포함하는 종속적인 관계

  • 서브쿼리는 메인쿼리의 칼럼을 사용할 수 있지만
    메인쿼리는 서브쿼리의 칼럼을 사용할 수 없다.
  • Subquery 는 괄호로 묶어서 사용
  • 단일 행 혹은 복수 행 비교 연산자와 함께 사용할 수 있다.
  • subquery 에서는 order by 를 사용할 수 없다.

Subquery 종류

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

2) Scalar Subquery

SELECT 절에서 사용하는 서브쿼리로 결과는 하나의 Column 이어야 한다

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 '검거';

3) Inline View

FROM 절에 사용하는 서브쿼리
메인쿼리에서는 인라인 뷰에서 조회한 Column 만 사용할 수 있다

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;

4) Nested Subquery

WHERE 절에서 사용하는 서브쿼리
Single Row - 하나의 행을 검색하는 서브쿼리
Multiple Row - 하나 이상의 행을 검색하는 서브쿼리
Multiple Column - 하나 이상의 열을 검색하는 서브쿼리

Single Row Subquery

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

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

Multiple Row - IN

서브쿼리 결과 중에 포함될 때

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

Multiple Row - EXISTS

서브쿼리 결과에 값이 있으면 반환

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

Multiple Row - ANY

서브쿼리 결과 중에 최소한 하나라도 만족하면(비교연산자)

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

Multiple Row - ALL

서브쿼리 결과를 모두 만족하면(비교연산자)

SELECT column_names
FROM table_name
WHERE column_name = ALL (SELECT column_name FROM table_name WHERE condigion)
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;

문제풀이

oil_price 테이블에서 상표별로 가장 비싼 가격과 상호를
Inline View 를 사용하여 조회

SELECT o.상호, o.상표, s.max_price
FROM oil_price o, 
	(SELECT 상표, max(가격) max_price FROM oil_price GROUP BY 상표) s
WHERE o.상표 = s.상표 AND o.가격 = s.max_price;

평균가격 보다 높은 주유소 상호와 가격을 Nested Subquery 를 사용하여 조회

SELECT 상호, 가격 FROM oil_price 
WHERE 가격 > (SELECT AVG(가격) FROM oil_price);

위에서 조회한 주유소에서 주유한 연예인의 이름과 주유소, 주유일을
Nested Subquery 를 사용하여 조회

SELECT 이름, 주유소, 주유일 FROM refueling
WHERE 주유소 IN 
	(SELECT 상호 FROM oil_price WHERE 가격 > (SELECT AVG(가격) FROM oil_price));

refueling 테이블과 oil_price 테이블에서 10만원 이상 주유한 연예인 이름, 상호, 상표, 주유 금액, 가격을 Inline View 를 사용하여 조회

SELECT r.이름, o.상호, o.상표, r.금액, o.가격 
FROM oil_price o, 
	(SELECT 주유소, 금액 FROM refueling WHERE 금액 >= 100000) r
WHERE o.상호 = r.주유소

📝 하나의 SQL 문 안에 또 다른 SQL 문을 넣어야 해서 조금 어려웠다. 종류도 여러개여서 헷갈리지 않게 정리해야겠다.

▷ 내일 학습 계획: EDA 테스트

[이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.]

0개의 댓글