12장. SELECT 명령문: ORDER BY절 단일 열 정렬 순서번호로 정렬 오름차순과 내림차순 정렬 하나 이상의 행 정렬 수식과 함수의 정렬 NULL 값의 정렬 2019-02-28 쉽게 배우는 MySQL 5.x
12.1 단일 열 정렬 -SELECT 명령문이 ORDER BY 절을 사용하지 않는다면 순서는 예측할 수 없다. [예제12-1] 등록한 학생에 대하여 학번과 등록일자를 출력하라. 이때 정렬순서는 학번으로 한다. mysql> select stu_no, fee_year, fee_term, fee_date -> from fee -> where year(fee_date) = 2006 -> order by stu_no; +----------+----------+----------+------------+ | stu_no | fee_year | fee_term | fee_date | | 20001015 | 2006 | 1 | 2006-02-14 | | 20001015 | 2006 | 2 | 2006-08-18 | | 20061011 | 2006 | 1 | 2006-02-18 | | 20061011 | 2006 | 2 | 2006-08-20 | 4 rows in set (0.05 sec) “ORDER BY STU_NO” 명령문은 STU_NO 다음에 정렬시키는 순서를 생략 기본 값으로 SQL은 오름차순(Ascending)으로 정렬 2019-02-28 쉽게 배우는 MySQL 5.x
12.2 순서번호로 정렬 ORDER BY 절에서 순서 번호로 열 명세를 대치할 수 있다. 12.2 순서번호로 정렬 ORDER BY 절에서 순서 번호로 열 명세를 대치할 수 있다. [예제12-1]을 순서번호를 사용하면 명령문은 다음과 같다. mysql> select stu_no, fee_year, fee_term, fee_date -> from fee -> where year(fee_date) = 2006 -> order by 1; +----------+----------+----------+------------+ | stu_no | fee_year | fee_term | fee_date | | 20001015 | 2006 | 1 | 2006-02-14 | | 20001015 | 2006 | 2 | 2006-08-18 | | 20061011 | 2006 | 1 | 2006-02-18 | | 20061011 | 2006 | 2 | 2006-08-20 | 4 rows in set (0.05 sec) 순서 번호는 SELECT 절에 있는 열 명세의 위치에 따른 순서로서, 이는 수식이 함수, 리터럴, 수치 수식으로 구성되었을 때 순서 번호이다. 2019-02-28 쉽게 배우는 MySQL 5.x
[예제12-2] 등록한 학생에 대하여 학번과 전체 등록금의 총액을 출력하라. 이때 출력순서는 등록금총액이다. mysql> select stu_no, sum(fee_total) mysql> select stu_no, sum(fee_total) -> from fee -> from fee -> group by stu_no -> group by stu_no -> order by 2; -> order by sum(fee_total); +----------+----------------+ | stu_no | sum(fee_total) | | 20071001 | 6500000 | | 20071010 | 6500000 | | 20071022 | 6500000 | | 20071300 | 6500000 | | 20071307 | 6500000 | | 20071405 | 6500000 | | 20061011 | 12500000 | | 20001015 | 23100000 | 8 rows in set (0.01 sec) -MySQL에서는 ORDER BY절에 “SUM(FEE_TOTAL)”를 우측과 같이 사용 가능 -SQL제품에 따라 “SUM(FEE_TOTAL)”을 사용할 수 없는 제품이 있다. -통계함수를 사용할 수 없는 경우 순서번호를 좌측과 같이 사용 2019-02-28 쉽게 배우는 MySQL 5.x
12.3 오름차순과 내림차순 정렬 -열 명세나 순서 번호 다음에 아무 것도 지정하지 않는다면 오름차순으로 정렬 12.3 오름차순과 내림차순 정렬 -열 명세나 순서 번호 다음에 아무 것도 지정하지 않는다면 오름차순으로 정렬 -수치 값에 대한 오름차순 정렬은 작은 값이 먼저 나타나고 큰 값이 나중에 -영수치 값에 대한 오름차순 정렬은 영문자 ASCII코드 값의 크기순서와 동일 [예제12-3]학적테이블의 영문이름의 첫 번째 문자가 ‘J'보다 큰 ASCII코드로 시작하는 학생의 학번과 이름, 영문이름을 출력(영문이름 내림차순으로 정렬)하라 mysql> select stu_no, stu_name, stu_ename -> from student -> where substring(stu_ename,1,1) > 'J' -> order by stu_ename desc; +----------+----------+------------------+ | stu_no | stu_name | stu_ename | | 20071300 | 유하나 | Yoo Ha-Na | | 20041033 | 연개소문 | Yean Gae-So-Moon | | 20061011 | 박정인 | Park Jung-In | | 20001015 | 박도준 | Park Do-Jun | | 20071022 | 이순신 | Lee Sun-Shin | | 20001021 | 이상길 | Lee Sang-Gil | | 20061014 | 고혜진 | Ko Hea-Jin | | 20061048 | 김영호 | Kim Young-Ho | | 20001001 | 김유신 | Kim Yoo-Shin | | 20041002 | 김유미 | Kim Yoo-Mi | | 20071307 | 김문영 | Kim Moon-Young | 11 rows in set (0.08 sec) 2019-02-28 쉽게 배우는 MySQL 5.x
12.4 하나 이상의 행 정렬 ORDER BY 절에 여러 개의 열을 지정할 수 있다. 12.4 하나 이상의 행 정렬 ORDER BY 절에 여러 개의 열을 지정할 수 있다. [예제12-4] 2006년에 등록한 학생에 대하여 학번과 납입한 등록금총액을 출력하라. 이때 출력순서는 학번은 오름차순, 등록금총액은 내림차순이다. mysql> select stu_no, fee_year, fee_term, fee_pay -> from fee -> where fee_year = 2006 -> order by stu_no asc, fee_pay desc; +----------+----------+----------+---------+ | stu_no | fee_year | fee_term | fee_pay | | 20001015 | 2006 | 1 | 500000 | | 20001015 | 2006 | 2 | 500000 | | 20061011 | 2006 | 1 | 3000000 | | 20061011 | 2006 | 2 | 500000 | 4 rows in set (0.00 sec) ORDER BY 절은 출력 순서를 학번은 오름차순으로 정렬하고, 납부 총액은 내림차순으로 정렬한다. 이 때 오름차순을 나타내는 “ASC"는 생략이 가능 2019-02-28 쉽게 배우는 MySQL 5.x
[예제 12-5] 교과목 테이블에서 생성년도가 2003년~2005년 사이 값으로 과목코드, 과목명, 생성년도를 출력하라 [예제 12-5] 교과목 테이블에서 생성년도가 2003년~2005년 사이 값으로 과목코드, 과목명, 생성년도를 출력하라.(단, 출력순서는 생성년도 내림차순으로 정렬한 뒤 같은 생성년도인 경우는 과목코드순으로 정렬) mysql> select sub_code, sub_name, create_year -> from subject -> where create_year between 2003 and 2005 -> order by create_year desc, sub_code; +----------+---------------------+-------------+ | sub_code | sub_name | create_year | | 4007 | UML | 2005 | | 4012 | 네트워크 프로그래밍 | 2005 | | 4013 | 컴포넌트 프로그래밍 | 2004 | | 4002 | 웹사이트 구축 | 2003 | | 4003 | 소프트웨어공학 | 2003 | | 4009 | 전자상거래 실무 | 2003 | 6 rows in set (0.05 sec) 2019-02-28 쉽게 배우는 MySQL 5.x
[예제 12-6] 성적 테이블에서 2007년도 1학기 석차순 명부를 학번, 연도, 학기, 평점평균, 총점을 출력하라 [예제 12-6] 성적 테이블에서 2007년도 1학기 석차순 명부를 학번, 연도, 학기, 평점평균, 총점을 출력하라.(단, 출력순서는 평점평균 내림차순, 총점 내림차순, 동점인 경우에는 학번순서로 정렬한다) mysql> select stu_no, sco_year, sco_term, exam_avg, exam_total -> from score -> where sco_year = '2007' and sco_term = 1 -> order by exam_avg desc, exam_total desc, stu_no; +----------+----------+----------+----------+------------+ | stu_no | sco_year | sco_term | exam_avg | exam_total | | 20071300 | 2007 | 1 | 4.4 | 577 | | 20071307 | 2007 | 1 | 4.4 | 575 | | 20071405 | 2007 | 1 | 4.2 | 572 | 3 rows in set (0.00 sec) 위의 예제에서는 20071300 학생과 20071307 학생의 평점평균이 4.4로 동일하기 때문에 백분율 총점이 높은 20071300번이 먼저 출력되고 20071307이 출력되고 다음으로 20071405번이 출력되었다. 2019-02-28 쉽게 배우는 MySQL 5.x
12.5 수식과 함수의 정렬 [예제 12-7] 교수 테이블에서 임용일자가 1997년 이전인 교수코드와, 교수이름, 임용일자를 교수임용일자 순으로 정렬하라.(DATE_FORMAT( ) 함수를 이용하라) mysql> select prof_code, prof_name, create_date "임용일자" -> from professor -> where date_format(create_date, '%Y') < 1997 -> order by date_format(create_date, '%Y'); +-----------+-----------+------------+ | prof_code | prof_name | 임용일자 | | 4007 | 김영식 | 1986-03-01 | | 4006 | 고진광 | 1988-03-01 | | 5011 | 최종주 | 1992-03-05 | | 4001 | 정진용 | 1995-09-01 | | 4009 | 문창수 | 1995-03-01 | 5 rows in set (0.02 sec) DATE_FORMAT 함수에서 임용일자 중 년도만을 오름차순 정렬하였기 때문에 정진용 교수와 문창수 교수의 임용일자와 상관없이 같은 년도이기 때문에 바뀌어 출력되었다. 2019-02-28 쉽게 배우는 MySQL 5.x
[예제12-7]을 임용일자 순으로 출력하기를 원한다면 ORDER BY 절을 “order by create_date”로 변경해 주면 된다. mysql> select prof_code, prof_name, create_date "임용일자" -> from professor -> where date_format(create_date, '%Y') < 1997 -> order by create_date; +-----------+-----------+------------+ | prof_code | prof_name | 임용일자 | | 4007 | 김영식 | 1986-03-01 | | 4006 | 고진광 | 1988-03-01 | | 5011 | 최종주 | 1992-03-05 | | 4009 | 문창수 | 1995-03-01 | | 4001 | 정진용 | 1995-09-01 | 5 rows in set (0.02 sec) 2019-02-28 쉽게 배우는 MySQL 5.x
12.6 NULL 값의 정렬 다양한 SQL 제품에서 NULL 값의 순서화는 그 방법에 있어서 차이가 있다. MySQL에서는 NULL 값을 열에서 가장 작은 값으로 취급한다. -오름차순으로 정렬한다면 결과에서 가장 먼저 출력 -내림차순으로 정렬한다면 결과에서 가장 나중에 출력 2019-02-28 쉽게 배우는 MySQL 5.x
Mysql에서 오름차순은 NULL값을 가장 작은 값으로 취급하여 가장 먼저 출력 [예제 12-8] 등록테이블에서 2007년에 등록한 학생의 학번과 장학금 총액을 출력하라. 단, 순서는 장학금 총액 오름차순이다. mysql> select stu_no, jang_total -> from fee -> where year(fee_date) = 2007 -> order by jang_total; +----------+------------+ | stu_no | jang_total | | 20071001 | NULL | | 20071022 | NULL | | 20071307 | NULL | | 20071010 | NULL | | 20071307 | 500000 | | 20071010 | 500000 | | 20071022 | 500000 | | 20071001 | 500000 | | 20071405 | 500000 | | 20071300 | 500000 | | 20061011 | 800000 | | 20071300 | 2000000 | | 20001015 | 2000000 | | 20061011 | 2000000 | | 20001015 | 2500000 | | 20071405 | 2500000 | 16 rows in set (0.00 sec) Mysql에서 오름차순은 NULL값을 가장 작은 값으로 취급하여 가장 먼저 출력 2019-02-28 쉽게 배우는 MySQL 5.x
내림차순에서는 NULL값이 가장 작은 값이므로 가장 나중에 출력 [예제 12-8]예제를 내림차순으로 정렬하여라. mysql> select stu_no, jang_total -> from fee -> where year(fee_date) = 2007 -> order by jang_total desc; +----------+------------+ | stu_no | jang_total | | 20071405 | 2500000 | | 20001015 | 2500000 | | 20071300 | 2000000 | | 20001015 | 2000000 | | 20061011 | 2000000 | | 20061011 | 800000 | | 20071001 | 500000 | | 20071405 | 500000 | | 20071307 | 500000 | | 20071300 | 500000 | | 20071010 | 500000 | | 20071022 | 500000 | | 20071022 | NULL | | 20071010 | NULL | | 20071307 | NULL | | 20071001 | NULL | 16 rows in set (0.00 sec) 내림차순에서는 NULL값이 가장 작은 값이므로 가장 나중에 출력 2019-02-28 쉽게 배우는 MySQL 5.x