1. 모든 레코드 조회하기
SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
- SELECT에서 모든 컬럼을 출력하기 위해선 * 을 이용한다.
- ORDER BY에서 오름차순은 ASC, 내림차순은 DESC
- 기본값이 오름차순이기 때문에 굳이 ASC를 작성해줄 필요가 없다.
2. 역순 정렬하기
SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC;
- NAME, DATETIME의 컬럼만 원하기 때문에 SELECT로 선택해준다.
- 역순으로 보여달라 했기 때문에 내림차순인 DESE 를 작성해준다.
3. 아픈 동물 찾기
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = "Sick"
ORDER BY ANIMAL_ID;
- 아픈 동물의 아이디와 이름을 출력해야 하기 때문에 WHERE절에 INTAKE_CONDITION = 'Sick'의 조건을 작성한다.
- 결과를 아이디 순으로 조회해야 하기 때문에 ORDER BY를 작성해준다.
4. 어린 동물 찾기
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != "Aged"
ORDER BY ANIMAL_ID;
- 어린 동물 중 젊은 동물은 INTAKE_CONDITION이 Aged가 아닌 동물이다.
- 따라서 WHERE절에 <> 나 != 를 작성해준다.
5. 이름이 없는 동물의 아이디
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID
- NULL은 IS NULL, IS NOT NULL을 이용해야 한다. (=, != 사용 불가)
- 문제에서 이름이 없는 채로(= NULL)들어온 동물을 출력해달라 했으니 IS NULL을 작성한다.
6. 동물의 아이디와 이름
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
7. 여러 기준으로 정렬하기
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC;
- NAME이 같은 동물 중에서는 보호를 나중에 시작한 동물을 보여줘야 한다.
- 따라서 ORDER BY 에 NAME을 먼저 작성해주고, DATETIME 을 내림차순으로 정렬한다.
8. 상위 N개 레코드
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1;
- MY SQL에서 상위 N개의 레코드를 출력하기 위해서는 LIMIT를 이용하면 된다.
- (참고) 앞에 N개를 건너 뛴 후 상위 N개만 가져오고 싶으면 LIMIT 건너뛸 개수, 가져올 개수
9. 이름이 있는 동물의 아이디
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID;
- 5번의 이름이 없는 동물의 아이디와 비슷한 문제다.
- '이름이 있는 아이디'를 출력해야 하기 때문에 IS NOT NULL 을 작성해준다.
- (참고) NULL은 IS NULL, IS NOT NULL을 이용해야 한다. (=, != 사용 불가)
10. 최댓값 구하기
SELECT MAX(DATETIME)
FROM ANIMAL_INS;
SELECT DATETIME
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1;
- 가장 최근에 들어온 동물을 출력하면 되기 때문에 MAX를 이용해주면 된다.
- 컬럼 이름은 일치하지 않아도 된다는 조건이 있어서 AS는 사용하지 않아도 괜찮다.
- 아래는 LIMIT를 이용한 풀이
11. 강원도에 위치한 생산공장 목록 출력하기
SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE "강원도%"
ORDER BY FACTORY_ID
- WHERE 절의 LIKE에서 %는 문자의 개수 상관 X, _ 는 _의 개수대로 문자가 있어야 한다.
- 이 문제에서는 강원도가 포함되어 있는 것만 원했기 때문에 %를 이용하면 된다.
12. 경기도에 위치한 생산공장 목록 출력하기
SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, IFNULL(FREEZER_YN,"N")
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE "경기도%"
ORDER BY WAREHOUSE_ID
- IFNULL(A,B) 는 A가 NULL일 경우 B를 채워서 출력하는 함수다.
- FREEZER_YN이 NULL일 경우 "N"을 채워야 하기 때문에 위와 같이 작성한다.
13. 나이 정보가 없는 회원 수 구하기
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE AGE IS NULL
SELECT SUM(AGE IS NULL) AS USERS
FROM USER_INFO
- 위는 AGE가 NULL인 경우 COUNT 해주는 풀이
- 아래는 SUM을 이용한 풀이이다.
- AGE IS NULL을 할 경우 NULL은 1, NOT NULL은 0이므로 SUM을 통해 COUNT와 동일한 결과를 출력할 수 있다.
14. 조건에 맞는 회원 수 구하기
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE LEFT(JOINED,4) = 2021 AND AGE BETWEEN 20 AND 29
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE YEAR(JOINED) = 2021 AND AGE BETWEEN 20 AND 29
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE JOINED LIKE '2021%' AND AGE BETWEEN 20 AND 29
- A 이상 B 이하인 경우를 찾고 싶으면 BETWEEN A AND B 를 해주면 된다.
- MY SQL의 경우 BETWEEN 작은 수 AND 큰 수 순서를 지켜야 한다.
- 1. LEFT(JOINED,4) 는 왼쪽 4개를 가져와서 비교
- 2. YEAR(JOINED)는 JOINED 에서 YEAR 정보만 가져와서 비교
- 3. JOINED LIKE '2021%'는 JOINED 중 2021로 시작하는 것만 가져오는 것
- 위 3개 중 편한 걸 선택해서 풀면 된다.
15. 가장 비싼 상품 구하기
SELECT MAX(PRICE) AS MAX_PRICE
FROM PRODUCT
- MAX(PRICE)를 통해 가장 비싼 값을 가져온다.
- 컬럼 명이 MAX(PRICE)라고 되어 있으니 AS로 변경해준다.
16. 12세 이하인 여자 환자 목록 출력하기
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO,'NONE') AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = "W"
ORDER BY AGE DESC, PT_NAME
- IFNULL(A,B) 는 A가 NULL일 경우 B를 채워서 출력하는 함수다.
- TLNO가 NULL일 경우 NONE으로 출력하며, AS를 이용해 TLNO라는 이름으로 다시 변경해준다.
17. 흉부외과 또는 일반외과 의사 목록 출력하기
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD,'%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME;
- HIRE_YMD를 그냥 출력하면 시간까지 같이 출력된다. 따라서 DATE_FORMAT를 이용해 포맷을 변경해야 한다.
- %Y 년도 4자리, %y 년도 4자리
- %M 월 영문, %m 월 숫자
- %D 일 영문, %d 일 숫자
- 다라서 format의 구조를 '%Y-%m-%d'로 작성해줘야한다.
18. 인기있는 아이스크림
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID;
19. 과일로 만든 아이스크림 고르기 ✨
SELECT FIRST_HALF.FLAVOR
FROM FIRST_HALF JOIN ICECREAM_INFO
ON FIRST_HALF.FLAVOR = ICECREAM_INFO.FLAVOR
WHERE TOTAL_ORDER > 3000 AND INGREDIENT_TYPE = "FRUIT_BASED"
ORDER BY TOTAL_ORDER DESC;
- JOIN을 이용한 문제
20. 조건에 맞는 도시리스트 출력하기
SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK
WHERE LEFT(PUBLISHED_DATE,4) = 2021 AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE;
- 2021년인 조건을 구하려면 LEFT, YEAR, LIKE 모두 사용 가능하다. (14번 참고)
- DATE_FORMAT은 17번 참고
21. 평균 일일 대여 요금 구하기
SELECT ROUND(AVG(DAILY_FEE)) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = "SUV";
- 평균은 AVG를 이용하면 된다.
- 소수 첫 번째 자리에서 반올림을 해야하므로 ROUND를 이용한다
- ROUND(숫자, 반올림할 자릿수)
- TRUNCATE(숫자, 버릴 자릿수)
22. 자동차 대여 기록에서 장기/단기 대여 구분하기 ✨
SELECT
HISTORY_ID,
CAR_ID,
DATE_FORMAT(START_DATE,'%Y-%m-%d') AS START_DATE,
DATE_FORMAT(END_DATE,'%Y-%m-%d') AS END_DATE,
CASE WHEN DATEDIFF(END_DATE,START_DATE) < 29 THEN '단기 대여'
ELSE '장기 대여'
END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE LIKE '2022-09%'
ORDER BY HISTORY_ID DESC;
- 일반 프로그래밍에서 IF, ELIF문을 MySQL에서는 CASE WHEN를 이용한다.
- DATEDIFF는 두 START와 END의 차이를 보여준다.
- CASE WHEN THEN / ELSE / END
23. 특정 옵션이 포함된 자동차 리스트 구하기
SELECT *
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%네비게이션%'
ORDER BY CAR_ID DESC;
- WHERE 절의 LIKE에서 %는 문자의 개수 상관 X, _ 는 _의 개수대로 문자가 있어야 한다.
- 문장 속에 네비게이션이 포함되는 경우를 원하기 때문에 양 쪽에 %를 붙여준다.
24. 조건에 부하하는 중고거래 댓글 조회하기 ✨
SELECT B.TITLE, B.BOARD_ID, R.REPLY_ID, R.WRITER_ID, R.CONTENTS, DATE_FORMAT(R.CREATED_DATE,'%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD B JOIN USED_GOODS_REPLY R
ON B.BOARD_ID = R.BOARD_ID
WHERE B.CREATED_DATE LIKE '2022-10%'
ORDER BY CREATED_DATE, TITLE;
- JOIN을 이용한 문제
댓글