1. Database - SQL(1)

hsso_o·2024년 6월 27일
0

스터디

목록 보기
2/44

SELECT

  • 특정 테이블에서 원하는 데이터를 조회해서 가져오는 데에 사용
SELECT 
       menu_name AS menu  -- 별칭 사용 가능
  FROM tbl_menu;

ORDER BY

  • 결과 집합을 특정 열이나 값에 따라 정렬하는 데에 사용
SELECT
       menu_code
     , menu_name
     , menu_price
  FROM tbl_menu
 ORDER BY menu_price;  -- ASC는 오름차순/DESC는 내림차순
 --  ORDER BY menu_price ASC;

WHERE

  • 특정 조건에 맞는 레코드를 선택할 때 사용
  • 비교 연산자(=), AND, OR, BETWEEN, LIKE, IN, IS NULL 등 활용 가능
SELECT
       menu_name
     , menu_price
     , orderable_status
  FROM tbl_menu
 WHERE orderable_status = 'Y';

DISTINCT

  • 중복값 제거에 사용
  • 컬럼값들의 종류를 쉽게 파악 가능
    ** 다중열 DISTINCT 사용 시, 다중열의 값들이 모두 동일하면 중복된 것으로 판별
SELECT 
       DISTINCT category_code
     , orderable_status
  FROM tbl_menu;

LIMIT

  • 결과 집합에서 반환할 행의 수를 제한하는 데에 사용
SELECT
    select_list
FROM
    table_name
LIMIT [offset], [row_count];

-- offset: 시작할 행의 번호(인덱스 체계)
-- row_count: 이후 행부터 반환 받을 행의 개수

JOIN

  • 두 개 이상의 테이블을 관련있는 컬럼을 통해 결합하는데 사용
  • 반드시 연관있는 컬럼이 존재해야 함
  • 테이블 별칭(ALIAS) 가능

JOIN의 종류

  • INNER JOIN
    • 두 테이블의 교집합을 반환
    • INNER 키워드 생략 가능
    SELECT
         a.menu_name
       , b.category_name
    FROM tbl_menu a
    --  INNER JOIN tbl_category b ON a.category_code =     b.category_code;
     JOIN tbl_category b ON a.category_code = b.category_code;
     -- JOIN tbl_category b USING (category_code);
  • LEFT JOIN
    • 첫 번째(왼쪽) 테이블의 모든 레코드와 두 번째(오른쪽) 테이블에서 일치하는 레코드를 반환
    • 오른쪽 테이블에 값이 없는 오른쪽 값은 null

  • RIGHT JOIN
    • 두 번째(오른쪽) 테이블의 모든 레코드와 첫 번째(왼쪽) 테이블에서 일치하는 레코드를 반환
    • 왼쪽 테이블에 값이 없는 왼쪽 값은 null

  • CROSS JOIN
    • 두 테이블의 모든 가능한 조합을 반환
    • N(왼쪽 테이블 열) * M(오른쪽 테이블 열)

  • SELF JOIN
    • 같은 테이블 내에서 행과 행 사이의 관계를 찾기 위해 사용
    SELECT
           a.category_name
         , b.category_name
      FROM tbl_category a
      JOIN tbl_category b ON a.ref_category_code = b.category_code
     WHERE a.ref_category_code IS NOT NULL;

JOIN 알고리즘

  • 단순 네스티드 루프
    • 가장 기본적인 조인 알고리즘으로 한 테이블의 각 행에 대해 다른 테이블의 모든 행을 순회하면서 조인 조건을 만족하는지 확인

  • 블록 네스티드 루프
    • 단순 네스티드 루프를 개선한 버전으로 데이터를 테이블(드라이빙 테이블)로부터 블록 단위로 불러와서 한 블록의 모든 행을 다른 테이블(드리븐 테이블)의 블록과 비교
    • IO 작업을 줄여 성능 향상

  • 블록 네스티드 루프 해쉬
    • 블록 네스티드 루프와 유사하지만 해쉬 테이블을 사용하여 조인 조건을 만족하는 행을 더 효율적으로 검색
    • 해쉬 함수를 사용하여 조인 키를 빠르게 매칭할 수 있어 성능 더욱 향상

  • 블록 인덱스
    • 인덱스를 활용하여 조인 수행

  • 블록 인덱스 해쉬
    • 블록 인덱스 조인에 해쉬 기능 추가
    • 해쉬 테이블을 활용하여 인덱스의 조인 성능을 더욱 향상시켜 빠른 매칭이 필요한 경우 유용

