Subpertanyaan Skalar dalam SELECT dan WHERE
Subpertanyaan nilai tunggal dan ralat yang berlaku apabila subpertanyaan mengembalikan lebih daripada satu baris
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,MINatauAVG— fungsi agregat tanpaGROUP BYsentiasa mengembalikan satu baris. - Gunakan
LIMIT 1(Postgres/MySQL) atauFETCH FIRST 1 ROW ONLYselepasORDER 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 JOINkepada 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.
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
- Subpertanyaan Skalar dalam SELECT dan WHERE
- Subpertanyaan dalam Klausa FROM (Jadual Terbitan)
- Subpertanyaan IN, ANY dan ALL
- Prestasi EXISTS berbanding IN