Rumah >pangkalan data >SQL >Bagaimanakah saya menggunakan subqueries dalam SQL untuk membuat pertanyaan kompleks?
Artikel ini menerangkan subqueries SQL (pertanyaan bersarang), mempamerkan penggunaannya dalam Pilih, dari, dan di mana klausa. Ia menyoroti faedah, perangkap biasa (subqueries berkorelasi, penggunaan tidak cekap), dan teknik pengoptimuman (bergabung, CTE, wujud
Subqueries, juga dikenali sebagai pertanyaan bersarang, adalah pertanyaan yang tertanam dalam pertanyaan SQL yang lain. Mereka sangat berguna untuk mewujudkan pertanyaan kompleks yang sukar atau mustahil untuk dicapai dengan satu pertanyaan mudah. Mereka membolehkan anda memecahkan masalah yang kompleks ke bahagian yang lebih kecil dan lebih mudah diurus. Subqueries boleh digunakan dalam pelbagai klausa pertanyaan utama, termasuk SELECT
, FROM
, WHERE
, dan HAVING
klausa.
Mari kita gambarkan dengan contoh:
Contoh 1: Subquery dalam klausa WHERE:
Katakan anda mempunyai dua jadual: Customers
(CustomerID, Nama, Bandar) dan Orders
(OrderID, CustomerID, OrderDate, Totalamount). Anda ingin mencari nama pelanggan yang telah membuat pesanan dengan jumlah yang lebih besar daripada jumlah pesanan purata.
<code class="sql">SELECT Name FROM Customers WHERE CustomerID IN (SELECT CustomerID FROM Orders GROUP BY CustomerID HAVING AVG(TotalAmount) > (SELECT AVG(TotalAmount) FROM Orders));</code>
Pertanyaan ini menggunakan subquery dalam klausa WHERE
untuk mencari CustomerID
yang memenuhi kriteria yang ditentukan sebelum memilih nama yang sepadan dari jadual Customers
. Subquery paling dalam mengira jumlah pesanan purata di semua pesanan.
Contoh 2: Subquery dalam klausa pilih:
Bayangkan anda mahu mengambil nama pelanggan bersama -sama dengan jumlah yang mereka belanjakan.
<code class="sql">SELECT c.Name, (SELECT SUM(TotalAmount) FROM Orders o WHERE o.CustomerID = c.CustomerID) AS TotalSpent FROM Customers c;</code>
Di sini, subquery dalam klausa SELECT
mengira TotalSpent
untuk setiap pelanggan.
Contoh 3: Subquery dalam klausa dari (menggunakan CTE - Ekspresi Jadual Biasa - untuk kebolehbacaan):
Untuk kebolehbacaan yang lebih baik, terutamanya dengan subqueries yang kompleks, menggunakan Ekspresi Jadual Biasa (CTE) adalah disyorkan. Mari cari pelanggan yang membuat pesanan pada bulan lalu.
<code class="sql">WITH RecentOrders AS ( SELECT CustomerID FROM Orders WHERE OrderDate >= DATE('now', '-1 month') ) SELECT c.Name FROM Customers c JOIN RecentOrders ro ON c.CustomerID = ro.CustomerID;</code>
Contoh ini menggunakan CTE, RecentOrders
, yang merupakan subquery yang ditakrifkan sebelum pertanyaan utama. Pertanyaan utama kemudian menyertai Customers
dengan RecentOrders
untuk mendapatkan hasil yang diinginkan. Pendekatan ini meningkatkan kebolehbacaan dengan ketara berbanding dengan terus membenamkan subquery dalam klausa FROM
.
Walaupun subqueries berkuasa, beberapa perangkap boleh membawa kepada masalah prestasi atau hasil yang salah:
WHERE
.IN
vs EXISTS
: EXISTS
umumnya lebih cekap daripada IN
memeriksa kewujudan baris, terutama dengan dataset yang besar. EXISTS
berhenti mencari sebaik sahaja perlawanan dijumpai, sementara IN
perlu memproses semua baris.Mengoptimumkan subqueries melibatkan beberapa strategi:
WHERE
.EXISTS
umumnya lebih cekap daripada IN
memeriksa kewujudan.EXPLAIN PLAN
di Oracle, EXPLAIN
dalam MySQL dan PostgreSQL, SQL Server Profiler) untuk menganalisis pelan pelaksanaan pertanyaan anda dan mengenal pasti kesesakan.Ya, subqueries disokong oleh hampir semua pangkalan data SQL utama, termasuk MySQL, PostgreSQL, SQL Server, Oracle, dan lain -lain. Sintaks asas adalah serupa di seluruh pangkalan data ini, walaupun terdapat variasi kecil dalam sintaks atau ciri yang disokong. Walau bagaimanapun, ciri -ciri prestasi dan strategi pengoptimuman mungkin berbeza sedikit bergantung kepada sistem pangkalan data tertentu dan pengoptimalnya. Memahami spesifik pengoptimuman pertanyaan sistem pangkalan data anda adalah penting untuk penulisan pertanyaan yang cekap.
Atas ialah kandungan terperinci Bagaimanakah saya menggunakan subqueries dalam SQL untuk membuat pertanyaan kompleks?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!