
숙제 검사 시간~~~!
내문제 풀이!
SELECT DATE
from basic.users u
where date(date) > date('2023-01-01')
해설!
select game_account_id, game_actor_id, serverno
from basic.users
wheredate>'2023-01-01'
;
해설에 date를 보면 뭔가 다른걸 느낄 수 있을 것이다.
sql에서는 "예약어"라는 기능이 있는데
흔히 쓰는 select / from / where 이런 언어가 예약어이다.
date 도 예약어인데 저런 작은 따음표와 비슷한 느낌의 저것이
나는 예약어를 부르는 게 아니고 콜론의 이름을 부른거야~~ 하는 표시이다.
맥북에서는 옵션 + 탭 위에 ~ 표시 ````
문제 3번
4. date 컬럼을 yyyy-mm 형태로 바꾸고, 컬럼이름을 m 으로 지정해주세요.
game_account_id, game_actor_id 를 추출하되, 월을 기준으로 오름차순
월이 같을 경우 game_actor_id 를 내림차순으로 정렬해주세요.
select distinct substr(date,1,7)as m, game_account_id, game_actor_id
또는 date_format(date, '%Y-%m')
from basic.users
order by substr(date,1,7) asc, game_actor_id desc
distinct >> 중복없이 나오는 것
substr >> substr ( 열이름,몇번부터,몇번까지끊겠다)
1️⃣ SELECT 뒤 기준컬럼 작성
2️⃣집계함수(COUNT, MAX, MIN, AVG, SUM) 작성
3️⃣ WHERE 절 뒤 GROUP BY 기준컬럼 작성 (WHERE 절은 생략 가능합니다.)
⚠️주의할 점⚠️: 1️⃣, 2️⃣번 작성 후, 3️⃣번을 작성하지 않을 경우 에러가 발생됩니다.
그 이유는, 데이터를 SELECT할 때, 2️⃣번 집계함수는 여러 데이터로부터 하나의 행을 반환하지만, 1️⃣번 기준컬럼은 N 개의 값을 반환하기 때문에, 3️⃣번 GROUP BY 절을 사용하여 기준컬럼 당 값 1개를 반환 할 수 있도록 명시해야 합니다.
✨여기서 잠깐! SQL 의 작동순서를 기억하고 계신다면, 이해에 도움이 될 거예요!
select 기준컬럼, 집계함수(조건컬럼을 기준으로 여러개의 집계함수 동시사용 가능)
from 테이블명
where 조건 #(생략가능)
group by 기준컬럼
;
select 기준컬럼, 집계함수(조건컬럼을 기준으로 여러개의 집계함수 동시사용 가능)
from 테이블명
where 조건 #(생략가능)
;
Having절은 GROUP BY에 의한 결과를 필터링 할 때 사용됩니다.
SQL 구문에서는 GROUP BY 절 뒤에 위치해요.
데이터 필터링이라는 기능을 가지고 있는 WHERE 과의 차이점은 아래와 같아요.
WHERE절은 GROUP BY 전
데이터를 기준으로 필터링을 한다면,
HAVING절은 GROUP BY 후
결과값을 기준으로 데이터를 필터링합니다. 차이점을 꼭 기억해주세요!
select 기준컬럼, 집계함수(조건컬럼을 기준으로 여러개의 집계함수 동시사용 가능)
from 테이블명
where 조건 #(생략가능)
group by 기준컬럼
having 조건식
;


사실 이건 대체 될 수도 있다
나이 > 문동은 나이
스칼라 서브쿼리- SELECT 절에서 사용
- 하나의 컬럼처럼 사용
- 스칼라 서브쿼리 이용을 위해서는, 서로 다른 테이블이 필요합니다.
THEGLORY2는 아래와 같이 생겼어요! 눈치채셨겠지만, THEGLORY 테이블에 있는 이름이 모두 있지는 않죠 ? 😄

중첩 서브쿼리 실습
theglory 의 이름과 theglory2 테이블의 이름이 일치하는 경우를 count 하여
#same_name_cnt 컬럼으로 반환
theglory 의 이름과 theglory 테이블의 이름이 일치하는 경우의 결제금액을 sum 하여
#same_name_sumamount 컬럼으로 반환
select 이름
, 나이
, (select count(*) from theglory2 where theglory2.이름=theglory.이름) as same_name_cnt
, (select sum(결제금액) from theglory2 where theglory2.이름=theglory.이름)as same_name_sumamount
from basic.theglory
;이것도 innerjoin 으로 대체 가능!

