오늘은 다시 한번 개념을 짚고 넘어가는 시간도 가졌고, 문제 풀고, sql강의를 드디어 다 수강 했다. 그 사이에 강의가 많이 늘어서 와우 언제 저 강의를 다 보고 풀까 생각하기도 했다.
아무튼 각설하고 오늘의 TIL을 작성해볼까 한다.
-집계함수. 흔히 말하는 집계함수에는 sum, avg, count, min, max 5가지가 있다. 이 집계함수들은 select 절에서만 사용이 가능하다. 그리고 오늘 문제를 풀면서 알게 된 것은 집계함수는 group by를 할 수 없다는 사아실. 그러니까,, 예를들자면 이런거다. select max(age), gender from customers group by max(age) 이렇게 작성이 안된다는 거다. 그리고 또 집계함수 관련돼서 새롭게 알게 된 사실은,, select구문에 뭐 컬럼1,컬럼2가 온 다음에 집계함수가 오게 된다면 무조건 group by로 정렬을 해줘야 한다는 것이다.(이것은 라이브 세션 때 튜터님께서 말씀하신 것.. 그리고 sql 강의에서도 강사님께서 말씀하신 것 같다. 꼭 그래야만 하는 것인가..? 이거는 디비버로 확인을 해보자. 해보니 무슨 말인지는 알겠는데 사실 꼭 그래야만 한다..는 것은... 잘 모르겠다. 그렇게 하지 않아도 결과 잘 나오고. 암튼 이거는 내가 나중에 실력이 좀 늘게된다면 다시 확인해 볼 수 있을 것 같다. 아니면 여쭤보거나..
-서브쿼리에 대해서. 서브쿼리를 지금까지는 from절 뒤에 한 테이블처럼 사용하는 인라인뷰를 주로 사용했는데, 이번에 코드카타를 풀면서 where절에서 사용하는 것을 알게되어서 다시 한번 개념 정리를 하게 되었다. 서브쿼리는 총 3군데에서 가능하다.
where 절에서 사용: 중첩(일반)서브쿼리->서브쿼리의 결과에 따라서 달라지는 조건절.
select 절에서 사용: 스칼라 서브쿼리(요거는 select절의 s를 생각하면 외우기 쉬울 것 같다.)->하나의 컬럼처럼 사용, 서로 다른 테이블이 필요하다고 함.
from 절에서 사용: 인라인 뷰(가장 많이 사용)->as 구문을 사용하여(사실 이건 생략 가능) 명칭을 반드시 기재해야 함.(안하면 에러납니다), 하나의 테이블처럼 사용.
암튼 틀려서 정답을 보고 알게 된 코드카타는 정답 제출 안 하고 나중에 내가 다시 풀어보고 그때 맞으면 제출하려고 한다. 서브쿼리 계속 사용하다보니 재밌음. 근데 join에서 서브쿼리 사용은 아직 조금 생소하다. 이것도 계속 보고 계속 써봐야 익숙해질 듯하다.
-like 구문. like구문에서 or을 썼더니 에러가 났다. 그래서 like구문에서는 한 조건만 가능한가 해서 튜터님께 여쭤보니 like 구문은 한 조건만 가능하다고 한다. 대신 or을 쓰려면 조건 앞에 like or like 이런식으로 써줘야 한다고,, 근데 적용해봤을 때 작동이 안되서 디비버에서 해봐야겠다. 그리고 like는 주로 where절에서 쓰인다. select절에서도 해봤는데 작동이 제대로 안됨.. 어떤 블로그에서는 select절에서도 쓰인다 하는데,,, 음,, 내가 해봤을 때는 아예값이 다르게 나와서. where절에서 쓰는게 맞는 듯 하다.
그럼 돌아와서 like 구문에서 or 쓰기 해보고 오겠다. 안되어서 튜터님께 여쭤봄. 내일 다시 수정해놓겠다. 암튼 like는 like 당 조건 한 개 작성할 수 있다는거 기억하기.
-> 방법 찾음! like 구문에서 or을 사용하려면 어떤 컬럼에서 like를 찾을 것인지 명시를 같이 해줘야 한다. 예를 들어서
select name
from customers
where name like '이%' or name like '김%’
이런식으로!
이런식으로 작성하면 된다. 내가 에러가 났던 부분은 where절 다음에
where name like ‘이%’ or like ‘김%’이렇게 작성해서 안되었던 것이었음.
-오늘 코드카타를 푸는데 답도 다 맞고 식도 다 맞았는데 자꾸 채점하기 눌렀더니 틀렸다고 해서 계속 디버깅 하다가 도저히 모르겠어서 튜터님께 들고갔더니 정말 어이없게도,, O,X로 표시하라고 했던 것을 나는 o,x로 그러니까. 소문자로 써서 계속 틀렸다고 했던 거였ㄷ..
진짜 어이없었음. 아니 이런것으로도..?? 개발자들은 그런 대소문자까지도 신경써야 한다고 하셨다. 그 컬럼이름은 소문자로 적어도 상관이 없지만, 데이터는 딱 맞게 써야 한다고 하셨다. 대문자면 나도 대문자로, 소문자면 나도 소문자로 작성해야 한다.
다음부터는 문제를 더 신경써서 읽어야겠다.하하
-join에 대하여. join과 where절.. join은 where절이 없을 때 간단하게 조인이 가능하다. 만약에 where이 필요하다고 하면 서브쿼리를 이용하여 작성하거나, join하고 그다음에 where절 작성해야 함. 이것도 오늘 처음 알게 된 사아실 코드 작성하다가 안되니까 찾아보면서 계속 수정하면서 결국 정답을 찾아나가는 나 꽤 멋질지도,,
-오늘 새로 배운 함수. date함수. 그냥 문자데이터를 date함수를 쓰면 날짜 데이터로 바꿔줄 수 있다. 그 디비버에서 실행값 가장 위에 보면 시계 모양이 나온 것을 확인할 수 있을 것이다. date(바꿔줄 컬럼) 그냥 이렇게 사용한다.
그리고 date_format함수. 이것은 날짜를 지정한 형식으로 뽑아주는 함수이다.
DATE_FORMAT(날짜 , 형식) : 날짜를 지정한 형식으로 출력
형식으로는 ‘%Y’,‘%m’,‘%d’이런식으로 지정할 수 있다. 년, 월, 일. 붙여 사용할 수도 있고 안에서 자유롭게 .을쓴다거나 –를 쓴다거나 특수문자로 자유롭게 사용이 가능하다고 한다.
오늘하루도 정말 고생했다! 그래도 하나씩 정리해가는 나 칭찬하고,, 약간 요즘 들어서 난이도가 확확 뛰는 것 같은데 하나씩 빠르고 정확하게 쳐나가자. 그리고 연습 많이하기.
오늘은 코드카타 3개 풀었는데, 내일도 3개 정도는 풀어보자. 더 풀 수 있으면 더 풀기!
암튼 고생함~~!! 오늘 드디어 sql 강의 다 끝내서 다행쓰,, 마지막 피벗 테이블 만드는거 솔직히 완전히 이해하지는 못했지만 그냥 대충 정리하고 끝냄 몰라 나중에 다시 할 일 있겠지,,,
이제 자자 고생해따!! 아 그리고 join문제 풀긴 했는데 내 방식대로 풀어서 정답이랑 일치는 하는데 정답쿼리랑 다르게 작성해서 괜찮은 건지 모르겠듬.. 그리고 정답 쿼리봐도 이해가 안됨.. 이거는 내일 다른 학습자분들에게 물어봐야겠다. 그래도 이해는 하고 넘어가야지,,
오늘은 window function 함수를 배웠다. 아직 실제로 내가 문제풀이에 안 써봐서 익숙하지는 않지만, 여러모로 꽤 유용한 함수인 것을 알 수 있었다.
window function함수는 모든 행을 잃고 싶지 않을 때 사용한다고 한다. 여러 행들을 활용하고 사용가능하게 하는 아주 쓸모있는 함수이다.
약간 내마음대로 조작하기=window function 이런 느낌
문법은 '윈도우펑션함수() OVER(PARTITION BY 컬럼1 ORDER BY 컬럼2)'
이런 식이다. 여기서 partition by는 빼도 상관이 없다. 이 아이는 구분하는 역할인데, group by와 비슷한 개념이라고 생각하면 쉽다. 그리고 order by는 그 똑같은 정렬기준이다.
종류에는 순위를 매기는 함수, 집계함수, 순서함수, 비율함수가 있다.

rank는 순위를 매기는 함수인데, 데이터가 만약 동일하다면 같은 번호로 할당이 되고 이로 인해서 중간 순위를 비운 값이 출력될 수 있다.
그래서 이걸 보완하기 위해 dense_rank함수가 있는데, 얘는 중간값을 비우지 않고 출력한다. 음 동일한 데이터가 있을 시에 같은 번호로 할당하는 것은 rank함수랑 같음.
row_number함수: 이 아이는 동일한 데이터 값이 있어도 고유한 순위를 부여한다. 순위를 부여할 때는 임의대로 부여하며, 실행할 때마다 달라질 수 있다고 한다. 이 함수는 123456789이렇게 숫자가 비면 안될 시에 사용할 수 있겠겠다. 근데 이 함수 많이 사용한다고 함.
순서에는 lag,lead함수가 있는데, 얘네들은 이전 열에서 값을 가져오는함수들이다. lag는 이전열 위쪽에 있는 데이터를 가져오고, lead는 이전열 밑쪽 데이터들을 가져온다. 숫자를 쓰지 않으면 1이 디폴트 값이다.
윈도우 함수 기본문법:
SELECT WINDOW_FUNCTION() OVER([PARTITION BY 컬럼][ORDER BY 컬럼])
FROM 테이블명
(다시한번 정확히!)
-with구문: 이 아이를 사용하면 테이블을 재사용 할 수 있다. 하나의 테이블이 여러번 필요할 때 사용가능. 임시테이블(가상테이블)이어서 쿼리의 가독성 및 쿼리성능을 향상시킨다고 한다. 여러개 사용가능.
-round함수는 select절에서 사용이 가능하다. 다른데에서 쓰지 말기,,, 나처럼,, 그리고 round(컬럼 또는 숫자,0) 이렇게 쓰면 그 소숫점 몇개까지 있던 간에 정수를 뽑는다는 소리임.
-datediff함수는 날짜차이를 계산하는 식이다. 날짜를 빼야 할 시에 사용한다. 함수식이 datediff(날짜지정,컬럼,컬럼2):날짜지정으로(ex일,월,년)컬럼-컬럼2 라고 생각하면 된다. 근데 보니까 굳이 날짜지정은 생략도 가능하더라.
-오늘 코드카타 풀면서 처음 써본 limit함수: 몇개만 보고 싶을 때 사용.
limit3 하면 3개의 행만 보고싶다는말... 맞겠지... 암튼 고런 느낌이다..
어깨와 목이 뻐근하여 오늘은 여기서 마치겠다,,,
오늘의 일기: 너 진짜 고생했다!!! 대단하고 정말로 잘하고 있어!!!!!!!