SQL_03_17

안선경·2023년 3월 18일

mysql_cook_book

목록 보기
1/9

  • 이제 내 스스로 공부하는 시간이다. 데이터 분석 및 사이언티스트에게 가장 중요한 것은 무엇일까?
  • 모델링? 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여부로 순서를 먼저 정하고, 이후 성과급을 오름차순으로 정렬했다.

profile
상황을 바꿀 수 없다면, 나를 바꾸자

0개의 댓글