5 분 소요

이 포스팅 내용은 얄팍한 코딩사전 강좌를 수강하며 학습한 내용과 추가로 공부한 내용을 정리한 포스팅입니다.


SELECT

  • 테이블의 컬럼이 아닌 값도 선택할 수 있음

    SELECT
      CustomerName, 1, 'Hello', NULL
    FROM Customers;
    
  • 여러가지 기준으로 정렬할 수 있음

    • 아래는 정렬조건이 2개 이상이며, 순서가 반대인 경우인데, 이 경우에는 먼저 설정한 정렬조건을 1순위로 가져가고, 그 안에서 다음 정렬조건으로 정렬함
    SELECT * FROM OrderDetails
    ORDER BY ProductID ASC, Quantity DESC; ## ASC Default 생략 가능
    

    image-20221211002813326

    SELECT * FROM OrderDetails
    ORDER BY Quantity DESC, ProductID ASC;
    

    image-20221211002907165

  • 원하는 만큼 데이터 가져오기 -> Paging 처리할 때 사용

    • LIMIT {가져올 갯수} 또는 LIMIT {건너뛸 개수}, {가져올 갯수}
    ### 처음 10개만
    SELECT * FROM Customers
    LIMIT 10;
    
    ### 30 건너뛰고 10개만
    SELECT * FROM Customers
    LIMIT 30, 10;
    
  • 문자열은 ‘0’으로 인식, 숫자로 구성된 문자열은 숫자로 자동 인식

    SELECT 'ABC' * 3; -> 0
    SELECT '1' + '002' * 3; -> 7
    
  • MySQL에서 True와 False는 ‘1’과 ‘0’으로 저장 및 표현

    SELECT !TRUE, NOT 1, !FALSE, NOT FALSE;
    ### 0, 0, 1, 1
    
  • IS, IS NOT, AND(&&), OR(||)

    SELECT (TRUE IS FALSE) IS NOT TRUE;
    ### 1
    
    SELECT * FROM OrderDetails
    WHERE
      ProductId = 20
      AND (OrderId = 10514 OR Quantity = 50);
    
  • = / != <> / > < / >= <= -> 결과는 or 거짓

    • 문자열끼리의 비교는 알파벳 순으로
    SELECT 'Apple' < 'Banana';
    ### 1
    
    SELECT 'ApplePay' < 'Ab';
    ### 0
    
    SELECT 'ApplePay' < 'Az';
    ### 1
    
    SELECT 'ApplePay' < 'ApplePay1';
    ### 1
    
    • 대소문자는 구분하지 않음
    SELECT 'a' = 'A';
    ### 1
    
    • 비교연산자의 값은 ‘0’ or ‘1’
    SELECT
      ProductName, Price,
      Price > 20 AS EXPENSIVE 
    FROM Products;
    

    image-20221211010819826

  • BETWEEN {MIN} AND {MAX}, NOT BETWEEN {MIN} AND {MAX}

    SELECT 5 BETWEEN 1 AND 10;
    SELECT 'banana' NOT BETWEEN 'Apple' AND 'camera';
    ### 모두 1
      
    SELECT 5 BETWEEN 10 AND 1;
    ### 0
    
    SELECT * FROM Customers
    WHERE CustomerName BETWEEN 'b' AND 'c';
    ### b 나옴
    

    image-20221211011335050

    SELECT * FROM Customers
    WHERE CustomerName BETWEEN 'b' AND 'd';
    ### b하고 c까지 나옴
    

    image-20221211011414040

    SELECT * FROM Customers
    WHERE CustomerName BETWEEN 'Blauer See Delikatessen' AND 'd';
    

    image-20221211011309701

