leet codeのSQL問題を1日1題解く【1757. Recyclable and Low Fat Products】
目次
初めに
SQL力はやっぱ書かないと落ちるなと感じたので、1日1題解いて行きます。
問題
セットアップ
以下の記事を参考にして、VSCode上でもSQLを実行できるようにします。DB環境をDockerを用いて構築しています。
以下の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を実行しないようにできることがわかりました。
TRUNCATE TABLEステートメント
TRUNCATE [TABLE] tbl_name
TRUNCATE TABLE は、テーブルを完全に空にします。 これには DROP 権限が必要です。 TRUNCATE TABLE は論理的に、すべての行を削除する DELETE ステートメントや、DROP TABLE および CREATE TABLE ステートメントのシーケンスに似ています。
TRUNCATE TABLE は DELETE と違い、AUTO_INCREMENT 値がすべて開始値にリセットされたり、パフォーマンスの面で優れているそうです。テーブルを完全に空にしたい時に、TRUNCATE TABLEステートメントを使ってみようと思います。
Enum
ENUM は、テーブル作成時にカラム仕様に明示的に列挙された、許可されている値のリストから選択された値を持つ文字列オブジェクトです。
ENUMカラムは一見優れているように見えますが、アプリケーション側で許可する値を追加したい場合、ENUMカラムの定義も変更しないといけません。つまり、一つの変更をしたいだけなのに、それ以外の別の変更(ENUM定義の変更)もしなければなりません。そのため、値を制限するカラムをテーブルに追加する場合、「RailsのようにInteger型のカラムにしてアプリケーション側でカラム値を制限するようにする」 or「 そのカラムの値を表す別テーブルを用意して、そのカラムには外部キーを格納する」が良いでしょう。
解答
こんな感じのSQL文を書きました。無事AC(Accepted(正解))できてよかったです。
select product_id from Products WHERE low_fats = "Y" AND recyclable = "Y";