본 글은 Fastcampus의 MySQL Database 강의를 수강하며 정리한 내용입니다.
강의 링크
서브 쿼리
SELECT
, FROM
, WHERE
, HAVING
, ORDER BY
절에 사용 가능INSERT
, UPDATE
, DELETE
문에도 사용 가능;
을 붙이지 않아도 된다.SELECT
절의 서브 쿼리는 반드시 결과값이 하나의 값이어야 한다.SELECT [컬럼 이름],
(SELECT [컬럼 이름]
FROM [테이블 이름]
WHERE 조건식)
FROM [테이블 이름]
WHERE 조건식;
FROM
절의 서브 쿼리는 반드시 결과값이 하나의 테이블이어야 한다.SELECT [컬럼 이름]
FROM (SELECT [컬럼 이름]
FROM [테이블 이름]
WHERE 조건식) AS [테이블 별명]
WHERE 조건식;
WHERE
절의 서브 쿼리는 반드시 결과값이 하나의 컬럼이어야 한다. (EXISTS
제외)WHERE [컬럼 이름][연산자][서브 쿼리]
형식으로 사용한다.SELECT [컬럼 이름]
FROM [테이블 이름]
WHERE [컬럼 이름][연산자](SELECT [컬럼 이름]
FROM [테이블 이름]
WHERE 조건식);
비교 연산자
연산자 | 활용 | 의미 |
---|---|---|
= | A = [서브 쿼리] | A와 [서브 쿼리]의 결과값이 같다 |
!= | A != [서브 쿼리] | A와 [서브 쿼리]의 결과값이 같지 않다 |
> | A > [서브 쿼리] | A가 [서브 쿼리]의 결과값보다 크다 |
>= | A >= [서브 쿼리] | A가 [서브 쿼리]의 결과값보다 크거나 작다 |
< | A < [서브 쿼리] | A가 [서브 쿼리]의 결과값보다 작다 |
<= | A <= [서브 쿼리] | A가 [서브 쿼리]의 결과값보다 작거나 같다 |
비교 연산자만 사용 시,
WHERE
절의 서브 쿼리는 반드시 하나의 값이어야 한다.
주요 연산자
연산자 | 활용 | 의미 |
---|---|---|
IN | A IN ([서브 쿼리]) | A가 [서브 쿼리]의 결과값 내에 있다 |
ALL | A < ALL([서브 쿼리]) | A가 모든 [서브 쿼리]의 결과값보다 작다 |
A > ALL([서브 쿼리]) | A가 모든 [서브 쿼리]의 결과값보다 크다 | |
ANY | A < ANY([서브 쿼리]) | A가 [서브 쿼리]의 결과값보다 하나라도 작다 |
A > ANY([서브 쿼리]) | A가 [서브 쿼리]의 결과값보다 하나라도 크다 | |
EXISTS | EXISTS([서브 쿼리]) | [서브 쿼리]의 결과값이 존재한다 |
NOT EXISTS([서브 쿼리]) | [서브 쿼리]의 결과값이 존재하지 않는다 |
주요 연산자 사용 시,
WHERE
절의 서브 쿼리는 반드시 결과값이 하나의 컬럼이어야 한다.
단,EXISTS
는 단독으로 사용하며, 결과값이 여러 컬럼이어도 된다.
※ ALL
<
와 사용 : [서브 쿼리]의 최솟값보다 작은 지 확인하는 연산자>
와 사용 : [서브 쿼리]의 최댓값보다 큰 지 확인하는 연산자※ ANY
<
와 사용 : [서브 쿼리]의 최댓값보다 작은 지 확인하는 연산자>
와 사용 : [서브 쿼리]의 최솟값보다 큰 지 확인하는 연산자※ EXISTS
DROP DATABASE IF EXISTS pokemon;
CREATE DATABASE pokemon;
USE pokemon;
CREATE TABLE mypokemon (
number INT,
name VARCHAR(20)
);
INSERT INTO mypokemon (number, name)
VALUES (10, 'caterpie'),
(25, 'pikachu'), (26, 'raichu'),
(133, 'eevee'),
(152, 'chikoirita');
CREATE TABLE ability (
number INT,
type VARCHAR(10),
height FLOAT,
weight FLOAT,
attack INT,
defense INT,
speed int
);
INSERT INTO ability (number, type, height, weight, attack, defense, speed)
VALUES (10, 'bug', 0.3, 2.9, 30, 35, 45),
(25, 'electric', 0.4, 6, 55, 40, 90),
(26, 'electric', 0.8, 30, 90, 55, 110),
(133, 'normal', 0.3, 6.5, 55, 50, 55),
(152, 'grass', 0.9, 6.4, 49, 65, 45);
SELECT number
FROM ability
WHERE weight = (SELECT MAX(weight) FROM ability);
SELECT number
FROM ability
WHERE speed < ANY(SELECT attack FROM ability WHERE type = 'electric');
SELECT name
FROM mypokemon
WHERE EXISTS (SELECT * FROM ability WHERE attack > defense);