*
은 모든을 의미하는 기호이다! 따라서 ANIMAL_INS
table에 있는 모든 필드들을 가져올 때는 다음과 같이 작성한다.
SELECT * FROM ANIMAL_INS;
어느 table에서 데이터를 가져올지를 FROM
뒤에 적어준다.
프로그래머스: 모든 레코드 조회하기
SELECT * FROM ANIMAL_INS ORDER BY ANIMAL_ID;
WHERE
를 이용하면, 내가 원하는 조건에 맞는 데이터를 가져올 수 있다.
프로그래머스: 아픈 동물 찾기
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION='Sick' ORDER BY ANIMAL_ID;
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
이 아닌 데이터만 가져오기 위해서는 다음과 같이 작성하면 된다.
프로그래머스: 이름이 없는 동물의 아이디
프로그래머스: 이름이 있는 동물의 아이디
# 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 3 : 위에서부터 3개까지의 정보 조회
LIMIT 2, 8 : 2번째부터 8번째까지의 정보 조회
프로그래머스: 상위 n개 레코드
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1;
DISTINCT
를 이용하면 컬럼 내 중복을 제거할 수 있다.
프로그래머스: 중복 제거하기
SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL;
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
를 이용하여 원하는 패턴의 문자열을 가져올 수 있다.
%
: sub string_
: 한 글자프로그래머스: 이름에 el이 들어가는 동물 찾기
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog' AND NAME LIKE '%el%'
ORDER BY NAME;
GROUP BY
를 이용하여 데이터를 그룹화하여 조회할 수 있다.
프로그래머스: 고양이와 개는 몇 마리 있을까
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE)
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
특정 컬럼을 그룹화한 결과에 조건을 주고 싶을때는 WHERE
가 아니라 HAVING
을 사용한다.
프로그래머스: 동명 동물 수 찾기
SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(NAME)>1
ORDER BY NAME
프로그래머스: 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(조건문, 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
을 이용해서 해결할 수도 있다.
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(날짜, 형식)
을 이용하여 날짜를 지정한 형식으로 출력할 수 있다.
%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
을 이용하여 두 개의 테이블을 엮어서 원하는 데이터를 추출할 수 있다.
프로그래머스: 없어진 기록 찾기
-- 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 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;