공부, 기록

[MSSQL/SQL SERVER] 서브쿼리 본문

공부/DATABASE

[MSSQL/SQL SERVER] 서브쿼리

무는빼주세요 2021. 3. 6. 15:04

 

서브쿼리란

메인쿼리안의 또 하나의 쿼리가 있는경우를 서브쿼리라 칭함

 

TABLE1 : COL1 INT, COL2 INT (약 3만건)

TABLE2 : COL1 INT COL2 INT, COL3 DATETIME (약 10만건)

 

1. SELECT 

   1-1 SELECT 스칼라 서브쿼리라고도 칭하며 한건의 조회수만 출력되어야 함.

 

   1-2 FROM 일종의 임시 테이블. 메인쿼리의 SELECT는 서브쿼리의 SELECT에 있는 값만 사용 가능.

   EX)

SELECT T1.COL1, SUB.T2C3 --T2.COL2 는 서브쿼리안에서 조회되지 않았기에 사용 불가
FROM (
SELECT T2.COL1 AS T2C1 ,T2.COL3 AS T2C3
FROM TABLE2 AS T2
) AS SUB
JOIN TABLE1 AS T1
ON T1.COL1 = SUB.T2C1

   1-3 WHERE 일반적인 서브쿼리 대부분 JOIN으로 처리가능하며 JOIN으로 처리하는 경우가 성능이 좋은 경우가 많음.

SELECT T1.*
FROM dbo.table1 AS T1 LEFT JOIN dbo.TABLE2 as T2
ON T1.col2 = T2.col1 
WHERE T2.COL1 IS NULL

SELECT T1.*
FROM dbo.table1 AS T1 
WHERE T1.col2 NOT IN (SELECT col1 FROM dbo.table2 AS T2



-> 동일한 결과의 쿼리의 방식에 따른 성능 차이 (OUTER JOIN으로 처리한 경우가 더 효율적)

 

 

 

2. INSERT 

INSERT INTO TABLE1 
SELECT COL1, COL2
FROM TABLE2
WHERE TABLE2.COL2 > 900000

 

3. UPDATE

UPDATE T1 SET T1.COL1 = T1.COL2
FROM TABLE1 AS T1
WHERE COL1 IN (
SELECT T2.COL1
FROM TABLE2 AS T2)

UPDATE T1 SET T1.COL1 = T1.COL2
FROM TABLE1 AS T1
JOIN TABLE2 AS T2
ON T1.COL1 = T2.COL1

 

※UPDATE ~~ FROM 을 사용하면 AS로 약칭을 정하여 간편하게 사용 가능

 

 

4. DELETE

DELETE FROM TABLE1
FROM TABLE1 AS T1
WHERE T1.COL1 IN (
SELECT T2.COL1
FROM TABLE2 AS T2)

DELETE FROM TABLE1
FROM TABLE1 AS T1
JOIN TABLE2 AS T2
ON T1.COL1 = T2.COL1

※최근 DBMS의 버전이 높아지면서 서브쿼리들도 옵티마이저가 JOIN으로 처리하여 실행하는 듯 하다.