[230125] 멋쟁이사자처럼 AI SCHOOL 8기 [특강] SQL_이범재강사님' 복습

조세연·2023년 1월 25일
0

멋사 AI SCHOOL 8기

목록 보기
22/35
post-thumbnail

📝Today I learned

🚀 TIL 목차 🚀

  • 함수
    - 숫자 함수
    - 문자열 함수
    - 날짜&시간 함수
  • 예제 오답노트

[특강] SQL 기초

1) 함수

숫자 함수

🔹 ROUND 🌟🌟🌟
: 해당 항목 레코드의 숫자를 반올림하여 출력하는 함수

SELECT ROUND(100.56789,2)
# 100.57

.
🔹 TRUNC
: 해당 항목 레코드의 숫자를 내림하여 출력하는 함수

SELECT TRUNC(100.56789,3)
# 100.567

.
🔹 MOD 🌟
: 해당 항목 레코드의 숫자를 나누기하여 나머지를 출력하는 함수

SELECT MOD(10, 3)
# 1

.
🔹 POWER
: 해당 항목 레코드의 숫자를 제곱하여 출력하는 함수

SELECT POWER(2, 5)
# 32

.
🔹 SQRT
: 해당 항목 레코드의 제곱근을 출력하는 함수

SELECT SQRT(4)
# 2

.
.

문자열 함수

🔹 SUBSTR 🌟🌟🌟
: 문자열의 일부만 출력

: 문자열 인덱스 → 1부터 시작

SELECT SUBSTR('hello world',1,5)
# hello

SELECT SUBSTR('hello world',3)
# llo world

.
🔹 LEFT 🌟🌟
: 문자열을 왼쪽에서 얼만큼 자를 지 설정한 후에 조회

SELECT LEFT('064-000-0000',3)
# 064

.
🔹 RIGHT 🌟🌟
: 문자열을 오른쪽에서 얼만큼 자를 지 설정한 후에 조회

SELECT RIGHT('064-000-0000',4)
# 0000

.
🔹 CONCAT 🌟🌟🌟
: 여러 문자열을 하나로 연결

SELECT CONCAT('Charlie', '-', 'Spring')
# Charlie-Spring
  • 문자열을 연결하는 또 다른 방법
    : 연결 연산자 '||' 이용
SELECT 'Charlie' || '-' || 'Spring'
# Charlie-Spring

.
🔹 LOWER
: 문자열을 모두 소문자로 변경

SELECT LOWER('ABC')
# abc

.
🔹 UPPER
: 문자열을 모두 대문자로 변경

SELECT UPPER('abc')
# ABC

.
🔹 INITCAP
: 앞에 문자만 대문자로 변경

SELECT INITCAP('abcde')
# Abcde

.
🔹 REPLACE 🌟🌟🌟
: 바꾸고 싶은 값으로 대상 값을 교체

SELECT REPLACE('hello world', 'world', 'sql')
# hello sql

.
🔹 LENGTH 🌟🌟
: 문자열의 길이를 출력

SELECT length('hello world')
# 11

.
🔹 INSTR 🌟🌟🌟
: 문자열의 위치를 출력

# 이메일에서 아이디 부분만 추출하기
SELECT LEFT(email, INSTR(email, '@') - 1)
FROM `thelook_ecommerce.users`;

.
🔹 IFNULL 🌟🌟
: 해당 컬럼에 NULL값이 있는 경우 다른 값으로 채워넣을 수 있음

SELECT IFNULL(name, 'No name')
FROM `animal_info`

.
🔹 ASCII
: 아스키코드 번호로 리턴하는 함수

SELECT ASCII('A')
# 65

.
.

날짜&시간 함수

🔹 CURRENT_DATE()
: 현재 날짜 출력 (Google Bigquery)

SELECT CURRENT_DATE()
# 2023-01-25

.
🔹 CURRENT_DATETIME()
: 현재 시간 출력

SELECT CURRENT_DATETIME()
SELECT CURRENT_DATETIME('Asia/Seoul') # 한국시간을 알고 싶다면

.
🔹 DATE()
: 날짜 객체 생성

SELECT DATE(2023,1,1)
SELECT DATE('2023-1-1')
# 2023-01-01
# 특정 국가 시간으로 출력하고 싶다면 timezone을 설정
SELECT DATE('2023-1-1', 'Asia/Seoul')

.
🔹 DATETIME()
: 시간 객체 생성

SELECT DATETIME(2023, 1, 25, 05, 30, 00)
# 2023-01-25T05:30:00

.
🔹 EXTRACT() 🌟🌟🌟
: 날짜(연, 월, 일 등등) 데이터를 추출할 때 사용

SELECT EXTRACT(YEAR FROM DATE '2023-1-1');
# 2023
SELECT EXTRACT(MONTH FROM DATE '2023-1-1');
# 1

