▷ 오늘 학습 계획: SQL 강의(심화9~10)
하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문
메인쿼리가 서브쿼리를 포함하는 종속적인 관계
- 서브쿼리는 메인쿼리의 칼럼을 사용할 수 있지만
메인쿼리는 서브쿼리의 칼럼을 사용할 수 없다.- Subquery 는 괄호로 묶어서 사용
- 단일 행 혹은 복수 행 비교 연산자와 함께 사용할 수 있다.
- subquery 에서는 order by 를 사용할 수 없다.
Subquery 종류
Scalar Subquery → SELECT 절에 사용
Inline View → FROM 절에 사용
Nested Subquery → WHERE 절에 사용
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 '검거';
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;
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 테스트