Lesson 5

データベースにテーブルを作成する

Lesson 5 Chapter 1
データベースにテーブルを作成し、単純なSELECT文で検索する

本レッスンでは、これからのレッスンで使用するデータベースの準備を下記の通り実施していきます。

  • データベースを作成する。
  • 作成したデータベースにテーブルを作成する
  • 作成したテーブルにデータを作成する。
  • 作成したデータをSELECT文で検索して確認する。
  • 本レッスン以降で、使用するデータをインポートする。

ここでは TablePlus を使用しますが、基本は SQL で操作していきます。
Powershell でも同じ SQL 文を実行できるので、どちらを使っても問題ありません。

データベースを作成する

データベースを作成していきます。
まずは、TablePlus から MySQL に接続して SQL を実行できるようにしましょう。

TablePlus を MySQL に接続する

① TablePlus を起動して、接続設定済みの「MySQL」をダブルクリックします。
(※接続方法は、Lesson 3 Chapter 2「DBに接続する」を参照してください)

TablePlus_img01-1

② 次の画面が開いたら SQL アイコン(赤枠部分)をクリックします。
すると、SQL の入力欄が現れます(青枠部分)。ここに SQL を記載していきます。

TablePlus_img01-2

CREATE DATABASE 文でデータベースを作成する

データベースを作成するには「CREATE DATABASE」文を使用します。
基本的な構文は次のとおりとなります。

CREATE DATABASE [データベース名];

ここでは、データベース名を「test」として作成を進めます。
TablePlus の SQL 入力欄に CREATE DATABASE test; と記載して、その行にカーソルを残したまま「Run Current」ボタンをクリックしてください。

TablePlus_img01-3

実行結果として「Query 1 Ok: 1 row affected」と表示されたら、データベースは作成されています(下図)。

TablePlus_img01-4

(参考)CREATE DATABASE 文の公式リファレンス

CREATE DATABASE 文では、細かい設定を行うこともできます。
必要に応じて公式マニュアルを参照すれば大丈夫ですが、概略を紹介しておきます。

公式MySQL 8.0 リファレンスマニュアルから抜粋)

CREATE DATABASE文(抜粋)
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
        [create_option] ... 
                        
    create_option: [DEFAULT] {
        CHARACTER SET [=] charset_name
      | COLLATE [=] collation_name
      | ENCRYPTION [=] {'Y' | 'N'}
    }

  • {DATABASE | SCHEMA}は、作成する対象を選びます。
  • [IF NOT EXISTS]を指定すると同名の DB が不存在の場合のみ DB を作成します。
    この指定が無い場合は、同名の DB が存在する場合にエラーが発生します。
  • db_nameには、データベースの名前を設定します。
  • [create_option]は、データベースのオプション設定を指定します。
    指定しない場合は、デフォルト設定が反映されます。
    オプションの設定内容は下記の通りです。
    [DEFAULT]は、デフォルト設定が設定されます。指定しない場合と同じです。
    CHARACTER SETは、データベースの文字コードを設定します。
    COLLATEは、データベースの照合順序を指定します。
    ENCRYPTION は、データベースの暗号化を定義します。

テーブルを作成する

データベースの指定

テーブル作成の前に操作するデータベースの指定をする必要があります。
TablePlus では、DB アイコン(青枠部分)からクリックのみでデータベース指定ができますが(Leeson 3 Chapter 3 参照)、ここでは SQL 文から切替えを行うようにします。

SQL の入力スペースに USE test; とコマンドを入力し、カーソルをコマンドに合わせた状態で「Run Current」をクリックします。
実行結果に「Query 1 Ok」と表示されれば成功です。

TablePlus_img01-5

テーブル作成の基本構文

データベースを指定できたら、テーブルを作成します。
テーブルを作成するには、CREATE TABLE 文を使用します。基本構文は次のとおりです。

CREATE TABLE [テーブル名] (カラム名1 データ型, カラム名2 データ型, ...)

CREATE TABLE 文を作成する

上記の基本構文に従って、次のような定義のテーブルを作成します(データ型と制約については、後で解説します)。

No カラム名 データ型 制約
1 id INT(整数型) PRYMARY KEY
1 name VARCHAR(文字列型) NOT NULL

これを、CREATE TABLE 文で表すと次のようになります。

