서브쿼리
select 안에 또 select 를 쓸 수 있는거 아시나요?
네? 이미 다 아신다구요?
다시한번 묻겠습니다.
select 안에 또 select 를 쓸 수 있는거 아시나요?
네ㅎㅎ 처음 듣는다구요?? 실은 select 문법 안에 select를 또 사용할 수 있는데요.
이런걸 서브쿼리라고 하는데 어떻게 사용하는지 알아봅시다.
Q. 위의 테이블에서 사용금액의 평균보다 더 큰 사용금액을 가진 사람만 출력하고 싶을땐 어떻게 해야할까요?
간단합니다.
- 사용금액 평균을 구한다.
- 사용금액 > 사용금액 평균을 필터링해주소
이겁니다. 간단하쥬?(백종원 톤으로)
SELECT AVG(사용금액) FROM card
사용금액의 평균을 내보면 대충 245000원이 나옵니다.
그담엔
SELECT * FROM card
WHERE 사용금액 > 245000
이렇게 필터링을 해주면 됩니다.
근데 이걸 2번이나 따로따로 입력하기엔 너무 귀찮습니다.
그래서 위에 말씀 드린 ‘서브쿼리’를 사용하면 한 쿼리문으로 해결됩니다.
SELECT * FROM card
WHERE 사용금액 > (SELECT AVG(사용금액) FROM card)
SELECT 쿼리 안에 다른 select를 자유롭게 넣을 수 있는데요.
이렇게 쿼리를 짠다면 ‘소괄호()’ 안에 있는 값이 먼저 실행되어 결과를 내뱉고 다음 쿼리를 알아서 실행해줍니다
그러면 소괄호 안에 245000을 뱉어줄거고 결국 사용금액 > 245000이 출력되는 것입니다. 참 쉽쥬?(백종원톤으로)
내가 보려고 만든 🍯팁
- 문자나 숫자가 들어갈 곳에 서브쿼리를 대신 쓸 수 있다.
- 그래서 1개의 문자나 숫자를 결과로 내뱉는 select 문만 서브쿼리로 쓸 수 있음(여러개의 행과 결과를 출력하는 select는 서브쿼리로 쓸 수 없습니다.)
- 서브 쿼리 밖을 때는 소괄호()를 사용한다.
그냥 쉽게 말하자면 쿼리를 2번 짜야할때 이 두개를 합칠 수 있도록 도와주는게 서브쿼리입니다. 넘 어렵게 생각 ㄴㄴ
컬렴명 자리에 서브쿼리 넣어보기
이전 포스팅에서 컬럼끼리 사칙연산이 될 수 있다고 배웠습니당.
그래서 사칙연산할 때도 서브쿼리 같은거 넣을 수 있는데요.
SELECT 사용금액 / 245000 FROM card
를
SELECT 사용금액 / (SELECT AVG(사용금액) FROM card)
FROM card
로 카카시 가능합니다.
열어분 그리고 컬럼명 자리에 숫자나 문자 넣으면 그거 그대로 출력해주는 사실 알고 계십니까!?!?!?!?
SELECT 사업장명, '국나뇽천재' FROM 강원도_관광숙박업_현황;
???
??? : 그럼 넣은 문자가 그대로 출력해주니까 이자리에 서브쿼리 써도 되는 거 아닐까여????
님 천재임? 정답;;
SELECT 사업장명,
(SELECT avg(총층수) FROM 강원도_관광숙박업_현황)
FROM 강원도_관광숙박업_현황;
이렇게 서브쿼리는 결과를 하나 내뱉는 곳이면 어디든 사용가능합니다.
그냥 보여주고 싶었을 뿐입니다.
IN안에 서브쿼리를 넣어보자
이 강원도_관광숙박업_현황 중에서 악덕인 숙소만 뽑아서 BlackList라는 테이블을 하나 만들었습니다.(예시일뿐 실제 숙소와 연관없음을 알립니다.)
Q. 강원도_관광숙박업_현황 테이블에서 블랙리스트의 지명을 출력하려면 어떻게 쿼리를 짜야할까요?
SELECT 도로명전체주소 FROM 강원도_관광숙박업_현황
WHERE 사업장명 IN ('벨라', '영진스테이2', '씬앤제이드', '강릉관광호텔');
이거 뭔가 불편하지 않아요??? 아아 ㅎㅎ 강요는 아니구ㅎㅎ
불편하지 않습니까!!?!?!?!?!?!?
서브쿼리를 배웠다면..
그대가 서브쿼리를 이해했다면…
정녕 불편하지 않사옵니까ㅠㅠ
그래요 바로그겁니다.
SELECT 도로명전체주소 FROM 강원도_관광숙박업_현황
WHERE 사업장명 IN (SELECT 이름 FROM BlackList);
똑같은 결과가 나옵니다.
??? : 당신 뭐여 아까는 결과가 하나 내뱉어야지 서브쿼리 쓸 수 있다매!!!!
IN()안에서는 예욉니다. ㅅㄱㅇ
오늘의 결론
select 문을 여러번 쓸때는 서브쿼리 형태로 하나로 합칠 수 있습니다.
편해보이면 그렇게 사용하믄 댑니다.
근데 바로 위에 같은 예제는 JOIN문법으로 사용하면 더빠르고 문법이 더 이해가 쉬운데요. 그냥 서브쿼리로 한번 써봤습니다.
'DI(Digital Innovation) > DataBase & SQL 뽀개기' 카테고리의 다른 글
SQL (IF/CASE) 장인을 꿈꾼다 (0) | 2024.02.21 |
---|---|
GROUP BY 뽀개기 (0) | 2024.02.19 |
푸바오가 알려주는 컬럼 출력시 사칙연산 & 문자를 다루는 함수 (0) | 2024.02.19 |
국가 권력급 집계함수로 통계내기 (0) | 2024.02.19 |
WHERE 완벽정리 (0) | 2024.02.19 |