(MySQL)서브쿼리

지며리·2023년 1월 7일
0

Scalar Subquery

select column1, (select column2 from table 2 where condition)
from table1
where condition;
  • select 절에 사용

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

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

Inline View

select a.column, b.column
from table a, (select column1, column2 from table 2) b
where condition;
  • from 절에 사용하는 서브쿼리
  • 메인쿼리에서는 인라인뷰에서 조회한 column만 사용가능

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 pollice_station) m
where c.police_station = m.police_station
	AND c.case_number = m.count;

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

Nested Subquery

Single Row

select column_names
from table_name
where column_name = (select column_name from table_name where condition)
order by column_name;
  • 하나의 열을 검색하는 서브쿼리
  • 서브쿼리가 비교연산자(=, >, >=, <, <=, <>, !=)와 사용되는 경우
  • 서브쿼리의 검색 결과는 한 개의 결과값을 가져야 한다.

select name from celeb where name = (select host from snl_show);

  • host가 1명이 아니므로 에러가 뜬다.

select name from celeb wehre name = (select host from snl_show where id=1);


Multiple Row

select column_names
from table_name
where column_name IN (select column_name from table_name where condition)
order by column_names;
  • 하나 이상의 행을 검색하는 서브쿼리
  • IN, Exsists, ANY, ALL 등 과 함께 쓰일 수 있다.

select host from snl_show 
where host in (select name from celeb where job_title like '%영화배우%');

  • snl에 출연한 영화배우 조회

select name
from police_station p
where exists (select police_station from crime_status c
				where p.name = c.reference and case_number > 2000);

  • 범죄 검거 혹은 발생 건수가 2000건 보다 큰 경찰서 조회

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 = '강동원');

  • 강동원과 성별, 소속사가 같은 연예인의 이름, 성별, 소속사를 조회
profile
쉽고 유익하게 널리널리

0개의 댓글