CREATE TABLE sample (id INT PRIMARY KEY, name VARCHAR(30) NOT NULL);

それでは、次のように、TablePlus に SQL 文を入力し、カーソルを SQL 文に合わせた状態で「Run Current」をクリックしてください。
実行結果に「Query 1 Ok」と表示されれば成功で、テーブルが作成が完了しています。

TablePlus_img01-6

(参考)CREATE TABLE 文の公式リファレンス

CREATE TABLE 文には様々なオプションがあります。
公式MySQL 8.0 リファレンスマニュアル で紹介されている構文は次のとおりです(一部抜粋)。

CREATE TABLE文(抜粋)
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
  (create_definition,...)
  [table_options]
  [partition_options]

  • [TEMPORARY]は、一時テーブルを作成するときに指定します。
  • [IF NOT EXISTS]を指定すると同名の DB が不存在の場合のみ DB を作成します。 この指定が無い場合は、同名の DB が存在する場合にエラーが発生します。
  • tbl_nameには、作成するテーブルの名前を指定します。
  • (create_definition,...)は、カラム名やカラム定義を指定します。
  • [table_options]は、テーブルのオプション設定するときに指定します。
  • [partition_options]は、パーティションのオプション設定するときに指定します。

オプション設定の詳細は、公式MySQL 8.0 リファレンスマニュアルを参照しましょう。

MySQL で使用できるデータ型の主なもの

ここでは、よく使用されるデータ型を中心に一覧としておきます(これ以外にも様々なデータ型があります)。
詳しくは、公式リファレンス - データ型 で紹介されていますので、詳しくはそちらを参照してください。

No データ型 種類 サイズ 扱える範囲
1 TINYINT 整数型 1 byte -128 ~ 127
符号なしの場合は 0 ~ 255
2 SMALLINT 整数型 2 byte -32768 ~ 32767
符号なしの場合は 0 ~ 65535
3 INT 整数型 4 byte -2147483648 ~ 2147483647
符号なしの場合は 0 ~ 4294967295
4 BIGINT 長整数型 8 byte -9223372036854775808 ~ 9223372036854775807
符号なしの場合は 0 ~ 18446744073709551615
5 DECIMAL(M, D) 固定小数点型 - M: 桁数(最大桁数 65)
D: 小数部の最大桁数(最大 30)
6 FLOAT 単精度浮動小数点数型 4 byte 有効桁数 7 桁の実数
7 DOUBLE 倍精度浮動小数点数型 8 byte 有効桁数 15 桁の実数
8 DATE 日付型 - '1000-01-01' ~ '9999-12-31'
形式:'YYYY-MM-DD'
9 DATETIME 日付時刻型 - '1000-01-01 00:00:00' ~ '9999-12-31 23:59:59'
形式:'YYYY-MM-DD hh:mm:ss'
10 TIMESTAMP タイムスタンプ型 - '1970-01-01 00:00:01' UTC ~ '2038-01-19 03:14:07' UTC
11 CHAR 固定長文字列型 - 0 ~ 255 文字
指定例:CHAR(80)
12 VARCHAR 可変長文字列型 - 0 ~ 65535 文字
指定例:VARCHAR(500)
13 BIT(M) ビット値型 - 0 ~ 64 Bit(M に bit 数を指定)

なお、MySQL 型には、真偽値型(True と False)という形式はないため、TINYINT型 または BIT型にて数値として真偽値を格納することとが通例です。
その場合は、一般的に、「0 を False」、「1 を True」とみなすことになります。

テーブル定義における制約

CREATE TABLE 文におけるテーブル定義には、データ型のほかに「制約」を指定できます。
制約を使用することで、データベースに格納するデータについて、「空値(NULL)を許可しない」とか「値の重複を許可しない」などの条件を設定することができます。
以下、よく使用される制約を挙げておきます。

No 名称 内容
1 NOT NULL 制約 NULL 値を許容しない制約です。つまり必ず値を指定する必要があります。
2 UNIQUE 制約 値が一意であること(重複しないこと)が必要です。NULL 値は許容されます。
3 PRYMARY KEY 制約 日本語で「主キー」と呼ばれ、テーブルに1のみ設定できます。
値は一意(UNIQUE)で、必ず指定(NOT NULL)しなければなりません。
4 FOREIGN KEY 制約 日本語で「外部キー」と呼ばれます。指定された他のテーブルのカラムの値を格納し、そこに存在しないデータを格納することはできません。
5 DEFAULT 値の設定 値の指定が無い場合は、デフォルト値を格納します。
指定例:price INT DEFAULT 500

