
1) 문법 순서
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
2) 실행 순서
FROM : 조회 테이블 확인
ON : 조인 조건 확인
JOIN : 테이블 조인(병합)
WHERE : 데이터 추출 조건 확인
GROUP BY : 특정 컬럼 그룹화
HAVING : 그룹화 시킨 후 각 그룹에 적용될 조건
SELECT : 데이터 추출
DISTINCT : 중복 제거
ORDER BY : 데이터 순서 정렬
LIMIT
*** Alias(as) 는 FROM, SELECT, ORDER BY 절에서만 사용 가능
그래서 FROM 절에서 정한 ALIAS를 이후에도 사용할 수 있음.
SELECT 절에서 사용한 ALIAS를 ORDER BY 절에서 사용할 수 있는 것과도 같음
*** tip : SQL 작성시 실행 순서대로 작성하기.
SELECT -> FROM -> WHERE 이 아니라
FROM -> WHERE -> SELECT 순으로 적으면 좋음. 이후에 성능적으로 튜닝할 수 있는 요소를 발견하기 용이하기 때문. 덜 헷갈린다고 함.
출처 : https://jaehoney.tistory.com/191
SELECT ANIMAL_ID,NAME,DATETIME FROM ANIMAL_INS
ORDER BY NAME ASC, DATETIME DESC
SELECT NAME FROM ANIMAL_INS
ORDER BY DATETIME LIMIT 1
SELECT COUNT(*) AS USERS FROM USER_INFO
WHERE AGE >= 20 AND AGE <= 29 AND YEAR(JOINED) = 2021
SELECT COUNT(*) AS USERS FROM USER_INFO
WHERE JOINED LIKE '2021%' AND AGE>=20 AND AGE<=29
SELECT * FROM FOOD_PRODUCT
ORDER BY PRICE DESC
LIMIT 1
OR
SELECT * FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT)
SELECT BOOK_ID,
DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLIC_DATE
FROM BOOK
WHERE CATEGORY = '인문'
AND YEAR(PUBLISHED_DATE)='2021%'
ORDER BY PUBLIC_DATE
*** Data_format(적용할 날짜, '적용시킬 포맷')
'%Y-%m-%d' => 2021-10-24
Y = 2021 / y = 21
M = October / m = 10
D = 24th / d = 24
*** 몇년도 조건으로 데이터 구하기
where YEAR(public_date) = '2021'
https://school.programmers.co.kr/learn/courses/30/lessons/59415
SELECT DATETIME
FROM ANIMAL_INS
ORDER BY DATETIME DESC LIMIT 1
의도 )
SELECT MAX(DATETIME)
FROM ANIMAL_INS
성능은 이게 더 좋다.
SELECT MIN(DATETIME) FROM ANIMAL_INS
아.. 낚시 잘하네 프로그래머스
SELECT COUNT(*) FROM ANIMAL_INS
처음에 COUNT(NAME)으로 했는데 NAME이 NULLABLE TRUE라서 한 케이스 빗겨나가 틀렸다.
전체 행으로 바꾸니 맞았네.. 그 전에 입력했던 ANIMAL_ID는 왜 안되나 했더니 오타였다.ㅎ
오타 조심하고 조건 잘보기
SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS
*** COUNT 는 NULL 안셈
COUNT 할 때 중복 제거하고 싶으면 COUNT(DISTINCT, 컬럼명) 이게 제일 깔금함.
참고 : https://chanhuiseok.github.io/posts/db-4/
조건 잘 확인하고 순서 기억하면서 풀기
SELECT B.INGREDIENT_TYPE, SUM(A.TOTAL_ORDER) AS TOTAL_ORDER
FROM FIRST_HALF AS A, ICECREAM_INFO AS B
WHERE A.FLAVOR = B.FLAVOR
GROUP BY B.INGREDIENT_TYPE
ORDER BY TOTAL_ORDER;
https://school.programmers.co.kr/learn/courses/30/lessons/59041
GROUP BY절의 조건을 줄 땐 HAVING 에서 조건을 주고
그룹함수는 NULL 값을 고려하지 않는다.
SELECT NAME, COUNT(NAME) AS 'count'
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) >= 2
ORDER BY NAME;
시간대별로 동물 수 구하기인데 생각보다 어려웠음.
시간 함수를 몰라서 어려웠던 것.
https://school.programmers.co.kr/learn/courses/30/lessons/59412
SELECT HOUR(DATETIME) AS 'HOUR', COUNT(HOUR(DATETIME)) AS 'COUNT'
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR BETWEEN '9' AND '19'
ORDER BY HOUR(DATETIME);
이것도있지만 이 경우엔 WHERE 절로 조건을 적어주는 것이 더 좋다.
SELECT HOUR(DATETIME) AS 'HOUR', COUNT(HOUR(DATETIME)) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN '9' AND '19'
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME);
날짜, 시간, DATEFORMAT 잘 활용해보자.
https://school.programmers.co.kr/learn/courses/30/lessons/131530
TRUNCATE(숫자,자리수) 일의자리 이상 -1,-2... / 소수점 1,2....
SELECT TRUNCATE(PRICE, -4) AS PRICE_GROUP, COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP;
하 진짜 한끝차이로 틀렸다.
다중조건.. 잊지말자
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE FAVORITES
IN (SELECT MAX(FAVORITES)
FROM REST_INFO GROUP BY FOOD_TYPE)
ORDER BY FOOD_TYPE DESC;
처음엔 이렇게 풀었는데 MAX FAVORITES 값이 중복된 값이 있어서 어떻게 해야되나 온갖 고민했는데
결국 답은 엄청 쉽게 풀었다.
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) // 이 부분을 묶어주면 됨.
IN (SELECT MAX(FAVORITES)
FROM REST_INFO GROUP BY FOOD_TYPE)
ORDER BY FOOD_TYPE DESC;
비교해줄 값도 묶어주면 된다는 것. 하하