정렬, 부분조회
#01. 데이터 정렬하기
- ORDER BY 절
- 칼럼이나 표현식을 기준으로 출력 결과를 정렬할 때 사용한다.
select [distinct] { * | 컬럼이름 [ as 별칭 ].....} from <테이블 이름>
[ where 검색조건 ]
[ order by 컬럼이름 [정렬옵션] ]
- 정렬옵션
- ASC : 오름차순으로 정렬하는 경우에 사용하며 기본값 -> 순차 정렬
- DESC : 내림차순으로 정렬하는 경우에 사용하며 생략 불가능 -> 역순 정렬
- 기본적인 정렬방법(ASC의 경우)
- 문자값 : 알파벳순 출력, 한글은 가나다 순으로 출력
- 숫자값 : 가장 작은 값부터 먼저 출력
- 날짜값 : 과거의 날짜부터 출력
ex) 학생 테이블에서 이름을 가나다 순으로 정렬하여 이름, 학년, 전화번호를 출력하시오.
mysql> select name, grade, tel
-> from student
-> order by name asc;
+--------+-------+--------------+
| name | grade | tel |
+--------+-------+--------------+
| 김영균 | 3 | 051)824-9637 |
| 김진경 | 2 | 052)175-3941 |
| 김진영 | 2 | 055)419-6328 |
| 류민정 | 2 | 055)248-3679 |
| 박동진 | 1 | 051)742-6384 |
| 박미경 | 1 | 055)261-8947 |
| 서재진 | 1 | 051)239-4861 |
| 오유석 | 4 | 051)724-9618 |
| 윤진욱 | 3 | 053)487-2698 |
| 이광훈 | 4 | 055)736-4981 |
| 이동훈 | 1 | 055)426-1752 |
| 임유진 | 2 | 02)312-9838 |
| 전인하 | 4 | 051)781-2158 |
| 조명훈 | 1 | 02)785-6984 |
| 지은경 | 2 | 055)418-9627 |
| 하나리 | 1 | 055)296-3784 |
+--------+-------+--------------+
#02. 다중 컬럼 정렬
- 2차, 3차 정렬 조건 부여하기
- ORDER BY 절에서 지정한 첫 번째 칼럼을 기준으로 1차 정렬한 후, 동일한 값이 있는 경우 두 번째 칼럼을 기준으로 정렬한다.
- 이 때 각 컬럼별로 정렬 옵션이 따로 설정된다.
select [distinct] { * | 컬럼이름 [ as 별칭 ]......} from <테이블이름>
[ where 검색조건 ]
[ order by 컬럼1이름 [정렬옵션], 컬럼2이름 [정렬옵션], ..., 컬럼n이름 [정렬옵션] ]
ex) 모든 학생에 대해 학과번호를 오름차순으로 먼저 정렬하고, 같은 학과 학생들은 학년이 높은 순으로 다시 정렬하여 학번, 이름, 학년, 학과번호, 사용자 아이디를 출력하여라.
mysql> select studno, name, grade, deptno, userid from student
-> order by deptno asc, grade desc;
+--------+--------+-------+--------+----------+
| studno | name | grade | deptno | userid |
+--------+--------+-------+--------+----------+
| 10101 | 전인하 | 4 | 101 | jun123 |
| 10107 | 이광훈 | 4 | 101 | huriky |
| 10103 | 김영균 | 3 | 101 | mandu |
| 10104 | 지은경 | 2 | 101 | gomo00 |
| 10105 | 임유진 | 2 | 101 | youjin12 |
| 10108 | 류민정 | 2 | 101 | cleansky |
| 10102 | 박미경 | 1 | 101 | ansel414 |
| 10106 | 서재진 | 1 | 101 | seolly |
| 10202 | 오유석 | 4 | 102 | yousuk |
| 10204 | 윤진욱 | 3 | 102 | samba7 |
| 10201 | 김진영 | 2 | 102 | simply |
| 10203 | 하나리 | 1 | 102 | hanal |
| 20103 | 김진경 | 2 | 201 | lovely |
| 20101 | 이동훈 | 1 | 201 | dals |
| 20102 | 박동진 | 1 | 201 | ping2 |
| 20104 | 조명훈 | 1 | 201 | rader214 |
+--------+--------+-------+--------+----------+
#03. 부분 조회
- Limit 절
- 전체 조회 결과의 n번쨰 위치에서 부터 m개를 조회하기
- n값은 0부터 시작한다.
select [distinct] { * | 컬럼이름 [ as 별칭 ]......} from <테이블이름>
[ where 검색조건 ]
[ order by 컬럼1이름 [정렬옵션], 컬럼2이름 [정렬옵션], ..., 컬럼n이름 [정렬옵션] ]
[ limit n,m ]
+ 참고 :
- 부분 조회 기능은 프로그램에서 페이지 번호 구현과 관련 있다.
- Limit 절의 경우 MySQL에서만 지원되는 구문이며, 같은 기능을 MSSQL에서는 TOP절의 형식으로, Oracle의 경우는 Rawnum이라는 기능으로 제공한다.
ex) 교수 테이블에서 급여가 높은 상위 3명의 이름, 직큽, 급여를 조회하시오.
- 0번째 위치 부터 3건의 데이터 추출하기
-
mysql> select name, position, sal
-> from professor
-> order by sal desc
-> limit 0,3;
+--------+----------+-----+
| name | position | sal |
+--------+----------+-----+
| 김도훈 | 교수 | 500 |
| 권혁일 | 교수 | 450 |
| 이만식 | 부교수 | 420 |
+--------+----------+-----+
#### 연습문제1
- 학생 테이블에서 학년을 내림차순으로 정렬하여 이름, 학년, 주민등록번호를 출력하여라.
mysql> select name, grade, idnum from student order by grade desc;
+--------+-------+---------------+
| name | grade | idnum |
+--------+-------+---------------+
| 전인하 | 4 | 7907021369824 |
| 이광훈 | 4 | 8109131276431 |
| 오유석 | 4 | 7709121128379 |
| 김영균 | 3 | 8103211063421 |
| 윤진욱 | 3 | 7904021358671 |
| 지은경 | 2 | 8004122298371 |
| 임유진 | 2 | 8301212196482 |
| 류민정 | 2 | 8108192157498 |
| 김진영 | 2 | 8206062186327 |
| 김진경 | 2 | 8302282169387 |
| 박미경 | 1 | 8405162123648 |
| 서재진 | 1 | 8511291186273 |
| 하나리 | 1 | 8501092378641 |
| 이동훈 | 1 | 8312101128467 |
| 박동진 | 1 | 8511241639826 |
| 조명훈 | 1 | 8412141254963 |
+--------+-------+---------------+
#### 연습문제2
- 학생 테이블에서 101번 학과에 소속된 학생들의 이름, 학년, 학과 번호를 생년월일이 빠른 순으로 출력하여라.
mysql> select name, grade, deptno from student where deptno = 101 order by birthdate asc;
+--------+-------+--------+
| name | grade | deptno |
+--------+-------+--------+
| 전인하 | 4 | 101 |
| 지은경 | 2 | 101 |
| 김영균 | 3 | 101 |
| 류민정 | 2 | 101 |
| 이광훈 | 4 | 101 |
| 임유진 | 2 | 101 |
| 박미경 | 1 | 101 |
| 서재진 | 1 | 101 |
+--------+-------+--------+
#### 연습문제3
- 학생 테이블에서 이름, 학번, 학년을 학년 순으로 정렬하여 조회하시오. 단, 같은 학년에 대해서는 이름순으로 출력하시오.
mysql> select name, studno, grade from student order by grade asc, name asc;
+--------+--------+-------+
| name | studno | grade |
+--------+--------+-------+
| 박동진 | 20102 | 1 |
| 박미경 | 10102 | 1 |
| 서재진 | 10106 | 1 |
| 이동훈 | 20101 | 1 |
| 조명훈 | 20104 | 1 |
| 하나리 | 10203 | 1 |
| 김진경 | 20103 | 2 |
| 김진영 | 10201 | 2 |
| 류민정 | 10108 | 2 |
| 임유진 | 10105 | 2 |
| 지은경 | 10104 | 2 |
| 김영균 | 10103 | 3 |
| 윤진욱 | 10204 | 3 |
| 오유석 | 10202 | 4 |
| 이광훈 | 10107 | 4 |
| 전인하 | 10101 | 4 |
+--------+--------+-------+
#### 연습문제4
- 교수 테이블에서 급여가 5번째로 높은 교수의 이름, 직급, 급여를 조회하시오
- 급여가 높은 순으로 정렬된 데이터의 4번째 위치부터 1건을 추출한다.
mysql> select name, position, sal from professor order by sal desc limit 4,1;
+--------+----------+-----+
| name | position | sal |
+--------+----------+-----+
| 성연희 | 조교수 | 360 |
+--------+----------+-----+
'코딩 공부 > DataBase' 카테고리의 다른 글
[DataBase] 07_그룹함수와 그룹조회 (0) | 2020.05.11 |
---|---|
[DataBase] 06_함수 (0) | 2020.05.11 |
[DataBase] 04_SQL 연산자 (0) | 2020.05.10 |
[DataBase] 03_데이터 조회하기 (0) | 2020.05.10 |
[DataBase] 02_데이터베이스 살펴보기 (0) | 2020.05.10 |