Coder/SQL

MySQL 문법 정리 with 프로그래머스 SQL 고득점 Kit

코딩 테스트 대비

코테의 데이터베이스 문제 유형이 주로 MySQL로 출제 된다고 해서 정리해봅니다.

 

아래의 <프로그래머스 SQL 고득점 Kit> 를 풀면서 문법을 기억하고 있는지 확인했습니다.

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

MySQL

  • 대소문자 구분 안함

SELECT

  • SELECT
    • 전체 변수 선택 : *
  • ORDER BY
    • 기본 : ASC , 내림차순 DESC
    • 여러 컬럼 기준 정렬할 때, 각각 다른 기준 가능
    • 별칭 사용 가능
  • 상위 n개 : ORDER BYLIMIT n 함께 사용
    • LIMIT : 첫번째 레코드는 0번 부터 시작, 시작 행을 정할 수 있음
      • SELECT * FROM[테이블명]LIMIT 100, 10
  • 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 하려는 컬럼] 과 함께 사용하는 게 더 빠름
  • 코드 예시
    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

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 으로 로컬 변수 선언