Persediaan Temu Duga Pengaturcaraan · Pelajaran

Subpertanyaan Skalar dalam SELECT dan WHERE

Subpertanyaan nilai tunggal dan ralat yang berlaku apabila subpertanyaan mengembalikan lebih daripada satu baris

Pelajaran 1 daripada 413 langkah

Subpertanyaan Skalar dalam SELECT dan WHERE ialah pelajaran Persediaan Temu Duga Pengaturcaraan 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 Pengaturcaraan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Maksud Penemu Duga dengan Subkueri Skalar

Subkueri skalar ialah kueri yang mengembalikan tepat satu baris dan satu lajur — satu nilai. Oleh sebab subkueri ini menghasilkan satu nilai, SQL membenarkan anda meletakkannya hampir di mana-mana tempat nilai harfiah boleh digunakan: dalam SELECT, WHERE, HAVING, malah ORDER BY.

  • Penemu duga menguji sama ada anda mengetahui peraturan satu baris, satu lajur.
  • Perangkap klasiknya: subkueri yang secara tidak sengaja mengembalikan lebih daripada satu baris.

Jika anda dapat menyatakan definisi itu dengan jelas, anda sudah melepasi titik semakan pertama.

Subkueri Skalar dalam Senarai SELECT

Meletakkan subkueri skalar dalam senarai SELECT membolehkan anda melampirkan satu nilai terhitung pada setiap baris hasil. Di sini, kami memaparkan setiap pekerja bersama gaji purata seluruh syarikat.

Subkueri (SELECT AVG(salary) FROM employees) berjalan dan meringkaskan keseluruhan jadual menjadi satu nombor, kemudian nombor itu diulang pada setiap baris.

SELECT
  name,
  salary,
  (SELECT AVG(salary) FROM employees) AS company_avg
FROM employees;

Subkueri Skalar dalam WHERE

Nilai tunggal yang sama boleh menjadi asas penapis. Soalan temu duga yang sangat lazim ialah cari semua orang yang menerima gaji melebihi purata syarikat.

Subkueri mengira purata sekali, kemudian setiap baris dalam kueri luar dibandingkan dengannya. Subkueri ini bukan berkorelasi — kueri dalam tidak bergantung pada baris luar, jadi ia berjalan sekali sahaja.

SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

Ralat 'Lebih daripada Satu Baris'

Inilah ralat yang penemu duga mahu anda jangkakan. Jika subkueri anda digunakan bersama = atau > tetapi mengembalikan beberapa baris, enjin menghasilkan:

  • Postgres: lebih daripada satu baris dikembalikan oleh subkueri yang digunakan sebagai ungkapan
  • MySQL: Subkueri mengembalikan lebih daripada 1 baris

Kueri di bawah gagal kerana mungkin terdapat beberapa pekerja dalam jabatan 5 — subkueri itu bukan skalar.

SELECT name
FROM employees
WHERE salary = (SELECT salary FROM employees WHERE dept_id = 5);

Memastikan Subkueri Menjadi Skalar

Dua cara yang boleh dipercayai untuk menjamin satu nilai:

  • Gunakan fungsi agregat seperti MAX, MIN atau AVG — fungsi agregat tanpa GROUP BY sentiasa mengembalikan satu baris.
  • Gunakan LIMIT 1 (Postgres/MySQL) atau FETCH FIRST 1 ROW ONLY selepas ORDER BY.

Versi yang diperbaiki di bawah meminta gaji tertinggi tunggal dalam jabatan 5.

SELECT name
FROM employees
WHERE salary = (
  SELECT MAX(salary) FROM employees WHERE dept_id = 5
);

Subkueri Skalar Mengembalikan NULL Apabila Tiada Baris

Satu perkara halus dalam temu duga: jika subkueri skalar sepadan dengan sifar baris, ia tidak menghasilkan ralat — sebaliknya mengembalikan NULL. NULL itu kemudiannya merambat melalui perbandingan anda.

Oleh sebab salary > NULL dinilai sebagai UNKNOWN (bukan benar), kueri luar tidak mengembalikan baris. Calon sering menjangkakan ralat di sini; jawapan yang betul ialah hasil kosong secara senyap.

SELECT name, salary
FROM employees
WHERE salary > (
  SELECT AVG(salary) FROM employees WHERE dept_id = 9999
);

Contoh Lengkap: Pekerja Bergaji Lebih Tinggi daripada Purata dengan Perbezaannya

Mari gabungkan kedua-dua penggunaan. Kami memaparkan setiap pekerja yang bergaji melebihi purata dan sejauh mana gaji mereka melebihi purata itu. Subkueri skalar yang sama muncul dalam SELECT dan WHERE.

Penemu duga mungkin bertanya sama ada subkueri itu berjalan dua kali. Secara logiknya, subkueri itu muncul dua kali, tetapi pengoptimum yang baik boleh menilai subkueri yang tidak berkorelasi sekali sahaja dan menggunakannya semula.

