SQL 문법 정리

danbibibi·2022년 7월 27일
0

SELECT

*은 모든을 의미하는 기호이다! 따라서 ANIMAL_INS table에 있는 모든 필드들을 가져올 때는 다음과 같이 작성한다.

SELECT * FROM ANIMAL_INS;

FROM

어느 table에서 데이터를 가져올지FROM 뒤에 적어준다.

프로그래머스: 모든 레코드 조회하기

SELECT * FROM ANIMAL_INS ORDER BY ANIMAL_ID;

WHERE

WHERE를 이용하면, 내가 원하는 조건에 맞는 데이터를 가져올 수 있다.

프로그래머스: 아픈 동물 찾기

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION='Sick' ORDER BY ANIMAL_ID;

ORDER BY

ORDER BY를 이용해서 원하는 필드를 기준으로 데이터를 정렬할 수 있다!

프로그래머스: 역순 정렬하기

# 정렬
SELECT NAME, DATETIME FROM ANIMAL_INS ORDER BY ANIMAL_ID; 

# 역순 정렬
SELECT NAME, DATETIME FROM ANIMAL_INS ORDER BY ANIMAL_ID desc;

NULL

NULL인 데이터만 가져오거나, NULL이 아닌 데이터만 가져오기 위해서는 다음과 같이 작성하면 된다.

프로그래머스: 이름이 없는 동물의 아이디
프로그래머스: 이름이 있는 동물의 아이디

# NAME이 NULL인 데이터 가져오기
SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NULL ORDER BY ANIMAL_ID;

# NAME이 NULL이 아닌 데이터 가져오기
SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NOT NULL ORDER BY ANIMAL_ID;

함수

데이터를 가져올 때 데이터들의 최대, 최소, 합 등을 다음과 같은 함수를 사용해서 가져올 수 있다.

MAX: 최대
MIN: 최소
COUNT: 개수
SUM: 합
AVG: 평균

프로그래머스: 최댓값 구하기

SELECT MAX(DATETIME) FROM ANIMAL_INS;

LIMIT

LIMIT을 이용하여 인덱싱, 슬라이싱? 비슷한 효과를 볼 수 있다.

LIMIT 3 : 위에서부터 3개까지의 정보 조회
LIMIT 2, 8 : 2번째부터 8번째까지의 정보 조회

프로그래머스: 상위 n개 레코드

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1;

DISTINCT

DISTINCT를 이용하면 컬럼 내 중복을 제거할 수 있다.

프로그래머스: 중복 제거하기

SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL;

IN

IN을 이용하여 컬럼에서 주어진 값들에 해당되는 행만 조회할 수 있다.

프로그래머스: 루시와 엘라 찾기

# OR 사용
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME = 'Lucy' OR NAME = 'Ella' OR NAME = 'Pickle' OR NAME = 'Rogan' OR NAME = 'Sabrina' OR NAME = 'Mitty'
ORDER BY ANIMAL_ID; 


# IN 사용
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID; 

LIKE

LIKE를 이용하여 원하는 패턴의 문자열을 가져올 수 있다.

  • %: sub string
  • _: 한 글자

프로그래머스: 이름에 el이 들어가는 동물 찾기

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog' AND NAME LIKE '%el%'
ORDER BY NAME;

GROUP BY

GROUP BY를 이용하여 데이터를 그룹화하여 조회할 수 있다.

프로그래머스: 고양이와 개는 몇 마리 있을까

SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE)
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE 
ORDER BY ANIMAL_TYPE

HAVING

특정 컬럼을 그룹화한 결과에 조건을 주고 싶을때WHERE가 아니라 HAVING을 사용한다.

프로그래머스: 동명 동물 수 찾기

SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(NAME)>1
ORDER BY NAME

NVL/IFNULL

프로그래머스: NULL 처리하기

Oracle

Oracle에서는 NVL을 이용하여 NULL 값을 원하는 값(작은 따옴표 이용)으로 대체할 수 있다.

SELECT ANIMAL_TYPE, NVL(NAME, 'No name'), SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

MySQL

MySQL에서는 IFNULL을 이용하여 NULL 값을 원하는 값으로 대체할 수 있다.

SELECT ANIMAL_TYPE, IFNULL(NAME, "No name"), SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

IF

조건에 따라 다른 값으로 조회하고 싶은 경우 IF(조건문, TRUE, FALSE)를 이용할 수 있다.

프로그래머스: 중성화 여부 파악하기

SELECT ANIMAL_ID, NAME,
IF((SEX_UPON_INTAKE LIKE 'Neutered%') OR (SEX_UPON_INTAKE LIKE 'Spayed%'), "O", "X")  AS "중성화" 
FROM ANIMAL_INS 
ORDER BY ANIMAL_ID;

CASE WHEN

위 문제를 아래와 같이 CASE WHEN을 이용해서 해결할 수도 있다.

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;

DATE_FORMAT

DATE_FORMAT(날짜, 형식)을 이용하여 날짜를 지정한 형식으로 출력할 수 있다.

  • %Y: 년도 (4자리)
  • %y: 년도 (2자리)
  • %m: 월 (2자리 숫자)
  • %M: 월 (긴 영문)
  • %b: 월 (짧은 영문)
  • %W: 요일 (긴 영문)
  • %a: 요일 (짧은 영문)
  • %d: 일 (2자리)
  • %c: 월 (1자리는 1자리 숫자)
  • %e: 일 (1자리는 1자리 숫자)
  • %I: 시간 (12시간)
  • %H: 시간 (24시간)
  • %T: hh:mm:SS
  • %r: hh:mm:ss AM,PM
  • %i: 분
  • %S: 초

프로그래머스: DATETIME에서 DATE로 형 변환

SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS '날짜' 
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

JOIN

JOIN을 이용하여 두 개의 테이블을 엮어서 원하는 데이터를 추출할 수 있다.

프로그래머스: 없어진 기록 찾기

--  입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문
SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_OUTS OUTS
LEFT OUTER JOIN ANIMAL_INS INS
ON OUTS.ANIMAL_ID = INS.ANIMAL_ID
WHERE INS.ANIMAL_ID IS NULL
ORDER BY INS.ANIMAL_ID;
profile
블로그 이전) https://danbibibi.tistory.com

0개의 댓글