Mari kita ke intinya.
Saya telah mencipta repo GitHub Interview SQL yang Hebat untuk menyediakan soalan temu duga dan mempraktikkan pertanyaan SQL. Saya telah membahagikan pertanyaan SQL kepada tiga bahagian: Asas (L0), Pertengahan (L1) dan Lanjutan (L2). Ini adalah penyelesaian untuk bahagian asas.
Ini adalah pertanyaan SQL L1 (Pertengahan) untuk diamalkan, rujuk L0 dahulu untuk latihan yang lebih baik.
Nota: Contoh-contoh ini diuji dalam MySQL. Sintaks mungkin berbeza untuk pangkalan data lain seperti MS-SQL atau Oracle.
L1: SQL Perantaraan
- Pertanyaan yang melibatkan kerja dengan berbilang jadual, menggunakan keadaan JOIN, GROUP BY, HAVING dan kompleks WHERE.
- Pengenalan kepada subkueri, fungsi agregat dan pernyataan kes.
Soalan:
- Tulis pertanyaan untuk mendapatkan semula Nama pelanggan dan bandar untuk pelanggan di 'AS' dan 'Perancis'.
- Bagaimanakah anda mengambil Nombor pekerja, Nama Akhir dan Kod pejabat semua pekerja yang bekerja di pejabat 'San Francisco'?
- Tulis pertanyaan untuk mencari jumlah pesanan bagi setiap pelanggan menggunakan pesanan dan jadual pelanggan.
- Bagaimana anda mendapatkan semula productName, quantityInStock, dan buyPrice untuk produk yang telah ditempah lebih daripada 10 kali?
- Tulis pertanyaan untuk mengambil Nombor pesanan, status dan Nama pelanggan untuk pesanan yang dibuat oleh pelanggan yang Nombor pelanggannya ialah 103.
- Tulis pertanyaan untuk mencari jumlah nilai jualan (kuantitiTempahan * hargaSetiap) untuk setiap pesanan dalam jadual butiran pesanan.
- Bagaimana anda mencari kuantiti purata Dipesan untuk setiap Nombor pesanan dalam jadual butiran pesanan?
- Tulis pertanyaan untuk menyenaraikan productLine dengan jumlah hasil tertinggi (kuantitiTempahan * hargaSetiap) dalam jadual butiran pesanan.
- Tulis pertanyaan untuk memaparkan Nombor pekerja, Nama pertama, Nama akhir dan nama pejabat tempat pekerja bekerja dengan menyertai jadual pekerja dan pejabat.
- Bagaimana anda mencari pelanggan yang tidak pernah membuat pesanan?
- Tulis pertanyaan untuk mendapatkan kembali Nama pelanggan dan jumlah bilangan pesanan yang dibuat oleh setiap pelanggan (termasuk pelanggan yang belum membuat sebarang pesanan).
- Tulis pertanyaan untuk mencari Nama produk dan kuantiti Dipesan untuk semua pesanan yang kuantiti produk yang dipesan lebih daripada 50.
- Dapatkan Nombor pekerja, Nama pertama dan pesananNombor pekerja yang ditugaskan sebagai wakil jualan kepada pelanggan yang telah membuat pesanan.
- Tulis pertanyaan untuk mengira harga purata produk dalam jadual produk berdasarkan harga beli.
- Bagaimanakah anda mendapatkan 3 produk paling mahal teratas dalam jadual produk?
- Tulis pertanyaan untuk mendapatkan kembali Nama pelanggan, Nombor pesanan dan Tarikh pesanan semua pesanan yang mempunyai status 'Dihantar'.
- Bagaimanakah anda memaparkan jumlah bilangan produk yang dijual untuk setiap ProductLine?
- Tulis pertanyaan untuk mencari pekerja yang melaporkan terus kepada pekerja dengan employeeNumber = 1143.
- Tulis pertanyaan untuk mengira jumlah pesanan dalam jadual pesanan, dikumpulkan mengikut status.
- Senaraikan pekerja dengan nama pengurus mereka.
Saya akan menyebut perkara yang salah juga, Adalah penting untuk mengetahui apa yang perlu dilakukan tetapi juga sangat penting apa yang tidak boleh dilakukan, dan di mana kita membuat kesilapan. jom ke point semula...
Penyelesaian dengan penjelasan DI MANA diperlukan
-
Pertanyaan untuk mendapatkan semula Nama pelanggan dan bandar untuk pelanggan di 'AS' dan 'Perancis'.
-
ATAU -> Sedikit perlahan jika terdapat banyak syarat, kerana pertanyaan menyemak setiap keadaan satu demi satu.
-
DALAM -> sedikit dioptimumkan secara dalaman oleh enjin pangkalan data, terutamanya untuk senarai panjang.
- Kedua-duanya baik untuk 2-3 keadaan. Untuk kebolehbacaan dan kebolehskalaan, IN adalah lebih baik, terutamanya apabila mengendalikan senarai nilai yang lebih besar.
-
IS digunakan untuk menyemak keadaan seperti IS NULL atau IS NOT NULL, bukan untuk perbandingan rentetan.
Ambil Nombor pekerja, Nama keluarga dan Kod pejabat semua pekerja yang bekerja di pejabat 'San Francisco'.
-
Pertanyaan untuk mencari jumlah pesanan bagi setiap pelanggan menggunakan pesanan dan jadual pelanggan.
- Sentiasa sertakan lajur tidak teragregat dalam klausa GROUP BY apabila menggunakan fungsi agregat dalam pertanyaan anda.
- Ini memastikan SQL tahu cara mengumpulkan baris dan mengelakkan kekaburan apabila memilih lajur tambahan.
- Dalam contoh kami: Nombor pelanggan danNama pelanggan mestilah kedua-duanya berada dalam klausa KUMPULAN OLEH kerana kami memilihnya bersama-sama COUNT(*).
? Peraturan Emas:
Setiap lajur dalam senarai PILIH mestilah sama ada:
Berada dalam klausa GROUP BY, ATAU
Gunakan fungsi agregat seperti COUNT(), SUM(), dsb.
-
Dapatkan semula productName, quantityInStock, dan buyPrice untuk produk yang telah ditempah lebih daripada 10 kali?
- Pertanyaan ini cekap untuk pangkalan data saiz kecil dan sederhana, untuk saiz besar kami boleh menggunakan indeks dan mengurangkan data yang diimbas menggunakan klausa WHERE dan bukannya bergantung semata-mata pada klausa HAVING
-
Ambil Nombor pesanan, status dan Nama pelanggan untuk pesanan yang dibuat oleh pelanggan yang Nombor pelanggannya ialah 103.
Penjelasan:
- Jadual Digunakan:
- pesanan: Mengandungi Nombor pesanan dan status.
- pelanggan: Mengandungi nama pelanggan.
- SERTAI DALAM:
- Menggabungkan pesanan dan jadual pelanggan menggunakan lajur Nombor pelanggan (kunci biasa).
- WHAT Klausa:
- Menapis data untuk memasukkan hanya rekod dengan nombor pelanggan = 103.
- Lajur Dipilih:
- o.orderNumber: Nombor pesanan.
- o.status: Status pesanan.
- c.customerName: Nama pelanggan yang membuat pesanan.
Cari jumlah nilai jualan (kuantitiTempahan * hargaSetiap) untuk setiap pesanan dalam jadual butiran pesanan.
-
Cari purata kuantitiDipesan untuk setiap Nombor pesanan dalam jadual butiran pesanan.
- Penjelasan:
- Nombor pesanan:
- Kumpulkan baris mengikut Nombor pesanan.
- AVG(kuantitiDipesan):
- Mengira kuantiti purata Dipesan untuk semua baris yang tergolong dalam Nombor pesanan yang sama.
- KUMPULAN OLEH:
- Memastikan purata dikira untuk setiap Nombor pesanan secara berasingan.
-
Pertanyaan untuk menyenaraikan barisan produk dengan jumlah hasil tertinggi (kuantiti Dipesan * hargaSetiap) dalam jadual butiran pesanan.
- Penjelasan:
- talian produk:
- Mengkategorikan produk kepada barisan yang berbeza, seperti "Motosikal" atau "Pesawat."
- JUMLAH(od.quantityOrdered * od.priceEach):
- Mengira jumlah hasil untuk setiap barisan produk.
- SERTAI DALAM:
- Menyertai produk dan jadual butiran pesanan pada ProductCode untuk mengaitkan barisan produk dengan butiran pesanan mereka.
- KUMPULAN OLEH p.productLine:
-
Himpunkan keputusan mengikut setiap barisan produk.
- PESAN MENGIKUT totalRevenue DESC:
- Isih hasil dikumpulkan dalam tertib hasil menurun, supaya hasil tertinggi muncul dahulu.
- HAD 1:
- Menghadkan hasil hanya kepada barisan produk dengan hasil tertinggi.
-
Pertanyaan untuk memaparkan Nombor pekerja, Nama pertama, Nama akhir dan nama pejabat tempat pekerja bekerja dengan menyertai jadual pekerja dan pejabat.
- CONCAT(lajur, 'pemisah', lajur, 'pemisah', lajur)
- CONCAT_WS('pemisah', lajur)
-
Cari pelanggan yang tidak pernah membuat pesanan
Penjelasan:
-
KIRI SERTAI: Dapatkan semua pelanggan daripada jadual pelanggan, sama ada mereka mempunyai baris yang sepadan dalam jadual pesanan atau tidak.
-
o.orderNumber IS NULL: Mengenal pasti pelanggan yang tidak mempunyai sebarang pesanan yang sepadan (iaitu, orderNumber ialah NULL kerana tiada padanan dalam jadual pesanan).
-
Lajur:
-
Nombor pelanggan: Pengecam unik untuk pelanggan.
-
Nama pelanggan: Nama pelanggan.
Pertanyaan untuk mendapatkan semula Nama pelanggan dan jumlah bilangan pesanan yang dibuat oleh setiap pelanggan (termasuk pelanggan yang belum membuat sebarang pesanan).
Cari nama produk dan kuantiti Dipesan untuk semua pesanan yang kuantiti produk yang dipesan melebihi 50.
-
Dapatkan Nombor pekerja, Nama pertama dan pesananNombor pekerja yang ditugaskan sebagai wakil jualan kepada pelanggan yang telah membuat pesanan.
Penjelasan:
-
DARIPADA pekerja e:
- Kami bermula dengan jadual pekerja (disebut sebagai e) kerana kami mahukan butiran pekerja, khususnya Nombor pekerja dan Nama pertama.
-
SERTAI pelanggan c ON e.employeeNumber = c.salesRepEmployeeNumber:
- Kami menyertai jadual pelanggan (disebut sebagai c) pada employeeNumber daripada pekerja dan salesRepEmployeeNumber daripada pelanggan. Ini mewujudkan hubungan antara pekerja (wakil jualan) dan pelanggan. Kini, kami boleh mengenal pasti pekerja yang ditugaskan kepada setiap pelanggan.
-
SERTAI pesanan o ON c.customerNumber = o.customerNumber:
- Kami terus menyertai jadual pesanan (alias sebagai o) dengan jadual pelanggan menggunakan Nombor pelanggan. Ini memberikan kami pesanan yang dibuat oleh setiap pelanggan.
-
PILIH e.employeeNumber, e.firstName, o.orderNumber:
- Akhir sekali, kami memilih Nombor pekerja dan Nama pertama daripada jadual pekerja (wakil jualan) dan Nombor pesanan daripada jadual pesanan untuk setiap pelanggan yang telah membuat pesanan.
Pertanyaan untuk mengira harga purata produk dalam jadual produk berdasarkan harga beli.
Dapatkan 3 produk paling mahal teratas dalam jadual produk?
Dapatkan semula Nama pelanggan, Nombor pesanan dan Tarikh pesanan semua pesanan yang mempunyai status 'Dihantar'.
Paparkan jumlah bilangan produk yang dijual untuk setiap ProductLine
Cari pekerja yang melaporkan terus kepada pekerja tersebut dengan employeeNumber = 1143.
Pertanyaan untuk mengira jumlah pesanan dalam jadual pesanan, dikumpulkan mengikut status.
Senaraikan pekerja dengan nama pengurus mereka.
Hei, Nama saya Jaimin Baria AKA Cloud Boy..., Jika anda telah menikmati dan mempelajari sesuatu yang berguna, suka siaran ini, tambahkan ulasan dan lawati repo GitHub Wawancara SQL Hebat saya.
Jangan lupa untuk memulakannya?.
Selamat Pengekodan ??
Catatan Lain
- Amalan SQL:
- Bahagian 1
- L0: SQL Asas
- L1: SQL Perantaraan
- L2: SQL Lanjutan - Akan Datang tidak lama lagi
- Reka Bentuk Sistem
- Pelaksanaan transaksi ACID dalam Pangkalan Data
- Transaksi ACID dalam Reka Bentuk Sistem
?️ Pembaikan yang Dicadangkan oleh Pembaca
Atas ialah kandungan terperinci Soalan Asas dan Pertengahan SQL untuk Temuduga. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Kenyataan:Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn