SQLite
SQLiteで`SELECT`を使用した基本的なクエリを実行する方法
はじめに
SELECT
SQLコマンドは、SQLiteのテーブル内から情報をクエリして返すのに最も適切なコマンドです。このコマンドは、その名前が示すように、コマンドで指定された基準に基づいて一致するレコードを選択することで目的を達成します。このコマンドは、データの読み取りだけでなく、データベース内の更新やその他のアクションをターゲットにするためにも役立ちます。
この記事では、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を使用する場合、select fields機能を使用して返される列を制御できます。
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
バリアントを使用することでこれを実現できます。これにより、列の一意の値ごとに単一行が表示されます。
その基本的な構文は次のとおりです
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
の有用性をさらに高めます。