
- 이제 내 스스로 공부하는 시간이다. 데이터 분석 및 사이언티스트에게 가장 중요한 것은 무엇일까?
- 모델링? EDA? 다 중요하다. 하지만 가장 중요한 것은 Data관리다.
- 그렇기에 데이터 가공, 전처리 등의 역량을 위한 SQL 공부를 시작하자

- 해당 책의 내용을 공부하기 위해서 2개의 Table을 만들었다.
- 출판사 홈페이지를 통해 다운받았지만, oracle 문법으로 sql파일이 있어서 수정하고 고치느라 힘들었지...

- 일단 시작은 alias 문법이다.
- 우리말로는 별칭?이라고 뜻하는 게 가장 자연스러울 것 같다.
- alias는 select, from 등에 원하는 별칭을 넣는 문법이다.
select sal as salary, comm as commission from emp as p
- 데이터를 다른 사람에게 설명하거나 보여줄 때 별칭을 넣음으로 이해를 도울 수 있으며, as는 넣지 않아도 괜찮다.

- 코드에서 중요한 요소 중 하나는 short circuit을 이해하는 것이다.
1. select sal salary, comm commission from emp where salary < 50000;
2. select * from
(select sal salary, comm commission from emp) x where salary < 50000
- 1번의 코드는 오류가 났지만, 2번의 코드는 오류가 나지 않았다.
- 그 이유는 where절은 select절을 시행하지 전에 판단되는데 select절에 입력한 alias를 인식하지 못하기 때문이다.
- 해당 문제를 해결하기 위해서는 외부 쿼리를 인라인 뷰에 배치함으로써 외부 쿼리의 alias를 참조하여 해당 기능을 오류 없이 사용할 수 있다. 여기서 from절은 where절보다 먼저 평가된다는 것을 확인할 수 있다.
- p.s 인라인 뷰 : 서브 쿼리가 from절 안에서 사용되는 경우를 의미

- 다음 기능은 concat이다. 아 참고로 다양한 sql tool마다 문법의 차이가 있는데, 여기서는 mysql8.0을 사용한다.
select concat(A, B, C) from table1
- 해당 함수를 사용하면 매소드 안에 값을 합쳐서 출력하는데 쿼리, 문자, 숫자 등 다양하게 넣어서 합칠 수 있다.

- case문은 조건을 통해 값을 출력할 수 있다.
case
when <조건1> then <결과1>
when <조건2> then <결과2>
else <결과3>
end
- else의 경우 넣지 않아도 정상적으로 작동되는데, 모든 조건에 해당하지 않을 경우 null값으로 변환된다.

- rand()는 무작위로 정렬을 하는 함수이다.
- 여기서 보고 가야 할 부분은 rand()와 limit n이다.
- limit 뒤에 넣은 숫자만큼의 자료를 출력하는데, 상위 10, 하위 10 등을 출력할 때 사용된다.

- 데이터 중 null값만 있는 자료를 출력할 때 조건문 where에
select ename, job from emp where job is null
- 위에 코드와 같이 column is null을 where조건절에 넣으면 된다.
- 그리고 밑에 coalesce함수는 null값을 바꿔주는 기능이 있다
A B
null 0
0 null
1 1
select coalesce(A, 3) from table
select coalesce(B, 3) from table
3 0
0 3
1 1
- 이런식으로 나온다. 이 함수의 기능은 null이 아닌 경우 원래 값을, null인 경우 두번 째 매소드에 넣은 값을 넣는다.

- where절에 column in (condition,1, condition2) 와 같이 여러 값을 조건으로 넣을 경우, in안에 값 중 하나에 해당하면 True로 인식한다.

- 또한, and로 다중 조건을 넣을 수 있으며, like는 여러 문법 기호를 통해 다양한 조건을 유동적으로 사용할 수 있다.

select column from table where condition order by <column1> (desc)
or
select column from table where condition order by 1, 2 (desc)
- order by절에 컬럼을 넣거나 select에 넣은 값을 왼쪽부터 1,2,3,으로 생각하고 번호를 통해 정렬할 수도 있다.

- order by절에 여러 조건을 넣음으로써 순차적으로 정렬순서를 입력할 수도 있다.

- 다음 기능으로 view 기능이다.
- view와 table의 가장 큰 차이는 메모리 할당이다. table은 실제 데이터를 저장하는 반면 view는 가상의 테이블로서 데이터를 저장하는 것은 아니다.

- 인라인 뷰에서 넣은 column을 order by절에 넣을 수도 있다.
- 위 코드와 같은 경우 인라인 뷰에서
slect ename, sal, comm, case when comm is null then 0 else 1 end
- 구문을 통해 null의 여부에 따라 0과 1로 구분되는 별도의 쿼리를 만들고, 해당 쿼리를 본 select문의 where절에 넣어 조건을 넣음으로써 null여부로 순서를 먼저 정하고, 이후 성과급을 오름차순으로 정렬했다.