“SQL 50” merupakan rangkaian 50 pertanyaan seputar SQL yang disusun oleh tim leetcode. Soal-soal SQL ini dikompilasi berdasarkan kemampuan seseorang dalam melakukan "select", "joins", "aggregate functions", "sorting and grouping", "advanced select and joins", "subqueries", dan "advanced string functions / regex / clause". Pada artikel ini kita akan terlebih dahulu menyelesaikan soal berkategori “select”. Pada dasarnya ingin menguji kemampuan seseorang dalam melakukan SELECT
, dan beberapa pengkondisian sederhana.
Saya rasa untuk beberapa soal dalam kemampuan melakukan “select”, penjelasan tidak diperlukan karena semua soal ini termasuk mudah. Pelabelannya benar-benar menunjukkan level kemudahannya, tetapi nanti kita akan melihat series selanjutnya yang mempunyai pelabelan yang tidak sesuai. Misalnya, soal kategori mudah, tetapi menurut beberapa orang dalam kolom "discussion" leetcode itu seharusnya berada pada kategori "medium", begitu pula sebaliknya.
Recyclable and Low Fat Products
https://leetcode.com/problems/recyclable-and-low-fat-products/description/
SELECT product_id
FROM Products
WHERE low_fats='Y' AND recyclable='Y';
Find Customer Referee
SELECT name from Customer
WHERE referee_id != 2 OR referee_id IS NULL;
Soal ini menarik karena kita dikenalkan dengan kata kunci NULL
. Berikut mengenai dua fakta singkat NULL
setidaknya pada MySQL:
NULL
tidak bisa dikomparasi dengan operator komparasi (=
,<
,>
,<>
). Misalnya,NULL=NULL
itu tidak benar. Untuk mengecekNULL
, harus menggunakanIS
operator,IS NULL
atauIS NOT NULL
.NULL
bukanlah sebuah tipe data, tetapi lebih ke placeholder.NULL
merepresentasikan keabsenan sebuah data, maka dari itulah komparasi dengan tipe data konvensional sepertiINT
,STRING
tidak dapat dilakukan.
CREATE TABLE Customers (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL, -- `name` itu wajib diisi, tidak boleh tidak diisi (NOT NULL)
email VARCHAR(100) -- email=NULL, artinya `email` tidaklah wajib. `email VARCHAR(100) NULL` merupakan cara deklarasi yang eksplisit (gaya ini yang setidaknya saya ketahui pada MySQL)
);
Untuk tabel CREATE Customers
, jika ingin mencari email
yang NULL
, maka gunakan:
SELECT name FROM Customers WHERE email IS NULL;
Jadi, jika mengecek NULL
seperti berikut:
SELECT name from Customer
WHERE referee_id != 2 OR referee_id=NULL
itu salah.
Big Countries
SELECT name,population,area
FROM World
WHERE area>=3000000 OR population>=25000000;
Article Views
GROUP BY
dan DISTINCT
sama-sama berperan dalam membantu memberi output yang non-duplikat. Namun, biasanya GROUP BY
itu digunakan berbarengan dengan fungsi agregat. Jadi mungkin disini, menggunakan DISTINCT
lebih terlihat semantik.
SELECT DISTINCT author_id AS id FROM Views
WHERE author_id = viewer_id
ORDER BY id;
SELECT author_id AS id FROM Views
WHERE author_id = viewer_id
GROUP BY author_id
ORDER BY id
Invalid Tweets
SELECT tweet_id FROM Tweets
WHERE LENGTH(content)>15;