ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2주 4일차 TIL 정리
    웅진 STARTERS 부트캠프 2023. 2. 16. 17:47

    2주 5일차의 주 내용은 SQL의 기능들과 다양한 쿼리문들이었다.

    이 중에서 몰랐거나 다시 짚고 넘어가고 싶은 내용들을 위주로 TIL을 작성하고자 한다.


    조건 제어를 위한 if 구문 


    if ( 판별할 식, 참일 때 출력할 문구, 거짓일 때의 반환값 )

    select if (100 > 200, '참이다', '거짓이다');


    자료를 제한하는 limit 문


    - select로 받아온 구문의 출력 개수 제한. (맨 마지막에 사용)
      eg) limit n  : 첫 번째 행부터 n개 출력
      limit s,n : s번째 행부터 n개 출력

    select *
    	from book
        limit 1;


    참거짓 판별


    - '일치하지 않다'

    select 101 <> 10;
    
     -- 두 코드는 같은 뜻이다.
    
    select 101 != 10;

    - '사실이 아니다'

    select not(10>10);
    
    -- 10이 10보다 크지 '않다'


    기타 산술 연산


    - 나머지를 가져오는 mod

    select mod(10,3)

    - a의 b제곱, power(a,b)

    select power(2,10)
    from dual;
    -- from dual은 자동으로 붙으며, 생략 가능하다.


    문자열 함수


    - concat 사이에 원하는 문구 넣기

    concat('아는 만큼','보인다')

    -- concat_ws 를 통해 다음과 concat 문자열 사이에 원하는 문자열을 넣을 수 있다.
    -- concat_ws('삽입할 문자열','합칠 문자열 1','합칠 문자열 2')
    concat_ws(' 다양하게 ','아는 만큼','보인다')

    - 문자열 길이 재기
    select length('안녕')                   # byte 단위로 세기
          ,char_length('안녕');             # 문자 단위

     

    - 공백을 제거하는 함수

    select trim('  ..안녕하세요..  ')         # 양쪽 공백 제거
          ,ltrim('  ..안녕하세요..  ')        # 왼쪽 공백 제거
          ,rtrim('  ..안녕하세요..  ');       # 오른쪽 공백 제거

    - 문자 제거 함수

    select trim(leading '안' from '안안안안요안녕하세요'),      -- 왼쪽 지우기

    select trim(trailing '요' from '안녕하세요안요요요');       -- 오른쪽 지우기

     


    현재 시점 날짜 및 시간 함수


    select curdate(), curtime(), now(), sysdate(),current_timestamp,current_time;


    날짜, 시간 증감 함수 


    select date_add(orderdate,interval 6 day) 'date_add'      -- 날짜 더하기
    	  ,adddate(orderdate, interval 6 day) 'adddate'   -- 날짜 더하기
          ,date_sub(orderdate, interval 6 day) 'date_sub'     -- 날짜 빼기
          ,subdate(orderdate, interval 6 day) 'subdate'       -- 날짜 뺴기
    	  ,addtime(orderdate, '1:1:1') 'addtime'          -- 시간 더하기
          ,subtime(orderdate, '1:1:1') 'subdate'              -- 시간 빼기
    	from Orders;


    기타 날짜함수


    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을 복습하는 의미에서 되짚어볼 수 있었다.

    댓글

Designed by Tistory.