select makedate(2023,88) 'makedate(연도에서 정수만큼 지난 날짜 반환)'
,maketime(12,10,30) 'maketime(시간으로 변환)'
,date_format('2022-01-30','%M%D, %Y') '날짜의 format 지정'
,quarter('2022-01-30') as 분기 계산;
※ 자료형 변환 함수 ※
select cast('2020-10-19 12:34:25.123' as date) as 'date' -- 날짜형으로
,cast('2020-10-19 12:34:25.123' as time) as 'time' -- 시간형으로
,cast('2020-10-19 12:34:25.123' as datetime) as 'datetime'; -- 날짜-시간형으로
※ 암묵적 형변환이 이뤄지는 케이스 ※
select 1 < '3mega' -- 3으로 변환한 후 비교
,4 < '3MEGA'
,0 = 'mega3'; -- 문자가 0으로 변환됨
※ 상관서브쿼리 까다로웠던 예제 ※
-- 출판사별로 출판사의 평균가격보다 비싼 도서 구하기
select b1.bookname
from book b1
where b1.price > (select avg(b2.price)
from book b2
where b1.publisher = b2.publisher);
※ 집합 연산자 ※
- union
select username, phone
from customer
where address like '%서울%'
union
select username, phone
from customer
where custid in(select custid from orders);
※ 그룹 토의 및 멘토링 내용 정리 ※
1. 멘토링에서 질문한 내용
Q1. 해당 예제 코드에서 row를 차지하는 값이 다른데, 어떻게 해당 코드가 실행이 가능한가요?
A. 실행 불가능한 코드가 맞다. 오류가 있었던 것으로 추정된다.
Q2. cross join의 개념이 잘 이해되지 않는다. 강의에서 나온 코드와 결과는 다음과 같은데, 내가 이해한 것은 join으로 묶어주지 않은 일반 두 테이블의 결합과 동일한 결과가 나오는 것이라 생각했는데, 강의에 나온 레퍼런스는 오히려 inner join과 동일했다.
강의에 나왔던 예시 코드:
select c.username, o.saleprice
from customer c cross join orders o
on c.custid = o.custid;
A. 강의에서 사용된 코드가 틀린 것이 맞다. cross join은 on문이 붙지 않은 채로 다음과 같이 사용한다.
select c.username, o.saleprice
from customer c cross join orders o;
또한, username과 saleprice가 만나서 생성할 수 있는 모든 경우의 수를 전부 보여주는 역할이다. 그런 의미에서 join의 언급이 아예 없는 해당 코드의 결과와 완벽히 동일하다.
select c.username, o.saleprice
from customer c orders o
2. 팀스터디에서 토의한 내용
- group by를 사용할 때 select 문에는 group by의 주체가 들어가야 하는데, 어떤 경우에선 그루핑의 주체가 들어가지 않아도 무방하다. 어떤 상황일까?
→ Primary key, integer 자료형의 특성 등으로 추정했으나, 멘토링 시간에 질문한 결과 Primary Key로 지정된 컬럼을 기준으로 그룹핑 할 경우 해당 테이블의 모든 컬럼을 그냥 넣을 수 있다는 답변을 받았다.
3. 전체적 리뷰
- 대체적으로 아는 내용이 많아 수강이 용이했지만, 잘못된 예시나 틀린 내용이 강의에 종종 나와 이를 해결하기 위해 시간을 꽤나 많이 써야만 했다. SQL을 복습하는 의미에서 되짚어볼 수 있었다.