ORDER BY mengurutkan baris hasil query berdasarkan satu atau beberapa kolom atau ekspresi, secara naik atau turun. Tanpanya, database mengembalikan baris dalam urutan apa pun yang paling cepat. Contoh-contoh di sini berlaku di PostgreSQL, MySQL, SQLite, dan SQL Server.
Cara menggunakan ORDER BY
Letakkan ORDER BY di akhir query, setelah WHERE, GROUP BY, dan HAVING; hanya LIMIT yang muncul sesudahnya. Tuliskan kolom yang ingin diurutkan. Setiap kolom diurutkan naik kecuali Anda menambahkan DESC:
SELECT columns
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC];
-- Input: customers
-- customer_id | name | signup_date
-- ------------+-------------+------------
-- 1 | Olivia Hart | 2024-03-12
-- 2 | Marcus Lee | 2023-11-05
-- 3 | Zara Ahmed | 2024-01-27
-- 4 | Ben Carter | 2023-08-19
SELECT customer_id, name, signup_date
FROM customers
ORDER BY signup_date;
-- Output:
-- customer_id | name | signup_date
-- ------------+-------------+------------
-- 4 | Ben Carter | 2023-08-19
-- 2 | Marcus Lee | 2023-11-05
-- 3 | Zara Ahmed | 2024-01-27
-- 1 | Olivia Hart | 2024-03-12
SELECT customer_id, name, signup_date
FROM customers
ORDER BY signup_date DESC;
-- Output:
-- customer_id | name | signup_date
-- ------------+-------------+------------
-- 1 | Olivia Hart | 2024-03-12
-- 3 | Zara Ahmed | 2024-01-27
-- 2 | Marcus Lee | 2023-11-05
-- 4 | Ben Carter | 2023-08-19
Aturan yang perlu diketahui
-
DESC hanya berlaku untuk kolom tepat sebelumnya.
ORDER BY author, published DESCmengurutkan penulis dari A ke Z, lalu buku tiap penulis dari yang terbaru:
-- Input: books
-- title | author | published
-- --------------------+-----------------+----------
-- Emma | Jane Austen | 1815
-- Bleak House | Charles Dickens | 1853
-- Pride and Prejudice | Jane Austen | 1813
-- Hard Times | Charles Dickens | 1854
SELECT title, author, published
FROM books
ORDER BY author, published DESC;
-- Output:
-- title | author | published
-- --------------------+-----------------+----------
-- Hard Times | Charles Dickens | 1854
-- Bleak House | Charles Dickens | 1853
-- Emma | Jane Austen | 1815
-- Pride and Prejudice | Jane Austen | 1813
-
Tanpa ORDER BY, urutan tidak dijamin. Baris sering kembali sesuai urutan dimasukkannya, sampai tabel membesar, index berubah, atau query berjalan paralel. Ini juga berlaku untuk
LIMIT: tanpa ORDER BY, yang dikembalikan adalah baris mana pun yang dibaca database lebih dulu. - Baris dengan nilai sama kembali dalam urutan acak. Tambahkan kolom unik, misalnya ID, sebagai kolom urutan terakhir agar urutannya selalu sama setiap kali dijalankan:
-- Input: customers
-- customer_id | name | signup_date
-- ------------+------------+------------
-- 3 | Mara Lind | 2024-01-15
-- 1 | Owen Price | 2024-01-10
-- 4 | Tariq Aziz | 2024-01-15
-- 2 | Lily Shore | 2024-01-15
-- The three 2024-01-15 rows can come back in any order
SELECT * FROM customers ORDER BY signup_date;
-- Output:
-- customer_id | name | signup_date
-- ------------+------------+------------
-- 1 | Owen Price | 2024-01-10
-- 3 | Mara Lind | 2024-01-15
-- 4 | Tariq Aziz | 2024-01-15
-- 2 | Lily Shore | 2024-01-15
-- customer_id breaks the tie
SELECT * FROM customers ORDER BY signup_date, customer_id;
-- Output:
-- customer_id | name | signup_date
-- ------------+------------+------------
-- 1 | Owen Price | 2024-01-10
-- 2 | Lily Shore | 2024-01-15
-- 3 | Mara Lind | 2024-01-15
-- 4 | Tariq Aziz | 2024-01-15
- NULL diurutkan paling awal, kecuali di PostgreSQL yang menaruhnya paling akhir. Itu untuk urutan naik; DESC membaliknya:
-- Input: users
-- name | middle_name
-- -----------+------------
-- John Smith | Robert
-- Ana Lopez | NULL
-- Kim Young | Elise
SELECT name, middle_name
FROM users
ORDER BY middle_name;
-- Output:
-- name | middle_name
-- -----------+------------
-- Ana Lopez | NULL
-- Kim Young | Elise
-- John Smith | Robert
-- (PostgreSQL puts Ana Lopez last instead)
Untuk menentukan posisi NULL, lihat NULLS FIRST dan NULLS LAST di bawah.
Sintaks alternatif
Anda bisa mengurutkan berdasarkan alias kolom atau posisi kolom di daftar SELECT. Alias menghindarkan Anda dari menulis ulang ekspresi. Posisi lebih singkat, tetapi diam-diam rusak saat seseorang mengubah daftar SELECT:
-- Input: employees
-- name | monthly_salary
-- ---------+---------------
-- Ivy Chen | 5200
-- Max Dunn | 7600
-- Pia Roth | 4500
SELECT name, monthly_salary * 12 AS annual_salary
FROM employees
ORDER BY annual_salary DESC; -- or ORDER BY 2 DESC
-- Output:
-- name | annual_salary
-- ---------+--------------
-- Max Dunn | 91200
-- Ivy Chen | 62400
-- Pia Roth | 54000
NULLS FIRST dan NULLS LAST setelah kolom urutan menentukan posisi NULL-nya:
-- Input: the users table above
SELECT name, middle_name
FROM users
ORDER BY middle_name NULLS LAST;
-- MySQL and SQL Server don't support NULLS LAST. Sort on a CASE first instead:
-- ORDER BY CASE WHEN middle_name IS NULL THEN 1 ELSE 0 END, middle_name
-- Output:
-- name | middle_name
-- -----------+------------
-- Kim Young | Elise
-- John Smith | Robert
-- Ana Lopez | NULL
MySQL punya FIELD(), yang mengurutkan nilai sesuai urutan yang Anda tuliskan. Di database lain, gunakan ekspresi CASE seperti pada Mengurutkan tugas berdasarkan prioritas di bawah:
-- Input: products
-- product_name | category
-- -------------+------------
-- Cookbook | Books
-- Raincoat | Clothing
-- Tablet | Electronics
-- Scarf | Clothing
-- MySQL
SELECT * FROM products
ORDER BY FIELD(category, 'Electronics', 'Clothing', 'Books');
-- Output:
-- product_name | category
-- -------------+------------
-- Tablet | Electronics
-- Raincoat | Clothing
-- Scarf | Clothing
-- Cookbook | Books
Kapan sebaiknya menggunakan ORDER BY?
Gunakan ORDER BY setiap kali urutan baris penting bagi pembacanya. Sebagian besar penggunaannya termasuk dalam salah satu dari empat kategori ini.
Menampilkan daftar dalam urutan yang konsisten
Nama dari A ke Z, tanggal dari yang terlama, ID secara berurutan. Tanpa ORDER BY, query yang sama bisa mengembalikan baris dalam urutan berbeda dari satu eksekusi ke eksekusi berikutnya, dan halaman hasil bisa tumpang tindih atau melewatkan baris.
Mencari nilai tertinggi atau terbaru
Urutkan secara turun untuk menaruh baris terbesar, terbaru, atau termahal di awal, lalu tambahkan LIMIT untuk mengambil beberapa teratas saja: produk terlaris, pesanan terbaru, skor tertinggi.
Mengurutkan berdasarkan lebih dari satu kolom
Saat kolom urutan pertama memiliki nilai yang sama, kolom berikutnya menentukan urutan di antaranya: departemen lalu gaji, kelas lalu skor, status lalu tanggal. Setiap kolom bisa punya arah urutannya sendiri.
Mengurutkan berdasarkan nilai hasil perhitungan atau urutan kustom
ORDER BY menerima ekspresi apa pun, bukan hanya kolom: total yang dihitung dari dua kolom, panjang sebuah nama, atau ekspresi CASE yang menyusun nilai seperti High, Medium, dan Low dalam urutan yang tidak bisa diberikan alfabet.
Contoh nyata ORDER BY
Menampilkan daftar pelanggan per halaman
ORDER BY dengan LIMIT dan OFFSET mengembalikan satu halaman setiap kali. Tiga pelanggan mendaftar di hari yang sama, jadi customer_id menjadi penentunya. Tanpanya, database bisa menaruh pelanggan yang sama di kedua halaman dan melewatkan pelanggan lain:
-- Input: customers
-- customer_id | name | signup_date
-- ------------+-------------+------------
-- 1 | Nina Brandt | 2024-02-14
-- 2 | Theo Walsh | 2023-09-30
-- 3 | Iris Novak | 2024-02-14
-- 4 | Felix Moore | 2024-02-14
-- 5 | June Park | 2024-03-22
-- Page 1
SELECT customer_id, name, signup_date
FROM customers
ORDER BY signup_date, customer_id
LIMIT 2 OFFSET 0;
-- Output:
-- customer_id | name | signup_date
-- ------------+-------------+------------
-- 2 | Theo Walsh | 2023-09-30
-- 1 | Nina Brandt | 2024-02-14
-- Page 2
SELECT customer_id, name, signup_date
FROM customers
ORDER BY signup_date, customer_id
LIMIT 2 OFFSET 2;
-- SQL Server has no LIMIT: use OFFSET 2 ROWS FETCH NEXT 2 ROWS ONLY
-- Output:
-- customer_id | name | signup_date
-- ------------+-------------+------------
-- 3 | Iris Novak | 2024-02-14
-- 4 | Felix Moore | 2024-02-14
Menampilkan tiga teratas di papan peringkat
Urutkan skor dari tertinggi ke terendah dan ambil tiga yang pertama:
-- Input: players
-- username | score
-- ----------+------
-- quokka42 | 1870
-- nightowl | 2310
-- pixelpete | 1525
-- zara_k | 2045
-- bytebard | 1990
SELECT username, score
FROM players
ORDER BY score DESC
LIMIT 3;
-- SQL Server has no LIMIT: write SELECT TOP 3 username, score instead
-- Output:
-- username | score
-- ---------+------
-- nightowl | 2310
-- zara_k | 2045
-- bytebard | 1990
Membuat laporan pesanan berdasarkan status, nilai, dan tanggal
Status diurutkan secara alfabet. Di dalam setiap status, pesanan terbesar muncul lebih dulu, dan pesanan dengan nilai sama ditampilkan dari yang terbaru:
-- Input: orders
-- order_id | status | order_value | order_date
-- ---------+------------+-------------+-----------
-- 1001 | Shipped | 120.00 | 2024-03-02
-- 1002 | Delivered | 75.50 | 2024-02-20
-- 1003 | Shipped | 120.00 | 2024-03-05
-- 1004 | Processing | 42.00 | 2024-03-06
-- 1005 | Delivered | 210.00 | 2024-02-28
SELECT order_id, status, order_value, order_date
FROM orders
ORDER BY status ASC, order_value DESC, order_date DESC;
-- Output:
-- order_id | status | order_value | order_date
-- ---------+------------+-------------+-----------
-- 1005 | Delivered | 210.00 | 2024-02-28
-- 1002 | Delivered | 75.50 | 2024-02-20
-- 1004 | Processing | 42.00 | 2024-03-06
-- 1003 | Shipped | 120.00 | 2024-03-05
-- 1001 | Shipped | 120.00 | 2024-03-02
Mengurutkan tugas berdasarkan prioritas
Urutan alfabet akan menghasilkan High, Low, Medium. Ekspresi CASE mengubah setiap prioritas menjadi angka untuk diurutkan. Nilai lainnya, di sini NULL, mendapat angka 4 dan ditaruh paling akhir, sementara tanggal tenggat mengurutkan tugas di dalam setiap prioritas:
-- Input: tasks
-- task_name | priority | due_date
-- ---------------+----------+-----------
-- Update docs | Low | 2024-06-03
-- Fix login bug | High | 2024-06-10
-- Plan offsite | NULL | 2024-05-20
-- Renew SSL cert | High | 2024-06-01
-- Review PR | Medium | 2024-06-04
SELECT task_name, priority, due_date
FROM tasks
ORDER BY
CASE priority
WHEN 'High' THEN 1
WHEN 'Medium' THEN 2
WHEN 'Low' THEN 3
ELSE 4
END,
due_date;
-- Output:
-- task_name | priority | due_date
-- ---------------+----------+-----------
-- Renew SSL cert | High | 2024-06-01
-- Fix login bug | High | 2024-06-10
-- Review PR | Medium | 2024-06-04
-- Update docs | Low | 2024-06-03
-- Plan offsite | NULL | 2024-05-20
Bacaan lanjutan tentang ORDER BY
Di blog ini:
- Panduan SQL GROUP BY: mengurutkan hasil yang dikelompokkan, seperti kategori teratas berdasarkan pendapatan
- Panduan statement SQL CASE: ekspresi CASE untuk urutan kustom
- Membatasi baris di PostgreSQL, MySQL, SQLite, dan SQL Server: LIMIT, OFFSET, dan TOP
- MySQL select N baris teratas: ORDER BY dengan LIMIT di MySQL
-
Panduan mencari duplikat di SQL: ORDER BY di dalam
ROW_NUMBER()menentukan salinan mana yang dianggap asli
Dokumentasi resmi:
- PostgreSQL: Sorting rows (ORDER BY)
- MySQL: Sorting rows
- SQLite: SELECT, the ORDER BY clause
- SQL Server: ORDER BY clause
Beekeeper Studio Adalah GUI Database Gratis & Open Source
Tool query & editor SQL terbaik yang pernah saya pakai. Semua yang saya butuhkan untuk mengelola database ada di sini. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio cepat, intuitif, dan mudah digunakan. Beekeeper mendukung banyak sekali database, dan berjalan mulus di Windows, Mac, dan Linux.
Apa Kata Pengguna Tentang Beekeeper Studio
"Beekeeper Studio sepenuhnya menggantikan alur kerja SQL lama saya. Cepat, intuitif, dan membuat pekerjaan database kembali menyenangkan."
"Saya sudah mencoba banyak GUI database, tetapi Beekeeper punya keseimbangan sempurna antara fitur dan kesederhanaan. Pokoknya langsung jalan."