서브쿼리까지 안 보고 할 줄 알면 sql 문법은 어느정도 다룰 수 있게 될거같다.
서브쿼리는 개념이 조금 말장난 같은 느낌이라 한 번에 이해되지 않았음..
원하는 값을 추출할 때, 구조적으로 추출을 못 하는 경우에 서브쿼리를 사용해주는 것 같다.
언제 사용해야 되는지, 어떻게 사용해야 되는지를 구분해서 사용하는데 익숙해져야겠다.
select col1, (select col2 from table2 where condition) from table1 where condition;

스칼라 서브쿼리로 추출한 값은 위와 같이 하나의 칼럼으로 나온다.
select a.col, b.col from table1 a, (select col1, col2 from table2) b where condition;

메인쿼리는 인라인뷰에서 조회한 칼럼 case_number를 사용한건가 싶다. 아닌가? 이게 헷갈림(사용 못한다 했다가 조회한건 사용한다니까..)
중첩 서브쿼리는 where절에서 사용하는데 3가지를 알아야 하고, 멀티플 로우에서 사용하는 3가지를 또 알아둬야한다.
검색 결과를 <1개냐 여러개냐> and <행이냐 열이냐> 구분해서 가져오게 된다.
서브쿼리가 비교연산자(=,>,>=,<,<=,<>,!=)와 사용되는 경우.
서브쿼리의 검색결과는 한 개의 결과값을 가져야 함.
(2개 이상인 경우 에러)
select col_name from table_name where col_name = (select col_name from table_name where condition) order by col_name;

에러가 나는 이유는 2개 이상이기 때문이다.
우선 메인쿼리랑 서브쿼리를 나눠서 출력해보고 비교해보자.
➡️ 메인쿼리

➡️ 서브쿼리

➡️ celeb 테이블과 snl_show 테이블 join

➡️ 서브쿼리에 id=1인 값만 호출 (결과값 1개)

📍where 절에서 사용할 수 있는 싱글 로우 서브쿼리는 메인쿼리가 서브쿼리의 모든 값과 일치하는 값을 불러온다.
➡️ 구조
select col1 from table1 where col1 멀티플 로우(in,exists,any,all) (select col2 from table2 where condition) order by col_name;
경우에 따라 join이 더 효율적일 수 있다.
<멀티플 로우>는 <싱글 로우>와 달리 여러 행의 값을 반환할 수 있다.
any와 all은 교집합, 합집합 대충 이런식으로 생각하면 될듯?
- exists는 col_name 없이 바로 쓴다. select name from police_station p where exists (select police_station from crime_status c where p.name = c.reference and case_number > 2000);
➡️ 구조
select col from table a where (a.col1, a.col2, ...) in (select b.col1, b.col2, ... from table b where a.col = b.col) order by col;
각각의 서브쿼리를 언제 사용할지는 많이 다뤄봐야 개념이 잡힐듯하다. 이렇게만 봐가지고는 어떻게 쓰는지는 알겠는데 언제 쓰는지는 모르겠다.
그래도 기본적으로 SQL을 다룰 수 있게 되었으니 이것저것 찾아보고 실제로 적용하면서 익숙해져야겠다.