본문 바로가기

코딩 공부/DataBase

[DataBase] 05_정렬, 부분 조회

정렬, 부분조회

#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