Post

SQL - SELECT, GROUP BY, HAVING

사용법

개요

기본적인 SQL의 SELECT 문법은 아래와 같은 형태를 따른다.

1
2
3
4
5
6
7
-- ()은 앞에 온 값에 대한 설명
-- {}은 들어갈 내용
-- []은 값은 있거나 없거나
SELECT [DISTINCT] {* 혹은 특정 열 [특정 열에 대한 별칭]}
FROM {테이블 이름}
WHERE {조건}
ORDER BY [특정 열 {ASC(오름차순, 기본값, 생략가능) 혹은 DESC(내림차순)}]

각 항목 세부 설명

SELECT

해당 테이블에서 특정 열을 출력하고자 할때 특정 열을 지정해서 사용할 수 있다. 표를 기준으로 둘 때 열을 기준으로 잘라준다고 생각하면 편하다.

아래 테이블을 예시로 설명을 하겠다.

img.png

  • *를 입력하면 테이블 전체 열을 출력한다.
    1
    2
    
    SELECT *
    FROM student;
    

    출력 :

    img_1.png

  • 특정 열 이름을 입력하면 해당 열만 반환하게 할 수있다. 다음은 student 테이블에 user 열만 출력하는 sql이다.
    1
    2
    
    SELECT user
    FROM student;
    

    출력 :

    img_2.png

  • 특정 열의 별칭을 지정하여 해당 이름을 반환할 수 있다. student table에 score를 sco로 변경하여 출력하는 sql이다. 여기에 distinct 까지 입력하면 중복 제거를 할 수있다.
    1
    2
    
     SELECT distinct score sco
     FROM student;
    

    출력 :

    img_3.png

  • 열을 결합하여 출력이 가능하다. || 연산자를 사용하면 되며 여기에 추가로 이름까지 지정 가능하다.
    1
    2
    
    SELECT user||sid user_id
    FROM student;
    

    출력 :

    img_4.png

별도의 함수를 추가로 지정하여 해당 열의 값을 변경하여 출력 할 수 있다. 다음은 SELECT에 지정된 열을 대상으로 사용하는 예시 함수이다. 빠진것이 많으니 빠진 부분은 이곳을 참고하면 되겠다.

문자 함수

아래 테이블의 예시로 설명을 하겠다.

img_5.png

  • LOWER & UPPER
    문자들을 소문자, 대문자로 변경하여 출력

    1
    2
    
    SELECT LOWER(NAME), UPPER(MANAGER)
    FROM DEPARTMENT;
    

    img_6.png

  • LPAD
    LPAD(필드, 문자 범위, ‘형식’)에 맞춰서 결과 출력

    1
    2
    3
    
    SELECT LPAD(NAME,10,'*')
    FROM DEPARTMENT;
    -- 10칸을 확보하여 출력하되 왼쪽 빈칸은 *로 채운다.
    

    img_7.png

  • SUBSTR
    SUBSTR(‘문자열’혹은 필드,pos,n) pos의 위치부터 n개의 문자를 출력한다. n이 없으면 마지막까지 출력한다.
    1
    2
    3
    
    SELECT SUBSTR(NAME,2,2)
    FROM DEPARTMENT;
    -- 2번째 문자열부터 2개 출력
    

    img_8.png

  • INSTR
    INSTR(필드,’문자’) : 필드에서 문자가 있는 위치를 출력
    INSTR(필드,’문자’, 수1, 수2) : 수 1부터 문자가 있는 위치를 검색하되 수 2번째의 위치 출력
    찾지 못하면 0을 반환

    1
    2
    3
    
    SELECT INSTR(NAME,'c',2,2), INSTR(MANAGER,'o')
    FROM DEPARTMENT;
    -- NAME에 있는 'c'가 두번째 문자부터 검색했을때 2번째 등장하는 위치, MANAGER의 'o'가 등장하는 위치
    

    img_23.png

  • LENGTH
    대상 필드나 입력한 문자열의 문자 개수를 출력
    1
    2
    3
    
    SELECT LENGTH(NAME)
    FROM DEPARTMENT;
    -- NAME 필드의 길이 출력
    

    img_23.png

  • TRANSLATE
    TRANSLATE(필드, ‘A’, ‘B’)함수는 필드에서 문자 A를 찾아 B로 변환하여 출력
    1
    2
    3
    
    SELECT TRANSLATE(NAME,'e','d')
    FROM DEPARTMENT;
    -- NAME에서 'e'가 있다면 'd'으로 변경하여 출력
    

    img_23.png

