1 | SELECT kolom_1, kolom_2, ..., kolom_n |
2 | ORDER BY kolom_1, [kolom_2] [ ASC | DESC ]; |
Penjelasan Sintak:
- Keyword ASC digunakan untuk mengurutkan data secara Ascending.
- Keyword DESC digunakan untuk mengurutkan data secara Descending.
- Secara default, ketika ORDER BY digunakan tanpa opsi ASC atau DESC, maka data yang diurutkan adalah Ascending.
- Anda bisa menggunakan opsi ASC dan DESC secara bersamaan sesuai dengan kebutuhan.
1 | SELECT * FROM nama_table |
2 | ORDER BY posisi_kolom [ ASC | DESC ]; |
Penjelasan Sintak:
- posisi_kolom adalah posisi dari suatu kolom di table, seperti 1, 2, 3, dan seterusnya berdasarkan urutan kolom ketika tabel dibuat.
Contoh Query
Dibawah ini adalah contoh penggunaan query ORDER BY Clause,1 | SELECT * FROM mahasiswa |
2 | ORDER BY nama ASC ; |
Anda juga bisa menggunakan perintah ORDER BY Clause dengan posisi kolom seperti di bawah ini:
1 | SELECT * FROM mahasiswa |
2 | ORDER BY 1 ASC ; |
Latihan
Sebagai latihan Bagaimana Cara Mengurutkan Data di MySQL, coba Anda ikuti step-step di bawah ini
- Login ke database MySQL
01
# mysql -u root
02
Welcome
to
the MySQL monitor. Commands
end
with
;
or
\g.
03
Your MySQL
connection
id
is
1
04
Server version: 5.5.36 MySQL Community Server (GPL)
05
06
Copyright (c) 2000, 2014, Oracle
and
/
or
its affiliates.
All
rights reserved.
07
08
Oracle
is
a registered trademark
of
Oracle Corporation
and
/
or
its
09
affiliates. Other names may be trademarks
of
their respective
10
owners.
11
12
Type
'help;'
or
'\h'
for
help. Type
'\c'
to
clear the
current
input statement.
- Pilih database yang akan digunakan
1
mysql> use akademik;
2
Database
changed
- Buatlah tabel MAHASISWA dengan menggunakan perintah sebagai berikut
01
mysql>
CREATE
TABLE
mahasiswa(
02
-> npm
VARCHAR
(10),
03
-> nama
VARCHAR
(30),
04
-> gender
VARCHAR
(1),
05
-> asal
VARCHAR
(30),
06
-> jurusan
VARCHAR
(30),
07
-> ipk
DOUBLE
(3,2),
08
->
PRIMARY
KEY
(npm)
09
-> );
10
Query OK, 0
rows
affected (0.15 sec)
- Insert data ke tabel MAHASISWA dengan data sebagai berikut:
01
mysql>
INSERT
INTO
mahasiswa
02
->
VALUES
(
'20151001'
,
'Nurul'
,
'P'
,
'Jakarta'
,
'Akuntansi'
,3.1);
03
Query OK, 1 row affected (0.07 sec)
04
05
mysql>
INSERT
INTO
mahasiswa
06
->
VALUES
(
'20152001'
,
'Budi'
,
'L'
,
'Bandung'
,
'Teknik Mesin'
,2.9);
07
Query OK, 1 row affected (0.06 sec)
08
09
mysql>
INSERT
INTO
mahasiswa
10
->
VALUES
(
'20153001'
,
'Ida'
,
'P'
,
'Semarang'
,
'Sastra Inggris'
,3.5);
11
Query OK, 1 row affected (0.11 sec)
12
13
mysql>
INSERT
INTO
mahasiswa
14
->
VALUES
(
'20154001'
,
'Eko'
,
'L'
,
'Jakarta'
,
'Teknik Informatika'
,3.25);
15
Query OK, 1 row affected (0.12 sec)
16
17
mysql>
INSERT
INTO
mahasiswa
18
->
VALUES
(
'20151002'
,
'Dina'
,
'P'
,
'Surabaya'
,
'Akuntansi'
,3.3);
19
Query OK, 1 row affected (0.06 sec)
20
21
mysql>
INSERT
INTO
mahasiswa
22
->
VALUES
(
'20154002'
,
'Doni'
,
'L'
,
'Makassar'
,
'Teknik Informatika'
,2.75);
23
Query OK, 1 row affected (0.07 sec)
24
25
mysql>
INSERT
INTO
mahasiswa
26
->
VALUES
(
'20154003'
,
'Dinda'
,
'P'
,
'Jakarta'
,
'Teknik Informatika'
,3.65);
27
Query OK, 1 row affected (0.04 sec)
28
29
mysql>
INSERT
INTO
mahasiswa
30
->
VALUES
(
'20151003'
,
'Naura'
,
'P'
,
'Bandung'
,
'Akuntansi'
,2.85);
31
Query OK, 1 row affected (0.09 sec)
32
33
mysql>
INSERT
INTO
mahasiswa
34
->
VALUES
(
'20153002'
,
'Soni'
,
'L'
,
'Surabaya'
,
'Sastra Inggris'
,3.3);
35
Query OK, 1 row affected (0.07 sec)
36
37
mysql>
INSERT
INTO
mahasiswa
38
->
VALUES
(
'20154004'
,
'Iski'
,
'P'
,
'Semarang'
,
'Teknik Informatika'
,3.8);
39
Query OK, 1 row affected (0.09 sec)
- Tampilkan semua data Mahasiswa dan urutkan berdasarkan nama (ascending)
01
mysql>
SELECT
*
FROM
mahasiswa
02
->
ORDER
BY
nama
ASC
;
03
+
----------+-------+--------+----------+--------------------+------+
04
| npm | nama | gender | asal | jurusan | ipk |
05
+
----------+-------+--------+----------+--------------------+------+
06
| 20152001 | Budi | L | Bandung | Teknik Mesin | 2.90 |
07
| 20151002 | Dina | P | Surabaya | Akuntansi | 3.30 |
08
| 20154003 | Dinda | P | Jakarta | Teknik Informatika | 3.65 |
09
| 20154002 | Doni | L | Makassar | Teknik Informatika | 2.75 |
10
| 20154001 | Eko | L | Jakarta | Teknik Informatika | 3.25 |
11
| 20153001 | Ida | P | Semarang | Sastra Inggris | 3.50 |
12
| 20154004 | Iski | P | Semarang | Teknik Informatika | 3.80 |
13
| 20151003 | Naura | P | Bandung | Akuntansi | 2.85 |
14
| 20151001 | Nurul | P | Jakarta | Akuntansi | 3.10 |
15
| 20153002 | Soni | L | Surabaya | Sastra Inggris | 3.30 |
16
+
----------+-------+--------+----------+--------------------+------+
17
10
rows
in
set
(0.01 sec)
- Tampilkan semua data Mahasiswa dan urutkan berdasarkan nama (descending)
01
mysql>
SELECT
*
FROM
mahasiswa
02
->
ORDER
BY
nama
DESC
;
03
+
----------+-------+--------+----------+--------------------+------+
04
| npm | nama | gender | asal | jurusan | ipk |
05
+
----------+-------+--------+----------+--------------------+------+
06
| 20153002 | Soni | L | Surabaya | Sastra Inggris | 3.30 |
07
| 20151001 | Nurul | P | Jakarta | Akuntansi | 3.10 |
08
| 20151003 | Naura | P | Bandung | Akuntansi | 2.85 |
09
| 20154004 | Iski | P | Semarang | Teknik Informatika | 3.80 |
10
| 20153001 | Ida | P | Semarang | Sastra Inggris | 3.50 |
11
| 20154001 | Eko | L | Jakarta | Teknik Informatika | 3.25 |
12
| 20154002 | Doni | L | Makassar | Teknik Informatika | 2.75 |
13
| 20154003 | Dinda | P | Jakarta | Teknik Informatika | 3.65 |
14
| 20151002 | Dina | P | Surabaya | Akuntansi | 3.30 |
15
| 20152001 | Budi | L | Bandung | Teknik Mesin | 2.90 |
16
+
----------+-------+--------+----------+--------------------+------+
17
10
rows
in
set
(0.00 sec)
- Tampilkan semua data Mahasiswa dan urutkan berdasarkan nama dan asal (ascending)
01
mysql>
SELECT
*
FROM
mahasiswa
02
->
ORDER
BY
nama
ASC
, asal
ASC
;
03
+
----------+-------+--------+----------+--------------------+------+
04
| npm | nama | gender | asal | jurusan | ipk |
05
+
----------+-------+--------+----------+--------------------+------+
06
| 20152001 | Budi | L | Bandung | Teknik Mesin | 2.90 |
07
| 20151002 | Dina | P | Surabaya | Akuntansi | 3.30 |
08
| 20154003 | Dinda | P | Jakarta | Teknik Informatika | 3.65 |
09
| 20154002 | Doni | L | Makassar | Teknik Informatika | 2.75 |
10
| 20154001 | Eko | L | Jakarta | Teknik Informatika | 3.25 |
11
| 20153001 | Ida | P | Semarang | Sastra Inggris | 3.50 |
12
| 20154004 | Iski | P | Semarang | Teknik Informatika | 3.80 |
13
| 20151003 | Naura | P | Bandung | Akuntansi | 2.85 |
14
| 20151001 | Nurul | P | Jakarta | Akuntansi | 3.10 |
15
| 20153002 | Soni | L | Surabaya | Sastra Inggris | 3.30 |
16
+
----------+-------+--------+----------+--------------------+------+
17
10
rows
in
set
(0.00 sec)
- Tampilkan semua data Mahasiswa dan urutkan berdasarkan nama (ascending), dan Jurusan (descending)
01
mysql>
SELECT
*
FROM
mahasiswa
02
->
ORDER
BY
nama
ASC
, jurusan
DESC
;
03
+
----------+-------+--------+----------+--------------------+------+
04
| npm | nama | gender | asal | jurusan | ipk |
05
+
----------+-------+--------+----------+--------------------+------+
06
| 20152001 | Budi | L | Bandung | Teknik Mesin | 2.90 |
07
| 20151002 | Dina | P | Surabaya | Akuntansi | 3.30 |
08
| 20154003 | Dinda | P | Jakarta | Teknik Informatika | 3.65 |
09
| 20154002 | Doni | L | Makassar | Teknik Informatika | 2.75 |
10
| 20154001 | Eko | L | Jakarta | Teknik Informatika | 3.25 |
11
| 20153001 | Ida | P | Semarang | Sastra Inggris | 3.50 |
12
| 20154004 | Iski | P | Semarang | Teknik Informatika | 3.80 |
13
| 20151003 | Naura | P | Bandung | Akuntansi | 2.85 |
14
| 20151001 | Nurul | P | Jakarta | Akuntansi | 3.10 |
15
| 20153002 | Soni | L | Surabaya | Sastra Inggris | 3.30 |
16
+
----------+-------+--------+----------+--------------------+------+
17
10
rows
in
set
(0.00 sec)
- Tampilkan semua data Mahasiswa dan urutkan berdasarkan posisi kolom ke-6 (IPK) secara ascending.
01
mysql>
SELECT
*
FROM
mahasiswa
02
->
ORDER
BY
6
ASC
;
03
+
----------+-------+--------+----------+--------------------+------+
04
| npm | nama | gender | asal | jurusan | ipk |
05
+
----------+-------+--------+----------+--------------------+------+
06
| 20154002 | Doni | L | Makassar | Teknik Informatika | 2.75 |
07
| 20151003 | Naura | P | Bandung | Akuntansi | 2.85 |
08
| 20152001 | Budi | L | Bandung | Teknik Mesin | 2.90 |
09
| 20151001 | Nurul | P | Jakarta | Akuntansi | 3.10 |
10
| 20154001 | Eko | L | Jakarta | Teknik Informatika | 3.25 |
11
| 20153002 | Soni | L | Surabaya | Sastra Inggris | 3.30 |
12
| 20151002 | Dina | P | Surabaya | Akuntansi | 3.30 |
13
| 20153001 | Ida | P | Semarang | Sastra Inggris | 3.50 |
14
| 20154003 | Dinda | P | Jakarta | Teknik Informatika | 3.65 |
15
| 20154004 | Iski | P | Semarang | Teknik Informatika | 3.80 |
16
+
----------+-------+--------+----------+--------------------+------+
17
10
rows
in
set
(0.00 sec)
Contoh Kasus #1. Tampilkan rata-rata nilai dari seluruh mahasiswa.
Untuk menyelesaikannya tidak perlu menggunakan GROUP BY karena yang diminta adalah seluruh mahasiswa. Untuk mendapatkan rata-rata nilai, kita dapat menggunakan fungsi AVG(). Berikut ini query untuk kasus tersebut.Berikut ini hasil dari query di atas.SELECT AVG(nilai) as rata_rata FROM nilai;
+-----------+ | rata_rata | +-----------+ | 79.6800 | +-----------+
Contoh Kasus #2. Tampilkan rata-rata nilai untuk setiap mahasiswa
Karena yang diminta adalah rata-rata untuk setiap mahasiswa, maka kita harus menggunakan GROUP BY untuk mengelompokkan rata-rata berdasarkan field tertentu. Query dan hasilnya kurang lebih sebagai berikut:SELECT nim, nama, AVG(nilai) as rata_rata FROM nilai GROUP BY nim;+------------+------+-----------+ | nim | nama | rata_rata | +------------+------+-----------+ | 0911500101 | ADI | 82.0000 | | 0911500102 | IDA | 81.0000 | | 0911500103 | EDI | 80.6000 | | 0911500104 | INA | 70.4000 | | 0911500105 | ANI | 84.4000 | +------------+------+-----------+
Contoh Kasus #3. Tampilkan nilai terbesar dan terkecil untuk setiap mahasiswa.
Query untuk menyelesaikan kasus ketiga di atas sebenarnya sama saja dengan yang sebelumnya. Perbedaannya hanya pada fungsi agregat yang digunakan untuk menampilkan nilai terbesar dan terkecil yaitu MAX() dan MIN(). Berikut ini query dan hasil query-nya.SELECT nim, nama, MAX(nilai) as terbesar, MIN(nilai) as terkecil FROM nilai GROUP BY nim;+------------+------+----------+----------+ | nim | nama | terbesar | terkecil | +------------+------+----------+----------+ | 0911500101 | ADI | 90 | 65 | | 0911500102 | IDA | 90 | 70 | | 0911500103 | EDI | 88 | 60 | | 0911500104 | INA | 80 | 50 | | 0911500105 | ANI | 92 | 68 | +------------+------+----------+----------+
Contoh Kasus #4. Tampilkan rata-rata nilai yang didapat mahasiswa untuk setiap matakuliah
Cukup jelas bahwa pada kasus ini, mirip dengan kasus kedua di atas, namun pengelompokkan data berdasarkan matakuliah, bukan berdasarkan mahasiswa. Querynya kurang lebih sebagai berikut:SELECT matkul, AVG(nilai) as rata_rata FROM nilai GROUP BY matkul;+-----------------+-----------+ | matkul | rata_rata | +-----------------+-----------+ | ALGORITMA | 84.4000 | | KALKULUS | 62.6000 | | PBO | 82.0000 | | PEMROGRAMAN WEB | 86.4000 | | PTI | 83.0000 | +-----------------+-----------+
Contoh Kasus #5. Tampilkan rata-rata nilai untuk setiap mahasiswa, yang rata-rata nilai lebih besar dari 80
Perhatikan kembali kasus kedua di atas. Hasil query menunjukkan bahwa untuk setiap mahasiswa akan ditampilkan nilai rata-rata yang diperoleh. Nah pada kasus ke-5 ini yang ingin ditampilkan adalah hanya mahasiswa yang nilainya lebih dari 80. Artinya untuk mahasiswa atas nama “INA” yang mendapat nilai rata-rata 70.4 tidak boleh ditampilkan. Solusinya adalah dengan menambahkan kondisi pada query kasus kedua diatas. Nah, jika kondisi suatu query terkait dengan fungsi agregat, maka kita tidak bisa menggunakan kondisi WHERE. Penggunaan WHERE pada fungsi agregat akan menyebabkan error.Cobalah query berikut ini.
Lalu bagaimana solusinya jika tidak bisa menggunakan WHERE ? MySQL (dan juga database yang lainnya) memiliki struktur kondisi khusus terkait fungsi agregat yaitu HAVING. Jika query diatas diperbaiki dan menggunakan HAVING, maka hasilnya sebagai berikut:SELECT nim, nama, AVG(nilai) as rata_rata FROM nilai GROUP BY nim WHERE AVG(nilai)>80;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE AVG(nilai)>80' at line 1
SELECT nim, nama, AVG(nilai) as rata_rata FROM nilai GROUP BY nim HAVING AVG(nilai)>80;+------------+------+-----------+ | nim | nama | rata_rata | +------------+------+-----------+ | 0911500101 | ADI | 82.0000 | | 0911500102 | IDA | 81.0000 | | 0911500103 | EDI | 80.6000 | | 0911500105 | ANI | 84.4000 | +------------+------+-----------+
GROUP BY Syntax
Sekarang kita sudah tahu apa itu klausa GROUP by, mari kita lihat sintaks untuk sebuah grup dasar dengan query.
SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];
"Pernyataan SELECT ..." adalah kueri perintah SQL SELECT standar.
"GROUP BY column_name1" adalah klausa yang melakukan pengelompokan berdasarkan pada column_name1.
"[, column_name2, ...]" adalah opsional; mewakili nama kolom lain ketika pengelompokan dilakukan pada lebih dari satu kolom.
"[Kondisi HAVING]" adalah opsional; ini digunakan untuk membatasi baris yang dipengaruhi oleh klausa GROUP BY. Ini mirip dengan klausa WHERE.
Pengelompokan menggunakan Kolom Tunggal
SELECT `gender` FROM `members` ;
gender Female Female Male Female Male Male Male Male Male
Untuk membantu memahami efek klausa Group By, mari kita jalankan kueri sederhana yang mengembalikan semua entri gender dari tabel anggota.
Misalkan kita ingin mendapatkan nilai unik untuk jenis kelamin. Kami dapat menggunakan kueri berikut -
SELECT `gender` FROM `members` GROUP BY `gender`;
Menjalankan skrip di atas di meja kerja MySQL terhadap Myflixdb memberi kita hasil sebagai berikut.
gender |
---|
Female |
Male |
Perhatikan hanya dua hasil yang telah dikembalikan. Ini karena kami hanya memiliki dua jenis kelamin Pria dan Wanita. Klausa GROUP BY mengelompokkan semua anggota "Pria" bersama-sama dan hanya mengembalikan satu baris untuk itu. Itu melakukan hal yang sama dengan anggota "Perempuan".
Pengelompokan menggunakan banyak kolom
Misalkan kita ingin mendapatkan daftar movie_film dan tahun terkait di mana mereka dirilis.
Mari kita amati hasil dari query sederhana ini
SELECT `category_id`,`year_released` FROM `movies` ;
category_id year_released 1 2011 2 2008 NULL 2008 NULL 2010 8 2007 6 2007 6 2007 8 2005 NULL 2012 7 1920 8 NULL 8 1920
Hasil di atas memiliki banyak duplikat.
Mari kita jalankan permintaan yang sama menggunakan grup dengan -
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
Menjalankan skrip di atas di meja kerja MySQL terhadap myflixdb memberi kita hasil berikut yang ditunjukkan di bawah ini.
category_id | year_released |
---|---|
NULL | 2008 |
NULL | 2010 |
NULL | 2012 |
1 | 2011 |
2 | 2008 |
6 | 2007 |
7 | 1920 |
8 | 1920 |
8 | 2005 |
8 | 2007 |
Klausa GROUP BY beroperasi pada id kategori dan tahun yang dirilis untuk mengidentifikasi baris unik dalam contoh kami di atas.
Jika id kategori sama tetapi tahun yang dirilis berbeda, maka baris dianggap unik. Jika id kategori dan tahun yang dirilis sama untuk lebih dari satu baris, maka dianggap sebagai duplikat dan hanya satu baris ditampilkan.
Fungsi pengelompokan dan agregat
Misalkan kita ingin jumlah total pria dan wanita di database kami. Kita dapat menggunakan skrip berikut di bawah ini untuk melakukannya.
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
Menjalankan skrip di atas di meja kerja MySQL terhadap myflixdb memberi kita hasil sebagai berikut.
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
Hasil yang ditunjukkan di bawah ini dikelompokkan berdasarkan setiap nilai gender unik yang diposkan dan jumlah baris yang dikelompokkan dihitung menggunakan fungsi agregat COUNT.
Membatasi hasil kueri menggunakan klausa HAVING
Tidak selalu kami ingin melakukan pengelompokan pada semua data dalam tabel yang diberikan. Akan ada saat-saat ketika kami ingin membatasi hasil kami dengan kriteria tertentu. Dalam kasus seperti itu, kita dapat menggunakan klausa HAVING
Misalkan kita ingin tahu semua tahun rilis untuk id kategori film 8. Kami akan menggunakan skrip berikut untuk mencapai hasil kami.
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
Menjalankan skrip di atas di meja kerja MySQL terhadap Myflixdb memberi kita hasil berikut yang ditunjukkan di bawah ini.
Perhatikan hanya film dengan id kategori 8 yang terpengaruh oleh klausa GROUP BY kami.
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
9 | Honey mooners | John Schultz | 2005 | 8 |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
Ringkasan
Klausa GROUP BY digunakan untuk mengelompokkan baris dengan nilai yang sama.
Klausa GROUP BY digunakan bersama dengan pernyataan SQL SELECT.
Pernyataan SELECT yang digunakan dalam klausa GROUP BY hanya dapat digunakan berisi nama kolom, fungsi agregat, konstanta, dan ekspresi.
Klausa HAVING digunakan untuk membatasi hasil yang dikembalikan oleh klausa GROUP BY.