본문 바로가기

SQL

[패스트캠퍼스] SQL 강의 : 조건에 조건 더하기, 서브쿼리 사용하기

 

*서브쿼리 특징

  • 쿼리(SELECT/ FROM/ WHERE/ GROUP BY/ HAVING/ ODER BY) 안에 서브쿼리를 사용하여 조건에 조건을 더하는 것이 가능하다
  • 쿼리문의 핵심키워드 6가지 중 GROUB BY 제외 서브쿼리 사용 가능
  • 서브쿼리는 하나의 쿼리 내에 포함된 또 하나의 쿼리를 의미
  • 서브 쿼리는 반드시 괄호 안에 있어야 한다
  • INSERT, UPDATE, DELETE 문에서도 사용 가능
  • 서브쿼리에는 ;(세미콜론) 붙이지 않아도 됨

 

SELECT 절의 서브쿼리

 

  • 스칼라 서브쿼리라고도 한다
  • SELECT절의 서브 쿼리의 결과 값은 반드시 하나여야 한다

 

*SELECT 절의 서브 쿼리

SLECT [컬럼이름],

(SELECT [컬럼이름], FROM [테이블이름], WHERE 조건식)

FROM [테이블이름]

WHERE 조건식;

 

예제테이블

*SELECT절의 서브 쿼리 예제

-피카츄의 번호, 영문 이름, 키를 가져와 주세요

 

SELECT number, name,

(SELECT height FROM ability WHERE number = 25) AS height

FROM mypokemon

WHERE name = 'pikachu';

 

 

 

 


FROM 절의 서브쿼리

 

  • 인라인 뷰 서브 쿼리라고도 한다
  • FROM절의 서브 쿼리는 반드시 결과 값이 하나여야 한다
  • 서브쿼리로 만든 테이블은 반드시 별명을 붙여야 한다

 

*FROM 절의 서브 쿼리

SLECT [컬럼이름]

FROM ( SELECT [컬럼이름] FROM [테이블이름] WHERE 조건식) AS [테이블 별명]

WHERE 조건식;

 

*FROM 절의 서브 쿼리 예제

-키 순위가 3위인 포켓몬의 번호와 키 순위를 가져와 주세요

*FROM 절의 서브 쿼리는 반드시 결과값이 하나의 테이블이여야 하고 별명을 가져야 함

 

SELECT number, height_rank

FROM (SELECT number, RANK() OVER(ODER BY height DESC) AS height_rank FROM ability) AS A

WHERE height_rank = 3;

 

서브쿼리결과


WHERE 절의 서브 쿼리

 

  • 중첩서브쿼리라고도 한다
  • WHERE절의 서브쿼리의 결과값은 반드시 하나의 컬럼이어야 한다(EXIST 제외)/ 하나의 컬럼에는 여러개 값이 존재 가능
  • 연산자와 함께 사용 → 보통 WHERE [컬럼이름] [연산자] [서브쿼리] 형식 사용

 

*WHERE 절의 서브 쿼리

SELECT [컬럼이름] FROM [테이블이름]

WHERE [컬럼이름] [연산자] ( SELECT [컬럼이름] FROM [테이블이름] WHERE 조건식 );

 

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

1. 비교연산자

비교 연산자만 사용 시, WHERE절의 서브 쿼리 결과값은 반드시 하나여야 한다

2. 주요 연산자

주요 연산자 사용 시, WHERE절의 서브 쿼리 결과값은 하나의 컬럼이어야 한다

EXISTS 값이 있는지 없는지 확인하는 연산자로 TRUE나 FALSE를 반환 

EXISTS 단독으로 사용하며, 결과값이 여러 컬럼이여도 된다

 

*WHERE 절의 서브 쿼리 예제1 

-키가 평균 키보다 작은 포켓몬의 번호를 가져와 주세요

SELECT number FROM ablility

WHERE height<(SELECT AVG(height) FROM ability);

*WHERE 절의 서브 쿼리 예제 ALL

-공격력이 모든 전기 포켓몬의 공격력보다 작은 포켓몬의 번호를 가져와 주세요

SELECT number FROM ablilty

WHERE attack < ALL (SELECT attack FROM ability WHERE type='electric');

*WHERE 절의 서브 쿼리 예제 ANY

-방어력이 모든 전기 포켓몬의 공격력보다 하나라도 큰 포켓몬의 번호를 가져와 주세요

SELECT number FROM ability

WHERE defense > ANY (SELECT attack  FROM ability WHERE type = 'electric');

*WHERE 절의 서브 쿼리 예제 EXIST

-bug 타입 포켓몬이 있다면 모든 포켓몬의 번호를 가져와 주세요

SELECT number FROM ability

WHERE EXISTS(SELECT* FROM ability WHERE type='bug');

 


예제테이블

 

<예제쿼리>

 

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);

/*MISSION (1)
내 포켓몬 중에 몸무게가 가장 많이 나가는 포켓몬의 번호를 가져와 주세요.
MISSION (2)
속도가 모든 전기 포켓몬의 공격력보다 하나라도 작은 포켓몬의 번호를 가져와 주세요.
MISSION (3)
공격력이 방어력보다 큰 포켓몬이 있다면 모든 포켓몬의 이름을 가져와 주세요.*/


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);