SQLite
SQLiteでSELECT
を使った基本的なクエリを実行する方法
はじめに
SQLiteのテーブル内の情報をクエリして返すには、SELECT
SQLコマンドが最も適しています。このコマンドは、指定された条件に基づいて一致するレコードを選択することで、その名前が示すとおりの機能を実現します。このコマンドはデータの読み取りに役立つだけでなく、データベース内の更新やその他のアクションのターゲット指定にも役立ちます。
この記事では、SELECT
コマンドの基本と、それを使ってデータを返す方法を解説します。SELECT
はより多くの高度なユースケースに対応できますが、ここでは基本的なコマンド構造を強調するために、より単純な形式に絞って説明します。
SELECT
コマンドの一般的な構文
SELECT
コマンドの基本的な形式は次のようになります
SELECT <column_names> FROM <table_name> <additional_conditions_and_formatting>;
このステートメントはいくつかのコンポーネントで構成されています
SELECT
:SELECT
コマンドそのもの。このSQLコマンドは、テーブルまたはビューが含むデータをクエリしたいことを示します。その周囲の引数と句によって、返される出力の内容と形式の両方が決定されます。<column_names>
:SELECT
ステートメントは、行全体(*
ワイルドカード文字で指定された場合)または利用可能な列のサブセットを返すことができます。特定の列のみを出力したい場合は、表示したい列名をカンマで区切って指定します。FROM <table_name>
:FROM
キーワードは、クエリ対象のテーブルまたはビューを示すために使用されます。ほとんどのシンプルなクエリでは、これは関心のあるデータを含む単一のテーブルで構成されます。<additional_conditions_and_formatting>
:SELECT
コマンドには、多数のフィルター、出力修飾子、および条件を追加として指定できます。これらを使用して、特定のプロパティを持つデータを特定したり、出力形式を変更したり、結果をさらに処理したりすることができます。
SELECT
で表示する列を指定する
SELECT
コマンドの列指定コンポーネントでは、クエリされたデータに対して表示したい列に名前を付ける必要があります。
列の表示要件がない場合、アドホッククエリやデータ探索に最も役立つオプションの1つは、アスタリスクを使用して、利用可能なすべての列の値を表示したいことを示すことです
SELECT * FROM my_table;
これにより、ステートメントに指定された列名がないため、my_table
のすべてのレコードが表示されます。各レコードのすべての列は、my_table
内で定義されている順序で表示されます。
注:アスタリスクのワイルドカードオプションは、テスト、アドホッククエリ、およびデータ探索に最適です。より制御された明示的なステートメント構文がより強力で信頼性の高い実際のアプリケーション開発には、有用な方法ではありません。
列名を指定することで、利用可能な列のサブセットを表示することもできます。列名はカンマで区切られ、指定した順序で表示されます
SELECT column2, column1 FROM my_table;
これにより、my_table
のすべてのレコードが表示されますが、column2
とcolumn1
のみが、その厳密な順序で表示されます。
Prisma Clientを使用する場合、フィールド選択機能で返される列を制御できます。
AS
で列エイリアスを使用して結果テーブルを変更する
MySQLやPostgreSQLなどの他のSQLデータベースと比較して、SQLiteはデフォルトではクエリ出力に列名を表示しません。SQLiteで列名の表示を強制するには、一連のコマンドを実行できます。
まず、出力のヘッダー表示を切り替える.header
コマンドを使用します
.header on
次に、.mode
コマンドを使用して出力モードを`column`に設定します。これにより、ヘッダーが対応する列の値と位置合わせされるようになります
.mode column
これで、クエリを実行すると、出力表示に結果の上に列名が含まれるようになります。これにより、出力内の列に使用される名前を変更するために、オプションで列エイリアスを設定できるようになります
SELECT column1 AS 'first column' FROM my_table;
これにより、my_table
内のcolumn1
の各値が表示されます。出力内の列は、column1
の代わりにfirst column
として表示されます。
エイリアスの設定は、出力が名前を共有する可能性のある複数のテーブルの列名を結合する場合や、すでに名前を持たない計算された列が含まれる場合に特に役立ちます。
ORDER BY
でソート順を定義する
SQLiteはデータをテーブル内に不定の順序で保存します。順序を定義する条件を指定せずにSELECT
ステートメントを使用してデータをクエリすると、結果の順序は不定になります。
ORDER BY
句は、特定の基準に従って結果の行をソートするために使用できます。その一般的な構文は次のようになります
SELECT * FROM my_table ORDER BY <sort expression>;
これにより、my_table
内のすべてのレコードのすべての列の値が表示されます。レコードは、式プレースホルダー<sort expression>
に従って順序付けられます。
例として、first_name
、last_name
、student_email
の列を含むstudent
テーブルがあるとします。last_name
でアルファベット順に結果を表示したい場合は、次のコマンドを使用できます
SELECT * FROM student ORDER BY last_name;
結果は、last_name
の値に基づいて生徒の姓をAからZの順に表示します。
+-------------+------------+-----------+--------------------------+id | first_name | last_name | student_email |+-------------+------------+-----------+--------------------------+1 | Felipe | Espinosa | felesp@university.com |+-------------+------------+-----------+--------------------------+2 | Bob | Smith | bobsmith@university.com |+-------------+------------+-----------+--------------------------+3 | Abigail | Smith | abismith@university.com |+-------------+------------+-----------+--------------------------+4 | Tamal | Wayne | tamalwayne@university.com|+-------------+------------+-----------+--------------------------+
結果の順序を逆にするには、ORDER BY
句の最後にDESC
修飾子を追加します
SELECT * FROM student ORDER BY last_name DESC;
結果は、last_name
の値に基づいてZからAの順に表示される、前のクエリの逆になります。
+-------------+------------+-----------+--------------------------+id | first_name | last_name | student_email |+-------------+------------+-----------+--------------------------+4 | Tamal | Wayne | tamalwayne@university.com|+-------------+------------+-----------+--------------------------+3 | Abigail | Smith | abismith@university.com |+-------------+------------+-----------+--------------------------+2 | Bob | Smith | bobsmith@university.com |+-------------+------------+-----------+--------------------------+1 | Felipe | Espinosa | felesp@university.com |+-------------+------------+-----------+--------------------------+
複数の列でソートすることも可能です。これは、例えば姓が同じ人がいる場合に特に役立ちます。クエリは次のようになります
SELECT * FROM student ORDER BY last_name, first_name;
結果は、両方のソートを昇順で表示します。結果はまずlast_name
でAからZの順にソートされます。次に、結果はfirst_name
でアルファベット順にソートされます。last_name
が複数のレコードで同じ場合、first_name
のソートでは、アルファベット順で先頭に来る名を持つ生徒が最初に表示されます。
+-------------+------------+-----------+--------------------------+id | first_name | last_name | student_email |+-------------+------------+-----------+--------------------------+1 | Felipe | Espinosa | felesp@university.com |+-------------+------------+-----------+--------------------------+3 | Abigail | Smith | abismith@university.com |+-------------+------------+-----------+--------------------------+2 | Bob | Smith | bobsmith@university.com |+-------------+------------+-----------+--------------------------+4 | Tamal | Wayne | tamalwayne@university.com|+-------------+------------+-----------+--------------------------+
個別の結果を取得する
SQLiteで列の値の範囲をテーブルにクエリしたい場合は、SELECT DISTINCT
バリアントを使用することでこれを実現できます。これにより、列の一意の値ごとに1つの行が表示されます。
その基本的な構文は次のとおりです
SELECT DISTINCT column1 FROM my_table;
結果は、column1
の一意の値ごとに1行となります。
例えば、shoe
テーブルに含まれるcolor
の異なるすべての値を表示するには、次のように入力できます
SELECT DISTINCT color FROM shoe;
--------+color |--------+blue |green |orange |red |yellow |--------+
複数の列にわたる一意性を表示するには、カンマで区切ってクエリに追加の列を追加できます。
例えば、次のクエリはshoe
テーブルのcolor
とshoe_size
の異なるすべての組み合わせを表示します
SELECT DISTINCT color, shoe_size FROM shoe;
これにより、靴のコレクション内のcolor
とshoe_size
の一意のすべての組み合わせが表示されます。
--------+------------+color | shoe_size |--------+------------+blue | 11 |blue | 7 |green | 8.5 |green | 4 |green | 13.5 |orange | 9.5 |orange | 6 |red | 15 |yellow | 8 |--------+------------+
まとめ
この記事では、SQLiteテーブルからデータを返すためのSELECT
コマンドの基本について紹介しました。コマンドの動作を変更するオプションの句は他にも多数あり、それらを使用すると結果を希望する仕様に制御できます。今後の記事では、これらの修飾子について詳しく掘り下げ、SELECT
の有用性をさらに高めていきます。