SQL Academy · Pelajaran

Menjana Siri dan Urutan

Cipta baris dengan rekursi.

Pelajaran 3 daripada 413 langkah

Menjana Siri dan Urutan ialah pelajaran SQL Academy percuma di CoddyKit. Ini ialah pelajaran 3 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 SQL Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.

Apakah Siri Terjana?

Kadangkala anda memerlukan senarai nombor, tarikh atau nilai lain yang berturutan tetapi tidak wujud dalam mana-mana jadual. SQL membolehkan anda menciptanya secara langsung menggunakan rekursi atau fungsi terbina dalam.

Dalam pelajaran ini, anda akan mempelajari cara menjana jujukan menggunakan WITH RECURSIVE — alat berkuasa yang membolehkan pertanyaan merujuk kepada keluarannya sendiri.

CTE Rekursif Pertama Anda

CTE rekursif (Ungkapan Jadual Biasa) mempunyai dua bahagian yang dicantumkan oleh UNION ALL: kes asas yang menghasilkan baris pertama dan langkah rekursif yang merujuk kepada CTE itu sendiri untuk menghasilkan baris seterusnya.

Rekursi berhenti apabila langkah rekursif tidak mengembalikan sebarang baris.

WITH RECURSIVE counter(n) AS (
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM counter WHERE n < 5
)
SELECT n FROM counter;

Cara Rekursi Berkembang

Anda boleh membayangkan setiap langkah secara berasingan. Kes asas mengisi jadual dengan nilai awal, kemudian setiap laluan rekursif menambah satu lagi baris sehingga syarat WHERE gagal.

Bagi pertanyaan WHERE n < 5, enjin menjana baris 1, 2, 3, 4, 5 dan kemudian berhenti kerana 5 < 5 adalah palsu.

WITH RECURSIVE steps(n, note) AS (
  SELECT 1, 'base case'
  UNION ALL
  SELECT n + 1, 'recursive step'
  FROM steps
  WHERE n < 4
)
SELECT n, note FROM steps;

Menjana Nombor Genap

Anda boleh mengubah saiz langkah dengan hanya menambah nilai yang lebih besar daripada 1 dalam bahagian rekursif. Ini menghasilkan setiap nombor genap dari 2 hingga 10.

Coraknya sentiasa: nilai_seterusnya = nilai_semasa + langkah.

WITH RECURSIVE evens(n) AS (
  SELECT 2
  UNION ALL
  SELECT n + 2 FROM evens WHERE n < 10
)
SELECT n FROM evens;

Mengira Menurun

Rekursi tidak terhad kepada pengiraan menaik. Tolak dan bukannya tambah untuk mendapatkan jujukan menurun. Pastikan syarat berhenti menggunakan > dan bukannya < bagi mengelakkan gelung tak terhingga.

WITH RECURSIVE countdown(n) AS (
  SELECT 10
  UNION ALL
  SELECT n - 1 FROM countdown WHERE n > 1
)
SELECT n FROM countdown;

Menjana Julat Tarikh

Salah satu kegunaan CTE rekursif yang paling praktikal ialah membina siri tarikh. Anda bermula dari tarikh tertentu dan terus menambah satu hari sehingga mencapai tarikh akhir.

Ini amat berguna untuk mengisi jurang dalam laporan — setiap tarikh akan muncul walaupun tiada data untuk hari tersebut.

WITH RECURSIVE dates(d) AS (
  SELECT DATE '2024-01-01'
  UNION ALL
  SELECT d + INTERVAL '1 day'
  FROM dates
  WHERE d < DATE '2024-01-07'
)
SELECT d FROM dates;

Mengisi Jurang Laporan dengan Siri Tarikh

Bayangkan jadual sales yang hanya mempunyai baris pada hari jualan berlaku. Dengan mencantumkan siri tarikh terjana kepada jadual jualan menggunakan LEFT JOIN, anda memperoleh setiap hari dalam julat tersebut, dengan NULL bagi hari yang tiada jualan.

WITH RECURSIVE cal(d) AS (
  SELECT DATE '2024-03-01'
  UNION ALL
  SELECT d + INTERVAL '1 day' FROM cal WHERE d < DATE '2024-03-05'
),
sales(sale_date, amount) AS (
  VALUES
    (DATE '2024-03-01', 100),
    (DATE '2024-03-03', 250),
    (DATE '2024-03-05', 180)
)
SELECT cal.d, COALESCE(sales.amount, 0) AS amount
FROM cal
LEFT JOIN sales ON cal.d = sales.sale_date
ORDER BY cal.d;

