Yuki's Tech Blog

仕事で得た知見や勉強した技術を書きます。

leet codeのSQL問題を1日1題解く【1757. Recyclable and Low Fat Products】

目次

初めに

SQL力はやっぱ書かないと落ちるなと感じたので、1日1題解いて行きます。

問題

leetcode.com

セットアップ

以下の記事を参考にして、VSCode上でもSQLを実行できるようにします。DB環境をDockerを用いて構築しています。

zenn.dev

以下のsqlを実行して、データベースにテーブルを作成したり、データをインサートします。

Create table If Not Exists Products (product_id int, low_fats ENUM('Y', 'N'), recyclable ENUM('Y','N'));
Truncate table Products;
insert into Products (product_id, low_fats, recyclable) values ('0', 'Y', 'N');
insert into Products (product_id, low_fats, recyclable) values ('1', 'Y', 'Y');
insert into Products (product_id, low_fats, recyclable) values ('2', 'N', 'Y');
insert into Products (product_id, low_fats, recyclable) values ('3', 'Y', 'Y');
insert into Products (product_id, low_fats, recyclable) values ('4', 'N', 'N');

知らなかった or 理解があやふやな知識

CREATE TABLE if NOT EXISTS

CREATE TABLE IF NOT EXISTS t1 (
  c1 INT,
  c2 VARCHAR(10)
);

ここで、t1はテーブル名で、括弧の間はすべてテーブルの定義(カラムなど)である。 この場合、t1というテーブルがまだ存在しない場合にのみ、テーブルが作成される。

CREATE TABLEにIF NOT EXISTSを書くことで、同じテーブルが既に存在する場合、CREATE TABLEを実行しないようにできることがわかりました。

database.guide

TRUNCATE TABLEステートメント

TRUNCATE [TABLE] tbl_name

TRUNCATE TABLE は、テーブルを完全に空にします。 これには DROP 権限が必要です。 TRUNCATE TABLE は論理的に、すべての行を削除する DELETE ステートメントや、DROP TABLE および CREATE TABLE ステートメントのシーケンスに似ています。

TRUNCATE TABLE は DELETE と違い、AUTO_INCREMENT 値がすべて開始値にリセットされたり、パフォーマンスの面で優れているそうです。テーブルを完全に空にしたい時に、TRUNCATE TABLEステートメントを使ってみようと思います。

dev.mysql.com

www.javadrive.jp

Enum

ENUM は、テーブル作成時にカラム仕様に明示的に列挙された、許可されている値のリストから選択された値を持つ文字列オブジェクトです。

ENUMカラムは一見優れているように見えますが、アプリケーション側で許可する値を追加したい場合、ENUMカラムの定義も変更しないといけません。つまり、一つの変更をしたいだけなのに、それ以外の別の変更(ENUM定義の変更)もしなければなりません。そのため、値を制限するカラムをテーブルに追加する場合、「RailsのようにInteger型のカラムにしてアプリケーション側でカラム値を制限するようにする」 or「 そのカラムの値を表す別テーブルを用意して、そのカラムには外部キーを格納する」が良いでしょう。

dev.mysql.com

shiro-secret-base.com

zenn.dev

解答

こんな感じのSQL文を書きました。無事AC(Accepted(正解))できてよかったです。

select product_id
from Products
WHERE low_fats = "Y" AND recyclable = "Y";

終わり

毎日SQLを解いて、SQLに慣れようと思います!

参考記事

yukiHaga - LeetCode Profile