
0. 개요
오늘은 SQL 에 대해서 배운 것들에 대해서 정리한다.
1. REPLACE, SUBSTRING, CONCAT
가공문 | 뜻 | 예제 |
REPLACE | 어떠한 값을 다른 값으로 변환합니다. REPLACE(바꿀 칼럼, 현재 값, 바꿀 값) |
SELECT ribbon_name "리본 목록", REPLACE(ribbon_name, '빨강', '파랑') "바뀐 목록" FROM product_orders WHERE ribbon_name like '%ribbon%' = 빨강 -- 리본 ----> 파랑 -- 리본 으로 변경 되어 있음 |
SUBSTRING (SUBSTR) |
원하는 글자만 골라 조회합니다. SUBSTR(조회 칼럼, 시작 위치, 글자 수) |
SELECT addr "원래 주소" SUBSTR(addr, 1, 2) "시도" = 첫번째 문장에서 2개만 FROM food_orders WHERE addr like '%경기도%' = 경기도 분당시 -- ---> '경기'만 출력 |
CONCAT | 원하는 문자와 칼럼을 하나로 합칩니다. CONCAT(문자,숫자, ...) |
SELECT restaurant_name "원래 이름" addr "원래 주소" CONCAT ('[', substr(혹은 substring)(addr,1,2),']',restaurant_name) "바뀐 이름" FROM food_orders WHERE addr like '&경기%' 출력 : [경기] 식당 이 |
2. IF, CASE WHEN 조건 구절
조건문 | 뜻 | 예제 |
IF | IF(조건, 조건 충족시 결과물, 조건 미충족시 결과물) --> 조건 충족하면 2번째 결과물, 미충족 시 3번째 결과물을 출력하시오. |
SELECT restaurant_name, cuisine_type "원래 음식 타입" IF(cuisine_type='Korean','한식','기타') "음식 타입" From food_orders --> 만약에 음식타입이 '한국'이면 '한식'이라고 출력하며, 아닌경우 '기타'로 출력합니다. 해당 카테고리(칼럼)은 "음식 타입"으로 기록합니다. |
CASE WHEN | CASE WHEN 조건 1 THEN 값(수식)1 WHEN 조건 2 THEN 값(수식)2 ELSE 값(수식)3 END --> 조건 1을 충족했을 때, 값 1을 출력하며,조건 2을 충족했을 때, 값 2을 출력하며, 그 것외에는 값 3을 출력합니다. END = 마무리 Else 값은 이외의 것은 조건 1, 조건 2가 아니라면 나머지를 출력하는 것. 그러나 조건 1, 조건 2 로 끝난다면 ELSE는 굳이 쓰지 않아도 된다. |
SELECT restaurant_name, cuisine_type AS "원래 음식 타입" CASE WHEN (cuisine_type='Korean') then '한식' Else '기타' End as "음식 타입" From food_orders --> 만약에 음식타입이 '한국'이라면 한식으로 출력하며 나머지는 '기타'로 출력합니다. 해당 카테고리는 "음식 타입"으로 카테고리로 묶습니다 ------------------------------------------------------------------- SELECT order_id, price, quantity CASE WHEN quantity=1 then price When quantity>=2 then price/quantity end "음식 단가" FROM food_orders --> 만약에 물건의 갯수가 1개라면 물건값을 1개 값 그대로 출력하며, 물건값이 2개 이상이라면 물건값/물간양을 나눠서 1개의 물건값으로 출력하시오. 이 카테고리는 "음식 단가"로 묶습니다. |
[실습 중에 좀 어려웠던 거] GROUP BY 를 사용한 쿼리 절
서울 지역의 음식 타입별 평균 음식 주문금액 구하기 (출력 : ‘서울’, ‘타입’, ‘평균 금액’)
필요한 정보 : 주소, 음식 타입, 금액(addr, price, cuisine_type)
조건부 '서울'만 출력할 것
SELECT substr(addr,1,2) "시도",
cuisine_type "음식 종류",
AVG(price) "평균 금액"
FROM food_orders
WHERE addr like '%서울%'
GROUP BY 1,2
GROUP BY 에 쓰이는 숫자의 의미 = 특정 열을 기준으로 데이터를 그룹화 하는 역할
현재 GROUP BY 1,2는 첫번째, 두번째 열의 데이터를 그룹화 하시오 라는 뜻이다.
1 = substr(addr,1,2) / 2 = cuisine_type
[내일 제출해야하지만 오늘 안풀려서 계속 풀어보는 SQL 문제]
6번.) 중복 카운트 '동명 동물수 찾기'
Select name, count(name) as 'count'
From animal_ins
Where not 'null'
group by name
Having count (name) >= 2
그래서 일단은 써봤다.
SELECT Name, Count(Name)
From animal_Ins
Group by name
이것도 안된다다... 끙.... 내가 아는 선에선 이게 전부인데.
그렇다고 IF 절을 쓰기에는 조건을 쓰기엔 까다롭다.
IF( COUNT(NAME)>=2, 뭐가 들어가지?, 뭐가 들어가지...?) 일단은 GROUP BY는 맞지만 GROUP BY는 전부가 아닌거 같아서 뭔가 이상했다. 거기서 알게 된 'HAVING COUNT'는 현재 배운 3주차 수업에서는 아직 모르는 지식이다.
일단은 HAVING 절은 GROUP BY와 함께 사용하는 필터 조건이라고 할 수 있다고 나왔다. 지금 가장 큰 문제가 이름이 2개 이상 중복되는 이름을 찾아야 하는데 엉뚱하게도 1개 이상만 주르륵 나온다. GROUP BY 썼는데.
어.. 찾아본 바에 의하면 HAVING 절은 WHERE 절처럼 조건을 추가할 수 있지만 계수 함수(SUM,AVG,>= ...)을 쓸 수 있는 모양인 거 같다. 일단은 다시 한번 시도 해보자..! ㅜㅜ
SELECT NAME, COUNT(NAME) AS 'COUNT'
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) >= 2
일단 이렇게 해봤다. NAME 칼럼하고, 이름의 갯수를 세주세요. 라고 요청한 상태
NAME 칼럼을 주르륵 내리고, HAVING 절에는 COUNT 된 이름 중 2개 이상의 친구들만이 나오게 해주세요....? 라고
나는 부탁해봤다.

