sql

스파르타 코딩 클럽 SQL 문법정리

야언 2022. 6. 26. 04:23

 

 

쿼리(Query)문 - 데이터베이스에 명령을 내리는 것

 

Select 쿼리문 - 데이터베이스에서 '데이터를 선택해서 가져오겠다'는 의미.

Select 쿼리문은 1) 어떤 테이블에서 2) 어떤 필드의 데이터를 가져올지 로 구성된다.

 

Where 절의 개념 - Select 쿼리문으로 가져올 데이터에 조건을 걸어주는 것

 

and 연산자 - 조건을 추가

 

비교 연산자 

 연산자 앞뒤에 있는 데이터 값을 비교하는 데 사용한다. 문자열은 알파벳 순서로 문자열의 대소를 비교한다.

    ex) >, >=, <, <=

 

 +등가 비교 연산자 : 연산자 양쪽 항목이 같은 값인지 검사하는 연산자

    ex) = , !=, <>, ^= : =를 제외한 3개는 모두 같은 의미 (≠)

 

범위 조건 - between 

 

포함 조건 - in

 

패턴 (문자열 규칙) 조건 - like

  where email like 'a%': email 필드값이 a로 시작하는 모든 데이터

  where email like '%a' email 필드값이 a로 끝나는 모든 데이터

  where email like '%co%' email 필드값에 co를 포함하는 모든 데이터

  where email like 'a%o' email 필드값이 a로 시작하고 o로 끝나는 모든 데 이터

 

일부 데이터만 가져오기: Limit

 

중복 데이터는 제외하고 가져오기: Distinct

 

몇 개인지 숫자 세보기: Count

 

Group by

동일한 범주를 갖는 데이터를 하나로 묶어서, 범주별 통계를 내주는 것

  • 동일한 범주의 개수 구하기 - count
  • 동일한 범주에서의 최솟값 구하기 - min
  • 동일한 범주에서의 최댓값 구하기 - max
  • 동일한 범주의 평균 구하기 - avg
  • 동일한 범주의 합계 구하기 - sum

Order by

 데이터를 내림차순(desc) 혹은 오름차순으로 정렬 

 

Alias

별칭 기능, 혼동을 최소화하고 원하는 이름으로 결과를 출력하기 위해 사용된다.

 

Join

두 테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것

  • Join의 종류  : Left Join, Inner Join
    • Left Join : 합집합, 왼쪽의 모든 행을 조회한다. 따라서 왼쪽 테이블의 key값이 NULL이라면 오른쪽 테이블은 해당 행이 존재하지 않으므로 해당 행의 필드값들은 NULL로 채워진다.
    • Inner Join : 교집합, 겹치치 않는 행이 존재할 경우 그 행은 결과에서 제외된다.

 

Union

여러개의 쿼리문을 사용하여 하나의 데이터로 출력해야 되는 경우 사용

  • Union -결과를 합칠 떄 중복되는 행은 하나만 표시
  • Union all - 중복제거를 하지 않고 모두 합쳐서 표시 

 

Subquery

 : 하나의 SQL 쿼리 안에 또다른 SQL 쿼리가 있는 것

  • 자주 쓰이는 Subquery 유형
    • Where 절에 들어가는 Subquery
      • Subquery의 결과를 조건에 활용하는 방식으로 유용하게 사용. - 
        ex) where 필드명 in (subquery)
    • Select 절에 들어가는 Subquery
      • 기존 테이블에 함께 보고싶은 통계 데이터를 손쉽게 붙이는 것에 사용 
        ex) select 필드명, 필드명, (subquery) from ..
    • From 절에 들어가는 Subquery (가장 많이 사용)
      • 내가 만든 Select와 이미 있는  테이블을 Join하고 싶을 때 사용

 

With 절

  • 이름을 가진 SubQuery를 정의한 후 사용하는 구문.
  • Query의 전체적인 가독성을 높이고, 재사용할 수 있는 장점이 있음.
  • with [별명] as (subquery)

실전에서 유용한 SQL 문법 (문자열, Case)

  • 문자열 데이터 다뤄보기
    • SUBSTRING_INDEX - 문자열 쪼개기
      • ex) 이메일에서 아이디만 가져와보기

           select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users

        @를 기준으로 텍스트를 쪼개고, 그 중 첫 번째 조각을 가져오라는 뜻
      • ex) 이메일에서 이메일 도메인만 가져와보기

           select user_id, email, SUBSTRING_INDEX(email, '@', -1) from users

        @를 기준으로 텍스트를 쪼개고, 그 중 마지막 조각을 가져오라는 뜻
    • SUBSTRING - 문자열 일부만 출력하기
      • ex) orders 테이블에서 날짜까지 출력하게 해보기

           select order_no, created_at, substring(created_at,1,10) as date from orders

        SUBSTRING(문자열, 출력을 하고싶은 첫 글자의 위치, 몇개의 글자를 출력하고 싶은지)
      • ex) 일별로 몇 개씩 주문이 일어났는지 살펴보기
         
          select substring(created_at,1,10) as date, count(*) as cnt_date from orders
          group by date
  • CASE: 경우에 따라 원하는 값을 새 필드에 출력해보기
    • ex) 포인트 보유액에 따라 다르게 표시해주기
        select pu.point_user_id, pu.point,
        case 
        when pu.point > 10000 then '잘 하고 있어요!'
        else '조금 더 달려주세요!'
        END as '구분'
        from point_users pu;
    • ex) 심화과정
      1. 우선 몇 가지로 구분을 나누고,

        select pu.point_user_id, pu.point,
        case 
        when pu.point > 10000 then '1만 이상'
        when pu.point > 5000 then '5천 이상'
        else '5천 미만'
        END as lv
        from point_users pu

      2. 서브쿼리를 이용해서 group by로 통계

        select level, count(*) as cnt from (
        select pu.point_user_id, pu.point,
        case 
        when pu.point > 10000 then '1만 이상'
        when pu.point > 5000 then '5천 이상'
        else '5천 미만'
        END as lv
        from point_users pu
        ) a
        group by lv

      3.with 절로 정리하기

        with table1 as (
        select pu.point_user_id, pu.point,
        case 
        when pu.point > 10000 then '1만 이상'
        when pu.point > 5000 then '5천 이상'
        else '5천 미만'
        END as lv
        from point_users pu
       )

        select level, count(*) as cnt from table1
        group by lv