GROUP BY

  • 결과 집합을 특정 열의 값에 따라 그룹화하는데 사용
SELECT
       category_code
     , COUNT(*) -- COUNT, SUM, AVG 등 함수 활용 가능
  FROM tbl_menu
 GROUP BY category_code
HAVING category_code BETWEEN 5 AND 8;
  • HAVING

    • GROUP BY 절과 함께 사용해야 하며 그룹에 대한 조건을 적용하는데 사용
  • ROLL UP

    • 그룹화한 열들을 계층적으로 집계
    SELECT
           region,
           product,
           SUM(sales_amount) AS total_sales
      FROM sales
     GROUP BY ROLLUP(region, product);
    | region | product | total_sales |
     |--------|---------|-------------|
     | Asia   | Laptop  | 10000       |
     | Asia   | Tablet  | 5000        |
     | Asia   | NULL    | 15000       | -- Asia 지역의 총 매출
     | Europe | Laptop  | 8000        |
     | Europe | Tablet  | 6000        |
     | Europe | NULL    | 14000       | -- Europe 지역의 총 매출
     | NULL   | NULL    | 29000       | -- 전체 총 매출
    

SUBQUERY

  • 다른 쿼리 내에서 실행되는 쿼리
  • SUBQUERY의 결과를 활용해서 복잡한 MAINQUERY를 작성해 한번에 여러 작업을 수행
SELECT                                                   
       menu_code                                         
     , menu_name                                         
     , menu_price                                
  FROM tbl_menu                                          
 WHERE category_code = (SELECT category_code             
                          FROM tbl_menu                  
                         WHERE menu_name = '민트미역국');
  • 상관 서브쿼리

    • 서브쿼리절이 쿼리절과 맞물려서 사용되는 쿼리절
  • EXISTS

    • 조회 결과가 있을 때 true 아니면 false
  • CTE(Common Table Expressions)

    • FROM절에서만 사용 됨(JOIN일 시 JOIN 구문에서도 가능)
    • 인라인 뷰로 쓰인 서브쿼리(FROM 절에 쓰인 서브쿼리)를 미리 정의하고 메인쿼리가 심플해 질 수 있도록 사용하는 문법
    WITH menucate AS (
      SELECT menu_name
           , category_name
        FROM tbl_menu a
        JOIN tbl_category b ON a.category_code = b.category_code
    )
    SELECT
           *
      FROM menucate
     ORDER BY menu_name;

SET OPERATORS

  • SET 연산자는 두 개 이상의 SELECT문의 결과 집합을 결합하는데 사용
  • SET 연산자를 통해 결합하는 결과 집합의 컬럼이 동일해야 함

UNION

  • 두 개 이상의 SELECT 문의 결과를 결합하여 중복된 레코드를 제거한 후 반환

UNION ALL

  • 두 개 이상의 SELECT 문의 결과를 결합하며 중복된 레코드를 제거하지 않고 모두 반환

INTERSECT

  • 두 SELECT 문의 결과 중 공통되는 레코드만을 반환
  • INNER JOIN 또는 IN 연산자 활용하여 구현

MINUS

  • 첫 번째 SELECT 문의 결과에서 두 번째 SELECT 문의 결과가 포함하는 레코드를 제외한 레코드를 반환
  • LEFT JOIN을 활용하여 구현

profile
아뇨 소혠데요-

0개의 댓글