GROUP BY

데이터를 그룹화 하고 싶을 때 GROUP BY 문을 사용하고 일반적으로 HAVING도 같이 사용한다.

HAVING : WHERE과 비슷한 역할을 하며 그룹화된 데이터를 필터링 한다.

다음 아래에 회원 테이블 생성 및 회원 쿼리문 예제로 실습을 진행한다.

회원 테이블 생성 쿼리문

CREATE TABLE `member` (

`mb_id` varchar(20) NOT NULL,  
`mb_password` varchar(255) NOT NULL,  
`mb_name` varchar(50) NOT NULL,  
`mb_email` varchar(100) NOT NULL,  
`mb_hp` varchar(20) DEFAULT NULL,  
`mb_tel` varchar(20) DEFAULT NULL,  
`mb_addr` varchar(255) DEFAULT NULL,  
`mb_birth` date DEFAULT NULL,  
`mb_sex` char(1) DEFAULT NULL,  
`mb_level` int DEFAULT '1',  PRIMARY KEY (`mb_id`)

);

회원 데이터

INSERT INTO `member` (`mb_id`, `mb_password`, `mb_name`, `mb_email`, `mb_hp`, `mb_tel`, `mb_addr`, `mb_birth`, `mb_sex`, `mb_level`) VALUES
('user001', 'password123', '홍길동', 'hong1@example.com', '010-1111-2222', '02-123-4567', '서울시 강남구', '1990-05-12', 'M', 1),
('user002', 'password456', '김영희', 'kim2@example.com', '010-2233-4455', '031-789-1234', '경기도 수원시', '1992-07-23', 'F', 2),
('user003', 'password789', '이철수', 'lee3@example.com', '010-3344-5566', '032-456-7890', '부산시 해운대구', '1985-10-30', 'M', 3),
('user004', 'password012', '박지영', 'park4@example.com', '010-4455-6677', '033-567-8901', '인천시 부평구', '1995-03-15', 'F', 1),
('user005', 'password345', '최민수', 'choi5@example.com', '010-5566-7788', '042-678-9012', '대전시 서구', '1993-12-05', 'M', 2),
('user006', 'password678', '윤수진', 'yoon6@example.com', '010-6677-8899', '052-789-0123', '울산시 남구', '1988-01-19', 'F', 1),
('user007', 'password901', '오세훈', 'oh7@example.com', '010-7788-9900', '061-890-1234', '광주시 북구', '1987-08-22', 'M', 3),
('user008', 'password234', '한지민', 'han8@example.com', '010-8899-0011', '051-901-2345', '경상북도 포항시', '1991-04-28', 'F', 1),
('user009', 'password567', '서지수', 'seo9@example.com', '010-9900-1122', '063-234-5678', '전주시 완산구', '1994-06-13', 'F', 2),
('user010', 'password890', '장우진', 'jang10@example.com', '010-1122-3344', '02-123-4567', '서울시 종로구', '1986-09-02', 'M', 1),
('user011', 'passwordabc', '김민지', 'kim11@example.com', '010-2233-4455', '031-567-8901', '경기도 안양시', '1990-11-11', 'F', 2),
('user012', 'passworddef', '조수미', 'cho12@example.com', '010-3344-5566', '032-456-7890', '부산시 동래구', '1985-05-23', 'F', 3),
('user013', 'passwordghi', '임윤호', 'lim13@example.com', '010-4455-6677', '033-678-9012', '인천시 송도구', '1992-01-14', 'M', 1),
('user014', 'passwordjkl', '오미정', 'oh14@example.com', '010-5566-7788', '042-789-0123', '대전시 유성구', '1994-09-30', 'F', 2),
('user015', 'passwordmno', '한상우', 'han15@example.com', '010-6677-8899', '052-890-1234', '울산시 울주군', '1993-02-02', 'M', 1),
('user016', 'passwordpqr', '최진영', 'cho16@example.com', '010-7788-9900', '061-123-4567', '광주시 서구', '1990-08-19', 'F', 3),
('user017', 'passwordstu', '윤진우', 'yoon17@example.com', '010-8899-0011', '051-234-5678', '경상북도 경주시', '1987-12-11', 'M', 2),
('user018', 'passwordvwx', '김하늘', 'kim18@example.com', '010-9900-1122', '063-567-8901', '전라북도 군산시', '1995-06-25', 'F', 1),
('user019', 'passwordyz1', '장우석', 'jang19@example.com', '010-1122-3344', '02-567-8901', '서울시 마포구', '1991-10-14', 'M', 2),
('user020', 'password1234', '박수현', 'park20@example.com', '010-2233-4455', '031-890-1234', '경기도 화성시', '1992-03-01', 'F', 1);

