SQLにおけるSELECT文とは、データベースから条件を指定して必要なデータを抽出する命令文のことです。「HTML」「CSS」「JavaScript」でWeb画面を作成したら、次のステップとして裏側で動くプログラムを作ることになります。そこで、プログラムの中でデータ操作をする際にはSQLを使いこなすことが必要です。
本記事では、SELECT文の使い方とデータベースのソート・グループ分けの方法、データの追加・更新・削除方法について解説します。
目次
SELECT文とは、条件を指定して特定のデータベースから必要なデータを抽出する命令文のことで、以下が一般的なSELECT文の記述例です。
SELECT 取得したい列名 FROM テーブル名 WHERE 条件
実際の使い方に入る前に、本記事で使用するテーブル(データベース)を確認します。今回は、野菜の名前と値段・生産地コードを管理するための「商品テーブル」と、生産地を詳しく管理する「生産地テーブル」の2つのテーブルを使います。
たとえば、以下のようなテーブルがあると仮定します。
商品テーブル
商品ID | 商品名 | 価格 | 生産地コード |
商品1 | ニンジン | 300円 | A |
商品2 | ジャガイモ | 350円 | B |
商品3 | ネギ | 250円 | A |
商品4 | キャベツ | 180円 | C |
商品5 | サツマイモ | 380円 | D |
生産地テーブル
生産地コード | 生産地名 |
A | 千葉県 |
B | 北海道 |
C | 長野県 |
D | 鹿児島県 |
E | 沖縄県 |
「商品テーブル」を縦に見たときの「商品ID」や「商品名」といった項目を列、横に見たときの「商品1 ニンジン 300円 A」のことを行と表現します。
ここからは、SQLのSELECT文の使い方について解説します。テーブルから値を取得する基本的な構文の例は以下の通りです。
SELECT 取得したい列名 FROM テーブル名
記述例で紹介した構文から「WHERE 条件」の部分がなくなり、シンプルな構文になっています。WHERE以降の部分はオプションであるため、使用しない場合はテーブルに登録されているすべての行を取得できます。上記の例文はSELECT文の一番シンプルな形で、この構文の実行結果は以下の通りです。
「商品テーブル」に登録されているすべての商品名を取得するSELECT文は、以下の通りです。
SELECT 商品名 FROM 商品テーブル
実行結果は、以下のようになります。
商品名 ------------ ニンジン ジャガイモ ネギ キャベツ サツマイモ
「商品テーブル」から、すべての行の「商品名」がすべて取り出せています。他の列を取り出したければ、次のように「取得したい列名」の部分を変更します。
SELECT 価格 FROM 商品テーブル
上記のSELECT文を実行した結果は、以下のようになります。
価格 ------------ 300円 350円 250円 180円 380円
「商品テーブル」に登録されているすべての「商品名」と「価格」を取得する場合は、「取得したい列名」を「,」で区切って記述します。具体的なSELECT文の例は、以下の通りです。
SELECT 商品名,価格 FROM 商品テーブル
上記のSELECT文を実行した結果は、以下のようになります。
商品名 価格 ---------------------------------------- ニンジン 300円 ジャガイモ 350円 ネギ 250円 キャベツ 180円 サツマイモ 380円
「商品テーブル」から、「商品名」と「価格」がすべて取り出せています。以下のように、他の列の組み合わせで取得することも可能です。
SELECT 商品ID,商品名,生産地コード FROM 商品テーブル
上記のSELECT文を実行した結果は、以下のようになります。
商品ID 商品名 生産地コード ------------------------------------------------------------- 商品1 ニンジン A 商品2 ジャガイモ B 商品3 ネギ A 商品4 キャベツ C 商品5 サツマイモ D
テーブルに登録されているすべての列と行を取得することもできます。「商品テーブル」のデータを取得する場合、以下のようなSELECT文と結果がなります。SELECT後の「取得したい列名」の部分に記述されている「*」はアスタリスクと読み、SQLでは「すべて」を意味します。
SELECT * FROM 商品テーブル
商品ID 商品名 価格 生産地コード ------------------------------------------------------------- 商品1 ニンジン 300円 A 商品2 ジャガイモ 350円 B 商品3 ネギ 250円 A 商品4 キャベツ 180円 C 商品5 サツマイモ 380円 D
上記では、「商品テーブル」に登録されているレコードがすべて取り出せています。他のテーブルを対象に取得する場合も、「*」を使用してすべてのデータの取得が可能です。
SELECT * FROM 生産地テーブル
生産地コード 生産地名 ------------------------- A 千葉県 B 北海道 C 長野県 D 鹿児島県
SELECT文の中に、さらにSELECT文を入れ子に挿入することも可能で、副問い合わせやサブクエリといいます。「商品テーブル」と「生産地テーブル」のレコードを、サブクエリを使って取得するSELECT文の例は以下の通りです。
SELECT 商品ID,商品名,生産地コード,(SELECT 生産地名 FROM 生産地テーブル) FROM 商品テーブル
上記のSELECT文を実行した結果は、以下の通りです。
商品ID 商品名 生産地コード 生産地名 ------------------------------------------------ 商品1 ニンジン A 千葉県 商品2 ジャガイモ B 北海道 商品3 ネギ A 千葉県 商品4 キャベツ C 長野県 商品5 サツマイモ D 鹿児島県
「商品テーブル」に登録されているレコードと、サブクエリで指定した「生産地テーブル」に登録されている「生産地名」が取り出せています。サブクエリ部分は、独立したSELECT文としてレコードを取得します。
ここからは、SELECT文に条件を指定して取得するレコードを絞る方法を解説します。実際のプログラム処理においては、特定の条件と合致するデータのみを取得する処理があります。そのため、以下のようにWHERE句を使用します。
SELECT [取得したい要素] FROM [使用テーブル] WHERE [条件文]
基本的なWHERE句の記述は、「項目がある値と一致するレコード」を取得する方法です。条件文の部分には、以下のように「項目 = 値」の形で記述します。
SELECT * FROM 商品データ WHERE 商品名 = ネギ
商品ID 商品名 価格 生産地コード ------------------------------------------------------------- 商品3 ネギ 250円 A
商品名がネギであるレコードが取得されます
「ある値と一致する」だけでなく、以下の数学的記号を使ってさまざまな条件指定が可能です。
また、条件を複数つなぐことも可能です。
SELECT * FROM 商品データ WHERE 価格 >= 350円 and 生産地コード <> D
商品ID 商品名 価格 生産地コード ------------------------------------------------------------- 商品2 ジャガイモ 350円 B
結果として、両方の条件を満たすジャガイモのみ取得できます。
WHERE句は、別名が使用できません。SELECT文の中で別名を使いたい場合は注意しましょう。ここからは、別名を設定した下記のSELECT文で解説します。
SELECT 価格 AS 商品の値段 FROM 商品テーブル WHERE 商品の値段 < 300円
商品テーブル上は「価格」として定義されていますが、「商品の値段」という別名にしてSELECT文を作成しています。しかしWHEREでは、その別名を使っての指定はできません。
このSELECT文を実行すると、エラーとなってしまうのです。正しくレコードを取得するには、WHERE句の記述を以下のようにする必要があります。
WHERE 価格 < 300円
結果で表示するレコードの並び順を指定することを、ソートと呼びます。ソートをするには、「ORDER BY」句をSELECTの基本構文に追加して使用します。構文の例は以下の通りです。
SELECT 取得したい列名 FROM テーブル名 WHERE 条件 ORDER BY [ソートしたい要素] [昇順・降順の指定(省略時昇順)]
先ほどの商品テーブルを使って、ORDER BY で「価格」を指定した実際のSELECT文を記述すると以下のようになります。
SELECT * FROM 商品テーブル ORDER BY 価格
上記のSELECT文を実行した結果は、以下の通りです。
商品ID 商品名 価格 生産地コード ------------------------------------------------------------- 商品4 キャベツ 180円 C 商品3 ネギ 250円 A 商品1 ニンジン 300円 A 商品2 ジャガイモ 350円 B 商品5 サツマイモ 380円 D
「商品テーブル」に登録されているレコードが、価格の小さい順に取り出せます。
「生産地コード」のアルファベットの逆順に表示したいという場合は、次のようなSELECT文です。
SELECT * FROM 商品テーブル ORDER BY 生産地コード DESC
商品ID 商品名 価格 生産地コード ------------------------------------------------------------- 商品5 サツマイモ 380円 D 商品4 キャベツ 180円 C 商品2 ジャガイモ 350円 B 商品1 ニンジン 300円 A 商品3 ネギ 250円 A
ORDER BYの後ろにDESCがついています。これは昇順、降順の指定オプションで、以下の意味があります。
なお指定を省略した場合は、ASC指定と同様の結果となります。
グループ分けをしたい場合は、GROUP BY句を使用します。GROUP BY句を使用した構文の例は以下の通りです。
SELECT 取得したい列名 FROM テーブル名 WHERE 条件 GROUP BY [グループ化したい要素]
たとえば「生産地コード別に商品をグループ化して、含まれる個数をカウントする」といった使い方が可能です。
SELECT 生産地コード,count(*) FROM 商品テーブル GROUP BY 生産地コード
生産地コード count(*) ------------------------------------------------------------- A 2 B 1 C 1 D 1
生産地コードがAの商品は、ニンジンとネギで2つ、その他の生産地コードは1つずつなことがわかります。GROUP BYで指定した列名とSELECTで取得したい列名は、一致させる必要があります。GROUP BY句を指定する際に間違えやすいので注意してください。
いままで実行してきたSELECT文の結果は、テーブルに定義されている列の名前で表示されていました。SELECT文を実行するときに表示時の各要素に別名をつけて、変更が可能です。名前をつける場合は、要素の後ろに「AS」をつけます。
構文は以下の通りです。
SELECT [要素名] AS [要素につけたい名前] from [使用テーブル]
SELECT 商品名,価格 AS 商品の値段 FROM 商品テーブル
商品名 商品の値段 ---------------------------------------- ニンジン 300円 ジャガイモ 350円 ネギ 250円 キャベツ 180円 サツマイモ 380円
「商品名」は名前をつけずそのままで、「価格」は「商品の値段」と列名に名前をつけて
取り出しています。本記事のテーブルは、わかりやすくするために日本語でテーブル名の項目名を設定しています。
しかし、仕事の場では、英語やローマ字を省略したような形で設定されている場合が多いです。適切な名称でデータを取得したい場合に、要素名にわかりやすい名前をつけて表示すると結果が読みやすくなります。
ここからは、データの追加や更新・削除の方法について詳しく解説します。具体的には以下の3つです。
SELECT文と合わせて命令文を使いこなすことができれば、データベース操作の基礎をマスターできます。
テーブルにレコードを追加したい場合は、INSERT文を使用します。INSERTを使用した基本的な構文は以下の通りです。
INSERT INTO [データを追加したいテーブル名] (要素名A,要素名B) VALUES (要素Aに入れるデータ,要素Bに入れるデータ)
商品テーブルに新しく商品を追加する構文の例は、以下の通りです。
INSERT INTO 商品テーブル (商品ID,商品名,価格,生産地コード) VALUES (商品6, タマネギ, 280円, C)
実際に登録できたかをテーブルのレコードで確認します。この例の場合は、全レコードを出力すればよいので「*」を使ったSELECT文を使いましょう。
SELECT * FROM 商品テーブル
商品ID 商品名 価格 生産地コード ------------------------------------------------------------- 商品1 ニンジン 300円 A 商品2 ジャガイモ 350円 B 商品3 ネギ 250円 A 商品4 キャベツ 180円 C 商品5 サツマイモ 380円 D 商品6 タマネギ 280円 C
商品6として追加されていることが確認できました。レコードを追加する際に注意する点は、以下のように要素名と要素に格納するデータを間違いないように指定することです。
(要素名A,要素名B) VALUES (要素Aに入れるデータ,要素Bに入れるデータ)
以下のように要素名と要素に入れるデータの順を誤ると、意図しないデータが格納されてしまいます。
(要素名A,要素名B) VALUES (要素Bに入れるデータ,要素Aに入れるデータ)
誤って指定したとしても、SQL構文に文法としての誤りがない限り、エラーは発生しません。レコードを登録する際は構文を実行前に確認し、登録した後は必ずSELECT文で確認してください。
テーブルに登録されているレコードを更新したい場合は、UPDATE文を使用します。
UPDATEを使用した構文の例は、以下の通りです。
UPDATE [データを更新したいテーブル名] SET [更新したい項目] = [更新したい値] WHERE 条件
商品テーブルの商品名が「キャベツ」の価格を更新する構文は、以下のようになります。
UPDATE 商品テーブル SET 価格 = 150円 WHERE 商品名 = キャベツ
実際に更新できたかどうか、テーブルのレコードを確認します。ここでも全レコードを確認するため、「*」を使ったSELECT文を使いましょう。
SELECT * FROM 商品テーブル
商品ID 商品名 価格 生産地コード ------------------------------------------------------------- 商品1 ニンジン 300円 A 商品2 ジャガイモ 350円 B 商品3 ネギ 250円 A 商品4 キャベツ 150円 C 商品5 サツマイモ 380円 D 商品6 タマネギ 280円 C
UPDATE文で注意すべき点は、WHEREでの条件指定です。UPDATE文を実行する前に、再度WHEREで条件指定の確認をおすすめします。
レコードを削除する場合は、DELETE文を使用します。DELETE文を使用した構文の例は以下の通りです。
DELETE FROM [データを削除したいテーブル名] WHERE 条件
以下は、「商品テーブル」に登録されている商品を削除する構文です。
DELETE FROM 商品テーブル WHERE 商品名 = タマネギ
実際に削除できたかテーブルのレコードを確認し、「*」を使ったSELECT文で全レコードを確認します。
SELECT * FROM 商品テーブル
商品ID 商品名 価格 生産地コード ------------------------------------------------------------- 商品1 ニンジン 300円 A 商品2 ジャガイモ 350円 B 商品3 ネギ 250円 A 商品4 キャベツ 150円 C 商品5 サツマイモ 380円 D
無事、タマネギが削除されていることが確認できました。
DELETE文で注意すべき点は、WHEREでの条件指定です。誤ってサツマイモを指定したら、サツマイモのレコードが削除されてしまいます。DELETE文を実行する前に、再度WHEREでの条件指定の確認をおすすめします。
複数のテーブルを結合してレコードを操作することも可能です。テーブルを結合したい場合は、「JOIN」を使用します。JOINを使用した構文は、以下の通りです。
◆テーブル1とテーブル2を結合したSQL
SELECT * FROM テーブル1 [JOIN] テーブル2 ON テーブル1項目 = テーブル2項目
結合したいテーブル同士を、それぞれの項目で紐づけます。すると結合するテーブル同士を横につなげて、1つのテーブルのように扱えます。またJOIN節に記述する、結合方法は、次の通りです。
INNER JOIN LEFT [OUTER] JOIN RIGHT [OUTER] JOIN
以下にそれぞれの結合方法と取得されるレコードの違いについて、いままで使ってきた「商品テーブル」「生産地テーブル」を例に説明します。両方のテーブルに共通する「生産地コード」が結合条件です。
SELECT * FROM 「商品テーブル」INNER JOIN 「生産地テーブル」 ON テーブル1生産地コード = テーブル2生産地コード
結合する「商品テーブル」と「生産地テーブル」の両方にあるレコード同士を結びます。
商品ID 商品名 価格 生産地コード 生産地名 ------------------------------------------------------------- 商品1 ニンジン 300円 A 千葉県 商品2 ジャガイモ 350円 B 北海道 商品3 ネギ 250円 A 千葉県 商品4 キャベツ 150円 C 長野県 商品5 サツマイモ 380円 D 鹿児島県
「生産地コードE 沖縄県」は、商品テーブルに存在しないので取得されません。
SELECT * FROM 「商品テーブル」LEFT JOIN 「生産地テーブル」 ON テーブル1生産地コード = テーブル2生産地コード
左側の「商品テーブル」は全件対象として、条件に一致する「生産地テーブル」のレコードを結びます。
商品ID 商品名 価格 生産地コード 生産地名 ------------------------------------------------------------- 商品1 ニンジン 300円 A 千葉県 商品2 ジャガイモ 350円 B 北海道 商品3 ネギ 250円 A 千葉県 商品4 キャベツ 150円 C 長野県 商品5 サツマイモ 380円 D 鹿児島県
こちらも同じく、「生産地コードE 沖縄県」は、商品テーブルに存在しないので取得されません。
SELECT * FROM 「商品テーブル」RIGHT JOIN 「生産地テーブル」 ON テーブル1生産地コード = テーブル2生産地コード
「生産地テーブル」は全件対象として、条件に一致する「商品テーブル」のレコードを結びます。
商品ID 商品名 価格 生産地コード 生産地名 ------------------------------------------------------------- 商品1 ニンジン 300円 A 千葉県 商品2 ジャガイモ 350円 B 北海道 商品3 ネギ 250円 A 千葉県 商品4 キャベツ 150円 C 長野県 商品5 サツマイモ 380円 D 鹿児島県 NULL NULL NULL E 沖縄県
右側の「生産地コードE 沖縄県」は表示されますが、商品テーブルにはないのでその部分はNULL(レコード無し)と表示されます。
SELECT文について、値の取得方法や条件の指定、テーブルの結合方法を紹介しました。プログラムを作る場面で、一番使われるのはSELECT文です。また、WHERE句での条件指定の方法はどのSQL文でも共通で使えます。
本記事で紹介したSELECT文とWHERE句について学習し、SQLを使いこなせるようになりましょう。
2024.06.17
子供におすすめのプログラミングスクール10選!学習メリットや教室選びのコツも紹介
#プログラミングスクール
2022.01.06
【完全版】大学生におすすめのプログラミングスクール13選!選ぶコツも詳しく解説
#プログラミングスクール
2024.01.26
【未経験でも転職可】30代におすすめプログラミングスクール8選!
#プログラミングスクール
2024.01.26
初心者必見!独学のJava学習方法とおすすめ本、アプリを詳しく解説
#JAVA
2024.01.26
忙しい社会人におすすめプログラミングスクール15選!失敗しない選び方も詳しく解説
#プログラミングスクール
2022.01.06
【無料あり】大阪のおすすめプログラミングスクール14選!スクール選びのコツも紹介
#プログラミングスクール
2024.01.26
【目的別】東京のおすすめプログラミングスクール20選!スクール選びのコツも徹底解説
#プログラミングスクール
2024.01.26
【無料あり】福岡のおすすめプログラミングスクール13選!選び方も詳しく解説
#プログラミングスクール
2024.01.26
【徹底比較】名古屋のおすすめプログラミングスクール13選!選び方も詳しく解説
#プログラミングスクール
2024.01.26
【徹底比較】おすすめのプログラミングスクール18選!失敗しない選び方も徹底解説
#プログラミングスクール