출력에 따르면 일단 이건데, 맞을까..? 아, 젠장 ㅜㅜ 이것도 오답이래 ㅜㅜ!!!!
뭐가 부족한거지?? 약간 모르겠어서 다시 다른 곳에서 자료를 이곳 저곳 뒤지다가 좀 찾아본 내용이 있었다.
"WHERE [칼럼명] IS NOT NULL" = 칼럼의 값이 비어있지 않은 튜플을 조회하는 연산자...? 아 그런건 모르겠다...
별개 다 쏟아졌다. 결과 값은 저게 맞는데 일단 저게 답은 아니란다.
SELECT NAME, COUNT(*) cnt
FROM ANIMAL_INS
WHERE NAME is not null
GROUP BY name
Having count(name)>1
Order by name ;
여기서 코드를 좀 쳐내도 답이 되더라구요. 여기서 WHERE NAME IS NOT NULL 은 꼭 안써도 되서 일단 빼봤다.
그래도 정답이었다.
SELECT NAME, COUNT(*) cnt
FROM ANIMAL_INS
GROUP BY name
Having count(name)>1
Order by name ;
일단 이것도 정답. 근데 여기서 ORDER BY를 빼면 정답이 아니란다.. 왜 그러지...? 설마 이름순으로 정리하라는 게...
오름차 순으로 정리하라고 한 거였나? 그건 좀 고민이었다. 아.. 있다가 여쭤봐야겠다. 메모...
8번 ) 상위 N개의 데이터 레코드
상위 N개의 데이터 중 1개만 레코드를 하라고 하는 문제다. 1..개만...? 그게 가능한가?
https://bom-rosy.tistory.com/13
[𝟐𝟓.𝟎𝟐.𝟏𝟕] 𝐓𝐈𝐋 𝐍𝐎𝐓𝐄 𝟐
0. 개요오늘은 SQL에 대해서 배운 것들에 대해서 정리한다.1. SQL 필터링 기능 추가조건문, 필터 문구의미사용 방법( ex.예시 )BETWEEN - AND -between A and BA와 B 사이의 값이 있는 것들은 모두 출력(즉, A와
bom-rosy.tistory.com
https://bom-rosy.tistory.com/10
[𝟐𝟓.𝟎𝟐.𝟏𝟒] 𝐓𝐈𝐋 𝐍𝐎𝐓𝐄 𝟏
0. 개요오늘은 SQL 의 아주 기본적인 내용들에 대해서 정리해보았다.1. SQL데이터베이스에서 원하는 정보를 뽑기위해서 사용하는 언어 중 하나 (파이썬, 자바 스크립트 등)2. 데이터 베이스와 테이
bom-rosy.tistory.com
내가 봤던 노트를 뒤적거려봐도. 저 위의 메모들을 봐도 제한해주는 함수는 없는 거 같다. 혹시 엑셀에는 있나...?
쭉 뒤져봐도 없다. 보통은 저러면 필터 기능을 하는 함수를 쓰니까. 필터 기능이 있긴 하지만 값은 1개만 출력할 수 있는 건 아니다.
SELECT Name
From Animal_ins
Having max (datetime)
일단 아까 아는 상식을 동원해서 풀어본건데, 절대 그럴리가 없다. 이건 답이 아니다... 절대로..
내가 코딩을 몰라도 이건 답이 이상하다.
이럴때 값을 제한해서 쓰는 게 LIMIT 함수라고 한다.
LIMIT 함수 = 수 많은 데이터 중에서 보고 싶은 함수를 제한할 때 쓰는 함수 식
SELECT 칼럼명
FROM 테이블명
LIMIT 갯수
SELECT 컬럼명
FROM 테이블명
LIMIT 개수 OFFSET 시작 인덱스
SELECT 칼럼명
FROM 테이블명
LIMIT 시작 인덱스, 개수
이걸 생각하면 다음과 같이 뽑아 낼 수 있었다. 일단 답은 이거 Jack 으로 단일로 나와야 한다.

SELECT Name
From Animal_INS
Order BY Datetime
Limit 1
그러한 이유로 1개의 이름만 남겨두고 최근 시간대의 것을 조회하라는 명령을 하면 다음과 같이 나온다.
ORDER BY의 경우에는 ASC가 없어도 알아서 오름차순이니까 최신 내용이니까 문제 없으므로 잭이 아마도 최근에 들어온 동물로 추정된다.
10번 어린동물 찾기
이번에는 많은 좋건 중에 'Aged' 된 동물을 제외한 Animal_ID 랑 Name 만 나오는 데! Intake_condition은 또 나오면 안된다고 한다. 아.. 또 리밋을 써야하나 고민을 했다.
일단은 첫번째 답변. 머리가 안돌아가서 이렇게 써봤다.
SELECT ANIMAL_ID,NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION IN ('NORMAL','SICK')
결국에는 이름이랑 동물들을 출력하고 상태 좋은 얘들만 출력하면 되는 거 아닌가...? 생각헀는데 이 방식은 아니란다.
음.. 그럼 두번째는 이렇게도 제출해봤다.
Select animal_id, name
From animal_ins
Where intake_condition <> 'Sick'
Order by animal_id, name
그럼 '아픈 상태'는 아닌데 이름이랑 동물을 출력하는 것. 근데 내가 까먹은게 있었다. Aged = Sick 가 아닌데 자꾸 둘을 동일하게 데이터 처리를 했다. 아.. 이런;
Select animal_id, name
From animal_ins
Where intake_condition <> 'Sick'
Group by animal_id, name
Order by animal_id, name
그래서 GROUP BY 까지 넣어서 계산 했을 떄에는 이게 다른 구가 문제가 아니고 'Sick'가 문제인 걸 나중에야 깨달았다. 아.. 세상에나.....;; 그래서 당장 'Sick ----> Aged'로 바꾸었다. 이런 바보같은 실수를... ㅜ
Select animal_id, name
From animal_ins
Where intake_condition <> 'Aged'
Group by animal_id, name
Order by animal_id, name
그래서 일단은 돌아가는 코드 중 하나는 이거!
결론적으로 10번까지 코드카타 10번 문제까지는 어찌저찌 풀었다. 겨우 이걸로 지치는데 11번은 어떻게 될지 모르겠다.
오늘 공부하면서 정말 어려웠다.
새롭게 파이썬도 공부했는데 아직까지는 기초 단계인데도 어떻게 해야할지 막막하다.
파이썬은 지금 막 입문한 시점에서 어떻게 풀어야하는지 계속 듣고 있기는 하다.
내일부터 SQL 4주차 정리랑 파이썬 목차를 정리해보려고 한다.
'𝐓𝐈𝐋 (𝐅𝐨𝐫 𝐂𝐚𝐦𝐩) > 𝐂𝐎𝐃𝐈𝐍𝐆 (𝐒𝐐𝐋, 𝐏𝐘𝐓𝐇𝐎𝐍)' 카테고리의 다른 글
[𝟐𝟓.𝟎𝟐.𝟐𝟎] 𝐓𝐈𝐋 𝐍𝐎𝐓𝐄 𝟓 (0) | 2025.02.20 |
---|---|
[𝟐𝟓.𝟎𝟐.𝟏𝟗] 𝐓𝐈𝐋 𝐍𝐎𝐓𝐄 𝟒 (0) | 2025.02.19 |
[𝟐𝟓.𝟎𝟐.𝟏𝟕] 𝐓𝐈𝐋 𝐍𝐎𝐓𝐄 𝟐 (0) | 2025.02.17 |
[𝟐𝟓.𝟎𝟐.𝟏𝟒] 𝐓𝐈𝐋 𝐍𝐎𝐓𝐄 𝟏 (0) | 2025.02.14 |
[𝟐𝟓.𝟎𝟐.𝟏𝟐] 𝐓𝐈𝐋 𝐒𝐓𝐀𝐑𝐓 𝐍𝐎𝐓𝐄 (0) | 2025.02.12 |