Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 코딩테스트
- NumPy
- Stack
- 백준
- queue
- 파이썬
- aws jupyter notebook
- 알고리즘스터디
- 가상환경
- 노마드코딩
- 정보처리기사 c언어
- 자료구조
- openCV
- dataframe
- javascript
- String Method
- 알고리즘
- MySQL
- Algorithm
- 데이터시각화
- Selenium
- 프로그래머스
- Join
- type hint
- pandas
- python
- 선그래프
- programmers
- Matplotlib
- 알고리즘 스터디
Archives
- Today
- Total
조금씩 꾸준히 완성을 향해
[MySQL] subquery 서브쿼리 기본 사용예제 본문
서브쿼리(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 |