English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQL ORDER BY 子句

このチュートリアルでは、SELECT SQLクエリからのデータをソートする方法を学びます。

結果セットのソート

通常、SELECT文を使用してテーブルからデータを取得する場合、結果セットの行は特定の順序に並んでいません。特定の順序で結果セットを並べ替えたい場合は、文の末尾にORDER BY子句を指定することができます。この子句は、プログラムがクエリからのデータをどのようにソートするかを示します。デフォルトのソート順序は昇順です。

文法

ORDER BY子句は、クエリからのデータを昇順または降順にソートするために使用されます。この子句の基本的な文法は以下のように示されます:

SELECT column_list FROM table_name ORDER BY column_name ASC|DESC;

ここでは、column_listその値を取得するデータベースのテーブル名前年齢などの列/のフィールド名前そしてcolumn_name排序する列の名前です。実際の動作方法を示すいくつかの例を見てみましょう。

생성 중에 데이터베이스에 다음과 같은 이름의 테이블이 있습니다.employees테이블이 다음과 같은 기록을 가지고 있습니다:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
+--------+--------------+------------+--------+---------+

단일 열 정렬

다음 SQL 문은employees테이블에서 모든 employee를 반환하고emp_name열에 대해 결과 집합을 오름차순 정렬합니다。

SELECT * FROM employees 
ORDER BY emp_name ASC;

ASC 옵션을 건너뛰고 다음과 같은 문법만 사용할 수 있습니다. 이는 이전 명령과 같은 결과 집합을 반환합니다. SQL은 기본 정렬 순서가 오름차순이므로:

SELECT * FROM employees 
ORDER BY emp_name;

위 명령을 실행하면, 다음과 같은 출력을 얻게 됩니다:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
+--------+--------------+------------+--------+---------+

DESC 옵션을 사용하여 내림차순으로 정렬할 수도 있습니다. 다음 명령은 숫자급여(salary)열의 내림차순 정렬된 결과 집합입니다。

SELECT * FROM employees 
ORDER BY salary DESC;

이번에는 다음과 같은 결과 집합을 얻게 됩니다:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
+--------+--------------+------------+--------+---------+

다중 열 정렬

정렬할 때 여러 열을 지정할 수 있습니다. 그러나, 테이블에 중복 값이 있지 않으면 결과 집합의 변경은 볼 수 없습니다. 그래서让我们找出:

다중 열 정렬을 더 잘 이해하기 위해, 데이터베이스에 다음과 같은 이름의 테이블이 있습니다.Trainees의 테이블에 다음과 같은 기록이 포함되어 있습니다:

+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
+----+------------+------------+-------------+--------+

그림을 꼼꼼히 살펴보면, 우리는 일부 중복 값을 발견할 수 있습니다. 그러나, 훈련생 Peter Parker와 Peter Pan의 전체 이름은 다르지만 이름이 같습니다.

다음 명령을 실행하면, 이 명령은first_name결과 집합에 대해정렬

SELECT * FROM trainees 
ORDER BY first_name;

실행 후에, 다음과 같은 출력을 얻게 됩니다:

+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
+----+------------+------------+-------------+--------+

이 명령을 실행하면, 이 명령은first_namelast_name결과 집합에 대해정렬

SELECT * FROM trainees 
ORDER BY first_name, last_name;
+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
+----+------------+------------+-------------+--------+

이전 결과 집합과 현재 결과 집합 사이의 차이를 주목했습니까?-이번에는 학습자 'Peter Parker'의 기록이 'Peter Pan'의 기록 뒤에 위치합니다.

두 개의 학습자의 이름이 모두 'Peter'인 경우, 이 두 학습자의last_name열이 두 번째 정렬을 수행합니다. 따라서 'Peter Parker'의 기록이 'Peter Pan'의 기록 뒤에 위치합니다.

주의:여러 정렬 열을 지정했을 때, 결과 집합은 먼저 첫 번째 열에 따라 정렬되고, 그 다음 두 번째 열에 따라 정렬된 목록에 따라 정렬됩니다.