Topik ini menjelaskan cara menggunakan pernyataan SELECT untuk mengquery data di Hologres.
Ikhtisar perintah
Pernyataan SELECT mengkueri data dari nol atau lebih tabel. Parameter utama tercantum dalam tabel berikut.
Parameter | |
Tidak ada | |
Sintaks perintah
Sintaks dasar pernyataan SELECT adalah sebagai berikut.
[ WITH with_query [, ...] ]
SELECT [ALL | DISTINCT [ON (expression [, ...])]]
* | expression [[AS] output_name] [, ...]
[FROM from_item [, ...]]
[WHERE condition]
[GROUP BY grouping_element [, ...]]
[HAVING condition [, ...]]
[{UNION | INTERSECT | EXCEPT} [ALL] select]
[ORDER BY expression [ASC | DESC | USING operator] [, ...]]
[LIMIT {count | ALL}]
Dalam sintaks ini, grouping_element dan from_item didefinisikan sebagai berikut:
-
grouping_elementberisi sebuahexpression. Ekspresi dapat berupa nama kolom, konstanta, fungsi, atau kombinasi apa pun dari nama kolom dan konstanta yang dihubungkan oleh operator aritmetika atau bitwise. -
from_item berisi
table_name [[AS] alias [( column_alias [, ...] )]] (select) [AS] alias [( column_alias [, ...] )] from_item [NATURAL] join_type from_item [ON join_condition | USING ( join_column [, ...] )]
Penggunaan perintah
Berikut adalah metode SELECT umum:
-
Semua elemen dalam daftar FROM, yang merupakan tabel nyata atau virtual, dievaluasi. Jika daftar berisi lebih dari satu elemen, hasilnya adalah gabungan mereka.
-
Jika klausa WHERE ditentukan, klausa tersebut menyaring semua baris yang tidak memenuhi kondisi yang ditentukan.
-
Jika klausa
GROUP BYditentukan atau jika fungsi agregat digunakan, baris-baris tersebut digabungkan ke dalam kelompok berdasarkan nilai yang cocok. Fungsi agregat kemudian dihitung untuk setiap kelompok. Jika klausa HAVING ada, klausa tersebut menyaring kelompok yang tidak memenuhi kondisi yang ditentukan. -
Ekspresi output SELECT digunakan untuk menghitung baris output aktual dari baris atau kelompok yang dipilih.
-
Anda dapat menggabungkan beberapa pernyataan SELECT menjadi satu set hasil menggunakan operator himpunan UNION, INTERSECT, dan EXCEPT. Operator UNION mengembalikan semua baris yang ada di salah satu atau kedua set hasil. Operator INTERSECT mengembalikan semua baris yang ada di kedua set hasil. Operator EXCEPT mengembalikan baris yang ada di set hasil pertama tetapi tidak ada di yang kedua. Untuk ketiga operator tersebut, baris duplikat dihapus dari set hasil akhir kecuali Anda menentukan ALL. Secara default, operator-operator ini menghapus duplikat, yang setara dengan menentukan DISTINCT. Perhatikan bahwa perilaku ini berbeda dari pernyataan SELECT standar, di mana perilaku default-nya adalah mengembalikan semua baris, termasuk duplikat.
-
Jika Anda menentukan klausa
ORDER BY, baris yang dikembalikan diurutkan sesuai urutan yang ditentukan. Jika Anda tidak menentukan klausaORDER BY, baris dikembalikan dalam urutan arbitrer, yang biasanya merupakan urutan tercepat bagi sistem untuk menghasilkannya. -
Jika klausa LIMIT (atau FETCH FIRST) atau OFFSET ditentukan, pernyataan SELECT hanya mengembalikan subset dari baris hasil.
Deskripsi parameter
-
WITH clause
-
Ikhtisar Perintah
Klausa WITH memungkinkan Anda mendefinisikan satu atau beberapa subkueri yang dapat dirujuk berdasarkan nama dalam kueri utama. Subkueri bernama ini dikenal sebagai Common Table Expressions (CTEs). Klausa WITH biasanya ditempatkan sebelum pernyataan SELECT utama. Sintaksnya adalah sebagai berikut:
with query_name [ ( column_name [, ...] ) ] AS ( select ) -
Deskripsi Parameter
Parameter
Deskripsi
query_name
Menentukan nama CTE saat ini. Nama ini dapat berupa pengenal yang valid apa pun.
column_name
Menampilkan daftar nama kolom yang sesuai dengan nilai kembali subkueri. Ini mirip dengan semantik AS dalam klausa SELECT. Subkueri dapat berupa kueri SELECT biasa.
CTE dipisahkan dengan koma. Definisi CTE yang lebih belakang dapat mereferensikan CTE sebelumnya. Saat ini, CTE rekursif tidak didukung. Dalam kueri selanjutnya, Anda dapat menggunakan
query_namesecara langsung sebagai tampilan. Jika daftarcolumn_nametidak ditentukan,column_nametampilan tersebut secara default menggunakan nama kolom yang dikembalikan oleh subkueri. Jika daftarcolumn_nameditentukan, Anda harus menggunakancolumn_nameyang telah didefinisikan, dan jumlah entricolumn_nameharus sesuai dengan jumlah kolom yang dikembalikan oleh pernyataan SELECT.
-
-
SELECT list
-
Ikhtisar Perintah
Daftar SELECT, yaitu bagian pernyataan antara kata kunci SELECT dan FROM, menentukan ekspresi yang membentuk baris output pernyataan SELECT. Ekspresi ini dapat merujuk pada kolom yang dihitung dalam klausa FROM.
-
Deskripsi Parameter
Setiap kolom output dalam pernyataan SELECT memiliki nama. Dalam pernyataan SELECT sederhana, nama ini digunakan untuk memberi label kolom saat ditampilkan. Jika pernyataan SELECT adalah subkueri, kueri luar menggunakan nama ini untuk mereferensikan kolom dari tabel virtual yang dihasilkan oleh subkueri. Untuk menentukan nama kolom output, tambahkan
AS output_namesetelah ekspresi kolom. Anda dapat menghilangkan AS, tetapi hanya jika nama output yang diinginkan tidak cocok dengan kata kunci PostgreSQL apa pun. Untuk menghindari potensi konflik dengan kata kunci di masa depan, kami menyarankan agar Anda menggunakan AS atau membungkus nama output dalam tanda kutip ganda. Jika Anda tidak menentukan nama kolom, PostgreSQL secara otomatis menetapkan satu. Jika ekspresi kolom adalah referensi kolom sederhana, nama yang ditetapkan sama dengan nama kolom tersebut. Dalam kasus yang lebih kompleks yang melibatkan fungsi atau nama tipe, sistem dapat menghasilkan nama generik, seperti?column?.Anda dapat mereferensikan kolom output berdasarkan namanya dalam klausa
ORDER BYdanGROUP BY. Namun, Anda tidak dapat mereferensikan kolom output berdasarkan namanya dalam klausa WHERE atau HAVING. Dalam klausa tersebut, Anda harus menggunakan ekspresinya sendiri.Anda dapat menggunakan tanda bintang (*) dalam daftar output sebagai singkatan untuk semua kolom dari baris yang dipilih. Anda juga dapat menggunakan
table_name.*sebagai singkatan untuk semua kolom dari tabel tertentu. Dalam kasus ini, Anda tidak dapat menggunakan AS untuk menentukan nama baru. Nama kolom output akan sama dengan nama kolom asli tabel.
-
-
FROM clause
-
Ikhtisar Perintah
Klausa FROM menentukan satu atau beberapa tabel sumber untuk pernyataan SELECT. Jika Anda menentukan beberapa tabel sumber, hasilnya adalah Produk Kartesius (cross join) dari semua tabel sumber. Biasanya, Anda dapat menambahkan klausa WHERE dengan kondisi join untuk membatasi baris yang dikembalikan menjadi subset kecil dari Produk Kartesius.
-
Deskripsi Parameter
Klausa FROM dapat mencakup elemen-elemen berikut:
Element
Deskripsi
table_name
Nama tabel atau tampilan yang ada (opsional dengan skema).
alias
Nama alternatif untuk item FROM yang mencakup alias. Alias membuat penulisan lebih ringkas atau menyelesaikan ambiguitas dalam self-join (di mana tabel yang sama dipindai beberapa kali). Ketika alias disediakan, nama tabel atau fungsi yang sebenarnya disembunyikan. Misalnya, diberikan
FROM foo AS f, sisa SELECT harus merujuk item FROM ini sebagai f, bukan foo.select
Sub-SELECT dapat muncul dalam klausa FROM. Ini bertindak seolah-olah outputnya adalah tabel sementara yang dibuat selama perintah SELECT berlangsung. Perhatikan bahwa sub-SELECT harus diapit tanda kurung dan harus memiliki alias.
function_name
Pemanggilan fungsi dapat muncul dalam klausa FROM (terutama berguna untuk fungsi yang mengembalikan set hasil, tetapi fungsi apa pun dapat digunakan). Ini bertindak seolah-olah output fungsi tersebut adalah tabel sementara yang dibuat selama perintah SELECT berlangsung.
Anda dapat memberikan alias seperti halnya pada tabel. Jika Anda memberikan alias, Anda juga dapat menentukan daftar alias kolom untuk memberikan nama alternatif pada satu atau beberapa atribut dari tipe kembalian komposit fungsi tersebut, termasuk kolom baru apa pun yang ditambahkan oleh ORDINALITY (jika ada).
Anda dapat menggabungkan beberapa pemanggilan fungsi menjadi satu item klausa FROM dengan mengapitnya dalam
ROWS FROM(。). Output dari item tersebut menggabungkan baris pertama dari setiap fungsi, lalu baris kedua dari setiap fungsi, dan seterusnya. Jika beberapa fungsi menghasilkan lebih sedikit baris daripada yang lain, nilai NULL mengisi posisi data yang hilang, sehingga jumlah total baris yang dikembalikan selalu sesuai dengan fungsi yang menghasilkan baris paling banyak.join_type
Mencakup lima jenis berikut:
-
[ INNER ] JOIN
Untuk jenis join INNER dan OUTER, Anda harus menentukan kondisi join: salah satu dari
NATURAL, ON join_condition, atau USING (join_column [, ...])(hanya satu). Lihat di bawah untuk maknanya. UntukCROSS JOIN, klausa-klausa ini tidak boleh muncul. Klausa JOIN menggabungkan dua item FROM (disebut “tabel” untuk kenyamanan, meskipun bisa berupa jenis item FROM apa pun). Gunakan tanda kurung untuk mengontrol urutan bersarang jika diperlukan. Tanpa tanda kurung, JOIN bersarang dari kiri ke kanan. Dalam semua kasus, pengikatan JOIN lebih kuat daripada item daftar FROM yang dipisahkan koma. -
LEFT [ OUTER ] JOIN
LEFT OUTER JOINmengembalikan semua baris dari Produk Kartesius terbatas (semua kombinasi yang memenuhi kondisi join), ditambah satu salinan setiap baris yang tidak cocok dari tabel kiri. Baris kiri yang tidak cocok diperluas menjadi baris tabel join lengkap dengan memasukkan nilai NULL di kolom sisi kanan. Perhatikan bahwa hanya kondisi milik klausa JOIN itu sendiri yang menentukan baris mana yang cocok. Kondisi luar diterapkan setelahnya. -
RIGHT [ OUTER ] JOIN
RIGHT OUTER JOINmengembalikan semua baris yang digabungkan ditambah setiap baris sisi kanan yang tidak cocok (diperluas dengan NULL di sisi kiri). Ini hanyalah kenyamanan notasi, karena Anda dapat mengonversinya menjadiLEFT OUTER JOINdengan menukar tabel kiri dan kanan. -
FULL [ OUTER ] JOIN
FULL OUTER JOINmengembalikan semua baris yang digabungkan, ditambah setiap baris sisi kiri yang tidak cocok (diperluas dengan NULL di sisi kanan), ditambah setiap baris sisi kanan yang tidak cocok (diperluas dengan NULL di sisi kiri). -
CROSS JOIN
CROSS JOINdanINNER JOINmenghasilkan Produk Kartesius sederhana—hasil yang sama seperti mencantumkan dua tabel dalam FROM—tetapi dibatasi oleh kondisi join (jika ada).CROSS JOINsetara denganINNER JOIN ON (TRUE), artinya kondisi tersebut tidak menghapus baris apa pun. Jenis join ini murni merupakan kenyamanan notasi, karena semua yang dilakukannya juga dapat dilakukan dengan FROM dan WHERE biasa.
join_condition
join_conditionadalah ekspresi yang mengevaluasi ke nilai Boolean (mirip dengan klausa WHERE), yang menentukan baris mana yang dianggap cocok dalam join.USING ( a, b, ... )
Klausa
USING (a, b...)adalah singkatan untukON left_table.a = right_table.a AND left_table.b = right_table.b .... Selain itu, USING memastikan hanya satu kolom dari setiap pasangan yang sama muncul dalam output join.NATURAL
Singkatan untuk USING yang mencantumkan semua kolom dengan nama identik di kedua tabel.
-
-
-
WHERE clause
-
Ikhtisar Perintah
Klausa WHERE opsional memiliki bentuk berikut:
WHERE condition -
Deskripsi Parameter
Parameter
Deskripsi
condition
condition adalah ekspresi apa pun yang mengevaluasi ke hasil Boolean. Setiap baris yang tidak memenuhi kondisi ini dihapus dari output. Suatu baris memenuhi kondisi jika mengganti nilai aktualnya untuk referensi variabel menyebabkan ekspresi mengembalikan true.
-
-
GROUP BY clause
-
Ikhtisar Perintah
Klausa
GROUP BYopsional menggabungkan semua baris yang dipilih yang memiliki nilai yang sama untuk ekspresi pengelompokan menjadi satu baris ringkasan. KlausaGROUP BYmemiliki bentuk berikut:GROUP BY grouping_element [, ...] -
Deskripsi Parameter
Ekspresi dalam
grouping_elementdapat berupa nama kolom input, nama atau nomor ordinal kolom output dari daftar SELECT, atau ekspresi yang dibentuk dari nilai kolom input. Jika suatu nama ambigu, klausaGROUP BYmenginterpretasikannya sebagai nama kolom input, bukan nama kolom output.Jika elemen pengelompokan berisi
GROUPING SETS, ROLLUP, atau CUBE, klausaGROUP BYmendefinisikan beberapa set pengelompokan independen. Ini setara dengan UNION ALL dari subkueri, di mana setiap subkueri memiliki klausaGROUP BYsendiri yang sesuai dengan salah satu set pengelompokan tersebut.Jika Anda menggunakan fungsi agregat, fungsi tersebut dihitung di seluruh baris dalam setiap kelompok, yang menghasilkan satu nilai untuk setiap kelompok. Jika Anda menggunakan fungsi agregat tetapi tidak menyertakan klausa
GROUP BY, kueri memperlakukan semua baris yang dipilih sebagai satu kelompok. Anda dapat menyaring baris yang diteruskan ke fungsi agregat dengan menambahkan klausa FILTER ke pemanggilan fungsi agregat. Jika klausa FILTER ada, hanya baris yang memenuhi kondisi filter yang dimasukkan ke dalam input untuk fungsi agregat tersebut.Jika klausa
GROUP BYatau fungsi agregat apa pun ada, ekspresi dalam daftar SELECT tidak dapat mereferensikan kolom yang tidak dikelompokkan, kecuali dalam fungsi agregat atau jika kolom yang tidak dikelompokkan tersebut secara fungsional bergantung pada kolom yang dikelompokkan. Hal ini karena jika tidak, akan ada lebih dari satu nilai yang mungkin dikembalikan untuk kolom yang tidak dikelompokkan tersebut. Ketergantungan fungsional ada jika kolom yang dikelompokkan mencakup primary key, atau subset dari primary key, dari tabel yang berisi kolom yang tidak dikelompokkan tersebut.Semua fungsi agregat dihitung sebelum ekspresi skalar apa pun dalam klausa HAVING atau daftar SELECT. Artinya, misalnya, ekspresi CASE tidak dapat digunakan untuk melewati perhitungan fungsi agregat.
-
-
CUBE clause
-
CUBE
Subklausa CUBE secara otomatis membuat subtotal untuk semua kombinasi kolom pengelompokan yang ditentukan dalam klausa GROUP BY. Set hasil mencakup semua kombinasi nilai yang mungkin dalam kolom dimensi, bersama dengan nilai agregat dari baris dasar yang cocok dengan kombinasi dimensi tersebut. CUBE mengembalikan satu baris ringkasan untuk setiap kelompok. Anda dapat menggunakan CUBE untuk menghasilkan nilai cross-tabulation. Misalnya, jika Anda menentukan tiga ekspresi
(n = 3)dalam klausa CUBE, operasi tersebut menghasilkan 2n = 23 = 8 kelompok. Baris yang dikelompokkan berdasarkan semua nilai ekspresi n adalah baris biasa. Semua baris lainnya adalah baris super-agregat. Sintaksnya adalah sebagai berikut:CUBE ( { expression | ( expression [, …] ) } [, …] ) -
ROLLUP
Subklausa ROLLUP adalah ekstensi dari klausa GROUP BY. Saat menghasilkan statistik dan laporan, Anda dapat menggunakan ROLLUP untuk mengembalikan subtotal untuk setiap kelompok dan total keseluruhan untuk semua kelompok. Sintaksnya adalah sebagai berikut:
ROLLUP ( { expression | ( expression [, …] ) } [, …] ) -
GROUPING SETS
Subklausa GROUPING SETS adalah ekstensi dari klausa GROUP BY yang memungkinkan Anda menentukan beberapa opsi GROUP BY dalam satu kueri. Ini meningkatkan efisiensi dengan memungkinkan Anda memilih hanya set pengelompokan yang Anda butuhkan. Saat Anda hanya menentukan kelompok data yang diperlukan, database tidak perlu menghitung set agregasi lengkap yang dihasilkan oleh CUBE atau ROLLUP. Sintaksnya adalah sebagai berikut:
GROUPING SETS ( grouping_element [, …] )
-
-
DISTINCT clause
Jika Anda menentukan SELECT DISTINCT, semua baris duplikat dihapus dari set hasil. Hanya satu baris yang disimpan dari setiap kelompok baris duplikat.
CatatanSELECT DISTINCT pada kolom dengan tipe data ARRAY tidak didukung.
SELECT DISTINCT accountid FROM table; -
COUNT DISTINCT clause
-
Ikhtisar Perintah
COUNT DISTINCTmenghitung jumlah nilai unik dalam suatu kolom. Nilai yang muncul beberapa kali hanya dihitung sekali. Mirip dengan fungsi COUNT, nilai NULL dalam kolom tidak termasuk dalam perhitungan. -
Deskripsi Sintaks
-
Sintaks untuk perhitungan eksak:
SELECT c1, COUNT(DISTINCT c2) FROM table GROUP BY c1 -
Perhitungan
COUNT DISTINCTeksak dapat mengonsumsi sumber daya signifikan. Oleh karena itu, Hologres juga mendukung perhitunganCOUNT DISTINCTperkiraan. Sintaksnya adalah sebagai berikut:SELECT c1, approx_count_distinct(c2) FROM table GROUP BY c1
-
-
-
UNION clause
-
Ikhtisar Perintah
Sintaks klausa UNION adalah sebagai berikut:
select_statement UNION [ ALL | DISTINCT ] select_statement -
Deskripsi Parameter
Parameter
Deskripsi
select_statement
select_statementadalah pernyataan SELECT apa pun tanpa klausaORDER BY, LIMIT, FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE, atauFOR KEY SHARE(jika subekspresi diapit tanda kurung,ORDER BYdan LIMIT dapat dilampirkan padanya. Tanpa tanda kurung, klausa-klausa ini berlaku untuk hasil UNION, bukan ekspresi sisi kanan).UNION
Operator UNION menghitung gabungan baris yang dikembalikan oleh pernyataan SELECT yang terlibat. Suatu baris muncul dalam gabungan jika muncul di setidaknya satu dari dua set hasil. Pernyataan SELECT yang digunakan sebagai operand UNION harus menghasilkan jumlah kolom yang sama, dan kolom yang sesuai harus memiliki tipe data yang kompatibel.
Hasil UNION tidak berisi baris duplikat kecuali opsi ALL ditentukan. ALL mencegah penghapusan duplikat (sehingga UNION ALL biasanya jauh lebih cepat daripada UNION; gunakan ALL kapan pun memungkinkan). Anda dapat secara eksplisit menentukan penghapusan duplikat dengan menulis DISTINCT.
Beberapa operator UNION dalam pernyataan SELECT yang sama dievaluasi dari kiri ke kanan kecuali tanda kurung menentukan urutan yang berbeda.
-
-
INTERSECT clause
-
Ikhtisar Perintah
Klausa INTERSECT memiliki bentuk berikut:
select_statement INTERSECT [ ALL | DISTINCT ] select_statement -
Deskripsi Parameter
Parameter
Deskripsi
select_statement
select_statementadalah pernyataan SELECT apa pun tanpa klausaORDER BY LIMIT.INTERSECT
Operator INTERSECT menghitung irisan baris yang dikembalikan oleh pernyataan SELECT yang terlibat. Suatu baris muncul dalam irisan hanya jika muncul di kedua set hasil.
Hasil INTERSECT tidak berisi baris duplikat kecuali opsi ALL ditentukan. Dengan ALL, baris yang muncul m kali di tabel kiri dan n kali di tabel kanan muncul min(m, n) kali dalam hasil. Anda dapat secara eksplisit menentukan penghapusan duplikat dengan menulis DISTINCT.
Beberapa operator INTERSECT dalam pernyataan SELECT yang sama dievaluasi dari kiri ke kanan kecuali tanda kurung menentukan urutan yang berbeda. INTERSECT memiliki presedensi lebih tinggi daripada UNION. Dengan demikian,
A UNION B INTERSECT Cdibaca sebagaiA UNION (B INTERSECT C).
-
-
EXCEPT clause
-
Ikhtisar Perintah
Klausa EXCEPT memiliki bentuk berikut:
select_statement EXCEPT [ ALL | DISTINCT ] select_statement -
Deskripsi Parameter
Parameter
Deskripsi
select_statement
select_statementadalah pernyataan SELECT apa pun tanpa klausaORDER BY LIMIT.EXCEPT
Operator EXCEPT menghitung himpunan baris yang muncul dalam hasil pernyataan SELECT kiri tetapi tidak dalam hasil pernyataan SELECT kanan.
Hasil EXCEPT tidak berisi baris duplikat kecuali opsi ALL ditentukan. Dengan ALL, baris yang muncul m kali di tabel kiri dan n kali di tabel kanan muncul max(m - n, 0) kali dalam hasil. Anda dapat secara eksplisit menentukan penghapusan duplikat dengan menulis DISTINCT.
Beberapa operator EXCEPT dalam pernyataan SELECT yang sama dievaluasi dari kiri ke kanan kecuali tanda kurung menentukan urutan yang berbeda. EXCEPT memiliki presedensi yang sama dengan UNION.
Saat ini,
FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE, danFOR KEY SHAREtidak dapat digunakan dengan hasil EXCEPT atau input EXCEPT apa pun.
-
-
ORDER BY clause
-
Ikhtisar Perintah
Klausa
ORDER BYopsional memiliki bentuk berikut:ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] -
Deskripsi Parameter
Klausa
ORDER BYmengurutkan baris hasil berdasarkan ekspresi yang ditentukan. Jika dua baris sama menurut ekspresi paling kiri, baris tersebut dibandingkan berdasarkan ekspresi berikutnya, dan seterusnya. Jika baris tersebut sama untuk semua ekspresi yang ditentukan, baris tersebut dikembalikan dalam urutan yang bergantung pada implementasi.Setiap ekspresi dapat berupa nama atau nomor ordinal kolom output dari daftar SELECT, atau ekspresi yang dibentuk dari nilai kolom input.
Nomor ordinal mengacu pada posisi kolom output, dari kiri ke kanan. Fitur ini memungkinkan Anda menentukan urutan untuk kolom yang tidak memiliki nama unik. Ini biasanya tidak diperlukan karena Anda dapat menggunakan klausa AS untuk memberikan nama unik pada kolom output.
Anda juga dapat menggunakan ekspresi arbitrer dalam klausa ORDER BY, termasuk kolom yang tidak ada dalam daftar output SELECT. Misalnya, pernyataan berikut valid:
SELECT name FROM distributors ORDER BY code;Batasan fitur ini adalah bahwa ketika Anda menerapkan klausa ORDER BY pada hasil klausa UNION, INTERSECT, atau EXCEPT, klausa
ORDER BYhanya dapat menentukan nama kolom output atau nomor ordinal, bukan ekspresi.Jika ekspresi ORDER BY adalah nama sederhana yang cocok dengan nama kolom output dan nama kolom input, ORDER BY menginterpretasikannya sebagai nama kolom output. Perilaku ini berbeda dari klausa GROUP BY, yang menginterpretasikan nama ambigu sebagai nama kolom input. Ketidakkonsistenan ini dimaksudkan untuk kompatibilitas dengan standar SQL.
Anda dapat menambahkan kata kunci ASC (ascending) atau DESC (descending) setelah ekspresi apa pun dalam klausa ORDER BY. Jika Anda tidak menentukan kata kunci, ASC digunakan secara default. Atau, Anda dapat menentukan nama operator pengurutan dalam klausa USING. Operator pengurutan harus merupakan anggota less-than atau greater-than dari family operator Pohon-B. ASC biasanya setara dengan USING <, dan DESC biasanya setara dengan USING >. Namun, pembuat tipe data yang ditentukan pengguna dapat menentukan urutan pengurutan default tertentu, yang mungkin sesuai dengan operator dengan nama lain.
Jika Anda menentukan
NULLS LAST, nilai null diurutkan setelah nilai non-null. Jika Anda menentukanNULLS FIRST, nilai null diurutkan sebelum nilai non-null. Jika Anda tidak menentukan salah satunya, perilaku default untuk ASC adalahNULLS LAST, dan perilaku default untuk DESC adalahNULLS FIRST. Secara default, nilai null dianggap lebih besar daripada nilai non-null. Saat Anda menggunakan klausa USING, urutan null default bergantung pada apakah operator tersebut adalah operator less-than atau greater-than.Perhatikan bahwa opsi pengurutan hanya berlaku untuk ekspresi yang diikuti. Misalnya,
ORDER BY x, y DESCberbeda dariORDER BY x DESC, y DESC.
-
-
LIMIT clause
-
Ikhtisar Perintah
Klausa LIMIT terdiri dari dua subklausa independen:
LIMIT { count | ALL } OFFSET start -
Deskripsi Parameter
Parameter count menentukan jumlah maksimum baris yang akan dikembalikan. Parameter start menentukan jumlah baris yang dilewati sebelum sistem mulai mengembalikan baris. Jika Anda menentukan kedua parameter, sistem melewati jumlah baris start yang ditentukan sebelum mulai menghitung jumlah baris count yang akan dikembalikan.
Jika ekspresi count mengevaluasi ke NULL, ekspresi tersebut diperlakukan sebagai
LIMIT ALL, yang berarti tidak ada batasan. Jika ekspresi start mengevaluasi ke NULL, ekspresi tersebut diperlakukan sebagai OFFSET 0.Saat Anda menggunakan klausa LIMIT, Anda juga harus menyertakan klausa
ORDER BYuntuk membatasi baris ke urutan yang unik. Jika tidak, Anda akan mengambil subset baris kueri yang tidak dapat diprediksi. Misalnya, jika Anda meminta baris 10 hingga 20 tanpa menentukan klausaORDER BY, tidak ada jaminan baris mana yang akan dikembalikan.Perencana kueri mempertimbangkan klausa LIMIT saat menghasilkan rencana kueri. Oleh karena itu, nilai LIMIT dan OFFSET yang berbeda kemungkinan besar menghasilkan rencana kueri dan urutan baris yang berbeda. Jika Anda memilih subset berbeda dari hasil kueri menggunakan nilai LIMIT dan OFFSET yang berbeda, Anda mungkin menerima hasil yang tidak konsisten kecuali Anda menegakkan urutan yang dapat diprediksi dengan klausa ORDER BY. Ini bukan bug. Ini adalah konsekuensi yang dimaksudkan dari fakta bahwa SQL tidak menjamin urutan tertentu untuk hasil kueri kecuali klausa
ORDER BYdigunakan untuk membatasi urutan tersebut.Jika Anda tidak menggunakan klausa
ORDER BYuntuk menegakkan subset deterministik, mengeksekusi kueri LIMIT yang sama beberapa kali mungkin mengembalikan subset baris tabel yang berbeda. Ini bukan bug. Determinisme tidak dijamin dalam kasus seperti ini.
-
Contoh penggunaan
-
Join dua tabel
SELECT f.title, f.did, d.name, f.date_prod, f.kind FROM distributors d, films f WHERE f.did = d.did; Klausa WITH
WITH distributor_name(name) AS (SELECT name from distributors) SELECT name FROM distributor_name ORDER BY name;-
GROUP BY
SELECT kind, sum(length) AS total FROM films GROUP BY kind; -
Filtering dengan HAVING
SELECT kind, sum(length) AS total FROM films GROUP BY kind HAVING sum(length) < interval '5 hours'; GROUP BY CUBE
SELECT l_returnflag ,l_shipmode ,SUM(l_quantity) FROM public.lineitem GROUP BY cube((l_returnflag),(l_shipmode)) ORDER BY l_returnflag ,l_shipmode;GROUP BY ROLLUP
SELECT l_returnflag ,l_shipmode ,SUM(l_quantity) FROM public.lineitem GROUP BY ROLLUP ((l_returnflag),(l_shipmode)) ORDER BY l_returnflag ,l_shipmode;GROUP BY GROUPING SETS
SELECT l_returnflag ,l_shipmode ,SUM(l_quantity) FROM public.lineitem GROUP BY GROUPING SETS ((l_returnflag,l_shipmode),()) ORDER BY l_returnflag ,l_shipmode;ORDER BY
SELECT * FROM distributors ORDER BY name;