[SQL] SQL 문법 정리

Blushed·2024년 2월 12일
0

분석공부

목록 보기
2/2

SQL(Structured Query Language)은, 데이터베이스에서 정보를 저장하고 처리하기 위한 프로그램 언어이다. R의 dplyR 문법과 비슷하다고 해서 흥미가 생겼고, SQL 할 줄 알아야 직무 확장성이 생긴다는(!) 선배 말씀에 호다닥 기초부터 다져보고자 한다.

  • Datacamp 내 'Intermediate SQL' 강의 내용을 정리한 포스트입니다.

기본 개념

  • 테이블(table): 데이터가 담긴 표
  • 필드(field): 열(세로)
  • 레코드(record): 행(가로)

이때, 테이블과 필드 이름은 소문자만 가능하며, 공백이 없어야 한다. 또, 테이블명과 필드명을 통틀어 중복이 없어야 한다.

(+) 쿼리 작성 후 마지막에는 세미 콜론(;)을 찍어준다!

쿼리 기초 문법

아래와 같은 형태의 테이블이 있다고 가정하자.

📍 Selecting

  • SELECT 필드명: 특정 필드를 골라 나타낸다.

    #1 그냥 고르기
    SELECT 제목
    FROM 영화;
    
    #2 고르고 이름 바꾸기
    SELECT 제목 as 영화제목
    FROM 영화;
  • COUNT(필드명): 레코드 수를 센다.

    • COUNT(*): 전체 테이블을 기준으로 레코드 수를 센다.
    • COUNT(필드명): 특정 필드를 기준으로 레코드 수를 센다.
    • COUNT(DISTINCT 필드명): 특정 필드에서 중복값을 제거한 후 레코드 수를 센다.
       SELECT COUNT(DISTINCT 연도) AS 
        FROM 영화;

📍 Filtering

  • WHERE 조건: 특정 조건을 만족하는 행을 나타낸다.
    • 숫자일 때는 그냥 (ex: 연도 = 2023 )
    • 문자일 때는 따옴표 붙여서 (ex: 국가 = '한국')
     SELECT 연도
     FROM 영화
     WHERE 연도=2023;
  • LIMIT 레코드 수: 몇 개의 레코드만 나타낼지 정한다.
     SELECT 연도
     FROM 영화
     WHERE 연도=2023;
  • AND / OR / BETWEEN : 여러 개의 조건 다룸

    • AND: 앞뒤 조건 동시 만족
    • OR: 앞뒤 조건 중 하나만 만족
    • BETWEEN: 범위 포함 (양끝 포함 X)
    #1
    SELECT 제목
    FROM 영화
    WHERE 연도 > 1994
         AND 연도 < 2000;
         
    #2 (#1과 같은 의미)
    SELECT 제목
    FROM 영화
    WHERE 연도 BETWEEN 1994 and 2000;
    
    #3
    SELECT *
    FROM 영화
    WHERE 연도 > 2000
        AND 연도 < 2010
        AND 국가 = '한국';
  • LIKE / NOT LIKE / IN

    • LIKE "표현식": 표현식을 만족하는 문자

    • NOT LIKE "표현식": 표현식을 만족하지 않는 문자

    • IN (a,b,c): 괄호 안에 포함되는 문자 (숫자 등 다른 데이터 타입도 가능)

      %: 0개 이상의 문자
      _: 문자 1개
      
      ex) 이름의 세번째 문자가 t?
      WHERE 이름 LIKE '__t%'
      
      ex) 1920,1930,1940 중 하나?
      WHERE 연도 IN (1920,1930,1940)
  • NULL: 누락되거나, 알 수 없는 값 (missing value)

    • COUNT(필드명): 해당 필드의 null값 제외하고 셈
    • COUNT(*): 전체 다 셈
      #1
      SELECT COUNT(예산) AS 예산_정제
      FROM 영화;
      
      #2
      SELECT COUNT(예산) AS 예산_정제
      FROM 영화
      WHERE 예산 IS NOT NULL;
      
      	```
      => 위 두 코드를 통해 동일한 결과를 얻을 수 있음!

📍 Aggregating & Arithmetic

<필드 내 연산>

  • AVG(필드명), SUM(필드명), MIN(필드명), MAX(필드명), COUNT(필드명)

    • MIN, MAX, COUNT는 해당 필드의 레코드가 숫자형이 아닐 때도 적용 가능 (알파벳 비교, 날짜 비교 등)
    Q. 예산이 1,000,000원 이상인 영화들의 예산 간 합을 구하라.
    
    SELECT SUM(예산)
    FROM 영화
    WHERE 예산>1000000;

<레코드 내 연산>

  • +, -, *, /
    SELECT 이익 - 예산 as 순이익
    FROM 영화
    WHERE (이익-예산) > 0;
    💡실행 순서는 코드 적는 순서와 달리 FROM -> WHERE -> SELECT 이므로, WHERE에는 SELECT에서 바꾼 이름 사용 불가

📍 Sorting & Grouping

  • ORDER BY: 특정 필드 순서로 정렬
    • ORDER BY 필드명 ASC : (기본) 오름차순 정렬
    • ORDER BY 필드명 DESC : 내림차순 정렬
  • GROUP BY: 특정 필드로 그룹짓고 요약 통계 제공
    • 그룹 짓지 않을 필드를 SELECT하면 오류 발생

    • 그룹 지은 후 필터링하려면 HAVING 사용

      Q. 연도별 영화 이익 합을 구하라. 
      (단, 이익이 1,000,000 이상인 영화를 대상으로 합을 구하며, 합이 10,000,000 이상인 연도만을 나타내라. 합 기준 내림차순으로 정렬하며, 상위 5개 연도만 나타내라.)
      
      SELECT 연도, SUM(이익) AS 이익합
      FROM 영화
      WHERE 이익 > 1,000,000
      GROUP BY 연도
      HAVING SUM(이익) > 10,000,000
      ORDER BY 이익합
      LIMIT 5;

      💡실행 순서는 코드 적는 순서와 달리 FROM -> WHERE -> GROUP BY -> HAVING - SELECT -> ORDER BY -> LIMIT 이므로, HAVING에는 SELECT에서 바꾼 이름 사용 불가

profile
데이터로 전하는 사람 이야기

0개의 댓글