Pengisihan Pelbagai Lajur dan Peletakan NULL
Percampuran ASC/DESC dan perbezaan NULLS FIRST/LAST merentas pangkalan data
Pengisihan Pelbagai Lajur dan Peletakan NULL ialah pelajaran Persediaan Temu Duga SQL percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga SQL, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.
Mengapa Pengisihan Muncul dalam Temu Duga
Penemuduga sering memilih ORDER BY pada awal temu duga kerana ia mendedahkan sama ada anda memahami bahawa set hasil SQL adalah tidak tersusun secara lalai. Tanpa pengisihan yang dinyatakan secara jelas, pangkalan data bebas mengembalikan baris dalam apa-apa susunan yang dikehendakinya.
Pembukaan yang biasa ialah: "Bagaimanakah anda memastikan baris dikembalikan dalam susunan tertentu?" Satu-satunya jawapan yang betul ialah klausa ORDER BY yang dinyatakan secara jelas. Bergantung pada susunan sisipan, susunan kunci utama atau susunan indeks ialah kesilapan lazim calon kurang berpengalaman.
Dalam pelajaran ini, anda akan menguasai pengisihan berbilang lajur dan soalan rumit tentang kedudukan nilai NULL.
Asas ASC dan DESC
ORDER BY mengisih secara menaik (ASC) secara lalai. Anda hanya memerlukan DESC untuk membalikkan susunan itu. Arah dikenakan bagi setiap lajur, bukan pada keseluruhan klausa.
Petua temu duga: nyatakan bahawa ASC ialah lalai tersirat supaya anda tidak perlu menulisnya. Ramai calon tersilap menganggap satu DESC membalikkan semua lajur.
SELECT name, hire_date
FROM employees
ORDER BY hire_date DESC;Mengisih Mengikut Berbilang Lajur
Senaraikan beberapa lajur yang dipisahkan dengan koma. SQL mengisih mengikut lajur pertama, kemudian memecahkan seri menggunakan lajur kedua, dan seterusnya. Anggap ia sebagai rantaian pemecah seri.
Contoh ini mengisih mengikut jabatan dalam susunan abjad, dan dalam setiap jabatan mengikut gaji daripada yang tertinggi dahulu.
- Isihan utama:
departmentmenaik - Pemecah seri:
salarymenurun
SELECT department, name, salary
FROM employees
ORDER BY department ASC, salary DESC;Mencampurkan ASC dan DESC
Perangkap temu duga yang kerap berlaku: setiap lajur mempunyai arah sendiri. Menulis ORDER BY a, b DESC mengisih a secara menaik dan b secara menurun, bukannya kedua-duanya secara menurun.
Jika anda mahu kedua-duanya menurun, anda mesti menulis ORDER BY a DESC, b DESC. Nyatakan dengan jelas apabila soalan mencampurkan arah.
SELECT region, sales_year, revenue
FROM sales
ORDER BY region ASC, sales_year DESC;Ke Mana NULL Pergi?
Inilah inti pelajaran ini. NULL bermaksud tidak diketahui, jadi piawaian tidak menetapkan kedudukan, dan pangkalan data berbeza pendapat tentang lalai:
- PostgreSQL & Oracle: NULL diisih terakhir dalam
ASC, dan pertama dalamDESC. - MySQL & SQL Server: NULL diisih pertama dalam
ASC, dan terakhir dalamDESC(dianggap sebagai nilai terkecil).
Penemuduga gemar bertanya "Di manakah NULL muncul dalam pengisihan ini?" Jawapan yang jujur: ia bergantung pada enjin kecuali anda mengawalnya secara jelas.
Mengawal Kedudukan NULL secara Eksplisit
Untuk menjadikan kedudukan itu pasti tanpa mengira lalai enjin, gunakan NULLS FIRST atau NULLS LAST. PostgreSQL, Oracle dan SQLite menyokongnya secara langsung.
Pertanyaan di bawah memaksa tarikh pengambilan yang tidak diketahui berada di bahagian bawah walaupun lajur diisih secara menaik.
SELECT name, hire_date
FROM employees
ORDER BY hire_date ASC NULLS LAST;Meniru NULLS LAST dalam MySQL
MySQL tidak menyokong kata kunci NULLS LAST. Penyelesaian yang serasi merentas pangkalan data ialah menggunakan kunci isihan pendahuluan yang menandakan sama ada nilai itu NULL.
Ungkapan hire_date IS NULL mengembalikan 0 untuk tarikh sebenar dan 1 untuk NULL. Mengisihnya secara menaik menolak NULL ke penghujung, kemudian kunci kedua mengisih tarikh sebenar.
SELECT name, hire_date
FROM employees
ORDER BY (hire_date IS NULL) ASC, hire_date ASC;Meniru NULLS FIRST dalam SQL Server
SQL Server juga tidak mempunyai NULLS FIRST/LAST. Gunakan ungkapan CASE sebagai kunci isihan pendahuluan. Di sini NULL diberikan kedudukan 0 supaya muncul dahulu.
Corak ini wajar dihafal: lajur penanda terhitung yang diletakkan sebelum lajur isihan sebenar memberikan anda kawalan penuh terhadap kedudukan NULL dalam mana-mana dialek.
SELECT name, hire_date
FROM employees
ORDER BY CASE WHEN hire_date IS NULL THEN 0 ELSE 1 END,
hire_date ASC;Contoh Berpandu: Papan Pendahulu
Andaikan anda membina papan pendahulu: skor tertinggi diutamakan, dan bagi skor yang seri, pemain yang mendaftar paling awal mendapat kedudukan lebih tinggi. Pemain yang tidak pernah memperoleh skor (skor NULL) hendaklah berada di bahagian bawah.
Pengisihan itu memerlukan tiga kunci: penanda NULL, skor secara menurun, dan tarikh pendaftaran secara menaik sebagai pemecah seri.
SELECT player, score, signup_date
FROM players
ORDER BY (score IS NULL) ASC,
score DESC,
signup_date ASC;Catatan tentang Kestabilan Isihan
Satu lagi soalan kegemaran: "Jika dua baris sama bagi setiap kunci ORDER BY, dalam susunan apakah baris itu dikembalikan?"
Jawapan: tidak ditentukan. Isihan SQL tidak dijamin stabil, jadi baris yang sama boleh muncul dalam apa-apa susunan relatif, dan susunan itu mungkin berubah antara pelaksanaan atau selepas perubahan indeks.
Penyelesaiannya ialah menambah pemecah seri yang unik sepenuhnya, biasanya kunci utama, supaya hasil boleh dihasilkan semula.
SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC;Nota Prestasi tentang Pengisihan
Pengisihan boleh menjadi mahal. Jika ORDER BY sepadan dengan indeks sedia ada dari segi susunan dan arah lajur, enjin boleh membaca baris yang telah diisih terlebih dahulu dan melangkau langkah pengisihan berasingan.
Arah yang tidak sepadan (contohnya indeks semuanya menaik tetapi anda mengisih satu lajur secara menurun) biasanya menghalang penggunaan ini, lalu memaksa pengisihan dalam memori atau pada cakera. Menyebut hubungan antara susunan indeks dengan kos pengisihan menunjukkan kematangan kepada penemuduga.
Semakan Pantas
Uji pemahaman anda tentang peraturan arah berbilang lajur.
Ringkasan
Rumusan utama tentang pengisihan berbilang lajur dan kedudukan NULL:
- Set hasil tidak tersusun kecuali anda menambah
ORDER BY. - Arah ditetapkan bagi setiap lajur;
ASCialah lalai. - Kedudukan NULL berbeza mengikut enjin: terakhir dalam ASC bagi PostgreSQL/Oracle, pertama dalam ASC bagi MySQL/SQL Server.
- Gunakan
NULLS FIRST/LASTapabila disokong, atau penandaIS NULL/CASEpendahuluan di tempat lain. - Tambahkan pemecah seri unik (seperti kunci utama) untuk mendapatkan susunan yang boleh dihasilkan semula.
Pelajari SQL dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “Pengisihan Pelbagai Lajur dan Peletakan NULL” percuma?
Ya — teks penuh “Pengisihan Pelbagai Lajur dan Peletakan NULL” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga SQL, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Pengisihan Pelbagai Lajur dan Peletakan NULL”?
Percampuran ASC/DESC dan perbezaan NULLS FIRST/LAST merentas pangkalan data Anda berlatih Persediaan Temu Duga SQL menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga SQL?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga SQL di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Pengisihan Pelbagai Lajur dan Peletakan NULL” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga SQL ini?
Ya. Setiap pelajaran Persediaan Temu Duga SQL menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pengisihan Pelbagai Lajur dan Peletakan NULL
- LIMIT, OFFSET dan FETCH FIRST
- Mengembalikan Baris Teratas-N Dengan Boleh Dipercayai
- Mengisih Mengikut Ungkapan dan Alias