ORDER BY문법
데이터 정렬
실습환경 구축
create table celeb
(
ID int not null auto_increment primary key,
NAME varchar(32) not null default '',
BIRTHDAY date,
AGE int,
SEX char,
JOB_TITLE varchar(32),
AGENCY varchar(32)
);
insert into celeb values (1, '아이유', '1993-05-16', 29, 'F', '가수, 텔런트', 'EDAM엔터테이먼트');
insert into celeb values (2, '이미주', '1994-09-23', 28, 'F', '가수', '울림엔터테이먼트');
insert into celeb values (3, '송강', '1994-04-23', 28, 'M', '텔런트', '나무엑터스');
insert into celeb values (4, '강동원', '1981-01-18', 41, 'M', '영화배우, 텔런트', 'YG엔터테이먼트');
insert into celeb values (5, '유재석', '1972-08-14', 50, 'M', 'MC, 개그맨', '안테나');
insert into celeb values (6, '차승원', '1970-06-07', 48, 'M', '영화배우, 모델', 'YG엔터테이먼트');
insert into celeb values (7, '이수현', '1999-05-04', 23, 'F', '가수', 'YG엔터테이먼트');
mysql> desc celeb;
+
| Field | Type | Null | Key | Default | Extra |
+
| ID | int | NO | PRI | NULL | auto_increment |
| NAME | varchar(32) | NO | | | |
| BIRTHDAY | date | YES | | NULL | |
| AGE | int | YES | | NULL | |
| SEX | char(1) | YES | | NULL | |
| JOB_TITLE | varchar(32) | YES | | NULL | |
| AGENCY | varchar(32) | YES | | NULL | |
+
7 rows in set (0.00 sec)
mysql> select * from celeb;
+
| ID | NAME | BIRTHDAY | AGE | SEX | JOB_TITLE | AGENCY |
+
| 1 | 아이유 | 1993-05-16 | 29 | F | 가수, 텔런트 | EDAM엔터테이먼트 |
| 2 | 이미주 | 1994-09-23 | 28 | F | 가수 | 울림엔터테이먼트 |
| 3 | 송강 | 1994-04-23 | 28 | M | 텔런트 | 나무엑터스 |
| 4 | 강동원 | 1981-01-18 | 41 | M | 영화배우, 텔런트 | YG엔터테이먼트 |
| 5 | 유재석 | 1972-08-14 | 50 | M | MC, 개그맨 | 안테나 |
| 6 | 차승원 | 1970-06-07 | 48 | M | 영화배우, 모델 | YG엔터테이먼트 |
| 7 | 이수현 | 1999-05-04 | 23 | F | 가수 | YG엔터테이먼트 |
+
7 rows in set (0.00 sec)
🔍ORDER BY문법 : 데이터 정렬해서 가져오기
- 특정 열을 기준으로 오름차순 or 내림차순으로 정렬
SELECT column1, column2, ...
FROM tablename
ORDER BY column1, column2, ... ASC | DESC;
mysql> select age, name from celeb order by age, name;
+
| age | name |
+
| 23 | 이수현 |
| 28 | 송강 |
| 28 | 이미주 |
| 29 | 아이유 |
| 41 | 강동원 |
| 48 | 차승원 |
| 50 | 유재석 |
+
7 rows in set (0.00 sec)
mysql> select age, name from celeb order by age desc, name asc;
+
| age | name |
+
| 50 | 유재석 |
| 48 | 차승원 |
| 41 | 강동원 |
| 29 | 아이유 |
| 28 | 송강 |
| 28 | 이미주 |
| 23 | 이수현 |
+
7 rows in set (0.00 sec)
연산자
🔍비교연산자
연산자 | 의미 |
---|
A = B | A와 B가 같음 |
A > B | A가 B보다 큼 |
A < B | A가 B보다 작음 |
A >= B | A가 B보다 크거나 같음 |
A <= B | A가 B보다 작거나 같음 |
A <> B | A가 B보다 크거나 작지 않음(=같지않음) |
A != B | A와 B는 같지 않음 |
mysql> select name, age from celeb
-> where age>29
-> order by age desc;
+
| name | age |
+
| 유재석 | 50 |
| 차승원 | 48 |
| 강동원 | 41 |
+
3 rows in set (0.00 sec)
🔍논리연산자
연산자 | 의미 |
---|
AND | 조건을 모두 만족하면 TRUE |
OR | 하나의 조건을 만족하면 TRUE |
NOT | 조건을 만족하지 않으면 TRUE |
BETWEEN | 조건값이 범위에 있으면 TRUE |
IN | 조건값이 목록에 있으면 TRUE |
LIKE | 조건값이 패턴에 맞으면 TRUE |
mysql> select * from celeb;
+
| ID | NAME | BIRTHDAY | AGE | SEX | JOB_TITLE | AGENCY |
+
| 1 | 아이유 | 1993-05-16 | 29 | F | 가수, 텔런트 | EDAM엔터테이먼트 |
| 2 | 이미주 | 1994-09-23 | 28 | F | 가수 | 울림엔터테이먼트 |
| 3 | 송강 | 1994-04-23 | 28 | M | 텔런트 | 나무엑터스 |
| 4 | 강동원 | 1981-01-18 | 41 | M | 영화배우, 텔런트 | YG엔터테이먼트 |
| 5 | 유재석 | 1972-08-14 | 50 | M | MC, 개그맨 | 안테나 |
| 6 | 차승원 | 1970-06-07 | 48 | M | 영화배우, 모델 | YG엔터테이먼트 |
| 7 | 이수현 | 1999-05-04 | 23 | F | 가수 | YG엔터테이먼트 |
+
7 rows in set (0.00 sec)
mysql> select * from celeb
-> where sex='M' and agency='YG엔터테이먼트'
-> order by agency;
+
| ID | NAME | BIRTHDAY | AGE | SEX | JOB_TITLE | AGENCY |
+
| 4 | 강동원 | 1981-01-18 | 41 | M | 영화배우, 텔런트 | YG엔터테이먼트 |
| 6 | 차승원 | 1970-06-07 | 48 | M | 영화배우, 모델 | YG엔터테이먼트 |
+
2 rows in set (0.00 sec)
mysql> select * from celeb
-> where ((id%2) = 1 and sex='M') or ((id%2)=0 and (agency='YG엔터테이먼트'))
-> order by age;
+
| ID | NAME | BIRTHDAY | AGE | SEX | JOB_TITLE | AGENCY |
+
| 3 | 송강 | 1994-04-23 | 28 | M | 텔런트 | 나무엑터스 |
| 4 | 강동원 | 1981-01-18 | 41 | M | 영화배우, 텔런트 | YG엔터테이먼트 |
| 6 | 차승원 | 1970-06-07 | 48 | M | 영화배우, 모델 | YG엔터테이먼트 |
| 5 | 유재석 | 1972-08-14 | 50 | M | MC, 개그맨 | 안테나 |
+
4 rows in set (0.00 sec)
mysql> select * from celeb
-> where not agency='YG엔터테이먼트';
+
| ID | NAME | BIRTHDAY | AGE | SEX | JOB_TITLE | AGENCY |
+
| 1 | 아이유 | 1993-05-16 | 29 | F | 가수, 텔런트 | EDAM엔터테이먼트 |
| 2 | 이미주 | 1994-09-23 | 28 | F | 가수 | 울림엔터테이먼트 |
| 3 | 송강 | 1994-04-23 | 28 | M | 텔런트 | 나무엑터스 |
| 5 | 유재석 | 1972-08-14 | 50 | M | MC, 개그맨 | 안테나 |
+
4 rows in set (0.00 sec)
mysql> select * from celeb
-> where age between 20 and 40
-> order by age desc;
+
| ID | NAME | BIRTHDAY | AGE | SEX | JOB_TITLE | AGENCY |
+
| 1 | 아이유 | 1993-05-16 | 29 | F | 가수, 텔런트 | EDAM엔터테이먼트 |
| 2 | 이미주 | 1994-09-23 | 28 | F | 가수 | 울림엔터테이먼트 |
| 3 | 송강 | 1994-04-23 | 28 | M | 텔런트 | 나무엑터스 |
| 7 | 이수현 | 1999-05-04 | 23 | F | 가수 | YG엔터테이먼트 |
+
4 rows in set (0.00 sec)
mysql> select * from celeb
-> where not (birthday between 19800101 and 19951231) and sex='F';
+
| ID | NAME | BIRTHDAY | AGE | SEX | JOB_TITLE | AGENCY |
+
| 7 | 이수현 | 1999-05-04 | 23 | F | 가수 | YG엔터테이먼트 |
+
1 row in set (0.00 sec)
mysql> select * from celeb
-> where agency like 'YG%';
+
| ID | NAME | BIRTHDAY | AGE | SEX | JOB_TITLE | AGENCY |
+
| 4 | 강동원 | 1981-01-18 | 41 | M | 영화배우, 텔런트 | YG엔터테이먼트 |
| 6 | 차승원 | 1970-06-07 | 48 | M | 영화배우, 모델 | YG엔터테이먼트 |
| 7 | 이수현 | 1999-05-04 | 23 | F | 가수 | YG엔터테이먼트 |
+
3 rows in set (0.00 sec)
🔍like문법
- '_' : 글자의 갯수
- '%' : 임의의 글자
mysql> select * from celeb
-> where agency like 'YG%';
+
| ID | NAME | BIRTHDAY | AGE | SEX | JOB_TITLE | AGENCY |
+
| 4 | 강동원 | 1981-01-18 | 41 | M | 영화배우, 텔런트 | YG엔터테이먼트 |
| 6 | 차승원 | 1970-06-07 | 48 | M | 영화배우, 모델 | YG엔터테이먼트 |
| 7 | 이수현 | 1999-05-04 | 23 | F | 가수 | YG엔터테이먼트 |
+
3 rows in set (0.00 sec)
mysql> select * from celeb
-> where job_title like '%,%';
+
| ID | NAME | BIRTHDAY | AGE | SEX | JOB_TITLE | AGENCY |
+
| 1 | 아이유 | 1993-05-16 | 29 | F | 가수, 텔런트 | EDAM엔터테이먼트 |
| 4 | 강동원 | 1981-01-18 | 41 | M | 영화배우, 텔런트 | YG엔터테이먼트 |
| 5 | 유재석 | 1972-08-14 | 50 | M | MC, 개그맨 | 안테나 |
| 6 | 차승원 | 1970-06-07 | 48 | M | 영화배우, 모델 | YG엔터테이먼트 |
+
4 rows in set (0.00 sec)
mysql> select * from celeb
-> where agency like '__엔터테이%';
+
| ID | NAME | BIRTHDAY | AGE | SEX | JOB_TITLE | AGENCY |
+
| 2 | 이미주 | 1994-09-23 | 28 | F | 가수 | 울림엔터테이먼트 |
| 4 | 강동원 | 1981-01-18 | 41 | M | 영화배우, 텔런트 | YG엔터테이먼트 |
| 6 | 차승원 | 1970-06-07 | 48 | M | 영화배우, 모델 | YG엔터테이먼트 |
| 7 | 이수현 | 1999-05-04 | 23 | F | 가수 | YG엔터테이먼트 |
+
4 rows in set (0.00 sec)
데이터 통합문법
UNION, JOIN
🔍UNION 문법 : SQL문 통합해서 하나로 만들기
SELECT column1, column2, ... FROM table1
UNION ALL | UNION
SELECT column1, column2, ... FROM table2
UNION ALL : 중복값 포함
mysql> select * from celeb where sex='F'
-> union all
-> select * from celeb where agency like 'YG%';
+
| ID | NAME | BIRTHDAY | AGE | SEX | JOB_TITLE | AGENCY |
+
| 1 | 아이유 | 1993-05-16 | 29 | F | 가수, 텔런트 | EDAM엔터테이먼트 |
| 2 | 이미주 | 1994-09-23 | 28 | F | 가수 | 울림엔터테이먼트 |
| 7 | 이수현 | 1999-05-04 | 23 | F | 가수 | YG엔터테이먼트 |
| 4 | 강동원 | 1981-01-18 | 41 | M | 영화배우, 텔런트 | YG엔터테이먼트 |
| 6 | 차승원 | 1970-06-07 | 48 | M | 영화배우, 모델 | YG엔터테이먼트 |
| 7 | 이수현 | 1999-05-04 | 23 | F | 가수 | YG엔터테이먼트 |
+
6 rows in set (0.00 sec)
UNION : 중복값 제거
mysql> select * from celeb where sex='F'
-> union
-> select * from celeb where agency like 'YG%';
+
| ID | NAME | BIRTHDAY | AGE | SEX | JOB_TITLE | AGENCY |
+
| 1 | 아이유 | 1993-05-16 | 29 | F | 가수, 텔런트 | EDAM엔터테이먼트 |
| 2 | 이미주 | 1994-09-23 | 28 | F | 가수 | 울림엔터테이먼트 |
| 7 | 이수현 | 1999-05-04 | 23 | F | 가수 | YG엔터테이먼트 |
| 4 | 강동원 | 1981-01-18 | 41 | M | 영화배우, 텔런트 | YG엔터테이먼트 |
| 6 | 차승원 | 1970-06-07 | 48 | M | 영화배우, 모델 | YG엔터테이먼트 |
+
5 rows in set (0.00 sec)
🔍JOIN 문법 : 집합사용
실습환경 구축
use zerobase;
create table snl_show
(
ID int not null auto_increment primary key,
SEASON int not null,
EPISODE int not null,
BROADCAST_DATE date,
HOST varchar(32) not null
);
insert into snl_show values (1, 8, 7, '2020-09-05', '강동원');
insert into snl_show values (2, 8, 8, '2020-09-12', '유재석');
insert into snl_show values (3, 8, 9, '2020-09-19', '차승원');
insert into snl_show values (4, 8, 10, '2020-09-26', '이수현');
insert into snl_show values (5, 9, 1, '2021-09-04', '이병헌');
insert into snl_show values (6, 9, 2, '2021-09-11', '하지원');
insert into snl_show values (7, 9, 3, '2021-09-18', '제시');
insert into snl_show values (8, 9, 4, '2021-09-25', '조정석');
insert into snl_show values (9, 9, 5, '2021-10-02', '조여정');
insert into snl_show values (10, 9, 6, '2021-10-09', '옥주현');
mysql> desc snl_show;
+
| Field | Type | Null | Key | Default | Extra |
+
| ID | int | NO | PRI | NULL | auto_increment |
| SEASON | int | NO | | NULL | |
| EPISODE | int | NO | | NULL | |
| BROADCAST_DATE | date | YES | | NULL | |
| HOST | varchar(32) | NO | | NULL | |
+
5 rows in set (0.00 sec)
mysql> select * from snl_show;
+
| ID | SEASON | EPISODE | BROADCAST_DATE | HOST |
+
| 1 | 8 | 7 | 2020-09-05 | 강동원 |
| 2 | 8 | 8 | 2020-09-12 | 유재석 |
| 3 | 8 | 9 | 2020-09-19 | 차승원 |
| 4 | 8 | 10 | 2020-09-26 | 이수현 |
| 5 | 9 | 1 | 2021-09-04 | 이병헌 |
| 6 | 9 | 2 | 2021-09-11 | 하지원 |
| 7 | 9 | 3 | 2021-09-18 | 제시 |
| 8 | 9 | 4 | 2021-09-25 | 조정석 |
| 9 | 9 | 5 | 2021-10-02 | 조여정 |
| 10 | 9 | 6 | 2021-10-09 | 옥주현 |
+
10 rows in set (0.00 sec)
mysql> select * from celeb;
+
| ID | NAME | birthday | AGE | SEX | JOB_TITLE | AGENCY |
+
| 1 | 아이유 | 1993-05-16 | 29 | F | 가수, 텔런트 | EDAM엔터테이먼트 |
| 2 | 이미주 | 1994-09-23 | 28 | F | 가수 | 울림엔터테이먼트 |
| 3 | 송강 | 1994-04-23 | 28 | M | 텔런트 | 나무엑터스 |
| 4 | 강동원 | 1981-01-18 | 41 | M | 영화배우, 텔런트 | YG엔터테이먼트 |
| 5 | 유재석 | 1972-08-14 | 50 | M | MC, 개그맨 | 안테나 |
| 6 | 차승원 | 1970-06-07 | 48 | M | 영화배우, 모델 | YG엔터테이먼트 |
| 7 | 이수현 | 1999-05-04 | 23 | F | 가수 | YG엔터테이먼트 |
+
7 rows in set (0.00 sec)
INNER JOIN
- 두 개의 테이블에서 공통된 요소들을 통해 결합하는 조인방식
SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.column = table2.column
WHERE condition;
mysql> select celeb.id, celeb.name, snl_show.id, snl_show.host
-> from celeb
-> inner join snl_show
-> on celeb.name = snl_show.host;
+
| id | name | id | host |
+
| 4 | 강동원 | 1 | 강동원 |
| 5 | 유재석 | 2 | 유재석 |
| 6 | 차승원 | 3 | 차승원 |
| 7 | 이수현 | 4 | 이수현 |
+
4 rows in set (0.00 sec)
LEFT JOIN
- 두개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터를 포함하는 조인방식
SELECT column1, column2, ...
FROM table1
LEFT JOIN table2
ON table1.column = table2.column
WHERE condition;
mysql> select celeb.id, celeb.name, snl_show.id, snl_show.host
-> from celeb
-> left join snl_show
-> on celeb.name = snl_show.host;
+
| id | name | id | host |
+
| 1 | 아이유 | NULL | NULL |
| 2 | 이미주 | NULL | NULL |
| 3 | 송강 | NULL | NULL |
| 4 | 강동원 | 1 | 강동원 |
| 5 | 유재석 | 2 | 유재석 |
| 6 | 차승원 | 3 | 차승원 |
| 7 | 이수현 | 4 | 이수현 |
+
7 rows in set (0.00 sec)
RIGHT JOIN
- 두개의 테이블에서 공통영역을 포함해 오른쪽 테이블의 다른 데이터를 포함하는 조인방식
SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column
WHERE condition;
mysql> select celeb.id, celeb.name, snl_show.id, snl_show.host
-> from celeb
-> right join snl_show
-> on celeb.name = snl_show.host;
+
| id | name | id | host |
+
| 4 | 강동원 | 1 | 강동원 |
| 5 | 유재석 | 2 | 유재석 |
| 6 | 차승원 | 3 | 차승원 |
| 7 | 이수현 | 4 | 이수현 |
| NULL | NULL | 5 | 이병헌 |
| NULL | NULL | 6 | 하지원 |
| NULL | NULL | 7 | 제시 |
| NULL | NULL | 8 | 조정석 |
| NULL | NULL | 9 | 조여정 |
| NULL | NULL | 10 | 옥주현 |
+
10 rows in set (0.00 sec)
FULL OUTER JOIN
- 두개의 테이블에서 공통영역을 포함하여 양쪽 테이블의 다른영역을 모두 포함하는 조인방식
MySQL에서는 FULL OUTER JOIN를 지원하지 않는다
SELECT column1, column2, ...
FROM table1
LEFT JOIN table2
ON table1.column = table2.column
UNION
SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column
mysql> select celeb.id, celeb.name, snl_show.id, snl_show.host
-> from celeb
-> left join snl_show
-> on celeb.name = snl_show.host
-> union
-> select celeb.id, celeb.name, snl_show.id, snl_show.host
-> from celeb
-> right join snl_show
-> on celeb.name = snl_show.host;
+
| id | name | id | host |
+
| 1 | 아이유 | NULL | NULL |
| 2 | 이미주 | NULL | NULL |
| 3 | 송강 | NULL | NULL |
| 4 | 강동원 | 1 | 강동원 |
| 5 | 유재석 | 2 | 유재석 |
| 6 | 차승원 | 3 | 차승원 |
| 7 | 이수현 | 4 | 이수현 |
| NULL | NULL | 5 | 이병헌 |
| NULL | NULL | 6 | 하지원 |
| NULL | NULL | 7 | 제시 |
| NULL | NULL | 8 | 조정석 |
| NULL | NULL | 9 | 조여정 |
| NULL | NULL | 10 | 옥주현 |
+
13 rows in set (0.00 sec)
SELF JOIN
SELECT column1, column2, ...
FROM table1, table2, ...
WHERE condition;
mysql> select celeb.id, celeb.name, snl_show.id, snl_show.host
-> from celeb, snl_show
-> where celeb.name = snl_show.host;
+
| id | name | id | host |
+
| 4 | 강동원 | 1 | 강동원 |
| 5 | 유재석 | 2 | 유재석 |
| 6 | 차승원 | 3 | 차승원 |
| 7 | 이수현 | 4 | 이수현 |
+
4 rows in set (0.00 sec)
mysql> select name, season, episode, broadcast_date, agency
-> from celeb, snl_show
-> where name = host
-> and (episode in (7, 9, 10) or agency like 'YG______')
-> and broadcast_date > '2020-09-15';
+
| name | season | episode | broadcast_date | agency |
+
| 차승원 | 8 | 9 | 2020-09-19 | YG엔터테이먼트 |
| 이수현 | 8 | 10 | 2020-09-26 | YG엔터테이먼트 |
+
2 rows in set (0.00 sec)
출력물 커스텀하기
CONCAT ALIAS DISTINCT LIMIT문법
🔍CONCAT : 여러 문자열을 하나로 합치거나 연결
SELECT CONCAT(column1, column2, ...)
FROM tablename
mysql> select concat('이름 :', name,', 소속사 :', agency) as '연예인 정보'
-> from celeb
-> where name like '___';
+
| 연예인 정보 |
+
| 이름 :아이유, 소속사 :EDAM엔터테이먼트 |
| 이름 :이미주, 소속사 :울림엔터테이먼트 |
| 이름 :강동원, 소속사 :YG엔터테이먼트 |
| 이름 :유재석, 소속사 :안테나 |
| 이름 :차승원, 소속사 :YG엔터테이먼트 |
| 이름 :이수현, 소속사 :YG엔터테이먼트 |
+
6 rows in set (0.00 sec)
🔍ALIAS : 칼럼이나 테이블 이름에 별칭 생성
SELECT column as alias
FROM tablename
>
SELECT A.column
FROM tablename as A
mysql> select c.id, c.name, s.id, s.host
-> from celeb c, snl_show s
-> where c.name = s.host;
+
| id | name | id | host |
+
| 4 | 강동원 | 1 | 강동원 |
| 5 | 유재석 | 2 | 유재석 |
| 6 | 차승원 | 3 | 차승원 |
| 7 | 이수현 | 4 | 이수현 |
+
4 rows in set (0.00 sec)
CONACAT + ALIAS
mysql> select concat(s.season, '-', s.episode, '(', s.broadcast_date, ')') as '방송정보',
-> concat(c.name, '(', c.job_title, ')') as '출연자정보'
-> from celeb as c, snl_show as s
-> where c.name = s.host;
+
| 방송정보 | 출연자정보 |
+
| 8-7(2020-09-05) | 강동원(영화배우, 텔런트) |
| 8-8(2020-09-12) | 유재석(MC, 개그맨) |
| 8-9(2020-09-19) | 차승원(영화배우, 모델) |
| 8-10(2020-09-26) | 이수현(가수) |
+
4 rows in set (0.00 sec)
🔍DISTINCT : 중복제거
SELECT DISTINCT column1, column2, ...
FROM tablename
mysql> select distinct agency from celeb;
+
| agency |
+
| EDAM엔터테이먼트 |
| 울림엔터테이먼트 |
| 나무엑터스 |
| YG엔터테이먼트 |
| 안테나 |
+
5 rows in set (0.00 sec)
🔍LIMIT : 출력갯수제한
SELECT column1, column2 ...
FROM tablename
WHERE condition
LIMIT number;
mysql> select concat('SNL 시즌', s.season, ' 에피소드', s.episode, ' 호스트 ', s.host) as 'SNL 방송정보',
-> c.age from celeb c, snl_show s
-> where c.name = s.host
-> order by age desc
-> limit 2;
+
| SNL 방송정보 | age |
+
| SNL 시즌8 에피소드8 호스트 유재석 | 50 |
| SNL 시즌8 에피소드9 호스트 차승원 | 48 |
+
2 rows in set (0.00 sec)