SQL문법
코드를 마치면 반드시 세미콜론(;)을 써야한다
줄바꿈과 개행이 자유롭기 때문에 가독성을 위해 줄바꿈과 개행을 사용한다
가독성을 위해 예약어는 대문자를 사용한다
MySQL을 기준으로 작성했습니다
SELECT문
테이블에 입력된 데이터를 조회하기 위해 사용
원하는 컬럼과 행을 조회할 수 있음
SELECT문 작성 순서
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
SELECT문 해석 순서
1. FROM(데이터베이스와 테이블 결정)
2. WHERE(조건을 만족하는 row들만 추출)
3. GROUP BY(row들을 그루핑. 그루핑 후 하나의 row는 하나의 그룹이 됨)
4. HAVING(조건을 만족하는 그룹들만 추출)
5. SELECT(조회)
6. ORDER BY(정렬)
7. LIMIT(일부 row만 추출)
MySQL에서
HAVING, ORDER BY 제외 SELECT절의 AS를 이용한 별칭은 사용할 수 없다
SELECT와 FROM절
SELECT [컬럼1], [컬럼2], ... , [컬럼n]
FROM [데이터베이스 이름].[테이블 이름];
SELECT * 를 사용하면 모든 컬럼을 조회한다
FROM에서 데이터베이스는 꼭 쓰지않아도 되지만, 테이블 이름의 중복 방지를 위해 쓴다
데이터베이스 이름을 쓰고 싶지 않다면
미리 이 데이터베이스를 사용한다고 지정하면 된다
USE [데이터베이스 이름];
SELECT [컬럼1], [컬럼2], ... , [컬럼n]
FROM [테이블 이름];
DISTINCT
중복된 데이터 한 번만 조회
SELECT DISTINCT [컬럼] FROM [테이블 이름];
AS
Alias(별칭)을 만들어 사용한다
SELECT [컬럼] AS [별칭]
FROM [테이블 이름];
별칭에 공백이 있다면 백틱(`)으로 묶어준다
별칭이 조회 시 컬럼명에 나타난다
+컬럼뿐만 아니라 테이블 이름에도 별칭 사용이 가능하다
CONCAT()
SELECT CONCAT(컬럼1, '-', 컬럼2) AS 별칭
FROM [테이블 이름];
CONCAT의 괄호 안을 묶어서 하나의 컬럼으로 만들어준다
WHERE절
조건을 작성한다
AND OR
조건1 AND 조건2 : 조건1, 조건2 모두 만족해야 SELECT됨
조건1 OR 조건2 : 조건1, 조건2 중 하나만 만족해도 SELECT됨
AND가 OR보다 연산자 우선순위가 높다
조건이 많다면 괄호()로 묶어줘 가독성을 높인다
비교 연산자
=, <, >, <=, >=
#2020-01-01 이후면 SELECT
WHERE 컬럼 >= '2020-01-01';
#30보다 작으면 SELECT
WHERE 컬럼 < 30;
BETWEEN a AND b
#20~29 사이면 SELECT
WHERE 컬럼 BETWEEN 20 AND 29;
#20~29 제외 SELECT
WHERE 컬럼 NOT BETWEEN 20 AND 29;
LIKE
_와 %
#010으로 시작하고, 뒤가 8자리인 문자열
WHERE 컬럼 LIKE '010________';
#070으로 시작하는 문자열
WHERE 컬럼 LIKE '070%';
#강남구가 포함된 문자열
WHERE 컬럼 LIKE '%강남구%';
_ : 문자열 한 개를 뜻함
% : 임의의 길이의 문자열(길이가 0이어도 됨)
문자열 안에 %가 있다면 이스케이프(\)를 사용한다
BINARY
문자열 대소문자 구분
#G로 시작하는 문자열(g로 시작하는 문자열은 포함 안함)
WHERE 컬럼 LIKE BINARY 'G%'
#g로 시작하는 문자열(G로 시작하는 문자열은 포함 안함)
WHERE 컬럼 LIKE BINARY 'g%'
IN (list)
list값 중 하나라도 일치하면 조건 만족
#값1 아니면 값2인 것만 SELECT
WHERE 컬럼 IN (값1, 값2);
#값1, 값2가 아닌 것만 SELECT
WHERE 컬럼 NOT IN (값1, 값2);
칼럼을 여러 개 사용하여 대응되도록 하는 IN 조건 지정 가능
#칼럼1과 칼럼2에 대응되도록 입력 가능
WHERE (컬럼1, 컬럼2) IN ((컬럼1의 값, 컬럼2의 값), (컬럼1의 값, 컬럼2의 값));
부정 비교 연산자
같지 않음
<>
!=
NOT 컬럼명 =
#조건: 30이 아닌 것만
WHERE 컬럼 <> 30;
WHERE 컬럼 != 30;
WHERE NOT 컬럼 = 30;
NULL 값
IS NULL: NULL인 것만 조회
IS NOT NULL: NULL이 아닌 것만 조회
SELECT * FROM [테이블 이름]
WHERE [컬럼] IS NULL;
SELECT * FROM [테이블 이름]
WHERE [컬럼] IS NOT NULL;
NULL을 대체하기
COALESCE(컬럼, 대체할 것)
SELECT
COALESCE(컬럼1, 대체할 값),
COALESCE(컬럼2, 대체할 값)
FROM [테이블 이름];
컬럼1 값이 NULL이 아니라면 그 값을 리턴, NULL이라면 대체할 값을 리턴
컬럼2 값이 NULL이 아니라면 그 값을 리턴, NULL이라면 대체할 값을 리턴
SELECT
COALESCE(컬럼1, 컬럼2, ... , 컬럼n)
FROM [테이블 이름];
컬럼 1 값이 NULL이라면 컬럼 2 값 보기
컬럼 2 값도 NULL이라면 컬럼 3 값 보기
...
컬럼 n까지
산술 함수 사용
ABS() : 해당 컬럼의 각 row의 값을 절대값으로 바꾼다
SQRT() : 해당 컬럼의 각 row의 값을 제곱근으로 바꾼다
CEIL() : 해당 컬럼의 각 row의 값을 올림한다
FLOOR() : 해당 컬럼의 각 row의 값을 내림한다
ROUND() : 해당 컬럼의 각 row의 값을 반올림한다
컬럼끼리의 산술
+, -, * , /, %
집계 함수 사용
COUNT() : 해당 컬럼의 NULL 제외 row의 수를 구한다
MIN(), MAX() : 해당 컬럼의 최소값과 최대값을 구한다
AVG() : 해당 컬럼의 row들의 평균을 구한다
SUM() : 해당 컬럼의 row들의 합을 구한다
STD() : 해당 컬럼의 표준편차를 구한다
집계 함수를 이용한 SELECT문
#가능
SELECT AVG(컬럼)
FROM [테이블];
#가능
SELECT AVG(컬럼), MIN(컬럼), MAX(컬럼)
FROM [테이블];
#에러
SELECT 컬럼, AVG(컬럼)
FROM [테이블];
SELECT문에서 집계함수만 넣는 것은 가능하지만
다른 컬럼과 함께는 사용이 불가능
+WHERE절에 집계 함수는 사용 불가능(서브 쿼리를 이용해야 함)
전체 row의 수 구하기(NULL값을 포함한 모든 행 수 계산)
COUNT(*)
SELECT COUNT(*) FROM [테이블 이름];
COUNT(컬럼명) : NULL값 제외한 행 수 계산
특정 컬럼의 NULL 수 구하기
SELECT COUNT(*) - COUNT(컬럼) FROM [테이블 이름];
SELECT COUNT(컬럼) FROM [테이블 이름]
WHERE 컬럼 IS NULL;
GROUP BY
그룹 나누기
컬럼의 값을 기준으로 그룹으로 묶는다
HAVING
그룹에 조건을 추가한다
SELECT 컬럼1, 컬럼2 FROM [테이블 이름]
GROUP BY 컬럼1, 컬럼2
HAVING [그룹에 대한 조건];
그룹을 여러 컬럼을 이용하여 나눌 수 있다
GROUP BY를 사용한 SELECT 절에는 GROUP BY에 사용한 컬럼과 집계 함수만 사용할 수 있다
집계 함수를 사용할 때는 GROUP BY에서 사용한 컬럼이 아니어도 사용할 수 있다.
집계 함수와 GROUP BY
컬럼 값을 기준으로 나뉜 그룹마다 집계 함수가 적용된다
부분 총계
WITH ROLLUP
SELECT
FROM [테이블 이름]
GROUP BY 컬럼1, 컬럼2 WITH ROLLUP
HAVING [그룹에 대한 조건];
SELECT와 GROUP BY 절에서 상위 컬럼(먼저 써준 컬럼)의 부분총계를 구한다
ORDER BY
SELECT
FROM
WHERE
ORDER BY 기준컬럼1 ASC/DESC, 기준컬럼2 ASC/DESC, ...;
기준을 여러 개로 두고 할 수 있다
ASC: 오름차순
DESC: 내림차순
숫자형 TEXT 데이터 타입과 INT/DOUBLE 데이터 타입의 정렬 기준이 다르니 조심!
TEXT 데이터 타입: 문자열 하나씩 비교('123', '19'면 오름차순 시 '123' -> '19')
INT/ DOUBLE 데이터 타입: 숫자의 크기 비교(123, 19면 오름차순 시 19 -> 123)
정렬을 위해 형변환이 필요할 때
CAST(컬럼 AS 바꾸고 싶은 데이터 타입)
TEXT 데이터 타입을 INT로 바꿔고 싶다면
CAST(컬럼1 AS SIGNED)
TEXT 데이터 타입을 DOUBLE로 바꿔고 싶다면
CAST(컬럼1 AS DECIMAL)
+TEXT 데이터 타입으로 바꾸고 싶다면
CAST(컬럼1 AS CHAR)
LIMIT
추출될 데이터 개수 지정
#처음 row부터 개수 만큼의 데이터를 본다
LIMIT 개수;
#해당 인덱스 번호부터 개수 만큼의 데이터를 본다
LIMIT 인덱스, 개수
row의 인덱스는 0부터 시작한다
IF문 구현
단일 조건
IF()
SELECT
IF([조건], [True일 시 반환할 값], [False일 시 반환할 값])
FROM [테이블 이름];
https://hellogk.tistory.com/22
다중 조건
CASE END
컬럼의 값을 기준으로 조건을 판단하고, 새 컬럼 생성
WHEN 조건, THEN 조건이 참일 때 반환할 값, ELSE 거짓일 때 반환할 값
SELECT
(CASE
WHEN 조건1 THEN 참일 때 반환할 값
WHEN 조건2 THEN 참일 때 반환할 값
...
ELSE 반환할 값
END) AS 별칭
FROM [테이블 이름];
< 문자열 다루기 >
문자열 일부를 추출하는 함수
SUBSTRING(컬럼, 시작 문자 번호, 추출할 개수)
#phone_num 컬럼의 8번째 글자부터(1번부터 시작) 4자리
SUBSTRING(phone_num, 8, 4)
문자열 길이 리턴 함수
LENGTH()
SELECT LENGTH(컬럼)
FROM [테이블 이름];
문자열 왼쪽, 오른쪽에 특정 문자열을 추가하는 함수
LPAD(), RPAD()
SELECT RPAD(컬럼, 자리 수, '채울 문자열')
FROM [테이블 이름];
#30이었다면 00030이 됨
SELECT LPAD(age, 5, '0')
FROM [테이블 이름];
문자열 모두 대문자, 소문자로 바꿔주는 함수
UPPER(), LOWER()
SELECT UPPER(컬럼), LOWER(컬럼)
FROM [테이블 이름];
문자열의 양쪽, 왼쪽, 오른쪽의 공백을 없애주는 함수
TRIM(), LTRIM(), RTRIM()
SELECT TRIM(컬럼), LTRIM(컬럼), RTRIM(컬럼)
FROM [테이블 이름];
< 날짜 다루기(DATE 타입) >
년, 월, 일만 추출
#년만 추출
YEAR(컬럼)
#월만 추출
MONTH(컬럼)
#일만 추출
DAYOFMONTH(컬럼)
날짜의 차이 구하기
#날짜1 - 날짜2
DATEDIFF('날짜1', '날짜2')
며칠인지 수로 반환
오늘 날짜 date타입으로 반환: CURDATE()
날짜 더하기, 날짜 빼기
DATE_ADD(date 컬럼, INTERVAL 일 DAY)
DATE_SUB(date 컬럼, INTERVAL 일 DAY)
DATE타입으로 반환
DATETIME 타입
날짜 + 시간까지
#date -> unix timestamp
UNIX_TIMESTAMP(date 컬럼)
#unix timestamp -> datetime
FROM_UNIXTIME(unix timestamp 컬럼)