-> Between의 앞은 포함, 뒤는 미만으로 처리되는 것으로 확인됨

  • IN (...), NOT IN (...) : 괄호 한의 값들 가운데 있음, 없음

    SELECT 1 + 2 IN (2, 3, 4);
    ### 1
    
    SELECT * FROM Customers
    WHERE City IN ('Torino', 'Paris', 'Portland', 'Madrid') 
    
  • LIKE '... % ...' , LIKE '... _ ...' : %(N개, 0 가능), _(_개수만큼)

    SELECT
      'HELLO' LIKE 'hel%', #1
      'HELLO' LIKE 'H%', #1
      'HELLO' LIKE 'H%O', #1 
      'HELLO' LIKE '%O', #1
      'HELLO' LIKE '%HELLO%', #1
      'HELLO' LIKE '%H', #0
      'HELLO' LIKE 'L%', #0
      'HELLO' LIKE 'HEL__', #1
      'HELLO' LIKE 'h___O', #1
      'HELLO' LIKE 'HE_LO', #1
      'HELLO' LIKE '_____', #1
      'HELLO' LIKE '_HELLO', #0
      'HELLO' LIKE 'HEL_', #0
      'HELLO' LIKE 'H_O' #0
    

    image-20221211012041847

  • TRUNCATE(N, n) -> N을 소숫점 n자리까지 선택

    SELECT
      TRUNCATE(1234.5678, 1),
      TRUNCATE(1234.5678, 2),
      TRUNCATE(1234.5678, 3),
      TRUNCATE(1234.5678, -1),
      TRUNCATE(1234.5678, -2),
      TRUNCATE(1234.5678, -3);
    

    image-20221211202546778

  • CONCAT(...), CONCAT_WS(S, ...) : 문자열 이어붙임

    SELECT CONCAT('HELLO', ' ', 'THIS IS ', 2022)
    ### HELLO THIS IS 2022
    SELECT CONCAT_WS('-', 2022, 8, 15, 'AM')
    ### 2022-8-15-AM
    
  • LENGTH , CHAR_LENGTH : 문자열 바이트 길이 / 문자열의 문자 길이

    SELECT
      LENGTH('안녕하세요'), ### 15
      CHAR_LENGTH('안녕하세요') ### 5
    
  • LPAD(S, N, P) , RPAD(S, N, P) : S가 N글자가 될 때까지 P를 이어붙임 -> 자리수 맞추기

    SELECT
      LPAD('ABC', 5, '-'), ### --ABC
      RPAD('ABC', 5, '-'); ### ABC--
    
  • REPLACE(S, N, P) : S중 A를 B로 변경

    SELECT
      REPLACE('맥도날드에서 맥도날드 햄버거를 먹었다.', '맥도날드', '버거킹');
    ### 버거킹에서 버거킹 햄버거를 먹었다.
    
  • INSTR(S, s) : S중 s의 첫 위치를 반환, 없으면 0

    SELECT * FROM Customers
    WHERE INSTR(CustomerName, ' ') BETWEEN 1 AND 6; 
    ###  단어가 6글자 이하인 경우를 찾음
      
    SELECT * FROM Customers
    WHERE INSTR(CustomerName, ' ') < 6; 
    ###  단어가 6글자 이하인 경우도 나오지만, 공백이 없는 단어도 나오게 
    
  • CAST(A, T) : A를 T 자료형으로 변환

    SELECT
      '01' = '1',
      CONVERT('01', DECIMAL) = CONVERT('1', DECIMAL);
    
  • CURDATE(), CURTIME(), NOW : 현재 날짜 / 시간 / 날짜와 시간

    SELECT CURDATE(), CURTIME(), NOW();
    
  • DATE(~~~) , TIME(~~~) : 문자열에 따른 날짜 / 시간 생성

    SELECT
      '2021-6-1 1:2:3' = '2021-06-01 01:02:03', ### 문자열 비교 -> 0
      DATE('2021-6-1 1:2:3') = DATE('2021-06-01 01:02:03'), ### 날짜 동일
      TIME('2021-6-1 1:2:3') = TIME('2021-06-01 01:02:03'), ### 시간 동일
      DATE('2021-6-1 1:2:3') = TIME('2021-06-01 01:02:03'), ### 날짜 != 시간 -> 0
      DATE('2021-6-1') = DATE('2021-06-01 01:02:03'), ### 날짜 동일 (날짜만 체크)
      TIME('2021-6-1 1:2:3') = TIME('01:02:03'); ### 시간 동일 (시간만 체크)
    

    image-20221211220657370

  • ADDDATE(), SUBDATE() : 날짜 혹은 시간 더하기 / 빼기

    SELECT 
      ADDDATE('2021-06-20', INTERVAL 1 YEAR), ### 2022-06-20	
      ADDDATE('2021-06-20', INTERVAL -2 MONTH), ### 2021-04-20	
      ADDDATE('2021-06-20', INTERVAL 3 WEEK), ### 2021-07-11	
      ADDDATE('2021-06-20', INTERVAL -4 DAY), ### 2021-06-16	
      ADDDATE('2021-06-20', INTERVAL -5 MINUTE), ### 2021-06-19 23:55:00	
      ADDDATE('2021-06-20 13:01:12', INTERVAL 6 SECOND); ### 2021-06-20 13:01:18
    
  • DATE_DIFF(), TIME_DIFF() : 두 날짜 / 시간 차이

    SELECT
      OrderDate,
      NOW(),
      DATEDIFF(OrderDate, NOW())
    FROM Orders;
    
  • LAST_DAY() : 해당 월의 마지막 날짜

    SELECT
      OrderDate,
      LAST_DAY(OrderDate),
      DAY(LAST_DAY(OrderDate)),
      DATEDIFF(LAST_DAY(OrderDate), OrderDate)
    FROM Orders;
    
  • 날짜 형식

    image-20221211221715920

    SELECT
      DATE_FORMAT(NOW(), '%M %D, %Y %T'), ### December 11th, 2022 13:17:45	
      DATE_FORMAT(NOW(), '%y-%m-%d %h:%i:%s %p'),### 22-12-11 01:17:45 PM	
      DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %p %h시 %i분 %s초'); ### 2022 12 11 PM 01 17 45
    
  • IF(조건, T, F) : 조건이 참이라면 T, 거짓이라면 F를 반환

    SELECT IF (1 > 2, '1는 2보다 크다.', '1은 2보다 작다.');
    
  • CASE // WHEN / ... / ELSE // END : 3가지 이상 조건은 CASE문 사용

    SELECT
      Price,
      CASE
        WHEN Price < 20 THEN '저가'
        WHEN Price BETWEEN 20 AND 30 THEN '일반'
        WHEN Price BETWEEN 30 AND 40 THEN '중고가'
        ELSE '고가'
      END
    FROM Products;
    
  • IFNULL(A, B) : A가 NULL이면 B 출력

    SELECT
      IFNULL('A', 'B'),
      IFNULL(NULL, 'B'); ### 백업 문자 등으로 사용함
    
  • 집계

    • MAX, MIN, COUNT, SUM, AVG *NULL값은 집계하지 않음

    • 이 함수들은 GROUP BY와의 조합으로 함께 사용하기도 함

      SELECT
        ProductID,
        SUM(Quantity) AS QuantitySum
      FROM OrderDetails
      GROUP BY ProductID
      ORDER BY QuantitySum DESC;
      

      image-20221211230155270

      -> 각 ProductID 마다의 수량의 합계를 구하게 됨!

      -> 자세히 알고 싶은 컬럼의 주체에 Group을 묶어주면 좋겠군!

  • HAVING - 그룹화된 데이터의 조건 (WHERE은 그룹하기 전 데이터의 조건)

    SELECT
      Country, COUNT(*) AS Count
    FROM Suppliers
    GROUP BY Country
    HAVING Count >= 3;
    

    image-20221211230824213

    SELECT
      Country, COUNT(*) AS Count
    FROM Suppliers
    WHERE Count >= 3
    GROUP BY Country;
    

    image-20221211230744856

    -> 집계하여 그룹화하기 전 조건이다보니 count라는 컬럼을 찾을 수 없다고 나옴

    -> 그룹화 후 조건이 되는 HAVING은 alias를 조건명으로 사용할 수 있게 되는구나!

  • DISTINCT : 중복값 제거 -> SELECT 에서 사용

    SELECT DISTINCT CategoryID
    FROM Products;
    

    -> 정렬 없이 먼저 출현한 순서대로 출력 (Group By는 정렬함)

    SELECT
      Country,
      COUNT(DISTINCT CITY)
    FROM Customers
    GROUP BY Country;
    

    image-20221211233102603

    -> Customer 테이블에서 Country가 Argentina인 튜플은 1종류의 도시가 있다.

    SELECT
      Country,
      COUNT(*)
    FROM Customers
    GROUP BY Country;
    

    image-20221211233219519

    -> Customer 테이블에서 Country가 Argentina인 튜플은 3개가 있다. (위 결과와 함께 비교했을 때, 모두 같은 도시에 있다는 것을 알게 됨)


마지막 수정일시: 2022-12-11 23:33

카테고리:

업데이트:

댓글남기기