[MySQL] 서브쿼리, 정규표현식

Jihoon·2023년 6월 11일
0

DB & SQL Study

목록 보기
5/8
post-custom-banner

🔥[중요] SUB QUERY

아래 내용은 https://mozi.tistory.com/233 블로그를 참고해서 적은 것입니다.

  • 서브쿼리 사용시 주의사항
  1. 서브쿼리는 괄호 사용 !
  2. 서브쿼리는 단일 행 OR 복수 행 비교 연산자와 함께 사용 가능
  3. 단, 서브쿼리에서는 ORDER BY를 사용하지 못함
  • 서브쿼리 사용 가능한 곳
  1. SELECT 절
  2. FROM 절
  3. WHERE 절
  4. HAVING 절
  5. ORDER BY 절
  6. INSERT 문의 VALUES 절
  7. UPDATE 문의 SET 절

1. 단일 행 서브쿼리

  • 서브쿼리가 단일 행 비교 연산자(=, <, <=, >, >=, <>)와 함께 사용할 때는 서브쿼리의 결과 건수가 반드시 1건 이하여야 합니다 !

  • IF 결과가 2건 이상인 경우 ERROR 발생 !!

단일 행 쿼리의 예제

  • ❌ T2 테이블의 조건 만족하는 C1 값이 2건 이상이라서 오류 발생 ! (ERROR)
SELECT C1, C2, C3
FROM T1
WHERE C1 = (SELECT C1
			FROM T2
            WHERE C2 = '3')
ORDER BY C1, C2, C3;
  • ✅ 그룹 함수(AVG)를 사용하는 경우 결과값이 1건이기 때문에 단일 행 서브쿼리로써 사용 가능
SELECT C1, C2, C3
FROM T1
WHERE C1 <= (SELECT AVG(C1)
			FROM T2
            WHERE C2 = '3')
ORDER BY C1, C2, C3;

2. 다중 행 서브쿼리

  • 서브쿼리의 결과가 2건 이상 반환될 수 있다면 반드시 다중 행 비교 연산자(IN, ALL, ANY, SOME)와 함께 사용해야 합니다 !

IN: 서브쿼리의 결과에 존재하는 임의의 값과 동일한 조건을 의미
ALL: 서브쿼리의 결과에 존재하는 모든 값을 만족하는 조건을 의미
ANY: 서브쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건 의미
EXISTS: 서브쿼리의 결과를 만족하는 값이 존재하는지 여부를 확인하는 조건 의미

다중 행 쿼리 예시

  • 만약 T2 테이블의 C2 = 3 인 조건을 만족하는 C1의 값이 2건 이상인 경우 =이 아닌 IN을 사용해야 합니다!!
SELECT C1, C2, C3
FROM T1
WHERE C1 IN (SELECT C1
			FROM T2
            WHERE C2 = '3')
ORDER BY C1, C2, C3;

3. 다중 칼럼 서브쿼리

  • 서브쿼리 결과로 여러 개의 컬럼이 반환되어 메인쿼리의 조건과 동시에 비교되는 것을 의미함
SELECT C1, C2, C3
FROM T1
WHERE (C1, C2) IN (SELECT C1, C2
				FROM T2
                WHERE C2 = '3')
ORDER BY C1, C2, C3

4. 연관 서브쿼리

  • 서브쿼리 내에 메인쿼리 컬럼이 사용된 서브쿼리입니다

연관 서브쿼리 예제

SELECT T1.C1, T1.C2, T1.C3
FROM T1 T1
WHERE (T1.C1, T1.C2) IN (SELECT T2.C1, T2.C2, 
						FROM T2 T2
                        WHERE T2.C2 = T1.C2) -- 메인 쿼리의 컬럼을 서브쿼리에 사용
ORDER BY T1.C1, T1.C2, T1.C3

그 밖의 위치에서 사용하는 서브쿼리

1. SELECT 절에 사용하는 서브쿼리

  • 스칼라 서브쿼리라고 불림
  • 스칼라 서브쿼리는 한 행, 한 컬럼만을 반환하는 서브쿼리 의미
SELECT T1.C1, (SELECT AVG(T2.C1) FROM T2 T2)
FROM T1 T1;

2. FROM 절에 사용하는 서브쿼리

SELECT T1.C1, T2.C1, T2.C2
FROM T1 T1,
		(SELECT C1, C2 FROM T2) T2
WHERE T1.C1 = T2.C1;

3. HAVING 절에서 사용하는 서브쿼리

SELECT T1.C1, T2.C1, T2.C2
FROM T1 T1, T2 T2
WHERE T1.C1 = T2.C1
GROUP BY T1.C1, T2.C1, T2.C2
HAVING AVG(T1.C1) < (SELECT AVG(C1)
					FROM T2);

4. UPDATE 문의 SET 절에서 사용하기

  • 값 변경 시
UPDATE T1 T1
   SET T1.C1 = (SELECT  T2.C1 FROM T2 T2 WHERE T2.C1 = T1.C1);

5. INSERT 문의 VALUES 절에서 사용하기

  • 데이터 추가 시
INSERT INTO T1 (C1, C2, C3) SELECT C1, C2, C3 FROM T2;
INSERT INTO T1 (C1, C2, C3) VALUES ((SELECT C1 FROM T2), (SELECT C2 FROM T2), (SELECT C3 FROM T2));
profile
장난감이 데이터인 사람
post-custom-banner

0개의 댓글