SQL 50: Selection

27 Febuari 2025 421 kata oleh Patrick 2 min#sql#leetcode

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.

Untitled

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:

  1. NULL tidak bisa dikomparasi dengan operator komparasi (=,<,>,<>). Misalnya, NULL=NULL itu tidak benar. Untuk mengecek NULL, harus menggunakan IS operator, IS NULL atau IS NOT NULL.
  2. NULL bukanlah sebuah tipe data, tetapi lebih ke placeholder. NULL merepresentasikan keabsenan sebuah data, maka dari itulah komparasi dengan tipe data konvensional seperti INT, 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;