아래부터에서는 다음의 TABLE을 사용한다.

img_14.png

숫자 함수

  • ROUND
    ROUND(실수 필드값 혹은 실수 입력값, 정수) 함수는 입력값을 정수만큼 반올림한다.
    1
    2
    
    SELECT ROUND(SCORE,1)
    FROM TEST;
    

    img_23.png

  • POWER
    POWER(실수 필드값 혹은 실수 입력값, 정수) 함수는 입력값을 정수만큼 제곱한 값을 출력
    1
    2
    
    SELECT POWER(SCORE,3)
    FROM TEST;
    

    img_23.png

  • SQRT
    SQRT(필드값 혹은 실수) 함수는 입력값의 제곱근을 출력
    1
    2
    
    SELECT SQLT(SCORE)
    FROM TEST;
    

    img_23.png

날짜 함수

Months_Between(date1, date2) 함수는 date1과 date2 사이의 개월수를 출력한다.

  • MONTHS_BETWEEN
    1
    2
    
    SELECT MONTHS_BETWEEN(START_DATE,END_DATE)
    FROM TEST;
    

    img_16.png

  • ADD_MONTHS
    ADD_MONTHS(날짜, 정수) 함수는 날짜의 달에 정수만큼 더한 값 출력
    1
    2
    
    SELECT ADD_MONTHS(START_DATE,3)
    FROM TEST;
    

    img_17.png

집계 함수

이 함수들은 GROUP에 대해서 적용이 가능하기 때문에 Group 함수라고도 한다.

  • COUNT
    1
    2
    3
    4
    
    SELECT COUNT(*)
    FROM TEST
    WHERE SCORE=20.23;
    -- SCORE 값이 20.23인 것들의 개수
    

    img_18.png

  • SUM
    SUM(필드 값) 함수는 필드의 총 합을 출력
    1
    2
    3
    
    SELECT SUM(SCORE)
    FROM TEST
    -- SCORE 값을 다 더한 것
    

    img_19.png

  • AVG
    AVG(필드 값) 함수는 필드의 총 평균을 출력
    1
    2
    3
    
    SELECT AVG(SCORE)
    FROM TEST
    -- SCORE 값의 총 평균값
    

    img_20.png

  • MAX
    MAX(필드 값) 함수는 필드값의 최대값을 출력
    1
    2
    3
    
    SELECT MAX(SCORE)
    FROM TEST
    -- SCORE 값 중에 최대값을 출력
    

    img_21.png

  • MIN
    MIN(필드 값) 함수는 필드값의 최소값을 출력
    1
    2
    3
    
    SELECT MIN(SCORE)
    FROM TEST
    -- SCORE 값 중에 최소값을 출력
    

    img_22.png

GROUP BY

동일한 필드 값을 갖는 레코드를 그룹으로 묶는 필드임.
이렇게 묶은 필드는 집계함수로 계산이 가능하다.
다음 쿼리는 아래의 표를 기준으로 설명하겠다.

img.png

1
2
3
4
  SELECT TYPE, SUM(NUMBER)
  FROM STOCK
  GROUP BY TYPE;
  -- TYPE을 기준으로 NUMBER값을 합산하여 출력

img_1.png

HAVING

Group by에서 특정 조건을 만족하는 그룹만을 검색하고자 할 경우, Having을 사용한다.
여기서 WHERE은 필드에 대한 조건이고, HAVING은 그룹함수에 대한 조건이다.

  SELECT TYPE, SUM(NUMBER)
  FROM STOCK
  GROUP BY TYPE
  HAVING count(*) > 28;

img.png

참고자료

This post is licensed under CC BY 4.0 by the author.