Database

[DB] MaridDB 문법 - 간략하게

grove1212 2025. 1. 24. 18:54

1. select

SELECT menu_name FROM tbl_menu;
-- '*' : 모든 컬럼을 보고싶을 때 사용, 그러나 현업에서는 모호한 *보다는 확실하게 모든 컬럼을 명시해서 사용한다고 한다.
SELECT * FROM tbl_menu; 

-- 단독으로 select문 사용
SELECT 7 + 3;

-- 내장함수 확인
SELECT NOW() AS 현재시간;

2. order by

: 오름차순 정렬이 기본이다.

2-1. 기본 사용 형태

ORDER BY '컬럼명' [ASC/DESC]

SELECT
         menu_code
         , menu_name
         , menu_price
    FROM tbl_menu
--     ORDER BY menu_price ASC; --asc는 오름차순 (default)
        ORDER BY menu_price DESC; -- desc는 내림차순

2-2. field 함수

내가 정렬하고 싶은 데이터의 순서가 있을 때, 이 함수와 함께 커스텀된 order by 사용이 가능하다.  
FIELD 함수를 ORDER BY 뒤에 사용하면 원하는 값을 우선적으로 정렬할 수 있다.
SELECT
         menu_name
        ,orderable_status
        ,FIELD(orderable_status, 'Y', 'N')
    FROM tbl_menu
 ORDER BY FIELD(orderable_status, 'Y','N');

'Y'가 먼저 정렬되고, 그 다음에 'N'이 정렬된다는 뜻이다.

같은 게 있으면 내부 기준으로 정렬되고, 만약 'Y'도, 'N'도 아닌 제 3의 값이 있으면 그 값은 'y','n'의 가장 위로 올라온다.

  • 정렬 결과

    명시되지 않은 값
    Y
    N

2-3. null의 정렬 기준

  1. 오름차순일 땐 맨 위에 NULL 값이 온다.
  2. 내림차순일 땐 맨 아래에 NULL 값이 온다.
    ORDER BY -ref_category_code와 같이 표현할 때도, -가 붙어서 값들은 내림차순으로 정렬되겠지만 null값은 맨 위로 온다.

3. where

: 조건에 맞는 레코드만 보고싶을 때 사용한다.
  1. 비교 연산자 : =, !=, <, <=, >, >= 사용 가능하다.

  2. 논리 연산자 : and, or, not 사용 가능하다. 이때 주의할 점은 and 연산자의 우선순위가 or 연산자의 우선순위보다 높아서, and가 먼저 연산된다는 것이다.

  3. between and 연산자

    SELECT *
    FROM tbl_menu
    WHERE menu_price BETWEEN 10000 AND 25000
    ORDER BY menu_price;
  4. like 연산자
    : 문자 포함은 %, 한 글자는 _로 표현한다.

    SELECT * FROM tbl_menu
    WHERE menu_name LIKE '_마늘%'; -- '_'는 한 글자 자리 차지
  • 검색 시 _%를 실제로 검색하고 싶을 때는 다음과 같이 사용한다.

    LIKE '%\_%'
  1. in 연산자
  2. SELECT * FROM tbl_menu WHERE category_code IN (4, 5, 6) ORDER BY category_code;
  3. is null : null값은 비교연산자로 비교가 불가능하다.
  4. SELECT * FROM tbl_category WHERE ref_category_code IS NULL;

4. distinct

: 중복 레코드 삭제
  • 재밌는 점은 null이 비교는 안되는데 중복 레코드 삭제할 때는 null도 중복으로 인식된다는 점이다.
  • 다중 열에도 사용이 가능하다.
  • SELECT DISTINCT category_code, orderable_status -- 두 개 컬럼 조합했을 때 중복되는 것을 제거 FROM tbl_menu;
  • group by 역시 중복을 제거하는 방법 중 하나이다.
  • SELECT category_code, orderable_status FROM tbl_menu GROUP BY category_code;

5. limit

: 특정 개수의 레코드만 보여주도록 조정
SELECT menu_code, menu_name, menu_price
FROM tbl_menu
ORDER BY menu_price
LIMIT 1, 4;

-- offset은 생략이 가능하며 row_count만 입력하면 top-n 행 반환
SELECT menu_code, menu_name, menu_price
FROM tbl_menu
ORDER BY menu_price
LIMIT 5;

6. join

: 관계형 DB는 최대한 중복되는 데이터가 없도록 테이블을 쪼개놓는다. 그래서 그 테이블을 연결해서 정보를 만들려면 join을 통해 테이블을 합쳐야 한다.
-- 조인의 종류
-- 1. inner join : 두 테이블의 교집합을 반환
-- (1) on : 
SELECT menu_name, category_name
FROM tbl_menu AS a
JOIN tbl_category AS b ON a.category_code = b.category_code;

-- (2) using : join할테이블의 컬럼명이 동일한 경우만 사용
SELECT a.menu_name, b.category_name
FROM tbl_menu a
JOIN tbl_category b USING (category_code);

-- employee와 department join
SELECT a.emp_name, b.dept_title
FROM employee a
JOIN department b ON a.DEPT_CODE = b.DEPT_ID;
-- inner join은 교집합만 반환하므로 겹치지 않는 값은 view에 들어가지 않는다.

-- 2. left [outer] join
-- : 왼쪽 테이블의 모든 레코드와 오른쪽 테이블에서 일치하는 레코드(행)를 반환
SELECT a.emp_name, b.dept_title
FROM employee a
LEFT JOIN department b ON a.DEPT_CODE = b.DEPT_ID;

-- 3. right [outer] join
-- : 오른쪽 테이블의 모든 레코드와 왼쪽 테이블에서 일치하는 레코드(행)를 반환
SELECT a.emp_name, b.dept_title
FROM employee a
RIGHT JOIN department b ON a.DEPT_CODE = b.DEPT_ID;

-- 4. cross join : 두 테이블의 가능한 모든 조합을 반환하는 조인
-- 카티션 프로덕트
SELECT 
       a.menu_name
     , b.category_name
  FROM tbl_menu a
 CROSS JOIN tbl_category b;

7. grouping

: 때로는 레벨별, 부서별로 어떤 값을 집계해서 보고싶을 때가 있다. 그럴 때 사용한다.
  • having
    : grouping 후 조건에 맞는 레코드만 보고싶을 때 사용한다.
--   group by : distinct와 같은 효과  
        SELECT *  
        FROM tbl_menu  
        GROUP BY category_code;

SELECT category_code, COUNT(*)  
FROM tbl_menu  
GROUP BY category_code;

8. subqueries

: 절 내부에 또 절이 올 수 있다.

-- 메뉴 이름이 민트미역국인 메뉴의 카테고리 코드를 찾아, 그 카테고리 코드에 속한 메뉴를 모두 보고싶을 때  
SELECT  
category_code  
FROM tbl_menu  
WHERE menu_name = '민트미역국';

SELECT  
menu_name  
FROM tbl_menu  
WHERE category_code = 4;

-- 위의 질의를 하나의 질의로 변경  
SELECT  
menu_name  
FROM tbl_menu  
WHERE category_code = (SELECT  
category_code  
FROM tbl_menu  
WHERE menu_name = '민트미역국');