.
🔹 FORMAT_DATE(format_string, date_expr) 🌟🌟🌟
: 지정된 format_string에 따라 날짜(date_expr)를 변경 (Google Bigquery)
🚨 mySQL은 DATE_FORMAT(date_expr, format_string)

-- %x는 날짜를 MM/DD/YY 형식으로 표현
SELECT FORMAT_DATE('%x', DATE '2023-1-25') AS US_format;
# 01/25/23

SELECT FORMAT_DATE('%b-%d-%Y', DATE '2023-1-25') AS US_format;
# Jan-25-2023

.
🔹 FORMAT_DATETIME(format_string, datetime_expression)
: 지정된 format_string에 따라 시간(datetime_expression)를 변경 (Google Bigquery)

SELECT FORMAT_DATETIME('%y/%m/%d %T', DATETIME '2023-1-25 15:30:00') AS KR_format;
# 23/01/25 15:30:00

.
🔹 DATE_DIFF(date_expression_a, date_expression_b, date_part)
: 두 날짜 간에(date_expression_a - date_expression_b) 지정된 date_part간격의 정수를 반환
: date_part는 YEAR, MONTH, DAY 등 지정 가능
: 첫 번째 날짜가 두 번째 날짜보다 이전이면 음수로 출력

SELECT DATE_DIFF(DATE '2023-9-3', DATE '2023-1-1', DAY) AS days_diff;
# 245

SELECT '2023-9-3'-'2023-1-1'
# 0-0 245 0:0:0

.
🔹 DATE_ADD, DATE_SUB
: 지정된 시간 간격을 추가 및 빼는 함수

SELECT DATE_ADD(DATE '2023-1-25', INTERVAL 5 DAY)
# 2023-01-30

SELECT DATE_SUB(DATE '2023-1-25', INTERVAL 5 YEAR)
# 2018-01-25

.
🔹 DATETIME_ADD, DATETIME_SUB
: 지정된 시간 간격을 추가 및 빼는 함수

SELECT DATETIME_ADD(DATETIME "2023-12-25 15:30:00", INTERVAL 10 MINUTE)
# 2023-12-25T15:40:00

2) 예제 오답 노트

.
1. SQL 연습문제 6-5
<문제>
회원(users) 테이블에서 2020년 7월 1일 부터 2020년 7월 10일까지 가입한 회원정보를 조회하세요.

SELECT * 
FROM `thelook_ecommerce.users`
WHERE created_at BETWEEN '2020-07-01'AND '2020-07-11';

👉 BETWEEN '2020-07-01'AND '2020-07-10'이라고 하면 7월 10일 00시 00분 00초이기 때문에 10일이 포함되지 않음. 그래서 10일을 포함하려면 11일로 적어줘야 함.
.
2. 프로그래머스 문제 6-1 (level 1)
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/132201
<문제>
PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, 'NONE'으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.

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 ASC

👉 IFNULL(필드명, NULL값을 대체할 문자)
👉 TLNO 다시 지정해주는 것도 잊지 말 것
.
3. 프로그래머스 문제 6-4 (level 1)
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/144853
<문제>
BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.

SELECT
    BOOK_ID,
    DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK
WHERE EXTRACT(YEAR FROM PUBLISHED_DATE) = 2021
    AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE

👉 mySQL에서 날짜 포맷 변경할 때
: DATE_FORMAT(필드명, '%Y-%m-%d') → 필드명 먼저다. 순서주의
👉 Y: 2021, y: 21

❗이것만은 외우고 자자 Top 3

📌 BETWEEN 2023-01-25 AND 2023-01-30 이라면 2023-01-30 00:00:00까지 이므로 30일까지 포함하고 싶다면 2023-01-31이라고 적어야함!!

📌 ROUND(숫자, 소수점 아래 자릿수) -> 소수점 아래 2자리 "까지" 나타내고 싶다면 2

📌 SUBSTR(문자열, 시작 인덱스, 출력할 문자열 개수) : 문자열의 일부만 출력
INSTR(문자열, 위치를 찾을 문자) : 문자의 위치를 출력

🌟데일리 피드백

1. 오늘의 칭찬&반성

연휴가 끝나서 그런지 아침에 심한 몸살을 앓았다.. 오전에 무슨 정신으로 수업을 들었는지 모르겠다. 오후에 약을 급하게 찾아서 먹었는데 조금 나아졌다. 몸 컨디션 때문에 수업을 제대로 참여하지 못해서 속상했다. 앞으로 컨디션 관리를 더 잘해야겠다.

2. 내가 부족한 부분

조건을 WHERE에서 걸어야 할 지, HAVING에서 걸어야 할 지 아직 애매하다. 멘토님께 여쭤봐야겠다.

3. 내일의 목표

몸 회복해서 온전한 정신으로 수업듣기. 내가 부족한 부분 멘토님께 질문하기

profile
HR Analyst가 되고 싶은

0개의 댓글