初心者向け簡単なSQL入門
この記事では、リレーショナルデータベースの初心者を対象として、SQLの初歩的な事項について説明します。SQLを使って、CRUDと呼ばれる基本的なデータの検索・更新方法を理解していただくことを目的とします。なお、この記事で紹介するSQL文は、Google Colabでも動作させることができます。興味のある方は、2024年1月11日公開の記事「Google ColabでSQLを実行する」も参考になると思います。
1. SQLの概要
1.1 SQLとは
SQL(エスキューエル)は、リレーショナルデータベースの標準言語です。1987年に国際標準が制定され、基本機能はすべてのリレーショナルデータベース管理システムで利用できます。SQLはコマンドとして入力するほかに、一般のプログラミング言語に組み込んで使用することもできます。
1.2 SQLの基本機能
SQLを使用することにより、データベースに関する以下の処理を行うことができます。
- データの定義(変更、削除を含む)
- データの検索(検索条件指定が可能)
- データの更新(追加、変更、削除)
- データの集計と加工(統計処理、ソート処理など)
- アクセス権限の設定(テーブル単位の権限設定)
2. リレーショナルデータベースの基本的な構造
2.1 テーブル(表)
データベース中のデータは、テーブルに格納されます。
- テーブル(表)は、関連するデータの集まりであり、例えば「商品」というような名前が付けられます。テーブルは1つ以上の列と複数の行で構成されます。
- 列(カラムまたはフィールド)は、テーブルの縦方向のデータの並びであり、例えば「品番」や「品名」のような列名が付いています。各列内のデータはすべて同じデータ型になります。例えば「品番」は整数で、「品名」は文字列といった感じです。
- 行(レコード)は、テーブルの横方向のデータの並びであり、各列のデータが1つずつ保持されます。行には名前がありませんが、通常は例えば「品番」のような特定の列によって一意に識別できるようにします。
2.2 テーブルの例(商品テーブル)
「商品」という名前のテーブルの例を以下に示します。商品テーブルは4つの列と7つの行で構成されています。商品テーブルの各行は1つの商品のデータを表しており、1行目は品番:1の商品で、品名:トマト, 分類:野菜, 価格:290(円)となっています。2行目以降も同様です。
品番 | 品名 | 分類 | 価格 |
---|---|---|---|
1 | トマト | 野菜 | 290 |
2 | タマネギ | 野菜 | 240 |
3 | キャベツ | 野菜 | 190 |
4 | レタス | 野菜 | 140 |
5 | いちご | 果物 | 490 |
6 | みかん | 果物 | 390 |
7 | りんご | 果物 | 190 |
参考までに、この商品テーブルを作成するためのSQL文を記載しておきます。動作はPostgreSQLで確認していますが、それ以外のリレーショナルデータベースでもそのまま動くと思います。
CREATE TABLE 商品
(品番 INT UNIQUE, 品名 TEXT, 分類 TEXT, 価格 INT);
INSERT INTO 商品
VALUES(1,'トマト','野菜',290), (2,'タマネギ','野菜',240), (3,'キャベツ','野菜',190),
(4,'レタス','野菜',140), (5,'いちご','果物',490),(6,'みかん','果物',390),
(7,'りんご','果物',190);
このテーブルを用いて以降のSQLの説明をしていきます。
3. SQLの基本的な文法
3.1 SQL文の種類
データに対する基本操作はCRUD(クラッド: Create, Retrieve, Update, Delete)と呼ばれる4つが基本となります。テーブルに格納されたデータを操作するSQL文は、以下の4つです。
- SELECT: テーブルからデータを検索する(列と行を指定できる)
- INSERT: テーブルにデータを追加する(行単位で追加する)
- UPDATE: テーブルのデータを更新する(列と行を指定できる)
- DELETE: テーブルのデータを削除する(行単位で削除する)
3.2 SQL文の基本ルール
各SQL文は、以下のルールに従います。
- SQL文を構成するSELECT, FROM等の句を指定できる順序は決められており、変更できません。
- SELECT, INSERT等のキーワードは半角で記述します。大文字と小文字は区別しません。
- 数値はそのまま何も付けず、文字列や日付時刻は一重引用符(')で前後を囲んで記述します。
- 文字列中に記述された場合を除き、空白、タブ、改行の各文字は同じスペースの扱いです。
- 文の区切りはセミコロン(;)を使用します。文が1つだけの場合は付ける必要がありません。
4. SQL文の使い方
4.1 SELECT文
SELECT文は、テーブルからデータを検索します。基本的な形式は以下の通りです。
SELECT 列リスト
FROM テーブル名
[WHERE 検索条件]
- SELECT句は、検索結果として出力する列名等のリスト(列リスト)を指定します。
- FROM句は、検索対象とするテーブル名を指定します。
- WHERE句は、検索条件を指定します。省略時はすべての行が検索結果になります。
SELECT句とFROM句の説明と使用例
SELECT句は、検索結果として出力する列名のリスト(列リスト)を指定します。列リストにアスタリスク(*)を書くと、テーブル中のすべての列を指定したことになります。列リストの先頭にキーワードDISTINCT
を付けると重複する行が出力されなくなります。
FROM句は、検索対象とするテーブル名を指定します。テーブル名は複数指定することが可能ですが、ここでの説明は、基本となる1つだけを指定する場合に限定します。
例: 商品テーブルのすべての内容を出力する ↓
SELECT * FROM 商品
例: 商品テーブルの品名と価格の列を出力する ↓
SELECT 品名, 価格 FROM 商品
例: 商品テーブルの分類の列を出力する(重複あり) ↓
SELECT 分類 FROM 商品
例: 商品テーブルの分類の列を出力する(重複なし) ↓
SELECT DISTINCT 分類 FROM 商品
WHERE句の説明と使用例
WHERE句は、検索条件を指定します。省略時はすべての行が出力対象になります。検索条件は、列名、演算子(=, <, <=, >, >=, <>)、定数の組み合わせにより指定します(演算子=
は等しい、<>
は等しくないことを表す)。複数の検索条件をAND
, OR
で連結することもできます。
例: 商品テーブルから品番:5の商品を出力する ↓
SELECT * FROM 商品 WHERE 品番 = 5
例: 価格:200(円)未満の商品の品番と品名を出力する ↓
SELECT 品番, 品名 FROM 商品 WHERE 価格 < 200
例: 分類:果物で価格:200(円)未満の商品の品名と価格を出力する ↓
SELECT 品名, 価格 FROM 商品 WHERE 分類 = '果物' AND 価格 < 200
例: 分類:果物か、または価格:290(円)以上の商品を出力する ↓
SELECT * FROM 商品 WHERE 分類 = '果物' OR 価格 >= 290
4.2 INSERT文
INSERT文は、テーブルにデータを追加します。基本的な形式は以下の通りです。
INSERT
INTO テーブル名 [(列リスト)]
VALUES (値リスト)
- INTO句は、追加対象とするテーブル名と列名のリスト(列リスト)を指定します。
- VALUE句は、テーブルに追加する1行分のデータのリスト(値リスト)を指定します。
INSERT文の各句の説明と使用例
INTO句は、追加対象とするテーブル名と列名のリスト(列リスト)を指定します。列リストは省略可能です。省略時はテーブルに定義されているすべての列名を指定したことになります。列リストを指定するときは、任意の順序で列名を指定できます。列リストに指定されなかった列には、既定の値(一般には空値 NULL)が格納されます。
VALUES句は、テーブルに追加する1行分のデータのリスト(値リスト)を指定します。値リストと列リスト1対1対応である必要があります。すなわち、値リストのn番目の値は、列リストのn番目の列に格納されます。
例: 商品テーブルに次の行を追加する (品番:9, 品名:なす, 分類:野菜, 価格:190) ↓
INSERT INTO 商品 VALUES(9, 'なす', '野菜', 190)
例: 商品テーブルに次の行を追加する (品番:10, 品名:ピーマン, 分類:野菜, 価格:120) ↓
INSERT INTO 商品(品番, 分類, 価格, 品名) VALUES(10, '野菜', 140, 'ピーマン')
例: 商品テーブルに次の行を追加する (品番:11, 品名:メロン, 分類:果物, 価格:NULL) ↓
INSERT INTO 商品(品番, 品名, 分類) VALUES(11, 'メロン', '果物')
4.3 UPDATE文
UPDATE文は、テーブルのデータを更新します。基本的な形式は以下の通りです。
UPDATE テーブル名
SET (列リスト) = (値リスト)
[WHERE 検索条件]
- UPDATE句は、更新対象とするテーブル名を指定します。
- SET句は、更新する列名のリスト(列リスト)とデータのリスト(値リスト)を指定します。
- WHERE句は、更新条件を指定します。省略時はすべての行が更新されます。
UPDATE文の各句の説明と使用例
UPDATE句は、更新対象とするテーブル名を指定します。指定できるテーブル名は1つだけです。
SET句は、更新する列名のリスト(列リスト)とデータのリスト(値リスト)を指定します。INSERT文と同様に列リストと値リストは1対1対応である必要があります。すなわち、値リストのn番目の値は、列リストのn番目の列に格納されます。列が1つたけの場合、カッコ()は不要です。SET句で指定されなかった列の値は更新されません。
SET句の別の書き方として、以下の書き方も可能です。
SET 列名 = 値 [, 列名 = 値 [, ...]]
WHERE句は、更新条件を指定します。更新条件に合致した行のみが更新されます。省略時はすべての行が更新されます。
例: 品番:1の商品の価格を300(円)に変更する ↓
UPDATE 商品 SET 価格 = 300 WHERE 品番 = 1
例: 品番:2の商品の品名をたまねぎ、価格を250(円)に変更する ↓
UPDATE 商品 SET (品名, 価格) = ('たまねぎ', 250) WHERE 品番 = 2
例: 同上(別の書き方)↓
UPDATE 商品 SET 品名 = 'たまねぎ', 価格 = 250 WHERE 品番 = 2
例: すべて商品の分類を青果に変更する ↓
UPDATE 商品 SET 分類 = '青果'
4.4 DELETE文
DELETE文は、テーブルのデータを削除します。基本的な形式は以下の通りです。
DELETE
FROM テーブル名
[WHERE 検索条件]
- FROM句は、削除対象とするテーブル名を指定します。
- WHERE句は、削除条件を指定します。省略時はすべての行が削除されます。
DELETE文の各句の説明と使用例
FROM句は、削除対象とするテーブル名を指定します。指定できるテーブル名は1つだけです。
WHERE句は、削除条件を指定します。削除条件に合致した行のみが削除されます。省略時はすべての行が削除されます。
例: 品番:3の商品を削除する ↓
DELETE FROM 商品 WHERE 品番 = 3
例: 価格:300(円)以上の商品を削除する ↓
DELETE FROM 商品 WHERE 価格 >= 300
例: すべての商品を削除する ↓
DELETE FROM 商品
5. まとめ
この記事では、リレーショナルデータベースの基本的な概念と、CRUDに対応する4つのSQL文によって、テーブルに格納されたデータの検索と更新ができることを説明しました。
それぞれのSQL文にはこの記事では説明しなかった種々のオプション機能があり、より高度な検索と更新が可能になります。また、4つのSQL文以外にも多くのSQL文が使用できます。この記事でSQLについて少しでも興味を持っていただければ幸いです。
Discussion