データを追加する

次は作成したテーブルにデータを追加しましょう。
データを追加するには、INSERT 文を使用します。

基本構文① レコードを1件追加する

INSERT 文の基本構文を確認しましょう。
次のように、データ(レコード)を挿入するテーブル名を指定して、データを追加するカラム名と値をセットで指定します。

INSERT INTO [テーブル名] (カラム名1, カラム名2, ...) VALUES (値1, 値2, ...);
上記の構文では「カラム名1」に「値1」(以下同様...)が格納されることになります。

上記の基本構文に従って、次のようなデータ(レコード)を追加します。

id name
1 yamada

これをもとに、INSERT 文を作成すると次のようになります。

INSERT INTO sample (id, name) VALUES (1, 'yamada');

それでは、次のように、TablePlus に SQL 文を入力し、カーソルを SQL 文に合わせた状態で「Run Current」をクリックしてください。
実行結果に「Query 1 Ok: 1 row affected」と表示されれば、データ追加完了となります。

TablePlus_img01-7

基本構文② カラム名の指定を省略する

CERATE TABLE 文で定義された順に全てのカラムの値を指定する場合は、以下のようにカラム名の指定を省略することができます。

INSERT INTO [テーブル名] VALUES (値1, 値2, ...);

それでは、TablePlus で実行してみましょう。
SQL 文として INSERT INTO sample VALUES (2, 'tanaka'); と指定して実行してみます。 次のようになれば、成功です。

TablePlus_img01-8

基本構文③ 複数のレコードを同時に追加する

複数のレコードを同時に追加する場合は、次のように VALUE 以下にカンマ区切りでデータを追加します。

INSERT INTO [テーブル名] (カラム名1, カラム名2, ...)
    VALUES (値1, 値2, ...), (値1, 値2, ...), (値1, 値2, ...);

こちらも、TablePlus で実行してみましょう。
SQL 文として INSERT INTO sample VALUES (3, 'suzuki'), (4, 'saito'); と指定して実行してみます。 次のようになれば、成功です。

TablePlus_img01-10

追加されたデータを確認する

これまで 4 件のデータを追加しました。TablePlus でテーブルの状態を確認してみましょう。
左側の欄に sample テーブルが表示されているのでこれをクリックします。
正しく INSERT 文が実行できていれば、下図のように、青枠部分にテーブルの内容が表示されます。

TablePlus_img01-11

基本構文④ 他のテーブルにあるレコードを SELECT して追加する

他のテーブルのデータを使用してデータ(レコード)追加をすることができます。
ここでは、構文のみの紹介にとどめます。
INSERT 文は、Lesson 10 で改めて解説しますので、現時点で正確に理解しなくとも大丈夫です。

INSERT INTO [テーブル名] (カラム名1, カラム名2, ...)
    SELECT カラムA, カラムB, ... FROM [他のテーブル名] WHERE [抽出条件];

(参考)INSERT 文の公式リファレンス

INSERT文は構文や、定義内容が様々にあります。
より詳しい定義は 公式MySQL 8.0 リファレンスマニュアル を参照してみましょう。

INSERT文(抜粋)
INSERT 
    [INTO] tbl_name
    [(col_name [, col_name] ...)]
    { {VALUES | VALUE} (value_list) [, (value_list)] ...
    }

  • [INTO]は、MySQL では省略可能ですが、標準 SQL では入れる必要があるので注意しましょう。
  • [(col_name [, col_name] ...)]は、データを登録するカラム名を指定します。ただし、全カラムに対してデータを登録する場合は、省略できます。
  • {VALUES | VALUE}は、どちらか一方を必ず指定します。標準 SQL に合わせて VALUES を使用した方が良いでしょう。
  • (value_list) [, (value_list)]には、登録するデータの内容を指定します。 col_nameを複数指定している場合は、「,(カンマ)」区切りでカラム指定した同じ順番にデータを指定します。

データを検索する