SELECT
  name,
  salary,
  salary - (SELECT AVG(salary) FROM employees) AS above_avg
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees)
ORDER BY above_avg DESC;

Subkueri Skalar dalam ORDER BY

Oleh sebab subkueri skalar hanyalah satu nilai, penggunaannya juga sah dalam ORDER BY. Ini jarang menjadi pendekatan yang paling kemas, tetapi penemu duga suka memastikan bahawa anda tahu penggunaannya dibenarkan.

Di sini, kami mengisih jabatan berdasarkan nilai yang diambil daripada jadual lain — bilangan pekerja bagi setiap jabatan — tanpa menggunakan JOIN.

SELECT d.dept_name
FROM departments d
ORDER BY (
  SELECT COUNT(*) FROM employees e WHERE e.dept_id = d.id
) DESC;

Skalar Biasa berbanding Berkorelasi: Mengetahui Perbezaannya

Contoh ORDER BY di atas secara tersembunyi merujuk kepada d.id daripada kueri luar — itu menjadikannya subkueri skalar berkorelasi, yang berjalan sekali bagi setiap baris luar.

Penemu duga sangat menitikberatkan perbezaan ini:

  • Subkueri skalar tidak berkorelasi: berdiri sendiri dan berjalan sekali.
  • Subkueri skalar berkorelasi: merujuk kepada baris luar dan berjalan bagi setiap baris.

Kedua-duanya masih bersifat skalar (satu nilai), tetapi prestasinya berbeza dengan ketara.

Bila NOT Patut Menggunakan Subkueri Skalar

Subkueri skalar berkorelasi dalam senarai SELECT mudah digunakan tetapi boleh menjadi perlahan pada jadual besar — ia dilaksanakan bagi setiap baris. Penemu duga menjangkakan anda mengetahui pilihan lain:

  • LEFT JOIN kepada jadual terbitan yang diagregatkan terlebih dahulu.
  • Fungsi tetingkap seperti AVG(salary) OVER ().

Bentuk fungsi tetingkap di bawah menghasilkan lajur purata syarikat yang sama tanpa imbasan subkueri berasingan.

SELECT
  name,
  salary,
  AVG(salary) OVER () AS company_avg
FROM employees;

Ayat Ringkas Temu Duga

Jika diminta mentakrifkan subkueri skalar, katakan: "Subkueri skalar mengembalikan satu baris dan satu lajur, jadi ia bertindak seperti satu nilai dan boleh digunakan di mana-mana tempat nilai harfiah dibenarkan. Jika subkueri itu mengembalikan lebih daripada satu baris, enjin menghasilkan ralat; jika tiada baris dikembalikan, ia menghasilkan NULL."

Satu ayat ini merangkumi definisi, keadaan ralat dan kes khas NULL — tiga perkara yang ingin didengar oleh setiap penemu duga.

Semakan Pantas

Uji pemahaman anda tentang tingkah laku subkueri skalar.

Ringkasan

Sekarang anda telah menguasai subkueri skalar:

  • Definisi: satu baris, satu lajur — boleh digunakan seperti nilai harfiah dalam SELECT, WHERE, HAVING dan ORDER BY.
  • Beberapa baris bersama =/> menyebabkan ralat; pastikan subkueri menjadi skalar dengan fungsi agregat atau LIMIT 1.
  • Sifar baris menghasilkan NULL, yang secara senyap-senyap menggugurkan baris dalam penapis.
  • Subkueri skalar berkorelasi berjalan bagi setiap baris; utamakan JOIN atau fungsi tetingkap apabila prestasi penting.

Seterusnya: subkueri dalam klausa FROM, yang hasilnya ialah keseluruhan jadual maya.

Percuma untuk bermula

Pelajari Persediaan Temu Duga Pengaturcaraan 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
90
Pelajaran
360

Soalan Lazim

Adakah pelajaran “Subpertanyaan Skalar dalam SELECT dan WHERE” percuma?

Ya — teks penuh “Subpertanyaan Skalar dalam SELECT dan WHERE” 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 Pengaturcaraan, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Subpertanyaan Skalar dalam SELECT dan WHERE”?

Subpertanyaan nilai tunggal dan ralat yang berlaku apabila subpertanyaan mengembalikan lebih daripada satu baris Anda berlatih Persediaan Temu Duga Pengaturcaraan 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 Pengaturcaraan?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga Pengaturcaraan 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 “Subpertanyaan Skalar dalam SELECT dan WHERE” 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 Pengaturcaraan ini?

Ya. Setiap pelajaran Persediaan Temu Duga Pengaturcaraan 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. Subpertanyaan Skalar dalam SELECT dan WHERE
  2. Subpertanyaan dalam Klausa FROM (Jadual Terbitan)
  3. Subpertanyaan IN, ANY dan ALL
  4. Prestasi EXISTS berbanding IN
← Kembali ke Persediaan Temu Duga Pengaturcaraan