SQL 문장 내부에 포함된, 또다른 SQL 문장을 내포하는 것이다.
주로
WHERE
,SELECT
,FROM
절에서 사용된다.
WHERE
절 에서의 사용
특정 조건에 만족하는 데이터를 조회하는데 사용된다.SELECT column_name FROM table_name WHERE column_name operator (SELECT column_name FROM table_name WHERE condition);
SELECT
절 에서의 사용
특정 데이터를 계산하거나 조회하는데 사용된다.SELECT column_name, ( SELECT column_name FROM table_name WHERE condition ) AS alias_name FROM table_name WHERE condition;
FROM
절 에서의 사용
임시 테이블을 생성하여JOIN
하는데 사용된다.SELECT column_name FROM (SELECT column_name FROM table_name WHERE condition) AS alias_name WHERE condition;
위와 같이 서브쿼리를 사용하면, 데이터를 더욱 정확하고 효율적으로 조회할 수 있다.
CTE(Common Table Expression) 라고도 하며,
하나 이상의 임시 테이블을 만들어서 여러 쿼리에서 재사용 가능한 쿼리를 생성할 때 사용된다.
WITH
의 기본 문법WITH cte_name (column_name1, column_name2, ...) AS ( subquery ) SELECT column_name1, column_name2, ... FROM table_name JOIN cte_name ON join_condition;
이후에 나오는
SELECT
문에서는 정의된WITH
를 참조할 수 있으며,
다른 테이블과JOIN
할 수도 있다.
하나의 쿼리에서 여러 개의 서브쿼리를 사용하지 않아도 되어 가독성을 높일 수 있고, 중복되는 코드를 줄일 수 있다.
문자열에서 지정된 위치에서 시작하여 지정된 길이의 하위 문자열을 반환합니다.
일반적으로 문자열의 일부분을 추출하고자 할 때 사용합니다.
SUBSTRING
의 기본 문법SUBSTRING(string, start_position, length)
string : 추출하고자 하는 문자열.
start_position : 하위 문자열이 시작되는 위치. 첫 번째 문자의 위치는 1.
length : 추출하고자 하는 문자열의 길이. 생략하면 문자열 끝까지 추출.예를 들어, 문자열 'https://velog.io/@ra0n' 에서 'velog' 만 추출하고자 한다면,
SELECT SUBSTRING('https://velog.io/@ra0n', 9, 5);
문자열에서 9번째 위치부터 시작하여 5개의 문자를 추출하므로 'velog' 라는 하위 문자열을 추출한다.
SUBSTRING_INDEX
의 기본 문법SUBSTRING_INDEX(string, delimiter, count)
주어진 문자열을 특정 delimiter(구분자) 를 기준으로 잘라내어 원하는 부분 문자열을 추출한다.
- string : 잘라내고자 하는 문자열.
- delimiter : 구분자.
- count : 반환할 문자열의 위치 지정.
ㅡ count > 0 : delimiter 기준으로 앞에서부터 count 번째 delimiter 까지의 문자열.
ㅡ count = 0 : 원래 문자열 전체.
ㅡ count < 0 : delimiter 기준으로 뒤에서부터 count 번째 delimiter 까지의 문자열.예를 들어, 문자열 '개발일지아닐지' 에서
첫번째 '지' 를 기준으로 앞에 있는 문자열'개발일' 을 추출하고자 한다면,SELECT SUBSTRING_INDEX('개발일지아닐지', '지', 1);
'1' 대신 '-2' 를 넣었을때는 '뒤에서부터 2번째 지' (즉, 문자열의 첫번째 지) 뒤의 '아닐지' 가 추출되게 된다.
조건에 따라 다른 결과를 반환하는 SQL 구문입니다. 일반적으로 SELECT 문에서 사용되며, 기본적으로 IF-THEN-ELSE 구문과 유사한 역할을 합니다.
CASE
의 기본 문법SELECT column_name, CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 WHEN condition3 THEN result3 ELSE default_result END AS alias_name FROM table_name;
- column_name : 조건에 따라 다른 결과를 반환할 열 이름.
WHEN
condition1, condition2, condition3 ... : column_name 에 적용될 조건.THEN
result1, result2, result3 ... : 조건이 참일 경우의 값.ELSE
default_result : 모든 조건이 거짓일 경우의 값.
CASE
문은 중첩해서 사용할 수 있으며, 다양한 함수와 함께 사용될 수도 있다.예를 들어, 연도별로 판매 총액을 계산하고자 할 때는 다음과 같은 구문을 사용할 수 있다.
SELECT YEAR(sales_date) AS sales_year, SUM(sales_amount) AS total_sales, CASE WHEN SUM(sales_amount) >= 1000000 THEN 'Large' WHEN SUM(sales_amount) >= 500000 THEN 'Medium' ELSE 'Small' END AS sales_level FROM sales_table GROUP BY YEAR(sales_date) ORDER BY YEAR(sales_date);
데이터를 보다 효과적으로 분류하고, 원하는 조건에 따라 결과를 출력할 수 있다.