1. SELECT
테이블에서 원하는 데이터를 조회할 때 사용
SELECT col1, col2, .... From table_name
모든 컬럼을 조회하고 싶다면 '*'을 사용하면 된다.
SELECT * From table_name
2. DISTINCT
중복을 배제하고 고유값만을 출력하고자 할 때 사용
SELECT DISTINCT col1, col2, ... From table_name
3. WHERE
조회하는 데이터에 조건을 걸고 싶을 때 사용
SELECT col1, col2, .... From table_name WHERE condition;
4. 비교연산자
조건에서 두 값을 비교할 때 사용
1) 같을 때
"="
SELECT * FROM table_name
WHERE column_name = value;
2) 같지 않을 때
"!=", "<>"
SELECT * FROM table_name
WHERE column_name != value;
SELECT * FROM table_name
WHERE column_name <> value;
3) 클 때
">"
SELECT * FROM table_name
WHERE column_name > value;
4) 크거나 같을 때
">="
SELECT * FROM table_name
WHERE column_name >= value;
5. 논리연산자
조건을 결합하거나 부정할 때 사용
1) AND
두 조건이 모두 참일 때만 참을 반환
SELECT col1, col2, .... From table_name WHERE condition1 AND condition2;
2) OR
두 조건중 하나만 참이어도 참을 반환
SELECT col1, col2, .... From table_name WHERE condition1 OR condition2;
3) NOT
조건이 거짓일 때 참을 반환
SELECT col1, col2, .... From table_name WHERE NOT condition;
4) 연산 우선순위
NOT >> AND >> OR
6. 비트 연산자
비트 수준에서 데이터를 조작하는 데 사용
1) AND(&)
두 비트가 모두 1이면 1을 반환
SELECT 6 & 3;
-- 결과: 2
-- 설명: 6 (110) AND 3 (011) = 2 (010)
2) OR(|)
두 비트 중 하나라도 1이면 1을 반환
SELECT 6 | 3;
-- 결과: 7
-- 설명: 6 (110) OR 3 (011) = 7 (111)
3) XOR(^)
두 비트가 서로 다르면 1을 반환
SELECT 6 ^ 3;
-- 결과: 5
-- 설명: 6 (110) XOR 3 (011) = 5 (101)
4) NOT(~)
비트의 값을 반전
SELECT ~6;
-- 결과: -7
-- 설명: 6 (0000 0110)의 비트를 반전하면 -7 (1111 1001)
5) SHIFT LEFT (<<)
비트를 왼쪽으로 이동
SELECT 1 << 2;
-- 결과: 4
-- 설명: 1 (001) << 2 = 4 (100)
6) SHIFT RIGHT (>>)
비트를 오른쪽으로 이동
SELECT 4 >> 1;
-- 결과: 2
-- 설명: 4 (100) >> 1 = 2 (010)
7. ORDER BY
결과를 오름차순이나 내림차순으로 정렬할 때 사용
SELECT col1, col2, ... FROM table_name
ORDER BY col1 ASC|DESC, col2 ASC|DESC;
여러 개의 컬럼을 지정할 수 있음.
ASC: 오름차순
DESC: 내림차순
기본값은 ASC이다.
SELECT col1, col2, ... FROM table_name
ORDER BY DATETIME ASC|DESC
날짜 값도 정렬이 가능하다.
오름차순(ASC): 오래된 순
내림차순(DESC): 최신 순
8. ORDER BY FIELD
결과를 내가 지정한 우선순위로 정렬할 때 사용
SELECT col1, col2, ...
FROM table_name
ORDER BY FIELD (col_name, order1, order2, ...);
예시: students 테이블에서 name을 특정 순서로 정렬하고 싶을 때
SELECT name, age
FROM students
ORDER BY FIELD(name, 'Alice', 'Bob', 'Charlie');
- name을 'Alice', 'Bob', 'Charlie' 순으로 정렬
💡 내가 지정하지 않는 값부터 표시하고 내가 지정한 순서대로 정렬해줌
9. LIMIT
검색 결과 중 지정한 숫자 개수만 리턴하고 싶을 때 사용
1) n개의 데이터 가져오기
SELECT col1, col2, ..
FROM table_name
LIMIT n;
2) k번째 데이터 부터 n개의 데이터 가져오기
SELECT col1, col2, ...
FROM table_name
LIMIT k, n;
❗️k는 0부터 시작함(배열의 인덱스와 같음)
3) ORDER BY와 함께 사용할 때의 주의점
ORDER BY와 LIMIT를 사용하는 순서에 따라 쿼리의 결과가 달리질 수 있다.
1. ORDER BY 후 LIMIT
SELECT * FROM table_name
ORDER BY col_name ASC
LIMIT n;
- col1을 기준으로 오름차순 정렬 후 데이터를 n개 가져옴
2. LIMIT 후 ORDER BY
SELECT * FROM
(SELECT * From table_name LIMIT n)
ORDER BY col_name ASC;
- 데이터를 n개 가져온 후 col1을 기준으로 오름차순 정렬
10. NULL
특정 값이 존재하지 않을 때 사용
NULL 값은 IS NULL이나 IS NOT NULL 연산자로 검색한다.
count 함수에도 포함되지 않음
SELECT col1, col2, ...
From table_name
WHERE col_name IS NULL|IS NOT NULL
IFNULL 함수
IFNULL 함수는 해당값이 NULL일 때 기본 값을 지정할 수 있는 함수이다.
SELECT IFNULL(col_name, 'DEFAULT_VALUE');
Null 사용시 주의점
Null과의 논리연산은 Null이 나온다. 이 경우 무조건 false를 반환하므로 주의해야한다.
11. LIKE
WHERE 절과 함께 특정 패턴을 검색할 때 사용
SELECT col1, col2, ...
FROM table_name
WHERE col_name LIKE pattern;
LIKE의 %, _ 사용법
- %: 0개 문자 혹은 여러 개의 문자를 의미
- _: 하나의 문자를 의미
예시
- LIKE 'a%': a로 시작하는 모든 것
- LIKE 'a_%': a로 시작하고 최소 3이상의 길이를 가진 것
- LIKE '_r%': 두 번째 자리에 r이 들어가는 모든 것
12. IN
WHERE 절 내 여러 값을 설정하고자 할 때 사용
해당 컬럼이 괄호 안에 값에 해당되면 참.
SELECT col1, col2, ...
FROM table_name
WHERE col_name IN (val1, val2, ...);
OR문과 같은 효과를 가진다.
SELECT col1, col2, ...
FROM table_name
WHERE col_name = 'val1' OR col_name = 'val2';
괄호 안에 SELECT문이 들어갈 수도 있다.
SELECT col1, col2, ...
FROM table_name
WHERE col1 IN (SELECT col ...);
- 이 경우 SELECT문의 컬럼은 비교하고자하는 컬럼과 같아야 한다.
여러 개의 컬럼을 설정할 수 있다.
SELECT col1, col2, ...
FROM table_name
WHERE col1, col2 IN (SELECT co1, co2 ...)
13. BETWEEN AND
WHERE 절 내 검색 조건으로 범위를 지정하고자 할 때 사용
SELECT col1, col2, ...
FROM table_name
WHERE col_name BETWEEN val1 AND val2;
- ❗️val1 이상 val2 이하이므로 val1, val2 값이 포함됨
14. UNION
SELECT의 컬럼 리스트를 기준으로 두 개 이상의 쿼리 결과를 하나의 테이블로 합치려고 할 때 사용
SELECT col_name(s) FROM table1
UNION
SELECT col_name(s) FROM table2;
UNION: 중복 제거
UNION ALL: 중복 제거 X
❗️UNION할때는 반드시 두 SELECT문의 컬럼들이 일치해야 한다.
15. JOIN
두 개나 그 이상의 테이블의 행을 서로 결합하고자 할때 사용
1) INNER JOIN
두 테이블에 동시에 존재하는 값을 반환하고 싶을 때 사용
SELECT col_name(s)
FROM table1 INNER JOIN table2
ON table1.col_name = table2.col_name;
2) LEFT JOIN
테이블1의 모든 레코드를 반환하고 그 중 테이블2에 해당하는 레코드들도 함께 반환하고 싶을 때 사용
SELECT col_name(s)
FROM table1 LEFT JOIN table2
ON table1.col_name = table2.col_name;
3) RIGHT JOIN
테이블2의 모든 레코드를 반환하고 그 중 테이블1에 해당하는 레코드들도 함께 반환하고 싶을 때 사용
SELECT col_name(s)
FROM table1 RIGHT JOIN table2
ON table1.col_name = table2.col_name;
4) FULL OUTER JOIN
전체의 합집합을 표현하고 싶을 때
SELECT col_name(s)
FROM table1 FULL OUTER JOIN table2
On table1.col_name = table2.col_name;
❗️MySQL에선 FULL OUTER JOIN을 지원하지 않는다.
MYSQL에서 FULL OUTER JOIN 사용법
LEFT JOIN, RIGHT JOIN, UNION을 사용해 FULL OUTER JOIN을 사용할 수 있다.
참고로 UNION은 두 SELECT문을 합치는 문법이다.
SELECT col_name(s)
FROM table1 LEFT JOIN table2
UNION
SELECT col_name(s)
FROM table1 RIGHT JOIN table2;
16. 집계 함수
주어진 컬럼을 가지고 집계 연산을 수행
❗️내장함수는 NULL 값을 무시한다.
1) MIN
주어진 컬럼의 최솟값을 반환
SELECT MIN(col_name)
FROM table_name;
2) MAX
주어진 컬럼의 최댓값을 반환
SELECT MAX(col_name)
FROM table_name;
3) COUNT
주어진 컬럼의 갯수를 반환
SELECT COUNT(col_name)
FROM table_name;
4) AVG
주어진 컬럼의 평균을 반환
SELECT AVG(col_name)
FROM table_name;
5) SUM
주어진 컬럼의 합을 반환
SELECT SUM(col_name)
FROM table_name;
17. 수학 함수
주어진 컬럼을 가지고 수학적 연산을 수행
1) ABS
주어진 컬럼의 절댓값을 반환
SELECT ABS(col_name)
FROM table_name;
2) CEIL
주어진 컬럼의 오름값을 반환
SELECT CEIL(col_name)
FROM table_name;
3) FLOOR
주어진 컬럼의 내림값을 반환
SELECT FLOOR(col_name)
FROM table_name;
4) ROUND
주어진 컬럼의 반올림값을 반환
SELECT ROUND(col_name)
FROM table_name;
특정 소수점 자리까지 반올림 할 수 있다.
SELECT ROUND(col_name, 2) // 소수점 둘째자리까지 반올림
FROM table_name;
SELECT ROUND(col_name, -1) // 십의 자리까지 반올림
FROM table_name;
5) TRUNCATE
주어진 컬럼의 버림값을 반환
SELECT TRUNCATE(col_name)
FROM table_name;
FLOOR과 다른 점은 특정 소수점 자리까지 반올림 할 수 있다는 점이다.
SELECT TRUNCATE(col_name, 2) // 소수점 둘째자리까지 버림
FROM table_name;
SELECT TRUNCATE(col_name, -1) // 십의 자리까지 버림
FROM table_name;
18. GROUP BY
주로 집계함수(MIN, MAX, COUNT, AVG, SUM)와 함께 사용되며, 결과를 지정한 컬럼을 기준으로 묶고자 할 때 사용한다.
SELECT col_name(s), FUN()
FROM table_name
WHERE condition
GROUP BY col_name(s);
19. HAVING
GROUP BY와 함께 사용되며 GROUP BY로 묶인 그룹에 조건을 걸고자 할 때 사용
WHERE이 각 행에 조건을 건다면 HAVING은 그룹의 조건을 거는 것이다.
주로 집계함수에 조건을 걸고자 할 때 사용됨
SELECT col_name(s)
FROM table_name
WHERE condition
GROUP BY col_name(s)
HAVING condition;
20. CONCAT
여러 문자열을 하나로 합치고자 할 때 사용
SELECT CONCAT(str1, str2, ... );
직접 문자열을 입력해줄 수도 있고 특정 컬럼을 입력할 수 도 있다.
SELECT CONCAT('HELLO', 'SQL');
SELECT CONCAT(col1, ' ', col2);
21. SUBSTRING
문자열을 분해할 때 사용
SELECT SUBSTRING(str, pos, len);
- str: 원본 문자열.
- pos: 추출을 시작할 위치. 1부터 시작.
- len: 추출할 길이. 생략할 경우 시작 위치부터 문자열 끝까지 추출.
22. CAST
데이터 유형을 다른 유형으로 변환하는 데 사용
SELECT CAST(expression AS target_type)
- expression: 변환할 값 또는 컬럼.
- target_type: 변환하려는 데이터 유형. 이 유형은 MySQL에서 지원하는 데이터 유형이어야 함
예시: 문자를 정수로 변환
SELECT CAST('123' AS SIGNED);
23. TIMESTAMPDIFF
두 개의 날짜값의 차이를 반환하고자 할 때 사용
두 날짜 값의 단위를 설정해 다양한 단위의 차이를 확인할 수 있다.
SELECT TIMESTAMPDIFF(interval, date1, date2);
❗️date2에서 date1을 빼는 것이다.
가능한 interval
- MICROSECOND: 마이크로초
- SECOND: 초
- MINUTE: 분
- HOUR: 시간
- DAY: 일
- WEEK: 주
- MONTH: 달
- QUARTER: 분기
- YEAR: 년
24. DATE_FORMAT
시간을 원하는 형태로 반환하고자 할 때 사용
SELECT DATE_FORMAT(date, FORMAT);
- date: 날짜 또는 시간 값
- FORMAT: 출력 형식
가능한 포멧
년
- %Y: 4자리 연도 (예: 2024)
- %y: 2자리 연도 (예: 24)
월
- %m: 2자리 월 (01부터 12까지)
- %c: 1자리 또는 2자리 월 (1부터 12까지)
- %M: 월 이름 (January부터 December까지)
- %b: 월 축약형 이름 (Jan부터 Dec까지)
일
- %d: 2자리 일 (01부터 31까지)
- %e: 1자리 또는 2자리 일 (1부터 31까지)
요일
- %W: 요일 이름 (Sunday부터 Saturday까지)
- %a: 요일 축약형 이름 (Sun부터 Sat까지)
시간
- %T: 시간 분 초(%H:%i:%s와 같음)
- %H: 2자리 시간 (00부터 23까지, 24시간 형식)
- %h: 2자리 시간(01부터 12까지, 12시간 형식)
- %k: 1자리 또는 2자리 시간 (0부터 23까지, 24시간 형식)
- %l: 1자리 또는 2자리 시간(1부터 12까지, 12시간 형식)
- %i: 2자리 분 (00부터 59까지)
- %s: 2자리 초 (00부터 59까지)
- %f: 마이크로초 (6자리)
- %p: AM 또는 PM
예시
yyyy-mm-dd 요일 hh:mm:ss 형식으로 출력하고 싶다면
SELECT DATE_FORMAT(date, '%Y-%m-%d %W %h:%i:%s');
25. DATE의 특정 부분 반환 함수
1) YEAR()
DATE의 연도를 반환
SELECT YEAR('2023-06-20 14:30:45');
--> 2023
2) MONTH()
DATE의 월을 반환
SELECT MONTH('2023-06-20 14:30:45');
--> 6
3) DAY()
DATE의 일을 반환
SELECT DAY('2023-06-20 14:30:45');
--> 20
4) HOUR()
DATE의 시간을 반환
SELECT HOUR('2023-06-20 14:30:45');
--> 14
5) MINUTE()
DATE의 분을 반환
SELECT MINUTE('2023-06-20 14:30:45');
--> 30
6) SECOND()
DATE의 초를 반환
SELECT SECONDE('2023-06-20 14:30:45');
--> 45
특정 시간 조건으로 데이터 조회
예사: 14시에 들어온 주문 조회
SELECT *
FROM orders
WHERE HOUR(order_date) = 14;
26. IF & CASE
MySQL에서 특정 조건에 따라 값을 다르게 반환하고 싶을 때 사용
IF
IF는 한가지 조건을 처리할 때 사용
IF(condition, value_if_true, value_if_false)
사용예시
SELECT
id,
column_name,
IF(column_name = 'a', 'value_for_a', 'value_for_not_a') AS result
FROM table_name;
CASE
CASE는 여러 가지 조건을 처리하고 싶을 때 사용
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE resultN
END
사용예시
SELECT
id,
column_name,
IF(column_name = 'a', 'value_for_a', 'value_for_not_a') AS result
FROM table_name;
27. MySQL에서 쿼리 실행 순서
- FROM: 데이터 소스(테이블 등)를 가져옴
- JOIN: 다른 테이블과의 조인 연산을 수행
- WHERE: 행을 필터링
- GROUP BY: 행을 그룹화
- HAVING: 그룹을 필터링
- SELECT: 선택할 열을 지정하고 별칭을 정의
- DISTINCT: 중복된 행을 제거
- ORDER BY: 결과를 정렬
- LIMIT: 결과의 개수를 제한
해당 포스트는 [코테대비] 김나무의 코딩테스트용 SQL 총정리 30분 벼락치기를 참고하여 작성하였습니다.
https://www.letuin.com/lecture.php?action=view&no=4219