[DB] SQL 기초 (1)

배창민·2025년 8월 19일
post-thumbnail

SQL 기초 정리

1. SELECT

테이블에서 원하는 데이터를 조회할 때 사용

-- 단일 컬럼 조회
SELECT menu_name
  FROM tbl_menu;

-- 여러 컬럼 조회
SELECT menu_code, menu_name, menu_price
  FROM tbl_menu;

-- 전체 컬럼 조회 (* 사용)
SELECT * FROM tbl_menu;

-- 단독 SELECT (테이블 없이 계산/함수 사용)
SELECT 7+3;              
SELECT NOW() AS 현재시간;

2. ORDER BY

결과 집합을 정렬할 때 사용

-- 오름차순 정렬 (ASC 기본값)
SELECT menu_name, menu_price
  FROM tbl_menu
 ORDER BY menu_price;

-- 내림차순 정렬
SELECT menu_name, menu_price
  FROM tbl_menu
 ORDER BY menu_price DESC;

-- 다중 정렬 (1순위 가격, 2순위 이름)
SELECT menu_name, menu_price
  FROM tbl_menu
 ORDER BY menu_price DESC, menu_name ASC;

-- 계산 결과로 정렬
SELECT menu_code, menu_price, menu_code*menu_price AS total
  FROM tbl_menu
 ORDER BY total DESC;

-- 특정 값 우선 정렬 (N 먼저, Y 나중)
SELECT menu_name, orderable_status
  FROM tbl_menu
 ORDER BY FIELD(orderable_status, 'N', 'Y');

3. WHERE

조건을 설정해 원하는 레코드만 조회

-- 비교 연산자 사용
SELECT menu_name, menu_price
  FROM tbl_menu
 WHERE menu_price >= 13000;

-- AND / OR 조건
SELECT menu_name, category_code
  FROM tbl_menu
 WHERE orderable_status='Y' AND category_code=10;

-- BETWEEN (범위 검색)
SELECT menu_name, menu_price
  FROM tbl_menu
 WHERE menu_price BETWEEN 10000 AND 25000;

-- LIKE (패턴 검색: %는 여러 글자)
SELECT menu_name
  FROM tbl_menu
 WHERE menu_name LIKE '%마늘%';

-- IN (여러 값 중 하나)
SELECT menu_name
  FROM tbl_menu
 WHERE category_code IN (4,5,6);

-- NULL 값 검색
SELECT category_name
  FROM tbl_category
 WHERE ref_category_code IS NULL;

4. DISTINCT

중복 제거

-- 단일 컬럼 중복 제거
SELECT DISTINCT category_code
  FROM tbl_menu;

-- 다중 컬럼 중복 제거
SELECT DISTINCT category_code, orderable_status
  FROM tbl_menu;

5. JOIN

두 개 이상의 테이블을 연결

-- INNER JOIN (공통되는 값만)
SELECT a.menu_name, b.category_name
  FROM tbl_menu a
  JOIN tbl_category b ON a.category_code=b.category_code;

-- LEFT JOIN (왼쪽 기준, 없는 건 NULL)
SELECT a.menu_name, b.category_name
  FROM tbl_menu a
  LEFT JOIN tbl_category b ON a.category_code=b.category_code;

-- RIGHT JOIN (오른쪽 기준, 없는 건 NULL)
SELECT a.menu_name, b.category_name
  FROM tbl_menu a
 RIGHT JOIN tbl_category b ON a.category_code=b.category_code;

-- CROSS JOIN (모든 조합)
SELECT a.menu_name, b.category_name
  FROM tbl_menu a
 CROSS JOIN tbl_category b;

-- SELF JOIN (자기 자신과 조인)
SELECT a.category_name, b.category_name AS parent_category
  FROM tbl_category a
  JOIN tbl_category b ON a.ref_category_code=b.category_code;

6. GROUP BY / HAVING

그룹별 집계

-- 그룹별 데이터 개수
SELECT category_code, COUNT(*) AS menu_cnt
  FROM tbl_menu
 GROUP BY category_code;

-- 그룹별 합계 / 평균
SELECT category_code, SUM(menu_price), AVG(menu_price)
  FROM tbl_menu
 GROUP BY category_code;

-- HAVING (그룹 조건)
SELECT category_code, COUNT(*)
  FROM tbl_menu
 GROUP BY category_code
HAVING category_code BETWEEN 5 AND 8;

-- ROLLUP (부분합, 총합)
SELECT category_code, SUM(menu_price)
  FROM tbl_menu
 GROUP BY category_code WITH ROLLUP;

7. SUBQUERY

쿼리 안에서 또 다른 쿼리 사용

-- 단일 값 서브쿼리 (민트미역국과 같은 카테고리)
SELECT menu_code, menu_name
  FROM tbl_menu
 WHERE category_code = (SELECT category_code
                          FROM tbl_menu
                         WHERE menu_name='민트미역국');

-- FROM절 서브쿼리 (파생 테이블)
SELECT MAX(count_val)
  FROM (SELECT COUNT(*) AS count_val
          FROM tbl_menu
         GROUP BY category_code) AS t;

-- 상관 서브쿼리 (카테고리별 평균보다 큰 메뉴)
SELECT menu_name, menu_price
  FROM tbl_menu a
 WHERE menu_price > (SELECT AVG(menu_price)
                       FROM tbl_menu
                      WHERE category_code=a.category_code);

-- EXISTS (관련 데이터 존재 여부 확인)
SELECT category_name
  FROM tbl_category a
 WHERE EXISTS (SELECT 1
                 FROM tbl_menu b
                WHERE b.category_code=a.category_code);

-- CTE (공통 테이블 표현식, WITH문)
WITH menucate AS (
    SELECT a.menu_name, b.category_name
      FROM tbl_menu a
      JOIN tbl_category b ON a.category_code=b.category_code
)
SELECT * FROM menucate;
profile
개발자 희망자

0개의 댓글