[TIL] SUBQUERY(서브쿼리)

썹스·2024년 2월 17일

SQL

목록 보기
17/17

📌 SUBQUERY(서브쿼리)

SUBQUERY(서브쿼리)는 하나의 SQL문 안에 또 다른 SQL문으로, 주로 외부 쿼리의 데이터 필터링, 검색, 비교 연산 등을 수행한다.

서브쿼리는 작성 위치에 따라 불리는 이름과 특징이 다르다.

  • SCALAR SUBQUERY(스칼라 서브쿼리)
    • select절에서 사용되는 단일 값(단일 칼럼) 반환 서브쿼리로, 주로 비교 연산자와 함께 사용
  • INLINE VIEW(인라인 뷰)
    • from절에서 사용되는 서브쿼리로, 일반적으로 조인이나 필터링에 사용
  • NESTED SUBQUERY(중첩 서브쿼리)
    • where절에서 사용되는 서브쿼리로, ALL, ANY, IN, EXISTS 함수와 주로 사용

또한, 서브쿼리는 아래와 같은 공통 특징을 가지고 있다.

  • 서브쿼리는 메인쿼리의 칼럼 사용 가능
  • 메인쿼리는 서브쿼리의 칼럼 사용 불가
  • 서브쿼리는 괄호로 묶어서 사용
  • 서브쿼리는 order by를 사용하지 않음


데이터 테이블인 police_station(경찰 데이터 테이블)crime_status(범죄 데이터 테이블)를 사용하여 원하는 데이터를 추출

✅ SCALAR SUBQUERY(스칼라 서브쿼리)

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

  1. 서울은평경찰서의 강도 검거 건수
select case_number
from crime_status
where police_station = '은평' and crime_typr = '강도' and status_type = '검거';
  1. 서울시 경찰서 전체의 평균 강도 검거 건수
select avg(case_number)
from crime_status
where crime_typr = '강도' and status_type = '검거';

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

select case_number as 은평건수, 
		(select avg(case_number) 
         from crime_status 
         where crime_typr = '강도' and status_type = '검거') as 평균건수
from crime_status
where police_station = '은평' and crime_typr = '강도' and status_type = '검거';

✅ INLINE VIEW(인라인 뷰)

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

  1. 경찰서 별로 발생한 범죄 건수
select police_station, crime_type, case_number
from crime_status
where status_type = '발생'
group by police_station;

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

select A.police_station, A.crime_type, A.case_number as all_count
from crime_status as A,
		(select police_statios, max(case_number) as max_count
         from crime_status
         where status_type = '발생'
         group by police_station) as B
where A.police_station = B.police_station and all_count = max_count;

✅ NESTED SUBQUERY(중첩 서브쿼리)

중첩 서브쿼리는 3가지 종류가 있다.
1. Single Row: 하나의 행 데이터를 검색하는 서브쿼리
2. Multiple Row: 하나 이상의 행 데이터를 검색하는 서브쿼리
3. Multiple Column: 하나 이상의 열 데이터를 검색하는 서브쿼리

▶️ Single Row

  • 단일 행 서브쿼리는 WHERE 절에서 사용될 때 주로 비교 연산자와 함께 사용
  • 서브쿼리는 단일 값을 반환하며, 일반적으로 '=' 비교 연산자와 함께 사용
  • 주로 서브쿼리의 결과를 특정 조건과 비교하여 조건을 만족시키는 행을 선택하는 데 사용
select * 
from crime_status
where reference = (select name from police_station where name = '서울노원경찰서');

▶️ Multiple Row

  • 다중 행 서브쿼리는 WHERE 절에서 IN, ANY, ALL과 같은 비교 연산자와 함께 주로 사용
  • 서브쿼리는 여러 값을 반환하며, 주로 IN 연산자와 함께 사용
  • 주로 서브쿼리의 결과 집합이 외부 쿼리의 특정 조건과 일치하는지 여부를 확인하는 데 사용
select *
from crime_status
where reference in (select name from police_station where length(name) = 24);

▶️ Multiple Column

  • 다중 열 서브쿼리는 WHERE 절에서 비교 연산자 또는 EXISTS와 함께 사용
  • 서브쿼리는 여러 열을 반환할 수 있으며, 일반적으로 EXISTS와 함께 사용되어 외부 쿼리의 특정 조건을 충족시키는지 확인하는 데 사용
//경찰서 지역"노원"과 같은 범죄 타입, 현황 타입을 조회

select crime_type, status_type 
from crime_status 
where (crime_type, status_type, reference) in 
(select crime_type, status_type, reference from crime_status where police_station = '노원');
profile
코린이

0개의 댓글