SQL 정리 - SELECT

Rael·2022년 10월 12일
0

SQL 정리

목록 보기
1/4

프로그래머스 SQL 고득점 KIT - SELECT 편

1. 상위 n개 레코드(Lv.1)

[문제]
동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성하여라.

[풀이]
DATETIME을 기준으로 최솟값을 구하는 문제이다.
따라서 ORDER BY를 사용하여 ASCENDING 기준(Default 값)으로 정렬 후,
LIMIT 1을 사용하여 최솟값 하나만을 SELECT하게 했다.

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1;

2. 여러 기준으로 정렬하기(Lv.1)

[문제]
동물 보호소에 들어온 모든 동물의 아이디와 이름, 보호 시작일을 이름 순으로 조회하는 SQL문을 작성하라. 단, 이름이 같은 동물의 경우 보호를 나중에 시작한 동물을 먼저 보여라.

[풀이]
이름 기준 오름차순으로 우선 정렬한 뒤, 이름이 같을 경우 보호 시작일 기준 내림차순으로 정렬해야 한다.
따라서 ORDER BY를 사용하여 정렬을 진행했다.
ORDER BY에는 여러개의 기준을 설정할 수 있으며, 선행이면 우선순위가 높다.

SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME ASC, DATETIME DESC;

3. 동물의 아이디와 이름(Lv.1)

[문제]
동물 보호소에 들어온 모든 동물의 아이디와 이름을 ANIMAL_ID 순으로 조회하는 SQL문을 작성하라.

[풀이]
1번 문제보다 쉽다고 할 수 있을 정도로, ORDER BY만 사용하면 되는 문제이다.

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

4. 어린 동물 찾기(Lv.1)

[문제]
동물 보호소에 들어온 동물 중 젊은 동물의 아이디와 이름을 조회하는 SQL 문을 작성하라. 결과는 아이디 순으로 조회할 것.

[풀이]
조건에 해당하는 데이터를 검색해야 하므로 WHERE 절을 사용하였다.
이 때, 문자열 비교를 진행할 경우, 쌍따옴표는 Syntax Error가 발생한다!
따라서 홑따옴표만 사용해야 한다.

문자열 비교
1. =: 속도가 빠름
2. LIKE: =보다는 속도가 느림, But 특정 조건의 검색이 가능함(문자열을 포함한 데이터 찾기와 같은)

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

5. 아픈 동물 찾기(Lv.1)

[문제]
동물 보호소에 들어온 동물 중 아픈 동물의 아이디와 이름을 조회하는 SQL 문을 작성하라. 결과는 아이디 순으로 조회할 것.

[풀이]
4번 문제와 마찬가지로 조건에 해당하는 데이터 검색이 필요하다.
따라서 WHERE 절을 사용하였다.

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

6. 역순 정렬하기(Lv.1)

[문제]
동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 조회하는 SQL문을 작성하라. 결과는 ANIMAL_ID 역순으로 보여라.

[풀이]
역순은 곧 내림차순을 의미한다. 따라서 ANIMAL_ID의 Descending 순으로 출력한다.

SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC;

7. 모든 레코드 조회하기(Lv.1)

[문제]
동물 보호소에 들어온 모든 동물의 정보를 ANIMAL_ID순으로 조회하는 SQL문을 작성하라.

[풀이]
6번의 문제와 동일한 방식으로 풀이하되, 출력되는 정보의 종류와 ANIMAL_ID가 ASCENDING이 되도록 바꾼다.

SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

8. 모든 레코드 조회하기(Lv.4)

[문제]
REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성하라.
리뷰 평균점수는 소수점 세 번째 자리에서 반올림하고 결과는 평균점수를 기준으로 내림차순 정렬이며, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬하라.

[풀이]
1.JOIN의 종류 지정
INNER JOIN vs LEFT JOIN
INNER JOIN: 두 테이블에 모두 존재하는 데이터만 join한다.
LEFT JOIN: 중복 관련 없이 무조건 join한다.
해당 문제는 리뷰 평균 점수가 필요하므로, INNER JOIN을 사용

2.주소가 서울인 가게로 제한
LIKE 절을 사용하여 주소 칼럼에 서울을 포함하는 데이터를 검색한다.
포함은 LIKE '서울 %'와 같은 구문으로 검색 가능하다.
단, 서울특별시와 서울시가 섞여있으므로 '서울'을 포함하는 주소를 찾도록 한다.
(이거 모르고 서울특별시라고 했다가 틀렸다.)

3.정렬 순서
리뷰 평균 점수 내림차순으로 정렬하되, 같을 경우 즐겨찾기 수 내림차순으로 정렬해야 한다.
이 경우, SELECT 절에 리뷰 평균 점수로 정의한 SCORE을 사용한다.

SELECT ri.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS, ROUND(AVG(REVIEW_SCORE),2) AS SCORE
FROM REST_INFO ri
    INNER JOIN REST_REVIEW rr
    ON ri.REST_ID = rr.REST_ID
WHERE ADDRESS LIKE '서울%'
GROUP BY ri.REST_ID
ORDER BY SCORE DESC, FAVORITES DESC;

9. 강원도에 위치한 생산공장 목록 출력하기(Lv.1)

[문제]
FOOD_FACTORY 테이블에서 강원도에 위치한 식품공장의 공장 ID, 공장 이름, 주소를 조회하는 SQL문을 작성하라. 이때 결과는 공장 ID를 기준으로 오름차순 정렬할 것.

[풀이]
강원도에 위치한 식품공장을 검색해야 하므로 LIKE 절을 사용한다.
이 문제의 경우에도 주소에 강원도를 포함하면 되므로, LIKE '강원도%'로 구할 수 있다.

SELECT FACTORY_ID, FACTORY_NAME,ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE '강원도%'
ORDER BY FACTORY_ID;

10. 3월에 태어난 여성 회원 목록 출력하기(Lv.2)

[문제]
MEMBER_PROFILE 테이블에서 생일이 3월인 여성 회원의 ID, 이름, 성별, 생년월일을 조회하는 SQL문을 작성하라. 전화번호가 NULL인 경우는 출력대상에서 제외하고, 결과는 회원ID를 기준으로 오름차순 정렬할 것.

[풀이]
1.생일이 3월
LIKE절과 _을 사용하여 특정한 위치의 문자만 비교할 수 있다.
현재 DATE_OF_BIRTH의 데이터 형식이 YYYY-MM-DD이므로,
LIKE '_ _ _ _-03-_ _'와 같이 3월 생일자를 구할 수 있다.

2.여성 회원
이 또한 문자열 비교를 통해, GENDER = 'W'일 경우를 검색하였다.

3.전화번호가 NULL인 경우 출력 대상 제외
비교를 할 때, !=과, <>를 모두 사용할 수 있다. (둘은 같은 연산자이다.)
또한 is null, is not null을 사용해서 표현할 수도 있다.

위의 알고리즘을 바탕으로 기존 작성한 코드는 다음과 같다.

SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE TLNO <> 'NULL' AND DATE_OF_BIRTH LIKE '____-03-__' AND GENDER = 'W'
ORDER BY MEMBER_ID;

하지만 위의 코드를 실행하였을 때, 오답이라고 판단되었다.

결과 창의 DATE_OF_BIRTH의 형식이 정답 형식과 맞지 않아 오답처리가 되었다.
따라서 데이터 형식 수정을 위해 DATE_FORMAT을 사용하였다.

수정한 코드는 다음과 같다.

SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE TLNO <> 'NULL' AND DATE_OF_BIRTH LIKE '____-03-__' AND GENDER = 'W'
ORDER BY MEMBER_ID;

0개의 댓글