Today's Goals
1. SQL 기억 되살리기 - 코드카타 레벨2 100%, SQL 강의(월,화,수) 복습, SQL 강의 4주차
1. SQL 기억 되살리기 - 코드카타 레벨2 (프로그래머스 코딩 연습), SQL 강의
오늘은 SQL 올-인. (잭팟은 아닌듯 ㅎ)
코드카타 SQL
[특정 년-월만 필터링하기]
SELECT MCDP_CD AS "진료과 코드",
COUNT(*) AS "5월예약건수"
FROM APPOINTMENT
WHERE YEAR(APNT_YMD)='2022' AND MONTH(APNT_YMD)='05'
GROUP BY MCDP_CD
ORDER BY `5월예약건수` ASC,`진료과 코드` ASC
- 2022년 5월 예약 건수를 구하는 문제였다. 위는 내가 사용한 방법. 하지만 다른 방법이 더 있다.
- 아 그리고 ORDER BY 에서 별칭을 쓰려면 별칭 그대로 혹은 ``(백틱)을 써야함(MySQL 기준)
WHERE APNT_YMD LIKE '2022-05%'
WHERE DATE_FORMAT(APNT_YMD, '%Y-%m')='2022-05'
WHERE LEFT(APNT_YMD, 7)='2022-05'
[IN에 대한 오해]
- '통풍시트, 열선시트, 가죽시트 중 하나의 옵션이라도 포함하고 있는 차량을 조회하고 싶다' 는 문제
SELECT CAR_TYPE, COUNT(CAR_ID) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS IN ('통풍시트','열선시트','가죽시트')
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC
- 위의 쿼리가 틀린 이유는 무엇일까?
- IN이라는 것은 컬럼값이 IN 뒤의 리스트 중 하나와 정확히 일치할 때만 필터링 되는 기능이다.
- 하지만 해당 테이블의 옵션 컬럼에는 한가지의 옵션만 있는 것이 아닌 N개의 모든 옵션이 작성되어 있다.
- 때문에 애초에 일치하는 경우가 없는 것
SQL 강의
[DISTINCT]
- SELECT 절에만 쓸 수 있다
[LIMIT의 두가지 사용법]
- 상위 5개 추출하기와 같은 경우에 사용
- LIMIT offset,count : offset은 건너뛸 행의 수(실제 반환 데이터는 offset+1 행부터 시작), count는 건너 뛴 후 가져올 행의 수이다. 즉, LIMIT 뒤에 두개의 숫자가 오면 n행 건너뛰고 n+1행 부터 m개 행 가져오기 라는 뜻
[와일드 카드]
- 많이 쓰는 와일드 카드는 %, _으로 LIKE와 함께 사용한다
- %는 몇글자이든 상관 없단 것, _는 한글자라는 것
- 더 다양한 와일드 카드와 사용 예시 : https://audgnssweet.tistory.com/65
[<>와 !=는 같은 뜻]
[연산의 우선순위는 ()로 해결하자]
- 사칙연산을 할 때 괄호()를 사용하여 계산의 우선순위를 설정하듯 SQL도 괄호()로 연산의 우선순위를 부여한다.
SELECT *
FROM employees
WHERE (age >= 30 AND city = 'Seoul') OR (job_title = 'Manager' AND city = 'Busan');
[CASE]
- 문자 변환 뿐만 아니라 새롭게 계산된 값을 컬럼으로 생성할 수 있음(구간에 따른 수수료 금액 계산 등)
-- 급여 수준에 따라 보너스를 계산
SELECT name, salary,
CASE
WHEN salary >= 5000000 THEN salary * 0.2
WHEN salary >= 3000000 AND salary< 5000000 THEN salary * 0.1
ELSE salary * 0.05
END AS bonus
FROM employees;
- ELSE는 생략 가능하지만, 모든 조건을 다루지 않을 경우 기본값을 지정하기 위해 사용하는 것이 좋다
[DBeaver 단축키]
[지금 짠 쿼리가 맞는지 확인해보고 싶은데! RAND()]
- RAND 함수는 0 이상 1 미만의 난수(예: 0.456)를 생성
- ORDER BY와 함께 사용하면 각 행마다 랜덤한 값을 생성한 후 이를 기준으로 정렬. 이후 LIMIT으로 원하는 갯수만큼 샘플링하는 효과
-- 랜덤하게 5개의 행 샘플링
SELECT *
FROM employees
ORDER BY RAND()
LIMIT 5;
-- 나이가 30 이상인 직원 중 랜덤하게 3명 추출
SELECT *
FROM employees
WHERE age >= 30
ORDER BY RAND()
LIMIT 3;
- 메모리 사용 증가, 성능 저하 등의 한계가 있으므로 10만 행 이하에만 사용하자!
[서브쿼리]
- FROM 또는 WHERE 구문에서 추가적으로 하나의 완전한 쿼리가 필요한 경우.
- 말로 하면 절대 모른다. 사례를 많이 경험하자
- 기본 사용법은 아래
select column1, special_column
from
( /* subquery */
select column1, column2 special_column
from table1
) a
select column1, column2
from table1
where column1 = (select col1 from table2)
[JOIN]
- 엑셀의 VLOOKUP과 유사하게 생각하면 된다. 특정 컬럼 기준으로 두 테이블 합치기
- left join : a 에 있는 정보가 b 에 없더라도 컬럼을 비운채로 결합
inner join ; a 에 있는 정보가 b 에 없다면 결합된 테이블에서 빠짐 - 기본 사용법은 아래
-- LEFT JOIN
select 조회 할 컬럼
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명
-- INNER JOIN
select 조회 할 컬럼
from 테이블1 a inner join 테이블2 b on a.공통컬럼명=b.공통컬럼명
- 합쳐줄 때, a의 공통 컬럼명과 b의 공통 컬럼명은 달라도 상관없음. 고객ID-고객아이디 기준으로 합치는 것 처럼
'데이터 부트캠프 - Today I Learned' 카테고리의 다른 글
[스파르타 내일배움캠프 / 데이터 분석 트랙] WIL(Weekly I Learned)_1주차 (0) | 2024.12.01 |
---|---|
[스파르타 내일배움캠프 / 데이터 분석 트랙] TIL(Today I Learned)_1주차_24.11.29 (1) | 2024.11.29 |
[스파르타 내일배움캠프 / 데이터 분석 트랙] TIL(Today I Learned)_1주차_24.11.27 (0) | 2024.11.27 |
[스파르타 내일배움캠프 / 데이터 분석 트랙] TIL(Today I Learned)_1주차_24.11.26 (0) | 2024.11.26 |
[스파르타 내일배움캠프 / 데이터 분석 트랙] TIL(Today I Learned)_1주차_24.11.25 (0) | 2024.11.25 |