MariaDB에서 데이터 조회를 위한 SELECT 문법은 가장 기본적이면서도 강력한 기능을 제공합니다.
이 글에서는 MariaDB의 SELECT 문법을 초보자분들이 알 수 있도록 단계별로 상세히 설명해드리고자 합니다.
데이터베이스 쿼리 작성에 자신감을 갖고 싶다면 이 가이드를 놓치지 말아 주시기 바랍니다.
이 가이드에서 사용할 데이터베이스 ERD는 기존 글에서 설계한 회원 및 게시판 ERD를 사용할 예정입니다.
2025.01.27 - [MariaDB] - 게시판 DB 테이블 설계하기
게시판 DB 테이블 설계하기
목차요구사항 확인하기테이블 설계테이블 생성 스크립트마무리 오늘은 MariaDB로 게시판 테이블 설계에 대해서 이야기해보려고 합니다.웹개발을 하다 보면 게시판은 가장 기본적이면서도 중요
hyangtech.tistory.com
목차
- SELECT 기본 문법
- WHERE 절을 활용한 조건 필터링
- ORDER BY로 데이터 정렬하기
- GROUP BY로 집계 함수 사용법
- HAVING 절을 활용한 조건 필터링
- LIMIT와 OFFSET으로 페이징 처리
1. SELECT 기본 문법
SELECT 문은 데이터베이스에서 데이터를 조회하는 가장 기본적인 명령어입니다.
기본 구조는 아래와 같습니다.
SELECT
[칼럼1], [칼럼2], [칼럼3]
FROM [테이블명]
WHERE [조회조건]
ORDER BY [정렬조건]
LIMIT 10 [조회할 데이터 수 제한]
- SELECT 키워드 바로 다음에는 조회할 테이블의 칼럼을 입력합니다.
- 모든 칼럼을 조회하고 싶을 때는 * 를 사용합니다.
- FROM 키워드 다음에는 조회할 테이블명을 입력합니다.
- WHERE 키워드 다음에는 조회 조건을 입력합니다. 조회 조건이 없다면 생략 가능합니다.
- ORDER BY 키워드 다음에는 정렬 조건을 입력합니다. 내림차순일 때는 ASC, 오름차순일 때는 DESC이며 기본값은 ASC입니다.
- LIMIT 키워드 다음에는 조회할 데이터 수를 입력합니다. 2건만 조회하고 싶다면 2, 100건만 조회하고 싶다면 100, 전체 다 조회하고 싶다면 생략 가능합니다.
그럼 다양한 예제를 통해 자세히 확인해 보도록 하겠습니다.
예제1-1. 게시판 테이블에서 전체 데이터 조회하기
전체 컬럼을 조회하기 위해서는 컬럼명을 모두 작성해도 되지만, * 로 전체 컬럼을 조회할 수 있습니다.
# * 를 사용해서 전체 컬럼 조회
SELECT * FROM tb_board;
# 모든 컬럼을 입력해서 전체 컬럼 조회
SELECT
ID, MEMBER_ID, CATEGORY_ID, TITLE, CONTENTS, HIT_CNT, REG_ID, REG_DATE, UPD_ID, UPD_DATE, STATUS
FROM tb_board;
예제 1-2. 게시판 테이블에서 특정 컬럼만 조회하기
특정 컬럼을 조회하기 위해서는 조회하고 싶은 컬럼명을 입력하면 됩니다. 2개 이상의 컬럼을 조회할 때는 콤마(,)로 구분할 수 있습니다.
SELECT
MEMBER_ID, CATEGORY_ID, TITLE, REG_DATE
FROM tb_board;
2. WHERE 절을 활용한 조건 필터링
WHERE 절은 특정 조건에 맞는 데이터를 조회할 때 사용됩니다.
조건 유형 | 연산자 | 설명 | 예시 |
비교연산자 | = | 값이 동일한지 비교 | WHERE ID = 12; |
!= 또는 <> | 값이 다른지 비교 | WHERE ID <> 12; | |
> | 값이 큰지 비교 | WHERE ID > 12; | |
< | 값이 작은지 비교 | WHERE ID < 12; | |
>= | 값이 크거나 같은지 비교 | WHERE ID >= 12; | |
<= | 값이 작거나 같은지 비교 | WHERE ID <= 12; | |
논리연산자 | AND | 모든 조건이 참인 경우 | WHERE ID = 1 AND CATEGORY_ID = 2; |
OR | 조건 중 하나라도 참인 경우 | WHERE ID = 1 OR CATEGORY_ID = 2; | |
NOT | 조건이 거짓인 경우 | WHERE NOT ID = 1; | |
범위조건 | BETWEEN ... AND ... | 값이 특정 범위 내에 있는지 비교 | WHERE ID BETWEEN 1 AND 20; |
NOT BETWEEN ... AND ... | 값이 특정 범위 내에 있지 않은지 비교 | WHERE ID NOT BETWEEN 1 AND 20; | |
리스트조건 | IN (...) | 값이 리스트 안에 포함되는지 비교 | WHERE ID IN (20, 21, 22); |
NOT IN (...) | 값이 리스트 안에 포함되지 않은지 비교 | WHERE ID NOT IN (20, 21, 22); | |
패턴매칭 | LIKE | 특정 패턴과 일치하는지 비교(와일카드 : %, _) | WHERE TITLE LIKE '%hello%'; |
NOT LIKE | 특정 패턴과 일치하지 않은지 비교 | WHERE TITLE NOT LIKE '%hello%'; | |
REGEXP | 정규식 패턴과 일치하는지 비교 | WHERE ID REGEXP '^J'; | |
NOT REGEXP | 정규식 패턴과 일치하지 않은지 비교 | WHERE ID NOT REGEXP '^J'; | |
NULL 확인 | IS NULL | 값이 NULL인지 확인 | WHERE ID IS NULL; |
IS NOT NULL | 값이 NULL이 아닌지 확인 | WHERE ID NOT NULL; | |
복합조건 | () | 조건을 그룹화하여 우선순위 지정 | WHERE (ID > 10 AND ID < 20) OR CATEGORY_ID = 1; |
서브쿼리조건 | EXISTS | 서브쿼리가 결과를 반환하는지 확인 | FROM tb_board a WHERE EXISTS (SELECT ID FROM tb_board_category b WHERE b.ID = a.CATEGORY_ID); |
NOT EXISTS | 서브쿼리가 결과를 반환하지 않은지 확인 |
예제 2-1. 게시판 테이블에서 카테고리 일련번호가 1이면서 상태값이 1인 데이터만 조회하기
값이 동일한지 비교하기 위해 = 연산자를 사용하였습니다. 두 가지의 조건이 참이어야 되기 때문에 AND 연산자도 사용하였습니다.
SELECT * FROM tb_board
WHERE CATEGORY_ID = 1 AND STATUS = 1;
CATEGORY_ID는 INT 데이터타입으로 생성될 칼럼이기에 가급적 조회 시 비교할 값도 같은 데이터타입으로 하는 게 조회 성능에 유리합니다.
# 좋은 예
SELECT * FROM tb_board
WHERE CATEGORY_ID = 1;
# 안 좋은 예
SELECT * FROM tb_board
WHERE CATEGORY_ID = '1';
예제 2-2. 게시판 테이블에서 제목에 Est 단어로 시작하는 데이터만 조회하기
# Est로 시작하는 데이터
SELECT * FROM tb_board
WHERE TITLE LIKE 'Est%';
# Est로 끝나는 데이터
SELECT * FROM tb_board
WHERE TITLE LIKE '%Est';
# Est가 포함되는 데이터
SELECT * FROM tb_board
WHERE TITLE LIKE '%Est%';
특정 단어가 포함되어 있는지 확인하기 위해서는 LIKE라는 문자열 패턴 매칭 연산자를 사용합니다. LIKE는 패턴과 일치하는 데이터를 검색할 때 유용하며, 와일드카드 문자를 사용하여 유연한 검색이 가능합니다.
와일드카드 문자
- % (퍼센트) : 0개 이상의 문자와 일치할 때 사용됩니다. (예 : 'John%'는 "John", "Johnny", "Johnnson" 등과 일치합니다.
- _ (언더스코어) : 정확히 한 개의 문자와 일치할 때 사용됩니다. (예 : 'J_hn'는 "John", "Jahn", "Juhn" 등과 일치합니다.
예제 2-3. 게시판 테이블에서 ID 컬럼이 1, 3, 5 인 데이터 조회하기
# IN 연산자를 이용한 검색
SELECT * FROM tb_board
WHERE ID IN (1, 3, 5);
# OR 연산자를 이용한 검색
SELECT * FROM tb_board
WHERE ID = 1 OR ID = 3 OR ID = 5;
3. ORDER BY로 데이터 정렬하기
ORDER BY는 조회된 데이터를 특정 컬럼 기준으로 정렬합니다. 오름차순(ASC) 또는 내림차순(DESC)으롤 정렬할 수 있습니다.
ASC, DESC 키워드는 생략할 수 있으며, 기본 값은 ASC입니다.
예제 3-1. 게시판 테이블에서 ID 컬럼 내림차순으로 조회하기
SELECT * FROM tb_board
ORDER BY ID DESC;
예제 3-2. 게시판 테이블에서 CATEGORY_ID 오름차순으로 정렬하고, 두 번째로는 HIT_CNT 내림차순으로 정렬하기
SELECT * FROM tb_board
ORDER BY CATEGORY_ID ASC, HIT_CNT DESC;
4. GROUP BY로 집계 함수 사용법
GROUP BY는 데이터를 그룹화하고, COUNT, SUM, AVG 등의 집계 함수와 함께 사용됩니다.
GROUP BY에서 그룹화한 컬럼을 제외하고, 다른 데이터를 조회하려면 반드시 집계 함수를 같이 사용해야 합니다.
MariaDB는 데이터베이스 설정에 따라 집계 함수를 사용하지 않아도 데이터가 조회되긴 하나, 정확히 사용하기 위해서는 반드시 집계 함수를 사용하길 권장드립니다.
주요 집계함수 목록
함수 | 설명 |
COUNT() | 그룹의 행 수를 반환합니다. |
SUM() | 그룹의 숫자 값의 합계를 반환합니다. |
AVG() | 그룹의 숫자 값의 평균을 반환합니다. |
MIN() | 그룹의 최소 값을 반환합니다. |
MAX() | 그룹의 최대 값을 반환합니다. |
GROUP_CONCAT() | 그룹의 문자열 값을 연결하여 하나의 문자열로 반환합니다. |
예제 4-1. 게시판 테이블에서 CATEGORY_ID 컬럼별 데이터 수 조회하기
CATEGORY_ID 컬럼으로 그룹화하고, COUNT() 집계 함수로 데이터 수를 조회하였습니다.
SELECT CATEGORY_ID, COUNT(*) FROM tb_board
GROUP BY CATEGORY_ID;
GROUP BY에 지정된 컬럼을 기준으로 한 로우씩 출력되는 걸 확인할 수 있습니다.
가끔 실무에서 한 로우에 각 CATEGORY_ID 데이터 수를 출력해야 하는 요구사항이 있을 수도 있는데요.
그럴 땐 CASE 문과 집계 함수를 이용해서 아래처럼 쿼리를 작성할 수 있습니다.
SELECT
SUM(CASE WHEN CATEGORY_ID = 1 THEN 1 ELSE 0 END) AS CATEGORY1_CNT,
SUM(CASE WHEN CATEGORY_ID = 2 THEN 1 ELSE 0 END) AS CATEGORY2_CNT,
SUM(CASE WHEN CATEGORY_ID = 3 THEN 1 ELSE 0 END) AS CATEGORY3_CNT,
SUM(CASE WHEN CATEGORY_ID = 4 THEN 1 ELSE 0 END) AS CATEGORY4_CNT
FROM tb_board;
개인적으로 개발할 때 위의 쿼리처럼 CASE 문과 SUM 집계함수를 이용해 데이터를 조회할 일이 많았던 것 같습니다.
예제 4-2. 게시판 테이블에서 CATEGORY_ID 컬럼별 최소 조회수, 최대 조회수, 평균 조회수 조회하기
SELECT
CATEGORY_ID,
MIN(HIT_CNT) AS '최소 조회수',
MAX(HIT_CNT) AS '최대 조회수',
AVG(HIT_CNT) AS '평균 조회수'
FROM tb_board
GROUP BY CATEGORY_ID;
예제 4-3. 게시판 테이블에서 MEMBER_ID, CATEGORY_ID 두 컬럼별 데이터 수와 최대 조회수 조회하기
GROUP BY로 그룹화할 컬럼은 1개 이상을 작성할 수 있습니다.
SELECT MEMBER_ID, CATEGORY_ID, COUNT(*), MAX(HIT_CNT) FROM tb_board
WHERE STATUS = 1
GROUP BY MEMBER_ID, CATEGORY_ID
예제 4-4. 그룹화 없이 CATEGORY_ID가 2인 데이터 수 조회하기
물론, GROUP BY문 없이도 특정 조건에 대한 데이터 수를 조회할 때는 GROUP BY문을 제외할 수 있습니다.
SELECT COUNT(*) FROM tb_board
WHERE CATEGORY_ID = 2;
5. HAVING 절을 활용한 조건 필터링
HAVING은 GROUP BY와 함께 사용되는 조건절입니다. HAVING은 그룹화된 데이터에 조건을 걸어 필터링하는 데 사용됩니다.
WHERE절이 개별 행에 조건을 걸는 반면에, HAVING은 그룹화된 결과에 조건을 적용합니다.
HAVING 절 기본 구조
SELECT 컬럼1, 집계함수(컬럼2)
FROM 테이블명
GROUP BY 컬럼1
HAVING 조건;
HAVING 절에 사용되는 조건은 집계함수 또는 SELECT 절에서 사용된 집계함수의 별칭으로 조건을 적용할 수 있습니다.
예제 5-1. MEMBER_ID별로 그룹화하고 데이터 수가 200건 이상인 데이터만 조회하기
# 집계함수 사용
SELECT MEMBER_ID, COUNT(*) FROM tb_board
WHERE STATUS = 1
GROUP BY MEMBER_ID
HAVING COUNT(*) > 200;
# 별칭 사용
SELECT MEMBER_ID, COUNT(*) AS CNT FROM tb_board
WHERE STATUS = 1
GROUP BY MEMBER_ID
HAVING CNT >= 200;
6. LIMIT와 OFFSET으로 페이징 처리
LIMIT는 조회할 데이터의 수를 제한하고, OFFSET은 시작 위치를 지정합니다.
예제 6-1. 게시판 테이블에서 데이터 10건만 조회하기
SELECT * FROM tb_board
LIMIT 10;
예제 6-2. 게시판 테이블에서 CATEGORY_ID 컬럼이 1인 데이터 중 10건만 조회하면서, 시작 위치는 20번째부터 조회하기
SELECT * FROM tb_board
WHERE CATEGORY_ID = 1
LIMIT 10 OFFSET 20
LIMIT와 OFFSET을 통해 게시판 페이징을 구현할 수 있습니다.
20개씩 게시물을 보여주는 게시판이 있으면서, 3번째 페이지를 클릭한다고 했을 때 아래처럼 조회 쿼리를 작성할 수 있습니다.
SELECT * FROM tb_board
WHERE STATUS = 1
LIMIT 20 OFFSET 40;
다만, OFFSET에 들어간 40은 3페이지를 클릭했을 때 동적으로 (현재 페이지 수 - 1) * 노출할 데이터 수 계산식으로 사전에 계산되어야 할 것입니다.
위의 계산식으로 구한다면, 4페이지를 클릭한다면 60이 될 것이고, 1번째 페이지는 0일 겁니다.
마무리
SELECT 문법은 데이터베이스 조회의 핵심입니다.
웹개발을 할 때 다른 내용도 중요하겠지만, 무엇보다 데이터를 정확하게 조회해서 노출하고 그러면서 데이터 조회 속도도 매우 빨라야 할 것입니다.
이를 위해서는 SELECT 문법을 정확히 사용해야 하며, 나아가서는 PK나 인덱스를 통한 데이터 색인이 필요합니다.
그리고 SELECT 문을 작성 시에는 늘 실행계획을 확인하며, 데이터베이스 옵티마이저가 쿼리를 어떻게 수행하는지 분석할 필요가 있습니다.
다음번에는 어떻게 SELECT 쿼리문을 작성해야 효율적이고 빠르게 조회할 수 있는지에 대해서도 작성해 보도록 하겠습니다.
감사합니다.
'MariaDB' 카테고리의 다른 글
MariaDB 실행 계획 분석 방법 (0) | 2025.03.17 |
---|---|
게시판 DB 테이블 설계하기 (0) | 2025.01.27 |
MariaDB 백업방식, 물리 백업과 논리 백업의 차이와 활용법 (0) | 2025.01.25 |
MariaDB 계산된필드(Computed Column)이란? (1) | 2025.01.24 |
MariaDB PK 설정하지 않은 테이블 조회하기 (1) | 2025.01.17 |