SQL adalah bahasa database dan PostgreSQL adalah bahasa pilihan kami. Seringkali, menyimpan data hanyalah salah satu aspek dari proses. Biasanya, dalam segala upaya yang berpusat pada data, Anda akan:melihat dan membaca data, mengambil tindakan atau menerapkan perubahan pada data, mengumpulkan informasi pengambilan keputusan (analitik), atau memanipulasi data yang disimpan dalam beberapa bentuk atau cara.
SQL terdiri dari kombinasi kata kunci, perintah, dan klausa. SQL tampaknya sederhana. Hanya beberapa 'mudah ' perintah di sana-sini. Bukan masalah besar, kan?
Tapi, ada lebih banyak SQL daripada yang terlihat. SQL dapat membuat Anda tersandung pada 'mudah . itu ' pertanyaan.
Satu tantangan (yang harus saya tinjau kembali secara rutin) adalah memahami bahwa urutan eksekusi SQL jelas berbeda dari sintaksnya.
Dalam posting blog ini, saya mengunjungi, pada tingkat tinggi, klausa SQL utama yang berlaku untuk PostgreSQL. Ada banyak dialek SQL tetapi interpretasi PostgreSQL adalah fokus di sini. (Beberapa karakteristik dari setiap klausa mungkin berlaku untuk dialek SQL lainnya.)
Klausa SQL membentuk dasar untuk perintah dan kueri dasar yang sering digunakan. Meskipun demikian, pertanyaan lanjutan dan contoh yang menggunakan Fungsi Jendela, CTE, Tabel Turunan, dll tidak akan dibahas dalam posting ini.
Seperti yang akan kita lihat, tidak semua klausa dibuat sama. Namun, mereka beroperasi bersama-sama, memberikan hasil kueri dengan mulus (atau tidak).
Izinkan saya untuk mengklarifikasi...
Saya akan secara berkala menyebutkan perintah eksekusi di seluruh posting blog karena ini berlaku untuk banyak klausa. Tapi, ini digeneralisasi.
Menurut pemahaman saya, lebih sering daripada tidak, pengoptimal memilih dan memutuskan rencana kueri terbaik untuk dieksekusi.
SELECT - Klausa 'pilih-pilih' yang digunakan untuk Query Database
SELECT adalah salah satu klausa sibuk. Itu ada di mana-mana. Digunakan lebih dari semua klausa lainnya. Klausa tertentu yang mungkin tidak Anda butuhkan sama sekali. Tidak demikian halnya dengan SELECT, karena ini adalah klausa wajib.
Klausa SELECT biasanya digunakan untuk menanyakan database, yang berisi (pada tingkat dasar):
- Daftar PILIH - Kolom data yang Anda inginkan.
- kumpulan data sumber - dinamai dalam klausa FROM. Tabel, Tampilan, CTE, dll. Dari sinilah data berasal.
- klausa WHERE opsional yang digunakan untuk memfilter baris yang disediakan oleh klausa FROM.
(Klausa FROM dan WHERE akan dibahas di bagian masing-masing.)
Sebenarnya, saya akan mengatakan bahwa klausa SELECT diperlukan di PostgreSQL untuk mengambil apa pun. Tapi kemudian, ada perintah TABLE yang mengembalikan semua baris dan kolom dari sebuah tabel.
Namun, ada pemisahan di antara keduanya. SELECT dapat menentukan kolom individual, tetapi dengan perintah TABLE, semua kolom dikembalikan.
PILIH sorotan:
- PILIH * adalah notasi singkatan dan mengembalikan semua kolom dari sumber data.
- Meskipun SELECT secara sintaks disebut sebagai klausa pertama (dengan pengecualian kueri tersebut menggunakan klausa WITH:tidak dibahas di sini), klausa ini tidak dieksekusi terlebih dahulu. Khususnya, SELECT juga bukan klausa terakhir yang dieksekusi.
- Ekspresi (atau kolom apa pun) dapat diberi nama referensi atau ALIAS dalam klausa SELECT, dengan peringatan. Nama yang diberikan tersebut dapat digunakan dalam klausa ORDER BY dan GROUP BY tetapi tidak pada klausa WHERE atau HAVING.
- Bila ada klausa GROUP BY (atau fungsi agregat) dalam kueri, SELECT tidak boleh memberi nama kolom yang tidak dikelompokkan. Hanya kolom-kolom dalam fungsi agregat apa pun atau yang secara fungsional bergantung pada kolom yang dikelompokkan.
- Tidak hanya SELECT mengembalikan kolom tertentu, tetapi penggunaannya juga meluas ke pernyataan INSERT dan CREATE TABLE.
- Klausa SELECT jauh dari sederhana.
Lihat bagian dokumentasi klausa SELECT PostgreSQL Resmi untuk liputan mendalam.
FROM - Menyediakan Sumber Data untuk Kueri
FROM sebagian besar merupakan klausa wajib. Saya menyebut ini 'secara longgar ' karena perintah TABLE yang tersedia (disebutkan di atas), yang tidak memerlukan klausa FROM.
Kemudian lagi, Anda dapat memilih ekspresi arbitrer, tanpa tabel bernama dalam kueri SELECT. Namun, dengan TABLE, itu tidak mungkin.
Berikut adalah contoh di psql:
learning=> SELECT 2+2;
?column?
----------
4
(1 row)
Tapi dengan TABEL:
learning=> TABLE 2+2;
ERROR: syntax error at or near "2"
LINE 1: TABLE 2+2;
^
Beberapa dialek SQL bahkan mengizinkan penamaan tabel yang tidak ada untuk mengurangi tidak adanya tabel aktual dalam klausa FROM. Namun, di PostgreSQL seperti yang Anda lihat dari kueri sederhana di atas, itu tidak diperlukan.
Tetapi, jika Anda membutuhkan data tersimpan aktual yang dikembalikan selain dari ekspresi sederhana, Anda akan memerlukan klausa FROM. Tanpanya, tidak ada data untuk dioperasikan.
Oleh karena itu FROM mutlak diperlukan untuk membuat kueri tabel apa pun.
Di Postgres, semua tabel bernama dalam klausa FROM pertama kali digabungkan (jika klausa WITH tidak ada) dalam urutan eksekusi yang membentuk Produk Cartesian. Ini masuk akal karena kita membutuhkan data untuk bekerja.
Dokumentasi FROM di sini juga mencatat bahwa biasanya, kumpulan data ini direduksi menjadi sejumlah kecil baris melalui kondisi klausa WHERE saat ini.
Klausa FROM menerima sejumlah elemen tertentu. Berikut adalah beberapa (lihat dokumentasi tautan di bawah untuk daftar lengkapnya):
- Nama tabel (jelas kami membutuhkan ini).
- PANDANGAN.
- Pernyataan SELECT (subquery).
- Nama CTE (DENGAN klausa).
- Jenis GABUNG - jika ada.
- Sebuah fungsi (saya tidak menyadarinya. Keren!!!)
DARI sorotan:
- Meskipun FROM secara sintaksis terdaftar sebagai klausa kedua dalam kueri SELECT, ini dieksekusi terlebih dahulu.
- FROM menyediakan (dengan memuat) semua baris dari tabel mana pun (nyata atau virtual) yang disebutkan dalam klausanya.
- Nama tabel dapat diberi alias dalam klausa FROM (mis., FROM shoe AS s) tetapi perlu direferensikan oleh ALIAS tersebut sepanjang kueri ke depan.
- FROM adalah klausa wajib saat membuat kueri tabel.
Lihat bagian klausa FROM PostgreSQL Resmi untuk liputan mendalam.
WHERE - Memfilter Baris Dari Sumber Data Berdasarkan Ekspresi Bersyarat Validasi Boolean
WHERE adalah klausa opsional. Namun, saat ada dalam kueri, tugasnya adalah menghapus catatan yang disediakan oleh klausa FROM yang tidak lulus pemeriksaan bersyarat boolean.
Klausa WHERE juga memiliki kegunaan mendalam dengan perintah SQL lainnya selain SELECT. Yaitu, perintah DML seperti INSERT (tidak secara langsung, tetapi melalui SELECT), UPDATE, dan DELETE.
Faktanya, tanpa klausa WHERE, pernyataan UPDATE dan DELETE kemungkinan akan mempengaruhi semua baris target. Mungkin bukan yang Anda inginkan (Ya!).
Fungsi agregat tidak dapat digunakan dalam ekspresi kondisional boolean dari klausa WHERE. Pengelompokan apa pun belum terjadi dalam urutan eksekusi. Oleh karena itu, agregat tidak tersedia (belum) untuk klausa WHERE.
Evaluasi WHERE didasarkan pada pemeriksaan boolean menggunakan salah satu operator perbandingan. (Misalnya,>, <, =, <>, dll…)
Klausa WHERE tidak dapat mengakses nama kolom alias yang tercantum dalam klausa SELECT. Karena klausa SELECT adalah sebenarnya (bukan sintaksis) dieksekusi setelah klausa WHERE, kolom alias tersebut belum tersedia.
DIMANA sorotan:
- Fungsi agregat tidak dapat diakses dan tidak dapat digunakan dalam pemeriksaan bersyarat boolean dari klausa WHERE. (Klausa WHERE mungkin bertanggung jawab atas setiap baris yang disediakan untuk fungsi agregat dan pengelompokan untuk komputasi.)
- Kolom alias dalam klausa SELECT tidak dapat dirujuk dalam klausa WHERE.
- Pemeriksaan kondisional ekspresi boolean klausa WHERE dapat menghasilkan:benar, salah, atau NULL.
- Setiap baris di mana ekspresi boolean klausa WHERE bernilai false atau NULL akan dihapus.
- Beberapa kondisi boolean dapat diperiksa di klausa WHERE dengan memanfaatkan kata kunci AND atau OR.
Lihat bagian klausa Resmi PostgreSQL WHERE untuk liputan mendalam.
GROUP BY - Bentuk Grup
Adalah klausa opsional.
Klausa ini membuat satu baris untuk yang dipilih, yang berisi kecocokan pada nilai kolom yang dikelompokkan yang ditentukan.
GROUP BY bisa jadi rumit, oleh karena itu, saya merasa penting untuk menyertakan bagian ini dari dokumentasi:
"Ketika GROUP BY hadir, atau ada fungsi agregat apa pun, itu tidak valid untuk ekspresi daftar SELECT untuk merujuk ke kolom yang tidak dikelompokkan kecuali dalam fungsi agregat atau ketika kolom yang tidak dikelompokkan secara fungsional bergantung pada kolom yang dikelompokkan, karena sebaliknya akan ada lebih dari satu nilai yang mungkin untuk dikembalikan untuk kolom yang tidak dikelompokkan. Ketergantungan fungsional ada jika kolom yang dikelompokkan (atau subsetnya) adalah kunci utama dari tabel yang berisi kolom yang tidak dikelompokkan."
Sorotan KELOMPOK BERDASAR:
- Postgres memungkinkan pengelompokan tidak hanya kolom dari tabel sumber tetapi juga yang tercantum dalam daftar kolom SELECT. Ini sedikit berbeda dari SQL ketat.
- Dalam kueri tertentu, GROUP BY dapat meniru klausa DISTINCT dengan menghapus nilai duplikat untuk kolom klausa SELECT.
- Urutan kolom tidak relevan untuk GROUP BY.
- Kolom yang tidak ditargetkan oleh klausa GROUP BY tidak dapat dirujuk kecuali secara agregat.
- Dalam banyak kasus, Anda dapat mengelompokkan pada KUNCI UTAMA untuk kolom yang bergantung secara fungsional dari kunci tersebut.
- Pengelompokan masih dilakukan untuk kueri yang menggunakan fungsi agregat tanpa adanya klausa GROUP BY.
Lihat bagian klausa Resmi PostgreSQL GROUP BY untuk liputan mendalam.
HAVING - Memfilter KELOMPOK BERDASARKAN Kolom dan Fungsi Agregat
Adalah klausa opsional.
HAVING memfilter baris dari hasil yang ditetapkan dengan pemeriksaan bersyarat boolean seperti klausa WHERE, kecuali, memfilter baris yang dibentuk oleh klausa GROUP BY dan/atau fungsi agregat.
MEMILIKI sorotan:
- Klausa HAVING dapat mereferensikan kolom-kolom yang disebutkan dalam fungsi agregat (bahkan yang tidak dikelompokkan) selain kolom GROUP BY.
- HAVING bertanggung jawab untuk menghilangkan baris setelah fungsi agregat atau pengelompokan diterapkan.
- Anda dapat mereferensikan kolom yang tidak teragregasi dalam klausa HAVING meskipun hal tersebut tidak banyak digunakan.
- Meskipun klausa HAVING sering digunakan bersama dengan klausa GROUP BY, Anda dapat menggunakannya sendiri. Hasil kueri dibentuk menjadi satu grup kolom tersebut dalam fungsi agregat saja.
Lihat bagian klausa HAVING PostgreSQL Resmi untuk liputan mendalam.
ORDER BY - Ukuran Urutan Di Luar Keacakan
Adalah klausa opsional.
Gunakan ORDER BY ketika Anda membutuhkan pemesanan tertentu. Jika tidak, database dapat (dan akan) mengembalikan hasil dalam urutan sembarang.
Bahkan jika hasilnya tampak seperti urutan, ini tidak dijamin.
Jangan tertipu. Gunakan ORDER BY.
Ada dua pola pemesanan yang tersedia. Urutan ASC (ascending) atau DESC (descending), dengan ASC sebagai default.
Jika hasil yang Anda set menyertakan nilai NULL, nilai tersebut juga dapat digunakan dalam urutan sebagai berikut:menentukan NULLS LAST menyebabkannya (NULL) mengurutkan setelah non-NULL sedangkan meminta NULLS FIRST adalah kebalikannya.
ORDER BY highlight:
- Ekspresi pengurutan adalah ekspresi apa pun yang diizinkan dalam daftar SELECT dari kueri.
- PostgreSQL memungkinkan Anda untuk ORDER BY kolom yang tidak ada dalam klausa SELECT di mana beberapa dialek SQL tidak.
- Hasil kueri berubah-ubah dan tidak dijamin menyerupai pola atau urutan apa pun kecuali klausa ORDER BY digunakan.
- ORDER BY dan klausa LIMIT (lihat bagian berikutnya), merupakan kombinasi yang bagus untuk menentukan 'Atas ' baris hasil ditetapkan. (mis., 5 hari penjualan tertinggi, 5 pasang sepatu dengan penjualan terendah, penjual teratas kuartal ini)
- Anda dapat mengurutkan hasil berdasarkan nomor posisi kolom dalam daftar SELECT tetapi nomor yang ditentukan tidak boleh lebih besar dari jumlah item dalam daftar klausa SELECT tersebut. Dengan kata lain, jika klausa SELECT hanya memiliki 2 item, maka ORDER BY 3 akan menghasilkan kesalahan.
- Setiap ekspresi individu hanya diurutkan berdasarkan opsi yang terdaftar. (mis., ORDER BY col_1 DESC, col_2 DESC tidak sama dengan ORDER BY col_1, col_2 DESC)
Lihat bagian klausa ORDER BY PostgreSQL Resmi untuk liputan mendalam.
Unduh Whitepaper Hari Ini Pengelolaan &Otomatisasi PostgreSQL dengan ClusterControlPelajari tentang apa yang perlu Anda ketahui untuk menerapkan, memantau, mengelola, dan menskalakan PostgreSQLUnduh WhitepaperLIMIT - Ambil Jumlah Baris Tertentu Dari Hasil Kueri
LIMIT adalah klausa opsional.
LIMIT sebenarnya terdiri dari 2 sub-klausa, dengan OFFSET menjadi yang kedua.
Jika nilai diberikan untuk bagian OFFSET dari klausa, baris hasil yang ditetapkan akan dikembalikan setelah melewatkan jumlah baris tersebut.
Bagian penting dalam dokumentasi yang perlu diperhatikan:
"Perencana kueri memperhitungkan LIMIT saat membuat rencana kueri, jadi Anda kemungkinan besar mendapatkan paket yang berbeda (menghasilkan urutan baris yang berbeda) tergantung pada apa yang Anda gunakan untuk LIMIT dan OFFSET. Jadi, menggunakan nilai LIMIT/OFFSET yang berbeda untuk memilih himpunan bagian dari hasil kueri akan memberikan hasil yang tidak konsisten kecuali jika Anda menerapkan urutan hasil yang dapat diprediksi dengan ORDER BY. Ini bukan bug; ini adalah konsekuensi bawaan dari fakta bahwa SQL tidak menjanjikan untuk memberikan hasil kueri dalam urutan tertentu kecuali ORDER BY digunakan untuk membatasi pesanan."
LIMIT sorotan:
- LIMIT mungkin dapat mengembalikan lebih sedikit baris daripada jumlah yang ditentukan jika kueri itu sendiri menghasilkan lebih sedikit baris dalam kumpulan hasil. Dengan kata lain, itu tidak akan berdampak pada jumlah baris yang dikembalikan.
- LIMIT ALL sintaks dapat diterima dan memiliki efek yang sama dengan tidak menyertakan klausa LIMIT sama sekali.
- Meskipun jumlah baris 'x' dilewati karena klausa OFFSET, ini bukan 'solusi ' untuk peningkatan kinerja apa pun, karena masih dihitung untuk rencana kueri di server.
- OFFSET 0 sama dengan tidak menyertakan klausa OFFSET sama sekali.
Lihat bagian Klausul LIMIT PostgreSQL Resmi untuk liputan mendalam.
Interpretasi PostgreSQL tentang klausa SQL utama adalah miliknya sendiri. Terlepas dari bagaimana PostgreSQL memilih untuk menerapkannya atau tidak, mereka adalah dasar untuk kueri SQL dan keakraban dengan karakteristik masing-masing (dan nuansa) hanya dapat bermanfaat bagi pengguna yang bergerak maju.
Meskipun banyak artikel, buku, dokumentasi, dan entri blog telah ditulis pada masing-masing klausa ini, saya harap Anda menemukan ikhtisar tingkat tinggi ini dapat dicerna dan informatif.
Terima kasih telah membaca.