코딩 테스트 대비
코테의 데이터베이스 문제 유형이 주로 MySQL로 출제 된다고 해서 정리해봅니다.
아래의 <프로그래머스 SQL 고득점 Kit> 를 풀면서 문법을 기억하고 있는지 확인했습니다.
MySQL
- 대소문자 구분 안함
SELECT
- SELECT
- 전체 변수 선택 :
*
- 전체 변수 선택 :
- ORDER BY
- 기본 :
ASC
, 내림차순DESC
- 여러 컬럼 기준 정렬할 때, 각각 다른 기준 가능
- 별칭 사용 가능
- 기본 :
- 상위 n개 :
ORDER BY
와LIMIT n
함께 사용- LIMIT : 첫번째 레코드는 0번 부터 시작, 시작 행을 정할 수 있음
SELECT * FROM
[테이블명]
LIMIT 100, 10
- LIMIT : 첫번째 레코드는 0번 부터 시작, 시작 행을 정할 수 있음
- WHERE
- 조건 제시할 때
=
1개만
- 조건 제시할 때
- 코드 예시
SELECT NAME, DATETIME FROM ANIMAL_INS WHERE INTAKE_CONDITION = 'Sick' ORDER BY ANIMAL_ID DESC LIMIT 3
SUM, MAX, MIN
- 집계함수
- SUM, MAX, MIN, COUNT
- COUNT
NULL
은 자동으로 제외하고 COUNT
- 중복 제거
- COUNT 내에
distinct
옵션 GROUP BY [COUNT 하려는 컬럼]
과 함께 사용하는 게 더 빠름
- COUNT 내에
- 코드 예시
SELECT max(datetime) from animal_ins SELECT min(datetime) from animal_ins SELECT count(animal_id) as count from animal_ins
IS NULL
- IS NULL
- where 절에 조건으로 사용
- IFNULL
IFNULL(컬럼명, NULL일 때 대체할 값)
- 코드 예시
SELECT animal_id from animal_ins where name is not null #where name is null order by animal_id SELECT animal_type, IFNULL(name, 'No name') as name, sex_upon_intake from animal_ins
String, Date
컬럼 in ()
로 ()안에 컬럼 값이 존재하는지 확인SELECT animal_id, name, sex_upon_intake FROM animal_ins where name in ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
- LIKE
- 대소문자 구분 X
%
는 글자 수 상관없이_
는 글자수 조건
SELECT animal_id, name FROM animal_ins where name like '%el%' and animal_type = 'Dog' ORDER BY name
- 날짜형 포맷 변경
- DATE_FORMAT(컬럼, 포맷) :
DATE_FORMAT(datetime,'%Y-%m-%d')
HOUR(DATE)
: DATE 타입에서 시간만 추출
SELECT animal_id, name, DATE_FORMAT(datetime,'%Y-%m-%d') as 날짜 from animal_ins order by animal_id
- DATE_FORMAT(컬럼, 포맷) :
IF, CASE
- IF
IF(조건절, 참일 때 값, 거짓일 때 값)
SELECT animal_id, name FROM animal_ins where name like '%el%' and animal_type = 'Dog' ORDER BY name SELECT animal_id, name, IF((sex_upon_intake LIKE '%Neutered%') OR (sex_upon_intake LIKE '%Spayed%'),'O','X') as 중성화 FROM animal_ins
- CASE
WHEN
절에 조건,THEN
절에 조건이 참일 경우,ELSE
에 조건이 거짓일 경우
SELECT ANIMAL_ID, NAME, CASE WHEN SEX_UPON_INTAKE LIKE '%Neutered%' OR SEX_UPON_INTAKE LIKE '%Spayed%' THEN 'O' ELSE 'X' END as '중성화' FROM ANIMAL_INS ORDER BY ANIMAL_ID
GROUP BY
- GROUP BY
- HAVING
- GROUP BY 결과에 대해 조건 추가
- 별칭 사용 가능
- 코드 예시
SELECT name, count(name) count from animal_ins group by name having count(name)>=2 #having count>=2 order by name SELECT HOUR(datetime) HOUR, count(animal_id) COUNT from animal_outs group by HOUR(datetime) having hour>=9 and hour<=19 order by HOUR(datetime) #order by HOUR
- 입양 시각 구하기(2)
- 0~23 까지의 시각을 나타내는 숫자 컬럼 필요 →
RECURSIVE
재귀 함수로 구현
WITH
절 사용 : 미리 테이블을 정제 및 정의하고FROM
절에 사용 가능
with RECURSIVE time as (select 0 as h union all select h+1 from time where h < 23) SELECT h HOUR , count(DATETIME) COUNT FROM ANIMAL_OUTS right join time on hour(DATETIME)=h GROUP BY h ORDER BY h #다른 코드 SET @hour := -1; SELECT (@hour := @hour + 1) as HOUR, (SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) AS 'COUNT' FROM ANIMAL_OUTS WHERE @hour < 23
SET
으로 로컬 변수 선언
- 0~23 까지의 시각을 나타내는 숫자 컬럼 필요 →