OT 교육 진행
OT 교육을 끝마치고 각 팀으로 배정을 받고 13팀에 함께 하게 되었습니다.
이번에 새로이 시작하는 마음으로 모두 함께 시작을 해보도록 하겠습니다.
우리 팀의 팀명은 13일은 불금으로 활활 태워 시작하도록 해보겠습니다.
SQL 문제 풀이 중 어려웠던 내용들
내가 처음 문제를 풀려고 했던 방은 MIN을 이용해서 풀이를 하려고 했지만 생각 보다 내가 원하는 답이 나오지 못했다.
내가 했던 방법
-- 코드를 입력하세요
SELECT NAME
FROM
(
SELECT NAME, DATETIME, MIN(DATETIME) MIN_D
FROM ANIMAL_INS
) A
WHERE DATETIME = MIN_D
하지만 여기서 큰 문제점으로는 서브쿼리 문에서 정렬을 할 때
NAME이 DATETIME에 맞추어 같이 따라가지 않는 것이
문제 였으므로 내가 원하는 방법으로 하기 위해서는 아래와 같이
-- 코드를 입력하세요
SELECT NAME
FROM ANIMAL_INS
WHERE DATETIME = (SELECT MIN(DATETIME) FROM ANIMAL_INS)
WHERE절에 만 따로 서브 쿼리문을 주어서 필요한 자료만 가져오는 방식으로 필터링을 해주어야 한다는 것을 깨달았다.
또한 ORDER BY에서 LIMIT를 추가시켜 내림차 순위 중에서 1순위만 가져오는 방법 또한 있었다.
SELECT NAME
FROM ANIMAL_INS
ORDER by DATETIME ASC
limit 1;
N 번째 순위까지 구하기 위해서는 아래의 LIMIT를 사용하는게 더욱 유용한 것 같다.
NULL 처리하기
처음에 내가 생각했던 방법으로는 REPLACE를 써서 바꾸어 줄려고 했으나 NULL이라는 값은 글자가 아니라 말뜻 자체로 아무것도 가지고 있지 않은 값이기 때문에 REPLACE의 방법이 통하지 않았다.
그리하여 다음 방법으로 IF문을 이용하여 적용하는 방법이 였는데.
-- 코드를 입력하세요
SELECT ANIMAL_TYPE, IF(NAME = NULL, 'No name', NAME) NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
처음 작성했던 문장에서는 내가 원하는 생각대로 적용이 되지 않았다.
그리하여 이유를 찾아보니 NULL 값을 조건문에 넣기 위해서는 =를 사용하는 것이 아니라
NAME IS NULL이라는 문장으로 조건을 넣어주어야 인식을 할 수 있다는 것을 알았다.
그렇기에 완벽한 문장을 만들어 보면
-- 코드를 입력하세요
SELECT ANIMAL_TYPE, IF(NAME IS NULL, 'No name', NAME) NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
이것이 맞는 문장이 될 수 있다.
DATE 포맷 변경하기
알고 있는 내용이었지만 사용하는 방법을 잊어 다시 찾아보았던 명령어이다.
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME,'%Y-%m-%d')
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
DATE_FORMAT에서 괄호 안에 데이터와 표기 방법을 넣어주면 된다.
% Y,%m,%d,%e 년, 월, 일, 요일로 맞추어 넣어줄 수 있다.
조건문의 반복
앞과 같은 문제에서 두 가지의 조건문을 같이 적용시키기 위해서 IF문을 사용하려고 명령문안에 IN을 사용하여 만들었지만 제대로 작동을 하지 않았다.
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, IF(SEX_UPON_INTAKE IN ('Neutered%', 'Spayed%'), 'O', 'X') '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
이유를 알아보니 문장 속에 포함된 단어를 사용라기 위해서 LIKE를 사용하여야 하고 OR을 사용하여 둘 중 하나가 포함이 되면 조건을 발동하는 식으로 만들어야 했다.
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, IF(SEX_UPON_INTAKE LIKE 'Neutered%' OR SEX_UPON_INTAKE LIKE 'Spayed%', 'O', 'X') '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
아니면 다중 조건문을 이용하는 CASE 문을 이용하면 조건이 여러 가지 일 경우에 좋은 방법이다.
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME,
CASE WHEN SEX_UPON_INTAKE LIKE 'Neutered%' THEN 'O'
WHEN SEX_UPON_INTAKE LIKE 'Spayed%' THEN 'O'
ELSE 'X'
END '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
SUBSTR
문자 중에서 내가 원하는 글자만 빼오는 방법으로 SUBSTR이 있어 빼 온다음 그룹으로 묶어 카운트를 하면 된다.
-- 코드를 입력하세요
SELECT SUBSTR(PRODUCT_CODE,1,2) CATEGORY, COUNT(1) PRODUCTS
FROM PRODUCT
GROUP BY 1
ORDER BY 1
날짜 조건문
날짜를 조건문으로 걸어줄 때는 문자형식으로 걸어주어야 한다.
-- 코드를 입력하세요
SELECT ORDER_ID,
PRODUCT_ID,
DATE_FORMAT(OUT_DATE, '%Y-%m-%d'),
CASE WHEN OUT_DATE IS NULL THEN '출고미정'
WHEN OUT_DATE <= '2022-05-01' THEN '출고완료'
ELSE '출고대기'
END '출고여부'
FROM FOOD_ORDER
ORDER BY 1
앞의 내용처럼 WHEN OUT_DATE <= '2022-05-01'을 비교문을 사용할 때에는 ' '를 붙여서 사용을 해야 비교문이 적용이 가능하다는 것을 알았다.
반올림을 하는 방법
반올림을 하는 방법이 두 가지가 있는데
하나는 숫자형식으로 반올림을 할 것인가
하나는 문자형식으로 반올림을 할 것 인가이다.
먼저 숫자형식의 반올림은 ROUND를 사용해서 만들어주고
-- 코드를 입력하세요
SELECT ROUND(AVG(DAILY_FEE),0) AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'
문자형식의 반올림은 FORMAT을 이용하여 만들어 줄 수 있다.
-- 코드를 입력하세요
SELECT FORMAT(AVG(DAILY_FEE),0) AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'
가격대별 정리방법
내가 아는 방법으로는 CASE문을 이용하여 각 상황마다 조건을 주어서 만들어 주는 방식을 이용하였는데
-- 코드를 입력하세요
SELECT CASE WHEN PRICE < 10000 THEN '0'
WHEN PRICE < 20000 THEN '10000'
WHEN PRICE < 30000 THEN '20000'
WHEN PRICE < 40000 THEN '30000'
WHEN PRICE < 50000 THEN '40000'
WHEN PRICE < 60000 THEN '50000'
WHEN PRICE < 70000 THEN '60000'
WHEN PRICE < 80000 THEN '70000'
WHEN PRICE < 90000 THEN '80000'
ELSE '90000'
END 'PRICE_GROUP',
COUNT(1) 'PRODUCTS'
FROM PRODUCT
GROUP BY 1
ORDER BY 1
같은 답을 찾을 수는 있지만 숫자가 많아진다면 무식하게 늘이는 방법 밖에 없었습니다.
하지만 다른 작성자의 내용을 보고 깨달은 것으로
TRUNCATE 또는 ROUND 문을 이용하는 것입니다.
SELECT TRUNCATE(PRICE/10000,0)*10000 PRICE_GROUP, COUNT(*) PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP;
먼저
- PRICE/10000: PRICE 값을 10000으로 나누어 해당 상품의 가격을 10000으로 나눈 값으로 변환합니다. 이를 PRICE_GROUP으로 사용합니다.
- TRUNCATE(PRICE/10000,0): 10000으로 나눈 값을 TRUNCATE 함수를 사용하여 소수점 이하를 제거합니다. 따라서 각 상품의 가격을 10000 단위로 묶습니다.
- COUNT(*) PRODUCTS: 각 PRICE_GROUP에 해당하는 상품의 수를 세는 것입니다.
- GROUP BY PRICE_GROUP: PRICE_GROUP 별로 결과를 그룹화합니다.
- ORDER BY PRICE_GROUP: PRICE_GROUP의 오름차순으로 결과를 정렬합니다.
위와 같은 순으로 넘어가므로 만원 단위를 일일이 설정해 주지 않아도 쉽게 설정을 해줄 수 있다는 것을 배웠습니다.
DATE DATA 사용하기
-- 코드를 입력하세요
SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH) = 3 AND GENDER = 'W'AND TLNO IS NOT NULL
ORDER BY 1
YEAR(DATE_OF_BIRTH) : 년
MONTH(DATE_OF_BIRTH) : 월
DAY(DATE_OF_BIRTH) : 일
DAYNAME(DATE_OF_BIRTH) : 요일
DATE의 비교문을 사용할 때 굳이 LIKE 문을 사용하지 말고 년 월 일에 맞추어 설정해 줄 수 있다.
12시간의 첫 후기
하루가 빠르게 지나가는 것처럼 느꼈다.
엉덩이가 많이 아프므로 방석을 좋은 걸로 바꾸어 주는 게 좋다고 생각이 들었습니다.
그래도 SQL 문제를 풀이하면서 내가 원하는 방식으로 결과를 만들어낼 수 있다는 것이 아주 좋았습니다.
'AI 코딩 교육 TIL' 카테고리의 다른 글
2024-01-23 AI 코딩 TIL (0) | 2024.02.16 |
---|---|
2024-01-22 AI 코딩 TIL (0) | 2024.02.16 |
2024-02-16 AI 코딩 TIL (1) | 2024.02.16 |
2024-02-15 AI 코딩 TIL (0) | 2024.02.15 |
2024-02-14 AI 코딩 TIL (1) | 2024.02.14 |