Meskipun mengkompilasi pertanyaan SQL bukan hal yang paling menarik bagi Data Scientists, pemahaman yang baik tentang SQL sangat penting bagi siapa saja yang ingin berhasil dalam aktivitas apa pun yang terkait dengan pemrosesan data. Intinya di sini adalah bahwa SQL tidak hanya SELECT
, FROM
dan WHERE
. Semakin banyak konstruksi SQL yang diketahuinya oleh spesialis, semakin mudah baginya untuk membuat permintaan untuk mendapatkan dari basis data segala yang mungkin diperlukan. Penulis artikel, terjemahan yang kami terbitkan hari ini, mengatakan bahwa artikel ini bertujuan untuk menyelesaikan dua masalah:
- Menjelajahi mekanisme yang melampaui pengetahuan SQL dasar.
- Pertimbangan beberapa tugas praktis untuk bekerja dengan SQL.
Artikel ini mencakup 5 pertanyaan SQL dari Leetcode. Mereka mewakili tugas-tugas praktis yang sering dijumpai dalam wawancara.Pertanyaan No. 1: tempat kedua dalam hal gaji
Tulis kueri SQL untuk mendapatkan dari tabel dengan informasi gaji karyawan ( Employee
) entri yang berisi gaji tertinggi kedua.Misalnya, kueri yang dieksekusi untuk tabel di bawah ini akan kembali 200
. Jika tabel tidak memiliki nilai lebih rendah dari gaji tertinggi, permintaan harus dikembalikan null
.+
| Id | Salary |
+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+
▍ Keputusan A: gunakan IFNULL
danOFFSET
Berikut adalah mekanisme utama yang akan digunakan dalam solusi untuk masalah ini:IFNULL(expression, alt)
: fungsi ini mengembalikan argumennya expression
jika tidak sama null
. Kalau tidak, argumen dikembalikan alt
. Kami akan menggunakan fungsi ini untuk kembali null
jika tabel tidak mengandung nilai yang diinginkan.OFFSET
: Operator ini digunakan dengan ekspresi ORDER BY
untuk membuang n
baris pertama . Ini berguna bagi kami karena kami tertarik pada baris kedua dari hasilnya (yaitu, gaji terbesar kedua, data yang ada di tabel).
Ini permintaan yang sudah jadi:SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1
), null) as SecondHighestSalary
FROM Employee
LIMIT 1
▍ Solusi B: gunakan MAX
Kueri di bawah ini menggunakan fungsi MAX
. Di sini, nilai gaji tertinggi dipilih, tidak sama dengan gaji maksimum yang diterima di seluruh tabel. Akibatnya, kami mendapatkan apa yang kami butuhkan - gaji terbesar kedua.SELECT MAX(salary) AS SecondHighestSalary
FROM Employee
WHERE salary != (SELECT MAX(salary) FROM Employee)
Pertanyaan # 2: duplikat alamat email
Tulis kueri SQL yang mendeteksi Person
semua alamat email duplikat di tabel .+
| Id | Email |
+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
+
▍ Keputusan A: COUNT
di dalam subquery
Pertama, kami membuat subquery di mana frekuensi kemunculan setiap alamat dalam tabel ditentukan. Kemudian hasil yang dikembalikan oleh subquery disaring menggunakan instruksi WHERE count > 1
. Kueri akan mengembalikan informasi tentang alamat yang ditemukan di tabel sumber lebih dari sekali.SELECT Email
FROM (
SELECT Email, count(Email) AS count
FROM Person
GROUP BY Email
) as email_count
WHERE count > 1
▍ Solusi B: ekspresi HAVING
HAVING
: Ini adalah ekspresi yang memungkinkan Anda untuk menggunakan instruksi WHERE
dengan ekspresi GROUP BY
.
SELECT Email
FROM Person
GROUP BY Email
HAVING count(Email) > 1
Pertanyaan No. 3: naiknya suhu
Tulis kueri SQL yang menemukan dalam tabel Weather
semua tanggal (pengidentifikasi tanggal) ketika suhu akan lebih tinggi dari suhu pada tanggal sebelumnya. Artinya, kami tertarik pada tanggal di mana suhu "hari ini" lebih tinggi daripada "kemarin".+
| Id(INT) | RecordDate(DATE) | Temperature(INT) |
+
| 1 | 2015-01-01 | 10 |
| 2 | 2015-01-02 | 25 |
| 3 | 2015-01-03 | 20 |
| 4 | 2015-01-04 | 30 |
+
▍Solusi: DATEDIFF
DATEDIFF
: Fungsi ini menghitung perbedaan antara dua tanggal. Ini digunakan untuk memberikan perbandingan suhu "hari ini" dan "kemarin" yang tepat.
Jika kita merumuskan kueri berikut dalam bahasa biasa, ternyata itu mengungkapkan ide berikut: kita perlu memilih pengidentifikasi sehingga suhu yang sesuai dengan tanggal yang mereka wakili lebih besar daripada suhu untuk tanggal "kemarin" sehubungan dengan mereka.SELECT DISTINCT a.Id
FROM Weather a, Weather b
WHERE a.Temperature > b.Temperature
AND DATEDIFF(a.Recorddate, b.Recorddate) = 1
Pertanyaan nomor 4: gaji tertinggi dalam unit
Tabel Employee
menyimpan informasi tentang karyawan perusahaan. Setiap catatan dalam tabel ini berisi informasi tentang pengidentifikasi ( Id
) karyawan, namanya ( Name
), gaji ( Salary
), dan divisi perusahaan tempat ia bekerja ( Department
).+
| Id | Name | Salary | DepartmentId |
+
| 1 | Joe | 70000 | 1 |
| 2 | Jim | 90000 | 1 |
| 3 | Henry | 80000 | 2 |
| 4 | Sam | 60000 | 2 |
| 5 | Max | 90000 | 1 |
+
Tabel Department
berisi informasi tentang divisi perusahaan.+
| Id | Name |
+
| 1 | IT |
| 2 | Sales |
+
Tulis kueri SQL yang ditemukan di setiap departemen karyawan dengan gaji maksimum. Misalnya, untuk tabel di atas, kueri yang sama harus mengembalikan hasil yang diwakili oleh tabel berikut (urutan baris dalam tabel tidak masalah):+
| Department | Employee | Salary |
+
| IT | Max | 90000 |
| IT | Jim | 90000 |
| Sales | Henry | 80000 |
+
▍Solusi: tim IN
Perintah ini IN
memungkinkan Anda untuk mengatur WHERE
kondisi dalam instruksi yang sesuai dengan penggunaan beberapa perintah OR
. Sebagai contoh, dua konstruksi berikut ini identik:WHERE country = ‘Canada’ OR country = ‘USA’
WHERE country IN (‘Canada’, ’USA’).
Di sini kita ingin mendapatkan tabel yang berisi nama departemen ( Department
), nama karyawan ( Employee
) dan gajinya ( Salary
). Untuk melakukan ini, kami membuat tabel yang berisi informasi tentang pengenal unit ( DepartmentID
) dan gaji maksimum untuk unit ini. Kemudian kami menggabungkan keduanya pada tabel kondisi yang menurut entri dalam tabel yang dihasilkan jatuh hanya jika DepartmentID
dan Salary
sebelumnya telah terbentuk dalam tabel.SELECT
Department.name AS 'Department',
Employee.name AS 'Employee',
Salary
FROM Employee
INNER JOIN Department ON Employee.DepartmentId = Department.Id
WHERE (DepartmentId , Salary)
IN
( SELECT
DepartmentId, MAX(Salary)
FROM
Employee
GROUP BY DepartmentId
)
Pertanyaan No. 5: siswa yang dipindahkan
Mary adalah guru sekolah menengah. Dia memiliki meja seat
yang menyimpan nama-nama siswa dan informasi tentang tempat mereka di kelas. Nilai id
dalam tabel ini terus meningkat. Mary ingin menukar siswa tetangga.Berikut adalah tabel penempatan awal siswa:+
| id | student |
+
| 1 | Abbot |
| 2 | Doris |
| 3 | Emerson |
| 4 | Green |
| 5 | Jeames |
+
Inilah yang harus terjadi setelah transplantasi siswa tetangga:+
| id | student |
+
| 1 | Doris |
| 2 | Abbot |
| 3 | Green |
| 4 | Emerson |
| 5 | Jeames |
+
Tulis permintaan yang akan memungkinkan guru untuk memecahkan masalah di atas.Harap perhatikan bahwa jika jumlah siswa aneh, Anda tidak perlu mentransfer siswa terakhir ke mana pun.▍Solusi: menggunakan operator WHEN
Konstruk SQL CASE WHEN THEN
dapat dianggap sebagai operator if
dalam pemrograman.Dalam kasus kami, operator pertama WHEN
digunakan untuk memeriksa apakah pengidentifikasi aneh ditugaskan ke baris terakhir dalam tabel. Jika demikian, garis tidak dapat berubah. Operator kedua WHEN
bertanggung jawab untuk menambahkan 1 ke setiap pengidentifikasi ganjil (misalnya, 1, 3, 5 berubah menjadi 2, 4, 6) dan untuk mengurangi 1 dari setiap pengidentifikasi genap (2, 4, 6 berubah menjadi 1, 3, 5).SELECT
CASE
WHEN((SELECT MAX(id) FROM seat)%2 = 1) AND id = (SELECT MAX(id) FROM seat) THEN id
WHEN id%2 = 1 THEN id + 1
ELSE id - 1
END AS id, student
FROM seat
ORDER BY id
Ringkasan
Kami menganalisis beberapa tugas SQL, membahas sepanjang jalan beberapa alat canggih yang dapat digunakan untuk mengkompilasi pertanyaan SQL. Kami berharap apa yang Anda pelajari hari ini akan berguna bagi Anda selama wawancara dalam SQL dan akan terbukti bermanfaat dalam pekerjaan sehari-hari.PS Di pasar kami ada gambar Docker dengan SQL Server Express, yang diinstal dalam satu klik. Anda dapat memeriksa pengoperasian wadah di VPS. Semua pelanggan baru diberikan 3 hari gratis untuk pengujian.Pembaca yang budiman! Apa yang bisa Anda sarankan kepada mereka yang ingin menguasai seni membuat query SQL?