[MySQL] 정렬, 부분조회 [SELECT]

심진주·2024년 10월 6일
0

MySQL

목록 보기
5/10
post-thumbnail

📁 ORDER BY : 단일 컬럼

  • 컬럼이나 표현식을 기준으로 출력 결과를 정렬할 때 사용
SELECT [DISTINCT] {*|컬럼 [별칭]}
FROM 테이블
[WHERE 조건식]
[ORDER BY 컬럼 [정렬 옵션]]
정렬옵션설명
ASC오름차순(기본값) : 순차 정렬
DESC내림차순(생략불가능) : 역순 정렬

기본적인 정렬방법 (ASC)

  • 문자값 : 알파벳순 출력, 한글은 가나다 순으로 출력
  • 숫자값 : 가장 작은 값부터 먼저 출력
  • 날짜값 : 과거의 날짜부터 출력

예제 1

  • 학생 테이블에서 이름을 가나다 순으로 정렬하여 이름, 학년, 전화번호를 출력하시오
SELECT name, grade, tel FROM student ORDER BY name;
+--------+-------+--------------+
| 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 |
+--------+-------+--------------+

📁 ORDER BY : 다중 컬럼

  • ORDER BY 절에서 지정한 첫 번째 컬럼을 기준으로 1차 정렬한 후,
    동일한 값이 있는 경우 두 번째 컬럼을 기준으로 정렬
  • 이때 각 컬럼별로 정렬 옵션이 따로 설정된다.
SELECT [DISTINCT] {*|컬럼 [별칭]}
FROM 테이블
[WHERE 조건식]
[ORDER BY 컬럼1 [정렬 옵션], 컬럼2 [정렬 옵션],...,컬럼n [정렬 옵션]]

예제 1

  • 모든 학생에 대한 학과번호를 오름차순으로 먼저 정렬하고,
    같은 학과 학생들은 학년이 높은 순으로 다시 정렬하여
    학번, 이름, 학년, 학과 번호, 사용자 아이디를 출력하여라
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 |
+--------+--------+-------+--------+----------+

📁 LIMIT : 데이터 부분 조회

  • 전체 조회 결과의 x번째 위치부터 y개를 조회하기
  • x값은 0부터 시작한다.
SELECT [DISTINCT] {*|컬럼 [별칭]}
FROM 테이블
[WHERE 조건식]
[ORDER BY 컬럼1 [정렬 옵션], 컬럼2 [정렬 옵션],...,컬럼n [정렬 옵션]]
[LIMIT x, y]

참고

  • 부분 조회 기능은 프로그램에서 페이지 번호 구현과 관련이있다. < 12345 >
  • Limit절의 경우 MySQL에서만 지원되는 구분이며, 같은 기능을 MSSQL에서는 TOP절의 형식으로, Oracle의 경우는 Rawnum이라는 기능으로 제공한다. (DBSM마다 다르다.)

예제 1

  • 교수 테이블에서 급여가 높은 상위 3명의 이름, 직급, 급여를 조회
  • 0번째 위치부터 3건의 데이터 추출
SELECT name, position, sal FROM professor ORDER BY sal DESC LIMIT 0, 3;
+--------+----------+-----+
| name   | position | sal |
+--------+----------+-----+
| 김도훈 | 교수     | 500 |
| 권혁일 | 교수     | 450 |
| 이만식 | 부교수   | 420 |
+--------+----------+-----+

예제 2

  • 교수 목록을 3건씩 나누어 부분 조회
SELECT name, position, sal FROM professor LIMIT 0,3;
SELECT name, position, sal FROM professor LIMIT 3,3;
SELECT name, position, sal FROM professor LIMIT 6,3;
+--------+----------+-----+
| name   | position | sal |
+--------+----------+-----+
| 김도훈 | 교수     | 500 |
| 이재우 | 조교수   | 320 |
| 성연희 | 조교수   | 360 |
-------------------------
| 염일웅 | 전임강사 | 240 |
| 권혁일 | 교수     | 450 |
| 이만식 | 부교수   | 420 |
-------------------------
| 전은지 | 전임강사 | 210 |
| 남은혁 | 부교수   | 400 |
+--------+----------+-----+
  • 마지막 페이지에서 지정된 수(3) 보다 남아 있는 데이터가 적은 경우 존재하는 만큼만 조회된다.

추가 설명

교수의 이름과 급여를 3명씩 조회
1페이지 - LIMIT 0,3
2페이지 - LIMIT 3,3
3페이지 - LIMIT 6,3

  • JAVA 에서 구현 ?
    3명씩 - 고정값 : ListCount 라는 변수로 정의
    link를 누르면 queryString변수로 날라감
    page는 상황에 따라 1,2,3
    0,3,6을 offSet이라고 변수설정
    offset = (Page-1) * listCount
    백엔드는 SQL로 시작해서 SQL로 끝난다.

✏️ 연습문제

연습문제 1

  • 학생 테이블에서 학년을 내림차순으로 정렬하여 이름, 학년, 주민등록번호를 출력
SELECT name, grade, birthdate FROM student ORDER BY grade DESC;
+--------+-------+---------------------+
| name   | grade | birthdate           |
+--------+-------+---------------------+
| 전인하 |     4 | 1979-07-02 00:00:00 |
| 이광훈 |     4 | 1981-09-13 00:00:00 |
| 오유석 |     4 | 1977-09-12 00:00:00 |
| 김영균 |     3 | 1981-03-21 00:00:00 |
| 윤진욱 |     3 | 1979-04-02 00:00:00 |
| 지은경 |     2 | 1980-04-12 00:00:00 |
| 임유진 |     2 | 1983-01-21 00:00:00 |
| 류민정 |     2 | 1981-08-19 00:00:00 |
| 김진영 |     2 | 1982-06-06 00:00:00 |
| 김진경 |     2 | 1983-02-28 00:00:00 |
| 박미경 |     1 | 1984-05-16 00:00:00 |
| 서재진 |     1 | 1985-11-29 00:00:00 |
| 하나리 |     1 | 1985-01-09 00:00:00 |
| 이동훈 |     1 | 1983-12-10 00:00:00 |
| 박동진 |     1 | 1985-11-24 00:00:00 |
| 조명훈 |     1 | 1984-12-14 00:00:00 |
+--------+-------+---------------------+

연습문제 2

  • 학생 테이블에서 101번 학과에 소속된 학생들의 이름, 학년, 학과번호를 생년월일이 빠른 순으로 출력
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

  • 학생테이블에서 이름, 학번, 학년을 학년 순으로 정렬하여 조회하시오
  • 단, 같은 학년에 대해서는 이름 순으로 출력하시오
SELECT name, deptno, grade FROM student ORDER BY grade ASC, name ASC;
+--------+--------+-------+
| name   | deptno | grade |
+--------+--------+-------+
| 박동진 |    201 |     1 |
| 박미경 |    101 |     1 |
| 서재진 |    101 |     1 |
| 이동훈 |    201 |     1 |
| 조명훈 |    201 |     1 |
| 하나리 |    102 |     1 |
| 김진경 |    201 |     2 |
| 김진영 |    102 |     2 |
| 류민정 |    101 |     2 |
| 임유진 |    101 |     2 |
| 지은경 |    101 |     2 |
| 김영균 |    101 |     3 |
| 윤진욱 |    102 |     3 |
| 오유석 |    102 |     4 |
| 이광훈 |    101 |     4 |
| 전인하 |    101 |     4 |
+--------+--------+-------+

연습문제 4

  • 교수테이블에서 급여가 5번째로 높은 교수의 이름, 직급, 급여를 조회
  • 급여가 높은 순으로 정렬된 데이터의 4번째 위치부터 1건을 추출
SELECT name, position, sal FROM professor ORDER BY sal DESC LIMIT 4,1;
+--------+----------+-----+
| name   | position | sal |
+--------+----------+-----+
| 성연희 | 조교수   | 360 |
+--------+----------+-----+

0개의 댓글