조금씩 꾸준히 완성을 향해

[MySQL] subquery 서브쿼리 기본 사용예제 본문

Database/MySQL

[MySQL] subquery 서브쿼리 기본 사용예제

all_sound 2022. 9. 18. 17:53

서브쿼리(Subquery) 

서브쿼리(subquery)란 하나의 query 안에 포함되어 있는 또 다른 SELECT문을 말한다.

서브쿼리를 포함하고 있는 쿼리를 외부쿼리(outer query)라고 부르며, 서브쿼리는 내부쿼리(inner query)라고도 부른다.

 

▶ 서브쿼리 사용 가능 한 곳 

​MySQL에서 서브쿼리를 포함할 수 있는 외부쿼리는 SELECT, INSERT, UPDATE, DELETE, SET, DO 문이 있다.

이러한 서브쿼리는 또 다시 다른 서브쿼리 안에 포함될 수 있다.

  • SELECT
  • FROM
  • WHERE
  • HAVING
  • ORDER BY
  • INSERT문의 VALUES 부분 대체제
  • UPDATE문의 SET 부분 대체제

 

 

1. 비상관 서브쿼리

 

▶ sample5의 a열 중 최솟값인 행을 찾기

mysql> SELECT * FROM sample54;
+------+------+
| no   | a    |
+------+------+
|    1 |  100 |
|    2 |  900 |
|    3 |   20 |
|    4 |   80 |
+------+------+

mysql> SELECT * FROM sample54 WHERE a = (SELECT MIN(a) FROM sample51);
+------+------+
| no   | a    |
+------+------+
|    3 |   20 |
+------+------+

 

 

DELETE (※ 주의!)

 

▶ sample5의 a열 중 최솟값인 행을 삭제  

-- MySQL에서만 에러가 뜨는 코드 
mysql> DELETE FROM sample54
    -> WHERE a = (SELECT MIN(a) FROM sample54);
-- ERROR 1093 (HY000): You can't specify target table 'sample54' for update in FROM clause
-- MySQL의 특징으로 데이터를 추가나 갱신할 경우 동일한 테이블로 서브쿼리를 사용할 수 없도록 되어 있기 때문

mysql> DELETE FROM sample54
    -> WHERE a = (SELECT a FROM (SELECT MIN(a) AS a FROM sample54) AS t);
mysql> SELECT * FROM sample54;
+------+------+
| no   | a    |
+------+------+
|    1 |  100 |
|    2 |  900 |
|    4 |   80 |
+------+------+

 

 

UPDATE (※ 주의!)

 

▶ sample54 a열의 값들을 sample54의 최대값으로 변경

mysql> UPDATE sample54
    -> SET
    -> a = (SELECT a FROM (SELECT MAX(a) as a FROM sample54) AS t);
mysql> SELECT * FROM sample54;
+------+------+
| no   | a    |
+------+------+
|    1 |  900 |
|    2 |  900 |
|    4 |  900 |
+------+------+

 

 

▶ sample541의 a열에 sample51의 행의 수, b열에 sample54의 행의 수 입력

mysql> INSERT INTO sample541
    -> VALUES(
    -> (SELECT COUNT(*) FROM sample51),
    -> (SELECT COUNT(*) FROM sample54));

mysql> SELECT * FROM sample541;
+------+------+
| a    | b    |
+------+------+
|    5 |    3 |
+------+------+

 

 

 

2. 상관 서브쿼리

 - EXISTS / NOT EXISTS (SELECT 명령) : select 명령이 존재한다면 / 존재하지 않는다면

 

 

▶ sample522의 no2열의 값이  sample551의 no열의 값과 같은 게 있다면 해당 sample551의 a열의 값을 '있음'으로 변경.

mysql> select * from sample552;
+------+
| no2  |
+------+
|    3 |
|    5 |
+------+

mysql> UPDATE sample551
    -> SET a = '있음'
    -> WHERE EXISTS
    -> (SELECT * FROM sample552 WHERE sample552.no2 = sample551.no);
    
mysql> select * from sample551;
+------+------+
| no   | a    |
+------+------+
|    1 | NULL |
|    2 | NULL |
|    3 | 있음 |
|    4 | NULL |
|    5 | 있음 |
+------+------+

 

 

▶ sample522의 no2열의 값이  sample551의 no열의 값과 같지 않은 게 있다면 해당 sample551의 a열의 값을 '있음'으로 변경.

mysql> UPDATE sample551
    -> SET a = '있음'
    -> WHERE EXISTS
    -> (SELECT * FROM sample552 WHERE sample552.no2 <> sample551.no);
    
mysql> select * from sample551;
+------+------+
| no   | a    |
+------+------+
|    1 | 있음 |
|    2 | 있음 |
|    3 | 있음 |
|    4 | 있음 |
|    5 | 있음 |
+------+------+

 

 

 sample551의 no열이 sample552의 no2열에 있는 값들에 포함되어 있는 것들만 출력

mysql> SELECT * FROM sample551 WHERE no IN (SELECT no2 FROM sample552);
+------+------+
| no   | a    |
+------+------+
|    3 | 있음 |
|    5 | 있음 |
+------+------+

 

'Database > MySQL' 카테고리의 다른 글

[MySQL] 문자 관련 함수 정리  (0) 2022.09.19
[MySQL] 숫자 관련 함수 정리  (0) 2022.09.18
[MySQL] Alter Table  (0) 2022.09.17
[MySQL] Group By, Having  (0) 2022.09.17
[MySQL] select 사용법 정리  (0) 2022.09.17