GROUP BY 기본 형식

SELECT [열] FROM [테이블명] WHERE [열] = [조건값] GROUP BY [열] HAVING [열] = [조건값]

※ SELECT하는 열과 GROUP BY의 열은 같아야 한다

회원 권한을 그룹화

mysql> select mb_level from member group by mb_level;
+----------+
| mb_level |
+----------+
|        1 |
|        2 |
|        3 |
+----------+

회원 권한을 중복만 제거하여 출력

mysql> select distinct mb_level from member;
+----------+
| mb_level |
+----------+
|        1 |
|        2 |
|        3 |
+----------+
3 rows in set (0.00 sec)

※ DISTINCT는 단순히 중복만 제거하기때문에 계산이 필요하다면 GROUP BY를 사용해야한다.

COUNT

그룹화한 튜플의 데이터 개수를 카운트

SELECT [컬럼1], COUNT(*) FROM [테이블명] GROUP BY [컬럼1]
SELECT [컬럼1], COUNT(*) AS CNT FROM [테이블명] GROUP BY [컬럼1]

AS(alias)

alias는 별칭을 뜻하며 필드명, 테이블 명에 붙일 수 있다

SELECT mb_level AS lv, mb_addr AS addr from member AS mb limit 5;
mysql> SELECT mb_level AS lv, mb_addr AS addr from member AS mb limit 5;
+------+-----------------+
| lv   | addr            |
+------+-----------------+
|    1 | 서울시 강남구   |
|    2 | 경기도 수원시   |
|    3 | 부산시 해운대구 |
|    1 | 인천시 부평구   |
|    2 | 대전시 서구     |
+------+-----------------+
5 rows in set (0.00 sec)

member 테이블에 mb_sex 컬럼의 카운트

mysql> select mb_level, mb_sex, count(*) as cnt from member group by mb_level, mb_sex order by mb_level asc;
+----------+--------+-----+
| mb_level | mb_sex | cnt |
+----------+--------+-----+
|        1 | F      |   5 |
|        1 | M      |   4 |
|        2 | F      |   4 |
|        2 | M      |   3 |
|        3 | F      |   2 |
|        3 | M      |   2 |
+----------+--------+-----+
6 rows in set (0.00 sec)

HAVING

GROUP BY는 WHERE절을 사용할 수 없기 때문에 HAVING을 사용한다

mb_level과 mb_sex로 그룹화하고 mb_level이 1인 데이터 조회

mysql> select mb_level, mb_sex, count(*) as cnt from member group by mb_level, mb_sex having mb_level = 1;
+----------+--------+-----+
| mb_level | mb_sex | cnt |
+----------+--------+-----+
|        1 | M      |   4 |
|        1 | F      |   5 |
+----------+--------+-----+
2 rows in set (0.00 sec)

mb_sex, mb_name, mb_birth를 그룹화하고 성별이 남자인 회원만 생년월일 오름차 순으로 조회

mysql> select mb_sex, mb_name, mb_birth from member group by mb_sex, mb_name, mb_birth having mb_sex = 'M' order by mb_birth asc;
+--------+---------+------------+
| mb_sex | mb_name | mb_birth   |
+--------+---------+------------+
| M      | 이철수  | 1985-10-30 |
| M      | 장우진  | 1986-09-02 |
| M      | 오세훈  | 1987-08-22 |
| M      | 윤진우  | 1987-12-11 |
| M      | 홍길동  | 1990-05-12 |
| M      | 장우석  | 1991-10-14 |
| M      | 임윤호  | 1992-01-14 |
| M      | 한상우  | 1993-02-02 |
| M      | 최민수  | 1993-12-05 |
+--------+---------+------------+
9 rows in set (0.00 sec)
반응형

'MYSQL' 카테고리의 다른 글

[MYSQL][08] ALTER  (1) 2024.11.27
[MYSQL][07] ORDER BY  (0) 2024.11.26
[MYSQL][06] 외래키(Foreign Key, FK)의 참조 무결성  (0) 2024.11.25
[MYSQL][05] KEY  (0) 2024.11.24
[MYSQL][04] SELECT  (0) 2024.11.22

ALTER

예제 쿼리문

부모 테이블 생성

mysql> create table parent_table(col1 int);
Query OK, 0 rows affected (0.02 sec)
mysql> desc parent_table;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| col1  | int  | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

자식 테이블 생성

mysql> create table child_table(col1 int);
Query OK, 0 rows affected (0.02 sec)

mysql> desc child_table;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| col1  | int  | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

PK의 추가 및 삭제

