Learn to share,Share to learn
MYSQL 기본 문법 총정리 본문
아무래도 프로그래머스의 모든문제를 풀었지만 불안한것이 사람마음이다.
시험전 마지막 정리로 한번 흝어보자.
index
- 기본적인 SQL 조회구조
- 집계함수(GROUP BY와 세트)
- String, Date
- 연산함수
번외. 그 외에 헷갈릴 만한 내용
0. 기본적인 SQL 조회구조
SELECT 칼럼
FROM 테이블
JOIN 조인
WHERE 조건
GROUP BY 그룹칼럼
HAVING 그룹조건
ORDER BY 정렬조건
LIMIT 출력개수
;
1. 집계함수(GROUP BY와 세트)
AVG() # 평균값 = SUM() / COUNT()
SUM() # 합
COUNT() # 그룹 내 데이터 개수
MAX() # 최대값
MIN() # 최소값
2. String, Date
STRING
문자열 LIKE '%조건%' # 문자열에 조건이 들어가는지 검사 이때 %를 앞이나 뒤에 붙여 다른 문자와 섞여있어도 체크가능
CONCAT(칼럼1, 칼럼2) # '칼럼1칼럼2' 이런식으로 문자열이나 칼럼을 하나의 문자열로 결합
SUBSTR(칼럼, 시작점, 개수) # 칼럼의 문자열에서 시작점으로부터 개수만큼 문자열을 잘라온다.
DATE
# 2024-01-15 와 같은 형태로 DATE 출력 형식 지정 대소문자를 구분하여 형식이 변화
DATE_FORMAT(날짜칼럼, '%Y-%m-%d')
YEAR(날짜칼럼) # 년도 출력 2024
MONTH(날짜칼럼) # 달 출력 1 위의 format과 달리 숫자타입으로 앞에 0이 안붙음
DAY(날짜칼럼) # 일 출력 마찬가지로 앞에 0 제외
HOUR(날짜칼럼) # 시간
3. 연산함수
소수점 연산
CEILING(변수) # 올림
ROUND(변수, 자리수) # 자리수에 맞춰 반올림
FLOOR(변수) # 내림
날짜 연산
# 날짜의 차이 계산
TIMESTAMPDIFF(형식, START_DATE, END_DATE)
# END_DATE - START_DATE를 구하되 형식에 맞게 구한다
# 형식으로는 DAY HOUR 등이 들어갈 수 있다
# 1일에서 31일을 뺴면 30일임에 주의하자 +1을 해줘야하는 경우가 많다
번외. 그 외에 헷갈릴 만한 내용
NULL
NULL 값인지 확인
칼럼 IS NULL, 칼럼 IS NOT NULL
NULL 값 대체
IFNULL(칼럼명, 대체값)
ORDER BY
ASC : 오름차순
DESC : 내림차순
WHERE VS HAVING
WHERE # GROUP BY의 위에 위치하며 그룹을 나누기 전 조건이 들어감
GROUP BY
HAVING # GROUP BY와 한 세트로 아래에 위치하며 그룹을 나눈 후 조건에 들어감
UNION
# 쿼리문에 따른 테이블 두개를 행으로 결합(중복행은 제거)
쿼리문1
UNION
쿼리문2;
# 쿼리문에 따른 테이블 두개를 행으로 결합(중복 포함)
쿼리문1
UNION ALL
쿼리문2;
UNION VS JOIN 차이점
- UNION: 행 결합
- JOIN: 열 결합
JOIN 종류
이미지 출처: https://velog.velcdn.com/images/solfe/post/a9da5b51-bdcd-4987-9902-d14f05559897
여기에 더해 교집합에 해당하는 'INNER JOIN' 이 존재한다. 가장 자주 사용된다.
TB1 INNER JOIN TB2 ON 조건
BETWEEN A AND B
값의 범위 비교
칼럼 BETWEEN A AND B # A이상 B이하 범위에 칼럼이 해당하는지 비교
'2022-10-16'
BETWEEN DATE_FORMAT(START_DATE, '%Y-%m-%d')
AND DATE_FORMAT(END_DATE, '%Y-%m-%d')
# 날짜도 형식을 FORMAT으로 맞춰주면 비교 가능하다.
DISTINCT
중복 제거
DISTINCT 칼럼명 # 칼럼의 중복을 제외한다. COUNT와 응용해 중복값 제외 개수도 측정가능
CASE
칼럼의 값을 조건에 따라 바꾸는 방법
# IF 문의 형태
CASE IF 조건1 THEN 값1
IF 조건2 THEN 값2
ELSE 예외값
END 칼럼별명
# SWITCH 문의 형태
CASE IF 조건칼럼
IF 조건칼럼값1 THEN 값1
IF 조건칼럼값2 THEN 값2
ELSE 예외값
END 칼럼별명
IN
같은지 비교하고 싶은 값이 많을때 사용
칼럼 IN ('값1', '값2') # 칼럼값이 값1이나 값2인지 비교
별명
편의를 위한 별명 설정
칼럼 AS 별명
칼럼 별명
테이블 AS 별명
테이블 별명
# 위 두가지 방법들로 테이블 칼럼 모두 별명화 가능
SET
변수를 선언하고 싶을때 사용
SET 변수명 = 초기화값;
@변수명 # 이걸로 가져다 사용
# 예시 문제: 입양 시각 구하기(2)
SET @HOUR = -1;
SELECT (@HOUR := @HOUR + 1) HOUR, (SELECT COUNT(HOUR(DATETIME))
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) = @HOUR) COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23
문자열 함수
CONCAT(), CONCAT_WS() : 두 개 이상의 문자열을 결합합니다.
SELECT CONCAT('Hello', ' ', 'World'); -- 'Hello World'
# CONCAT_WS는 특정 구분자를 이용해 문자를 결합할 수 있음
SELECT CONCAT_WS('/', '2022', '10','22'); -- '2022/10/22'
SUBSTRING() : 문자열의 일부분을 추출합니다.
SELECT SUBSTRING('Hello World', 7); -- 'World'
SUBSTRING_INDEX(): 찾는 문자열이 n회 등장하면 그 이후 문자열을 버립니다. n이 마이너스면 오른쪽에서 시작합니다.
SELECT SUBSTRING_INDEX('test3.account.gmail.com', '.', 2) -- 'test3.account'
SELECT SUBSTRING_INDEX('test3.account.gmail.com', '.', -2) -- 'gmail.com'
LENGTH() : 문자열의 길이를 반환합니다.
SELECT LENGTH('Hello World'); -- 11
LOWER(), UPPDER() : 문자열을 모두 소문자, 대문자로 변환합니다.
SELECT LOWER('Hello World'); -- 'hello world'
SELECT UPPER('Hello World'); -- 'HELLO WORLD'
TRIM([LEADING, BOTH, TRAILING][rem_str] FROM str) : 문자열의 앞/뒤/양쪽에서 지정된 문자열을 제거합니다.
SELECT TRIM(" abc "); -- 'abc'
SELECT TRIM(BOTH "a" FROM "aaaabcbbbaaa"); -- 'bcbbb'
SELECT TRIM(TRAILING "a" FROM "aaaabcbbbaaa"); -- 'aaaabcbb'
SELECT TRIM(LEADING "a" FROM "aaaabcbbbaaa"); -- 'bcbbbaaa'
REPLACE(str, old_str, new_str) : 문자열에서 old_str을 new_str로 대체합니다.
SELECT REPLACE("It's Banana", "Banana", "Apple"); -- It's Apple
INSTR(str, substr) : 문자열에서 substr이 처음 나타나는 위치를 반환합니다.
SELECT INSTR('foobarbar', 'bar'); -- 4
# SQL에서 시작점은 1이기 때문에 0이면 존재하지않는다는 의미이다.
SELECT INSTR('xbar', 'foobar'); -- 0
LPAD, RPAD(str, len, pad_str) : 문자열을 왼쪽, 오른쪽으로 패딩합니다.
SELECT LPAD("aaa", 5, "0"); -- 00aaa
SELECT RPAD("aaa", 5, "0"); -- aa000
LEFT, RIGHT(str, len) : 문자열에서 왼쪽 또는 오른쪽에서 길이만큼 추출합니다.
SELECT LEFT("abcde", 3); -- "abc"
SELECT RIGHT("abcde", 3); -- "cde"
MID(str, pos, len) : 문자열에서 특정 시작점에서의 길이만큼을 추출합니다.
SELECT MID("abcdefghi", 5, 2); -- "ef"
BIN, OCT, HEX : 각각 2진수, 8진수, 16진수 값을 반환합니다.
SELECT BIN(31); -- 11111
SELECT OCT(31); -- 37
SELECT HEX(31); -- 1F
REVERSE(str) : 주어진 문자열을 거꾸로 반환합니다.
SELECT REVERSE("123456789"); -- 987654321
SPACE(len) : 길이만큼의 공백을 반환합니다.
SELECT CONCAT("Hello", SPACE(5), "World"); -- "Hello World"
REPEAT(str, len) : 문자열을 주어진 횟수만큼 반복합니다.
SELECT REPEAT("abc", 3); -- "abcabcabc"
LOCATE(substr, str, [pos]) : 첫번째로 발견한 문자열의 위치를 반환합니다. (POSITION과 동일한 함수이며, INSTR와는 파라미터 순서만 다릅니다.)
SELECT LOCATE("abc", "abcdefabc"); -- 1
SELECT POISITION("abc" IN "abcdefabc"); -- 1
SELECT INSTR("abcdefabc", "abc");
# 시작지점을 정하는 것은 Locate에서만 가능합니다.
SELECT LOCATE("abc", "abcdefabc", 3); -- 7
FORMAT(x, d) : 세자리 수 마다 콤마를 넣고 주어진 길이만큼 소수점을 소수점을 남깁니다.
SELECT FORMAT(12332.1,4); -- '12,332.1000'
SELECT FORMAT(12332.2,0); -- '12,332'
날짜 및 시간 관련 함수
CURDATE(), CURTIME(), NOW(), SYSDATE() : 현재 날짜 또는 시간을 반환합니다.
# 현재 날짜를 '년-월-일'로 반환
SELECT CURDATE(); -- '2023-02-27'
# 현재 시간을 HH:MM:SS로 반환
SELECT CURTIME(); -- '04:45:10'
# 현재 날짜 및 시간을 반환
SELECT NOW(); -- '2023-02-27 04:45:00'
SELECT SYSDATE(); -- '2023-02-27 04:45:00'
YEAR(), MONTH(), DAYOFMONTH(), HOUR(), MINUTE(), SECOND(): 특정 날짜나 시간 단위를 반환합니다.
# 날짜에 대한 "연도"를 반환
SELECT YEAR('2023-02-27'); -- 2023
# 날짜에 대한 "월"을 반환
SELECT MONTH('2023-02-27'); -- 2
# 날짜에 대한 "일"을 반환
SELECT DAYOFMONTH('2023-02-28'); -- 28
# 시간을 반환
SELECT HOUR('2023-02-27 15:32:00'); -- 15
# 분을 반환
SELECT MINUTE('2023-02-27 15:32:00'); -- 32
# 초를 반환
SELECT SECOND('2023-02-27 15:32:00'); -- 0
ADDDATE(date, diff), SUBDATE(date,diff) : 날짜를 기준으로 차이를 더하거나 뺍니다. (DATE_ADD와 DATE_SUB와 동일)
SELECT ADDDATE('2022-12-31', INTERVAL 15 DAY); -- '2022-01-15'
SELECT ADDDATE('2022-12-31', INTERVAL 1 MONTH); -- '2022-01-31'
SELECT SUBDATE('2022-12-31', INTERVAL 15 DAY); -- '2022-12-16'
SELECT SUBDATE('2022-12-31', INTERVAL 1 MONTH); -- '2022-11-30'
DATEDIFF(date1, date2), TIMEDIFF(time1, time2) : 날짜 차이 혹은 시간 차이를 반환합니다.
SELECT DATEDIFF('2022-12-31', '2022-10-29'); -- 63
SELECT TIMEDIFF('14:50:00', '08:40:50'); -- 06:09:10
DATEOFWEEK(day) : 해당 날짜의 요일을 숫자로 반환합니다.(일:1, 월:2..)
SELECT DAYOFWEEK(NOW()); -- 2
MONTHNAME(month) : 해당 월의 영어 이름을 반환합니다.
SELECT MONTHNAME(NOW()); -- February
DAYOFYEAR(day) : 1월 1일 기준으로 몇 일이 지났는 지를 반환합니다.
SELECT DAYOFYEAR(NOW()); -- 58
LASTDAY(date) : 주어진 월의 마지막 날을 반환합니다.
SELECT LAST_DAY('2012-02-01'); -- '2012-02-29
TIME_TO_SEC(time) : 시간을 초 단위로 반환니다.
SELECT TIME_TO_SEC('12:00:00'); -- 43200
**DATE_FORMAT(date, condition) : 조건에 맞는 형식으로 변환된 date를 반환합니다.
SELECT DATE_FORMAT(now(), '%Y-%M-%D'); -- '2023-February-27th'
숫자 관련 함수
SUM(column) : 숫자 열의 합계를 계산합니다.
SELECT SUM(sales) FROM orders; -> 10000
AVG(column) : 숫자 열의 평균을 계산합니다.
SELECT AVG(sales) FROM orders; -> 500
MAX(column) : 숫자 열의 최댓값을 찾습니다.
SELECT MAX(sales) FROM orders; -> 1000
MIN(column) : 숫자 열의 최솟값을 찾습니다.
SELECT MIN(sales) FROM orders; -> 100
COUNT(column) : 열의 레코드 수를 반환합니다.
SELECT COUNT(*) FROM orders; -> 10
ABS(number) : 숫자의 절대값을 출력합니다.
SELECT ABS(100-150); -- 50
MOD(분자, 분모) : 분자를 분모로 나눈 나머지를 구합니다. (%와 동일)
SELECT MOD(100, 3); -- 1
CEILING(number) : 소수점을 올림한 값을 반환합니다.
SELECT CEILING(3301.3123); -- 3302
FLOOR(number) : 소수점을 내림한 값을 반환합니다.
SELECT FLOOR(1523.5779); -- 1523
TRUNCATE(number, pos): 숫자를 소수점 이하 자리수에서 버린 값을 반환합니다.
SELECT TRUNCATE(1523.5779, 2); -- 1523.57
SELECT TRUNCATE(1523.5779, -2); -- 1500
ROUND(number, pos)숫자를 소수점 이하 자리수에서 반올림한 값을 반환합니다.
SELECT ROUND(1523.5779, 3); -- 1523.578
SQRT(number): 숫자를 제곱근 값을 반환합니다.
SELECT SQRT(100); -- 10
POW(number, n): 숫자를 n 제곱한 값을 반환합니다.
SELECT POW(5, 3); -- 125
RAND() : 0 ~ 1 사이의 랜덤값을 반환합니다.
SELECT FLOOR(RAND() * 100)+ 1; -- 1 ~ 100 사이 랜덤한 값 반환
조건함수
IF(expr, true_value, false_value) : 조건에 따라 다른 값을 반환합니다.
SELECT IF(sales > 500, 'High', 'Low') FROM orders; -- 'Low'
IFNULL(column, value) : 컬럼이 NULL이라면 대체할 값을 출력합니다.
SELECT IFNULL(data, '자료없음') FROM library; -- '자료없음'
CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ... ELSE else_result END : 다중 조건에 따라 다른 값을 반환합니다.
SELECT CASE
WHEN sales > 500
THEN 'High'
WHEN sales > 100
THEN 'Medium'
ELSE 'Low' END
FROM orders; -- 'Medium'
COALESCE(value1, value2, ...) : NULL이 아닌 첫 번째 인수를 반환합니다.
SELECT COALESCE(NULL, NULL, 'apple', 'banana'); -- 'apple'
정규식
매칭
- . : 문자 하나, ex) ... - 문자열의 길이가 세 글자 이상인 것
- | : 또는 (OR) |로 구분된 문자에 해당하는 문자열을 찾음 ex) a|b라면 a 또는 b에 해당하는 문자열을 찾음
- []: []안에 나열된 패턴에 해당하는 문자열을 찾음
- ^: 시작하는 문자열을 찾음
- $: 끝나는 문자열을 찾음
수의 제한
- *: 0회 이상 나타나는 문자
- +: 1회 이상 나타나는 문자
- {m, n}: m회 이상 n회 이하 나타나는 문자
- ?: 0 또는 1회 나타나는 문자
문자 그룹
- [A-z]또는 [:alpha:] 또는 \a: 알파벳 대문자 또는 소문자인 문자열을 찾음
- [0-9] 또는 [:digit:] 또는 \d :숫자인 문자열을 찾음
부정
- [^문자]: 괄호 안의 문자를 포함하지 않은 문자열을 찾음
예시
# (1) apple 또는 banana로 시작하는 문자열을 찾고 싶을 때
SELECT *
FROM tb
WHERE data REGEXP ('^apple | ^banana')
(2) 길이 7글자인 문자열 중 2번째 자리부터 abc를 포함하는 문자열을 찾고 싶을 때
SELECT *
FROM tb
WHERE data REGEXP ('^.abc...$')
(3) 텍스트와 숫자가 섞여있는 문자열에서 숫자로만 이루어진 문자열을 찾고 싶을 때
SELECT *
FROM tb
WHERE data REGEXP (^[:digit:]+$)
참고한, 그리고 참고할 블로그:
https://velog.io/@solfe/MYSQL-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8
MYSQL 코딩테스트
소마 15기를 준비함에 있어 MYSQL 코테를 준비해보게 되었다. 프로그래머스의 문제집을 활용하였으며 개인적으로 헷갈릴만한 내용들을 정리하려고 한다. index 집계함수(GROUP BY와 세트) String, Date
velog.io
코딩테스트 SQL 모음집
SQL을 급하게 봐야한다구? 이것만 보면 야, 너두 SQL 할 수 있숴😎
velog.io
https://velog.io/@coddingyun/SQL-%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC
[SQL] 함수 정리
DECODE: 컬럼 값이 n에 일치하면 뒤의 결과를 반환, 기본 값이 없으면 Null 반환POWER(N,M): N의 M제곱SQRT(N): N의 제곱근ABS(N): N의 절대값날짜 + 숫자 N: 날짜에 N일 더한 날짜날짜 - 숫자 N: 날짜에 N일 뺀
velog.io
https://velog.io/@wngud4950/MySQL-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC
MySQL 내장함수 정리
CONCAT(), CONCAT_WS() : 두 개 이상의 문자열을 결합합니다.SUBSTRING() : 문자열의 일부분을 추출합니다.SUBSTRING_INDEX(): 찾는 문자열이 n회 등장하면 그 이후 문자열을 버립니다. n이 마이너스면 오른쪽에
velog.io
추가)정규표현식
https://yurimkoo.github.io/analytics/2019/10/26/regular_expression.html
유림's Blog
베짱이가 되고 싶은 개미의 기술 블로그
yurimkoo.github.io