kjh00n의 기록저장소
서브쿼리 본문
서브쿼리
● 하나의 SQL문 안에 포함되어 있는 또 다른 SQL문
● 정해져있지 않은 데이터를 조건 값을 설정하고 싶은 경우 해당 데이터를 검색하여 불러와 조건을 만족하기 위해 사용
● 상수가 아니고 변수 값을 불러오기 위한 기술
●SELECT, UPDATE, DELETE, INSERT, CREATE TABLE, VIEW에서 사용 가능
● 서브쿼리는 세미콜론(;)을 사용하지 않는다
SELECT MAX(s_level) FROM sword; → 50
→ 검의 최고레벨 값 구하기
최고레벨의 검 아이템의 이름을 조회
→ SELECT s_name FROM sword WHERE s_level = (SELECT MAx(s_level) FROM sword);
종류
①단일 행 서브쿼리
→ 서브쿼리가 동작 후 나오는 데이터가 하나인 경우
SELECT MAX(s_level) FROM sword; → 50
SELECT s_name FROM sword WHERE s_level >= 50<,>,<=,>=,!= 를 사용가능하다
SELECT s_name FROM sword WHERE s_level (SELECT s_level FROM sword);
SELECT s_level FROM sword는 값이 여러개가 나온다.
그래서 값이 1개가 나오는 것만 사용할 때를 단일 행 서브쿼리라고 한다
②다중 행 서브쿼리
→ 서브쿼리가 동작 후 나오는 데이터가 여러개인 경우
SELECT s_name FROM sword WHERE s_level IN (SELECT s_level FROM sword);
SELECT s_name FROM sword WHERE s_level IN(50,45,36,20);
여러개의 데이터 중 만족하는 것을 찾아야하기 때문에 연산자 IN을 사용한다.
③다중 열 서브쿼리
→ 서브쿼리가 동작 후 나오는 데이터가 여러 Column의 여러 데이터인 경우
SELECT MAX(s_level),MAX(s_attack) FROM sword;
SELECT s_name FROM sword WHERE s_attack = (SELECT MAX(s_level),MAX(s_attack) FROM sword);
→ s_attack만 조회가 가능하고 s_level은 조회가 불가능한 상황이 된다.
SELECT s_name FROM sword WHERE (s_level,s_attack)IN (SELECT MAX(s_level),MAX(s_attack) FROM sword);
→ 괄호를 사용해서 s_level과 s_attack을 넣어주면 결과가 나온다.
※조회하려는 쿼리와 서브쿼리의 행의 갯수를 같이 맞춰줘야 된다.s_level의 값과 MAX(s_level)의 값이 같아야하고 s_attack의 값과 MAX(s_attack)의 값도 맞아야 결과가 나온다.결국 2개의 값이 모두 맞아야하는 AND여야 결과가 나온다
● 여러개의 Column이 서브쿼리로 출력되기 때문에 조건을 지정시 Column을 서브쿼리의 Column과 똑같이 맞춰야 한다.
● 다중 Column으로 출력되는 데이터가 전부 만족해야 출력된다.
● 다중 Column으로 출력되는 데이터가 Column당 한개씩 출력되는 것은 아니끼 때문에 연산자를 IN으로 작성해야 한다.
TIP
서브쿼리의 결과를 TABLE로 인식 가능
SELECT * FROM (SELECT * FROM sword UNION SELECT * FROM staff) AS [Table 이름 지어주기];