Menjana Jadual Pendaraban

CTE rekursif boleh membawa berbilang lajur, yang membolehkan anda membina keluaran yang lebih kaya. Di sini, indeks baris dan nilai terhitung dijejaki pada masa yang sama.

WITH RECURSIVE mult(n, result) AS (
  SELECT 1, 1 * 7
  UNION ALL
  SELECT n + 1, (n + 1) * 7
  FROM mult
  WHERE n < 10
)
SELECT n, result AS seven_times_n FROM mult;

Nombor Fibonacci

Fibonacci ialah jujukan klasik yang setiap nombornya merupakan hasil tambah dua nombor sebelumnya: 0, 1, 1, 2, 3, 5, 8 …

CTE rekursif menjejaki nilai semasa a dan nilai seterusnya b, lalu menukarnya pada setiap langkah.

WITH RECURSIVE fib(a, b) AS (
  SELECT 0, 1
  UNION ALL
  SELECT b, a + b FROM fib WHERE a < 100
)
SELECT a AS fibonacci FROM fib;

Menggunakan generate_series dalam PostgreSQL

PostgreSQL menawarkan jalan pintas terbina dalam yang dipanggil generate_series() untuk menghasilkan jujukan tanpa perlu menulis CTE rekursif. Fungsi ini menerima nilai mula, nilai henti dan langkah pilihan.

Inilah cara paling ringkas untuk menjana julat nombor atau tarikh dalam PostgreSQL.

SELECT gs AS num
FROM generate_series(1, 10, 2) AS gs;

Menjana Selang Bulanan

Hantar selang '1 month' kepada generate_series() untuk membina kalendar bulanan. Ini amat sesuai untuk mencipta pengepala laporan bulanan atau menyemak bulan yang tiada data.

SELECT gs::DATE AS month_start
FROM generate_series(
  '2024-01-01'::DATE,
  '2024-06-01'::DATE,
  INTERVAL '1 month'
) AS gs;

Semakan Pengetahuan

Uji pemahaman anda tentang penjanaan siri menggunakan CTE rekursif.

Ulang Kaji: Menjana Siri dan Jujukan

Dalam pelajaran ini, anda telah mempelajari cara menghasilkan jujukan nombor dan tarikh tanpa sebarang jadual sumber:

  • WITH RECURSIVE — kes asas bersama langkah rekursif yang dicantumkan dengan UNION ALL; berhenti apabila langkah rekursif tidak mengembalikan sebarang baris.
  • Saiz langkah fleksibel — tambah atau tolak sebarang nilai untuk mengira menaik, mengira menurun atau melangkau nilai.
  • Julat tarikh — tambahkan selang untuk menjana siri kalendar harian, bulanan atau tersuai.
  • CTE berbilang lajur — bawa keadaan tambahan merentasi lelaran untuk menghasilkan keluaran yang lebih kaya seperti Fibonacci.
  • generate_series() — fungsi terbina dalam PostgreSQL untuk menghasilkan jujukan nombor dan tarikh dengan cara paling ringkas.

Siri terjana penting untuk mengisi jurang dalam laporan, membina data ujian dan apa-apa keadaan yang memerlukan julat nilai lengkap tanpa mengira kandungan data.

Percuma untuk bermula

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
46
Pelajaran
183

Soalan Lazim

Adakah pelajaran “Menjana Siri dan Urutan” percuma?

Ya — teks penuh “Menjana Siri dan Urutan” 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 SQL Academy, tingkat taraf kepada CoddyKit PRO. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Menjana Siri dan Urutan”?

Cipta baris dengan rekursi. Anda berlatih SQL Academy 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 SQL Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran SQL Academy 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 3 daripada 4.

Berapa lamakah pelajaran “Menjana Siri dan Urutan” 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 SQL Academy ini?

Ya. Setiap pelajaran SQL Academy 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

  1. Cara CTE Rekursif Berfungsi
  2. Menelusuri Pepohon Kategori
  3. Menjana Siri dan Urutan
  4. Mengelakkan Gelung Tanpa Henti
← Kembali ke SQL Academy