조건에 조건 더하기

오상윤·2023년 1월 30일
0

SQL

목록 보기
9/10

조건에 조건 더하기 (서브 쿼리)

  • 하나의 쿼리 내 포함된 또 하나의 쿼리를 의미
  • 서브 쿼리는 반드시 괄호 안에 있어야 한다
  • SELECT, FROM, WHERE, HAVING, ORDER BY 절에 사용 가능
  • INSERT, UPDATE, DELETE 문에도 사용 가능
  • 서브쿼리에는 ; (세미콜론)을 붙이지 않아도 된다

SELECT 절의 서브 쿼리

  • 스칼라 서브쿼리라고도 한다
  • SELECT 절의 서브 쿼리는 반드시 결과값이 하나의 값이어야 한다
    SELECT [컬럼이름],
    (SELECT[컬럼 이름]
    FROM [테이블 이름]
    WHERE 조건식)
    FROM [테이블 이름]
    WHERE 조건식;

FROM 절의 서브 쿼리

  • 인라인 뷰 서브쿼리라고도 한다
  • FROM절의 서브 쿼리는 바드시 결과값이 하나의 테이블이여야 한다
  • 서브 쿼리로 만든 테이블은 반드시 별명을 가져야 한다
    SELECT [컬럼 이름]
    FROM (SELECT[컬럼 이름]
    FROM [테이블 이름]
    WHERE 조건식) AS [테이블 별명]
    WHERE 조건식;

WHERE 절의 서브 쿼리

  • 중첩 서브쿼리라고도 한다
  • WHERE절의 서브 쿼리는 반드시 결과값이 하나의 컬럼이 이어야 한다.(EXISTS제외)
    - 하나의 컬럼에는 여러 개의 값이 존재할 수 있다
  • 연산자와 함께 사용한다
    - 보통 WHERE [컬럼 이름][연산자][서브 쿼리] 형식으로 사용한다.
    SELECT [컬럼 이름]
    FROM [테이블 이름]
    WHERE [컬럼 이름][연산자](SELECT[컬럼 이름]
    FROM [테이블 이름]
    WHERE 조건식);

서브쿼리에 사용하는 연산자

비교 연산자

  • 비교 연산자만 사용시, WHERE절의 서브 쿼리는 반드시 결과값이 하나의 값이어야 한다
  • EXISTS는 단독으로 사용하며, 결과값이 여러 칼럼이어도 된다.
  • =
    - A=[서브 쿼리] : A와 [서브 쿼리]의 결과값이 같다
  • !=
    - A!=[서브 쿼리] : A와 [서브 쿼리]의 결과값이 같지 않다
  • 	- A>[서브 쿼리] : A와 [서브 쿼리]의 결과값보다 크다
  • =
    - A>=[서브 쿼리] : A와 [서브 쿼리]의 결과값보다 크거나 작다

  • <
    - A<[서브 쿼리] : A와 [서브 쿼리]의 결과값보다 작다
  • <=
    - A<=[서브 쿼리] : A와 [서브 쿼리]의 결과값보다 작거나 같다

주요 연산자

  • 주요 연산자 사용시, WHERE절의 서브 쿼리는 반드시 결과값이 하나의 컬럼이어야 한다
  • EXISTS는 단독으로 사용하며, 결과값이 여러 칼럼이어도 된다.
  • IN
    - A IN([서브 쿼리]) : A가 [서브 쿼리]의 결과값 내에 있다
  • ALL
    - A <ALL([서브 쿼리]) : A가 모든[서브 쿼리]의 결과값보다 작다
    • A >ALL([서브 쿼리]) : A가 모든[서브 쿼리]의 결과값보다 크다
  • ANY
    - A <ANY([서브 쿼리]) : A가 [서브 쿼리]의 결과값보다 하나라도 작다
    • A >ANY([서브 쿼리]) : A가 [서브 쿼리]의 결과값보다 하나라도 크다
  • EXISTS
    - EXISTS([서브 쿼리]) : [서브 쿼리]의 결과값이 존재한다
    • NOT EXITSTS([서브 쿼리]) : [서브 쿼리]의 결과값이 존재하지 않는다

실습1

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);
  1. 내 포켓몬 중에 몸무게가 가장 많이 나가는 포켓몬의 번호를 가져와 주세요
SELECT number
FROM ability
WHERE weight = (SELECT MAX(weight) FROM ability);
  1. 속도가 모든 전기 포켓몬의 공격력보다 하나라도 작은 포켓몬의 번호를 가져와 주세요
SELECT NUMBER
FROM ability
WHERE speed < ANY(SELECT attack FROM ability WHERE type = 'electric'); 
  1. 공격력이 방어력보다 큰 포켓몬이 있다면 모든 포켓몬의 이름을 가져와 주세요
SELECT name
FROM mypokemon
WHERE EXISTS (SELECT * FROM ability WHERE attack > defense);

실습2

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);
  1. 이브이의 번호 133을 활용해서, 이브이의 영문 이름, 키, 몸무게를 가져와 주세요
    이 때, 키는 height, 몸무게는 weight이라는 별명으로 가져와 주세요
SELECT name, (SELECT height FROM ability WHERE number = 133) AS height,
			 (SELECT weight FROM ability WHERE number = 133) AS weight
FROM mypokemon
WEHRE number = 133;
  1. 속도가 2번째로 빠른 포켓몬의 번호와 속도를 가져와 주세요
SELECT number, speed
FROM (SELECT number, speed, RANK() OVER(ORDER BY speed DESC) AS speed_rank FROM ability) AS A
WHERE speed_rank = 2;
  1. 방어력이 모든 전기 포켓몬의 방어력보다 큰 포켓몬의 이름을 가져와 주세요
SELECT name
FROM mypokemon
WHERE number IN (SELECT number FROM ability WHERE defense > ALL(SELECT defense FROM ability WHERE type = 'electric'));
profile
가보자가보자~

0개의 댓글