それでは、これまでに登録したデータを SELECT 文で取得してみましょう。

SELECT 文の基本構文

まず、構文から見ていきます。

① 全件取得する SELECT 文
Lesson 4 では次のような SELECT 文を使用しました。

SELECT [カラム名] FROM [テーブル名];

上記の指定をすると、テーブルに存在するレコードを全て取得することになります。

レコード

レコードとは、1件分のデータのことを示します。
データを表形式で捉えた場合、横に並ぶ列がカラム、縦に並ぶ行がレコードということなります。

② 抽出条件を指定する SELECT 文
今回は「検索」を行うため、次のような構文を使用します。

SELECT [カラム名] FROM [テーブル名] WHERE [抽出条件];

ここで、新しく「WHERE 句」というものが出てきています。
簡単に言えば、 WHERE id = 1 のように抽出条件を指定することで、取得するレコードを絞り込むことができます(WHERE 句については、Lesson 6 以降で詳細に解説していきます)。

SELECT 文を作成して検索を実行する

それでは、実践です。ここでは「name」が「suzuki」であるレコードを検索して取得してみます。
SELECT 文は次のようになります。なお、カラム名のところには、アスタリスク(*)を指定して全カラムを取得するようにしています(Lesson 4 参照)。

SELECT * FROM sample WHERE name = 'suzuki';

それでは、TablePlus で実行してみましょう。
次のように SQL 文を指定して、いつものように「Run Current」をクリックします。

TablePlus_img01-12

上のように、実行結果部分(青枠部分)に取得されたデータが表示されていれば成功です。

WHERE 句における数値と文字列の指定方法の違いについて

上記の例では、WHERE name = 'suzuki' というように「suzuki」をシングルクォーテーションで囲んでいました。
SQL 文を書く時は、文字列はシングルクォーテーション(またはダブルクォーテーション)で囲むという決まりがあります。
簡単にまとめると次の表のとおりです。

No データ型 WHERE 句の例 説明
1 数値型 WHERE price = 1200 数値型(整数・実数)の場合は、そのまま指定します。
2 文字列型 WHERE name = 'yamada' 文字列型の場合は、クォーテーションで囲みます。
3 日付型 WHERE created_at = '2022-12-01' 日付型の場合は、クォーテーションで囲みます。
4 真偽値型 WHERE delete_flag = false 真偽値型の場合は、そのまま指定します。

(参考)SELECT 文の公式リファレンス

SELECT文にも様々な指定項目があります。
より詳しい定義は公式MySQL 8.0 リファレンスマニュアルを参照しましょう。

SELECT文(抜粋)
SELECT
  select_expr [, select_expr] ...
  [FROM table_references]
}

  • select_expr [, select_expr]は、取得したいカラム名を指定します。複数取得したい場合は、「,(カンマ)」区切りで指定してください。 また、全カラムを取得したい場合は「*(アスタリスク)」を指定してください。
  • [FROM table_references]は、table_references に検索するテーブル名を指定します。

Lesson 5 Chapter 2
実習で使用するテーブルをインポートする

本レッスン以降で、使用するデータをインポートしましょう。
インポートファイルを任意のフォルダにダウンロードしてください。

TablePlusの場合

右上の「Menu」をクリックして、「File」>「Import」>「From SQL Dump」の順に選択し、ダウンロードしたファイルを開いてください。

TablePlus_img01-13

次の画面が表示されたら「Import」ボタンをクリックします。
ポップアップで「Import SQL successfully」が表示されたら、インポートは完了です。

TablePlus_img01-14

PowerShellの場合

PowerShell を起動して MySQL に接続します。

PowerShell
> mysql -u root -p
Enter password: ****

データベース test を選択します。

PowerShell
mysql> use test
Database changed

インポートは、次の SQL 文で実行します。
SOURCE [ダウンロードしたファイルのパス]\test.sql;
実行結果に「ERROR…」が1件も表示されず、次のように「Query OK…」が表示されていればインポートは完了です。

PowerShell
mysql> SOURCE C:\file\test.sql
Query OK, 0 rows affected (0.07 sec)
Query OK, 0 rows affected (0.06 sec)
# 中略
Query OK, 14 rows affected (0.00 sec)
Records: 14  Duplicates: 0  Warnings: 0