USE [데이터베이스 이름];
# 컬럼 하나만 선택
SELECT [컬럼 이름] FROM [테이블 이름];
# 컬럼 여러개 선택
SELECT [컬럼 이름], [컬럼 이름], ... [컬럼 이름]
FROM [테이블 이름];
# 컬럼 전체 선택
SELECT * FROM [테이블 이름];
별명 붙이기
SELECT [컬럼 이름] AS [컬럼 별명]
FROM [테이블 이름];
데이터 일부만 보기
SELECT [컬럼 이름] FROM [테이블 이름]
LIMIT [가져올 로우 수];
중복 제거
SELECT DISTINCT [컬럼 이름] # 고유값만 확인
FROM [테이블 이름];
조건 활용
SELECT [컬럼 이름] FROM [테이블 이름]
# 조건식이 True인 로우만 선택
WHERE 조건식;
IN문법
# 목록 내 포함되는 데이터를 선택할 때 사용하는 연산자
SELECT [컬럼 이름] FROM [테이블 이름]
WHERE [컬럼 이름] IN (조건 1, 조건 2, ...);
문자형 데이터
LIKE 문법
# 특정 문자열이 포함된 데이터를 선택하는 연산자
SELECT [컬럼 이름] FROM [테이블 이름]
WHERE [컬럼 이름] LIKE [검색할 문자열];
와일드카드 → 검색 조건 표현
와일드카드
의미
사용 예제
해석
%
0개 이상의 문자
'%e'
e로 끝나는 문자열
'e%'
e로 시작하는 문자열
'%e%'
e가 포함된 문자열
_
1개의 문자
'_e'
e로 끝나고 e앞에 1개의 문자가 있는 문자열
'%_e'
e로 끝나고 e앞에 1개 이상의 문자가 있는 문자열
'%_e_%'
e를 포함하고 앞뒤로 각각 1개 이상의 문자가 있는 문자열
NULL 데이터
IS NULL 문법
# 데이터가 NULL인지 아닌지를 확인하는 연산자
SELECT [컬럼 이름] FROM [테이블 이름]
WHERE [컬럼 이름] IS NULL;
# null이 아닌 데이터만 찾을 경우
SELECT [컬럼 이름] FROM [테이블 이름]
WHERE [컬럼 이름] IS NOT NULL;
원하는 데이터 만들기
정렬
# 오름차순
SELECT [컬럼 이름] FROM [테이블 이름]
WHERE 조건식
ORDER BY [컬럼 이름] (ASC); # 디폴트
# 내림차순
SELECT [컬럼 이름] FROM [테이블 이름]
WHERE 조건식
ORDER BY [컬럼 이름] DESC;
# 여러 컬럼으로 정렬
## [컬럼 1] 기준으로 정렬 -> [컬럼 1] 값이 동일한 로우 간에 [컬럼 2] 기준으로 정렬
SELECT [컬럼 이름] FROM [테이블 이름]
WHERE 조건식
ORDER BY [컬럼1 이름], [컬럼2 이름] DESC;
순위 매기기
RANK
# B컬럼 기준으로 오름차순 순위 컬럼 생성
## 내림차순은 DESC 추가
SELECT [A 컬럼 이름], ..., RANK() OVER (ORDER BY [B 컬럼 이름])
FROM [테이블 이름]
WHERE 조건식;
DENSE_RANK
SELECT [컬럼 이름], ..., DENSE_RANK() OVER (ORDER BY [컬럼 이름])
FROM [테이블 이름]
WHERE 조건식;
ROW_NUMBER
SELECT [컬럼 이름], ..., ROW_NUMBER() OVER (ORDER BY [컬럼 이름])
FROM [테이블 이름]
WHERE 조건식;
세 함수 비교
# 예시 코드
SELECT name, attack,
RANK() OVER (ORDER BY attack DESC) AS rank_rank,
DENSE_RANK() OVER (ORDER BY attack DESC) AS rank_dense_rank,
ROW_NUMBER() OVER (ORDER BY attack DESC) AS rank_row_number
FROM mypokemon;
# GROUP BY가 쓰인 쿼리의 SELECT 절에는 GROUP BY 대상 컬럼과 그룹 함수만 사용 가능
SELECT [그룹화 대상 컬럼 이름], ... , [그룹 함수]
FROM [테이블 이름]
WHERE 조건식
GROUP BY [컬럼 이름];
HAVING문법
# 가져올 데이터 그룹에 조건을 지정 -> GROUP BY에서의 WHERE절
SELECT [컬럼 이름], ..., [그룹 함수]
FROM [테이블 이름]
WHERE 조건식
GROUP BY [컬럼 이름]
HAVING 조건식;
그룹 함수
COUNT
# 그룹의 값 수를 세는 함수
# 그룹함수들은 모두 GROUP BY가 없는 쿼리에서도 사용 가능하며, 이때는 전체 로우에 함수가 적용
SELECT [컬럼 이름], ..., COUNT([컬럼 이름])
FROM [테이블 이름]
GROUP BY [컬럼 이름]
HAVING 조건문;
SUM
# 그룹의 합을 계산하는 함수
SELECT [컬럼 이름], ..., SUM([컬럼 이름])
FROM [테이블 이름]
GROUP BY [컬럼 이름]
HAVING 조건문;
AVG
# 그룹의 평균을 계산하는 함수
SELECT [컬럼 이름], ..., AVG([컬럼 이름])
FROM [테이블 이름]
GROUP BY [컬럼 이름]
HAVING 조건문;
MIN
# 그룹의 최솟값을 반환하는 함수
SELECT [컬럼 이름], ..., MIN([컬럼 이름])
FROM [테이블 이름]
GROUP BY [컬럼 이름]
HAVING 조건문;
MAX
# 그룹의 최댓값을 반환하는 함수
SELECT [컬럼 이름], ..., MAX([컬럼 이름])
FROM [테이블 이름]
GROUP BY [컬럼 이름]
HAVING 조건문;
쿼리 순서
작성 순서
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
실행 순서
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
조건 & 함수 생성
조건문
주로 SELECT절에 사용하는 함수로, 결과 값을 새로운 컬럼으로 반환
IF 문법 - 조건 하나를 만들 때 사용
# 예시 코드
## attack_class컬럼의 값을 공격력이 60이상이면 strong, 아니면 weak로 반환
SELECT name, IF(attack >= 60, ‘strong’, ‘weak’) AS attack_class
FROM pokemon.mypokemon;
IFNULL
# 데이터가 NULL이라면 새로운 값을 반환하는 함수
# 예시 코드
## full_name컬럼의 값을 이름이 NULL이면 unknown으로 반환
SELECT name, IFNULL(name, ‘unknown’) AS full_name
FROM pokemon.mypokemon;
CASE - 조건 여러개 만들 때 사용
# 주로 SELECT절에 사용하는 함수로, 결과 값을 새로운 컬럼으로 반환
# ELSE 문장을 생략 시 NULL 값을 반환
# 형식 1
CASE
WHEN 조건식1 THEN 결과값1
WHEN 조건식2 THEN 결과값2
ELSE 결과값3
END
# 예시 코드
SELECT name,
CASE
WHEN attack >= 100 THEN ‘very strong’
WHEN attack >= 60 THEN ‘strong’
ELSE ‘weak’
END AS attack_class
FROM pokemon.mypokemon;
# 형식 2
CASE [컬럼 이름]
WHEN 조건값1 THEN 결과값1
WHEN 조건값2 THEN 결과값2
ELSE 결과값3
END
# 예시 코드
SELECT name, type
CASE type
WHEN ‘bug’ THEN ‘grass’
WHEN ‘electric’ THEN ‘water’
WHEN ‘grass’ THEN ‘bug’
END AS rival_type
FROM pokemon.mypokemon;
함수
함수 만들기
CREATE FUNCTION [함수 이름] ( [입력값 이름] [데이터 타입], ...)
RETURNS [결과값 데이터 타입]
BEGIN
DECLARE [임시값 이름] [데이터 타입];
SET [임시값 이름] = [입력값 이름];
쿼리;
RETURN 결과값
END
함수 지우기
DROP FUNCTION [함수 이름];
예시 코드 CREATE FUNCTIONgetAbility(attackINT, defenseINT) RETURNSINT BEGIN DECLAREaINT; DECLAREbINT; DECLAREabilityINT; SETa = attack; SETb = defense; SELECT a + b INTOability; RETURNability; END
MySQL Workbench에서 함수 생성 시 주의할 점
SET GLOBAL log_bin_trust_function_creators = 1; # 사용자 계정에 function create 권한 생성
DELIMITER // # 함수의 시작 지정
CREATE FUNCTION [함수 이름] ( [입력값 이름] [데이터 타입], ...)
RETURNS [결과값 데이터 타입]
BEGIN
DECLARE [임시값 이름] [데이터 타입];
SET [임시값 이름] = [입력값 이름];
쿼리;
RETURN 결과값
END
//
DELIMITER ; # 함수의 끝 지정
# ; 전에 반드시 1칸 띄어주기
테이블 합치기
JOIN의 종류
INNER JOIN 문법
# 두 테이블 모두에 있는 값만 합치기
# 디폴트 (그냥 JOIN으로 해도 INNER JOIN으로 수행)
SELECT [컬럼 이름]
FROM [테이블 A 이름]
INNER JOIN [테이블 B 이름]
ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름]
WHERE 조건식;
LEFT JOIN 문법
# 왼쪽 테이블에 있는 값만 합치기
SELECT [컬럼 이름]
FROM [테이블 A 이름]
LEFT JOIN [테이블 B 이름]
ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름]
WHERE 조건식;
RIGHT JOIN 문법
# 오른쪽 테이블에 있는 값만 합치기
SELECT [컬럼 이름]
FROM [테이블 A 이름]
RIGHT JOIN [테이블 B 이름]
ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름]
WHERE 조건식;
OUTER JOIN 문법
# 두 테이블에 있는 모든 값 합치기
# OUTER JOIN은 MySQL 키워드에 없음
SELECT [컬럼 이름]
FROM [테이블 A 이름]
LEFT JOIN [테이블 B 이름]
ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름]
UNION
SELECT [컬럼 이름]
FROM [테이블 A 이름]
RIGHT JOIN [테이블 B 이름]
ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름] ;
CROSS JOIN 문법
# 두 테이블에 있는 모든 값을 각각 합치기
# ON 키워드가 없어도 됨
SELECT [컬럼 이름]
FROM [테이블 A 이름]
CROSS JOIN [테이블 B 이름]
WHERE 조건식;
SELF JOIN 문법
# 같은 테이블에 있는 값 합치기
SELECT [컬럼 이름]
FROM [테이블 A 이름] AS t1
INNER JOIN [테이블 A 이름 ] AS t2
ON t1.[컬럼 A 이름] = t2.[컬럼 A 이름]
WHERE 조건식;