PK 추가

ALTER TABLE [테이블명] ADD PRIMARY KEY(PK_COLUMN);
mysql> alter table parent_table add primary key(col1);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc parent_table;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| col1  | int  | NO   | PRI | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

PK 삭제

ALTER TABLE [테이블명] DROP PRIMARY KEY;
mysql> alter table parent_table drop primary key;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc parent_table;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| col1  | int  | NO   |     | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

FK의 추가 및 삭제

FK 추가

외래키 추가시 자식 테이블에서 REFERENCES 사용하여 부모 테이블의 PK를 참조한다.

ALTER TABLE CHILD_TABLE ADD FOREIGN KEY(C_FK_COLUMN) 
REFERENCES PARENT_TABLE(P_PK_COLUMN)
mysql> alter table child_table add foreign key(col1) references parent_table(col1);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc child_table;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| col1  | int  | YES  | MUL | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

FK 삭제

CONSTRAINT 제약 조건을 찾아서 DROP 한다.

mysql> show create table child_table;
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table       | Create Table                                                                                                                                                                                                                                |
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| child_table | CREATE TABLE `child_table` (
  `col1` int DEFAULT NULL,
  KEY `col1` (`col1`),
  CONSTRAINT `child_table_ibfk_1` FOREIGN KEY (`col1`) REFERENCES `parent_table` (`col1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> alter table child_table drop constraint child_table_ibfk_1;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc child_table;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| col1  | int  | YES  | MUL | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

필드 추가

ADD 기본형식

ALTER TABLE [테이블명]
ADD [컬럼명] [타입명] [제약조건];

ADD 여러 필드 입력

ALTER TABLE [테이블명]
ADD [컬럼명] [타입명] [제약조건],
ADD [컬럼명] [타입명] [제약조건],
ADD [컬럼명] [타입명] [제약조건];
mysql> desc parent_table;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| col1  | int  | NO   | PRI | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> alter table parent_table add col3 int;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc parent_table;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| col1  | int  | NO   | PRI | NULL    |       |
| col3  | int  | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
2 rows in set (0.00 sec)

필드 위치 지정

AFTER

AFTER 컬럼 뒤에 위치하며 AFTER를 작성하지 않으면 가장 마지막에 추가된다.

ALTER TABLE [테이블명]
ADD [컬럼명] [타입명] [제약조건] AFTER [추가될 필드 앞의 컬럼];
ALTER TABLE [테이블명]
ADD col2 int [제약조건] AFTER [추가될 필드 앞의 컬럼];
mysql> alter table parent_table add col2 int after col1;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc parent_table;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| col1  | int  | NO   | PRI | NULL    |       |
| col2  | int  | YES  |     | NULL    |       |
| col3  | int  | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
3 rows in set (0.00 sec)

FIRST

필드가 제일 앞에 추가된다.


mysql> alter table parent_table add col0 int first;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc parent_table;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| col0  | int  | YES  |     | NULL    |       |
| col1  | int  | NO   | PRI | NULL    |       |
| col2  | int  | YES  |     | NULL    |       |
| col3  | int  | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
4 rows in set (0.00 sec)

필드 수정

MODIFY

기본 형식

ALTER TABLE PARENT_TABLE MODIFY [컬럼명] [타입];

col3을 int->varchar(50) 타입으로 변경

mysql> alter table parent_table modify col3 varchar(50);
Query OK, 4 rows affected (0.05 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> desc parent_table;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| col0  | int         | YES  |     | NULL    |       |
| col1  | int         | NO   | PRI | NULL    |       |
| col2  | int         | YES  |     | NULL    |       |
| col3  | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

col3을 col0 앞으로 이동


mysql> alter table parent_table modify col3 varchar(50) after col0;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc parent_table;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| col0  | int         | YES  |     | NULL    |       |
| col3  | varchar(50) | YES  |     | NULL    |       |
| col1  | int         | NO   | PRI | NULL    |       |
| col2  | int         | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

col3을 제일 앞으로 이동

mysql> alter table parent_table modify col3 varchar(50) first;
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc parent_table;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| col3  | varchar(50) | YES  |     | NULL    |       |
| col0  | int         | YES  |     | NULL    |       |
| col1  | int         | NO   | PRI | NULL    |       |
| col2  | int         | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

컬럼명 타입 기재 없이 작성시 오류

mysql> alter table parent_table modify col3 after col2;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'after col2' at line 1

col3을 col2 뒤로 이동

mysql> alter table parent_table modify col3 varchar(50) after col2;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc parent_table;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| col0  | int         | YES  |     | NULL    |       |
| col1  | int         | NO   | PRI | NULL    |       |
| col2  | int         | YES  |     | NULL    |       |
| col3  | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

※ 타입을 지정해줘야 오류가 발생하지 않는다.

필드명 변경

CHANGE(MySQL 5.x 이상 지원)

필드명 변경시 새로운 컬럼의 타입을 지정해야한다.

ALTER TABLE [테이블명] CHANGE [기존컬럼명] [새컬럼명] [새컬럼타입];

CHANGE COLUMN(MySQL 5.x 이상 지원)

CHANGE와 마찬가지로 필드명 변경시 새로운 컬럼의 타입을 지정해야한다.

ALTER TABLE [테이블명] CHANGE COLUMN [기존컬럼명] [새컬럼명] [새컬럼타입];
mysql> alter table parent_table change col3 column3 varchar(50);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc parent_table;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| col0    | int         | YES  |     | NULL    |       |
| col1    | int         | NO   | PRI | NULL    |       |
| col2    | int         | YES  |     | NULL    |       |
| column3 | varchar(50) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

RENAME COLUMN(MySQL 8.0 이상 지원)

타입 지정 없이 필드명만 변경

ALTER TABLE [테이블명] RENAME COLUMN [기존컬럼명] TO [새컬럼명];
mysql> alter table parent_table rename column col2 to column2;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc parent_table;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| col0    | int         | YES  |     | NULL    |       |
| col1    | int         | NO   | PRI | NULL    |       |
| column2 | int         | YES  |     | NULL    |       |
| column3 | varchar(50) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

필드 삭제

DROP

한 개의 필드 삭제

ALTER TABLE [테이블명] DROP [기존컬럼명];
mysql> alter table parent_table drop column3;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc parent_table;
+---------+------+------+-----+---------+-------+
| Field   | Type | Null | Key | Default | Extra |
+---------+------+------+-----+---------+-------+
| col0    | int  | YES  |     | NULL    |       |
| col1    | int  | NO   | PRI | NULL    |       |
| column2 | int  | YES  |     | NULL    |       |
+---------+------+------+-----+---------+-------+
3 rows in set (0.00 sec)

여러 개의 필드 삭제

mysql> alter table parent_table drop col0, drop column2;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc parent_table;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| col1  | int  | NO   | PRI | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

PK, FK 삭제시 오류

mysql> alter table parent_table drop col1;
ERROR 1090 (42000): You can't delete all columns with ALTER TABLE; use DROP TABLE instead
mysql> alter table child_table drop col1;
ERROR 1090 (42000): You can't delete all columns with ALTER TABLE; use DROP TABLE instead
mysql> desc child_table;

아래의 링크에서 확인

[MYSQL][06] 외래키(Foreign Key, FK)의 참조 무결성

반응형

'MYSQL' 카테고리의 다른 글

[MYSQL][09] GROUP BY  (0) 2024.11.28
[MYSQL][07] ORDER BY  (0) 2024.11.26
[MYSQL][06] 외래키(Foreign Key, FK)의 참조 무결성  (0) 2024.11.25
[MYSQL][05] KEY  (0) 2024.11.24
[MYSQL][04] SELECT  (0) 2024.11.22

ORDER BY 문

order by 기본형식은 다음과 같다.


SELECT * FROM [테이블명] ORDER BY [컬럼] [ASC|DESC];

ASC(ascending) : 오름차순(default 값)

DESC(descening) : 내림차순

두 개의 열 정렬 예시

SELECT * FROM [테이블명] WHERE [조건] ORDER BY [컬럼1], [컬럼2 DESC];

1차 정렬 : 컬럼1 ASC

2차 정렬 : 컬럼2 DESC

1차 정렬 후 2차 정렬 진행된다.

LIMIT

LIMIT절은 반환할 튜플 수를 지정할 수 있다.
예를 들어 방문자 카운트 테이블 같이 튜플이 굉장히 많은 대형 테이블에서 사용하면 좋다.

limit 기본 형식

SELECT * FROM [테이블명] LIMIT N;

조회결과 : N개 출력

mysql> select actor_id, first_name, last_name from actor limit 10;
+----------+------------+--------------+
| actor_id | first_name | last_name    |
+----------+------------+--------------+
|        1 | PENELOPE   | GUINESS      |
|        2 | NICK       | WAHLBERG     |
|        3 | ED         | CHASE        |
|        4 | JENNIFER   | DAVIS        |
|        5 | JOHNNY     | LOLLOBRIGIDA |
|        6 | BETTE      | NICHOLSON    |
|        7 | GRACE      | MOSTEL       |
|        8 | MATTHEW    | JOHANSSON    |
|        9 | JOE        | SWANK        |
|       10 | CHRISTIAN  | GABLE        |
+----------+------------+--------------+

조회결과 : 기본 정렬기준으로 10개 출력

limit 범위

SELECT * FROM [테이블명] WHERE [컬럼] = [값] LIMIT N, M;

N : offset(지정 위치), M : 개수

조회결과 : N+1 부터 M개 출력

mysql> select actor_id, first_name, last_name from actor limit 1, 10;
+----------+------------+--------------+
| actor_id | first_name | last_name    |
+----------+------------+--------------+
|        2 | NICK       | WAHLBERG     |
|        3 | ED         | CHASE        |
|        4 | JENNIFER   | DAVIS        |
|        5 | JOHNNY     | LOLLOBRIGIDA |
|        6 | BETTE      | NICHOLSON    |
|        7 | GRACE      | MOSTEL       |
|        8 | MATTHEW    | JOHANSSON    |
|        9 | JOE        | SWANK        |
|       10 | CHRISTIAN  | GABLE        |
|       11 | ZERO       | CAGE         |
+----------+------------+--------------+
10 rows in set (0.00 sec)

조회결과 : 2부터 10개 출력

SELECT * FROM [테이블명] LIMIT M OFFSET N;

조회결과 : N까지는 건너 뛰고 M개 출력

mysql> select actor_id, first_name, last_name from actor limit 1 offset 10;
+----------+------------+-----------+
| actor_id | first_name | last_name |
+----------+------------+-----------+
|       11 | ZERO       | CAGE      |
+----------+------------+-----------+
1 row in set (0.00 sec)

조회결과 : 10까지 건너뛰고 1개 출력

LIKE

LIKE 기본 형식


select * from [테이블명] where [열] LIKE [와일드카드 패턴]

와일드카드

와일드카드 문자는 문자열에서 하나 이상의 문자를 대체할 수 있는데 = 연산자가 아닌 LIKE 연산자를 사용하여 패턴을 만들어 데이터를 조회한다.
퍼센트(%)와 언더스코어(_)를 사용하며 퍼센트는 0개 이상의 문자열을 대체, 언더스코어는 단일 문자를 대체한다.

(X) select * from [테이블명] where [열] = [패턴]
(O) select * from [테이블명] where [열] LIKE [패턴]

% : 0개 이상의 문자열을 대체

_(Under score) : 단일 문자를 대체

  • LIKE 'A%' : A로 시작하는 모든 문자열
  • LIKE '%A' : A로 끝나는 모든 문자열
  • LIKE '%A%' : A가 포함된 모든 문자열
  • LIKE 'A__' : A로 시작하는 두 글자인 문자열
  • LIKE '_A' : A로 끝나는 두 글자인 문자열
  • `LIKE '_A_'` : 세 글자 문자열 중 가운데 글자만 A인 문자열

ESCAPE

퍼센트와 언더스코어는 예약어기 때문에 퍼센트를 포함한 문자열(%%%) 또는 언더스코어를 포함한 문자열(%_%)을 검색할 수 없기 때문데 ESCAPE를 사용하여 조회를 한다.

퍼센트가 포함된 컬럼 조회

SELECT * FROM [테이블명] WHERE [열] LIKE '%\%%' ESCAPE '\';

언더스코어가 포함된 컬럼 조회

SELECT * FROM [테이블명] WHERE [열] LIKE '%\_%' ESCAPE '\';

REGEXP

정규표현식(Regular Expression)을 활용하여 문자열 패턴을 만들어 다양한 방법으로 데이터를 조회할 수 있다.

REGEXP 기본형식

SELECT * FROM [테이블명] WHERE [열] REGEXP [정규식];

정규표현식 종류

  • . : \n을 제외한 임의의 한 문자
  • * : 패턴이 0번 이상 반복
  • + : 패턴이 1번 이상 반복
  • ^ : 문자열의 처음
  • $ : 문자열의 끝
  • | : or
  • [...] : 대괄호 안 문자
  • [^...] : 대괄호 안 문자 아닌 문자여
  • {n} : n회 반복
  • {m,n} : 반복되는 횟수의 최소, 최댓값
반응형

'MYSQL' 카테고리의 다른 글

[MYSQL][09] GROUP BY  (0) 2024.11.28
[MYSQL][08] ALTER  (1) 2024.11.27
[MYSQL][06] 외래키(Foreign Key, FK)의 참조 무결성  (0) 2024.11.25
[MYSQL][05] KEY  (0) 2024.11.24
[MYSQL][04] SELECT  (0) 2024.11.22

+ Recent posts