kjh00n의 기록저장소

서브쿼리 본문

DB

서브쿼리

kjh00n 2024. 11. 21. 17:50

서브쿼리

● 하나의 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 이름 지어주기];

'DB' 카테고리의 다른 글

VIEW  (0) 2024.11.22
실습6  (0) 2024.11.22
실습5  (0) 2024.11.21
집합 연산자 (Set Operator)  (0) 2024.11.21
실습4  (0) 2024.11.21