🔰

初心者向け簡単なSQL入門

2023/12/26に公開

この記事では、リレーショナルデータベースの初心者を対象として、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