SQLの基本構文
カテゴリ:データベース編
今回はSQLの基本構文を解説したいと思います。データベースを操作する際に主に使用する文は、レコードを挿入するINSERT文、レコードを抽出するSELECT文、レコードを更新するUPDATE文の3つです。Noteなお、以降のではMySQLでのデータベースとテーブルの作成で作成したblogテーブルを基に解説いたします。もし作成していない場合は先に作成してください。
まず、操作を始める前に今回操作を行うblogデータベースを選択しておきます。
use blog;
レコードの挿入(INSERT)
テーブルにレコードを挿入する場合はINSERT文を使用します。
INSERT文の構文は以下となります。
INSERT INTO テーブル名 (カラム名1, カラム名2, カラム名3 ...) VALUES (カラム名1の値, カラム名2の値, カラム名3の値 ...);
実際にblogテーブルに簡単なレコードを追加してみましょう。
INSERT INTO blog (id, title, text, date) VALUES ('1', 'ブログ始めました', '今日はデータベースのお勉強をしました。', NOW());
NoteNOW() は現在の日時が返される関数です。
以下のように「Query OK, 1 row affected」と表示されればレコードの挿入成功です。
mysql> INSERT INTO blog (id, title, text, date) VALUES ('1', 'ブログ始めました', '今日はデータベースのお勉強をしました。', NOW());
Query OK, 1 row affected (0.11 sec)
挿入したレコードを確認するには、次に説明するSELECT文を使用してレコードを抽出します。
レコードの抽出(SELECT)
テーブルからレコードを抽出する場合はSELECT文を使用します。
SELECT文の構文は以下となります。
SELECT カラム名 FROM テーブル名 WHERE 条件;
blogテーブルからtitleカラムのみを抽出する場合は以下のようになります。
SELECT title FROM blog;
date値が2020年1月1日以降という条件を付加して、全カラムを抽出する場合は以下のようになります。
SELECT * FROM blog WHERE date > 2020-01-01;
Noteワイルドカードアスタリスク(*)は全てを表す演算子です。
以下のように先程挿入したレコードが表示されたはずです。
mysql> SELECT * FROM blog WHERE date > 2020-01-01;
+------+--------------------------+-----------------------------------------------------------+---------------------+
| id | title | text | date |
+------+--------------------------+-----------------------------------------------------------+---------------------+
| 1 | ブログ始めました | 今日はデータベースのお勉強をしました。 | 2020-05-02 16:56:30 |
+------+--------------------------+-----------------------------------------------------------+---------------------+
1 row in set, 1 warning (0.00 sec)
レコードの更新(UPDATE)
既存のレコードの値を変更したい場合はUPDATE文を使用します。
UPDATE文の構文は以下となります。
UPDATE テーブル名 SET カラム名 = 値 WHERE 条件;
先程挿入したレコードのtitleを「データベースのご勉強」に変更してみましょう。その最、以下のようにWHERE句の条件としてid = 1を指定します。
UPDATE blog SET title = 'データベースのご勉強' WHERE id = 1;
以下のように「Query OK, 1 row affected」に続けて「Rows matched: 1 Changed: 1 Warnings: 0」と表示されれば成功です。
mysql> UPDATE blog SET title = 'データベースのご勉強' WHERE id = 1;
Query OK, 1 row affected (0.17 sec)
Rows matched: 1 Changed: 1 Warnings: 0
確認のため、SELECT文でもう一度レコードの内容を見てみましょう。以下の例では条件にid = 1を指定してレコードを抽出しています。
mysql> SELECT * FROM blog WHERE id = 1;
+------+--------------------------------+-----------------------------------------------------------+---------------------+
| id | title | text | date |
+------+--------------------------------+-----------------------------------------------------------+---------------------+
| 1 | データベースのご勉強 | 今日はデータベースのお勉強をしました。 | 2020-05-02 16:56:30 |
+------+--------------------------------+-----------------------------------------------------------+---------------------+
1 row in set (0.00 sec)
レコードの削除(DELETE)
既存のレコードを削除したい場合はDELETE文を使用します。
DELETE文の構文は以下となります。
DELETE FROM テーブル名 WHERE 条件;
先程挿入したid = 1のレコードを削除するには以下のように実行します。
DELETE FROM blog WHERE id = 1;
以下のように「Query OK」と表示されれば削除成功です。
mysql> DELETE FROM blog WHERE id = 1;
Query OK, 1 row affected (0.20 sec)
注意条件を付け忘れると全レコードを削除してしまうため気をつけましょう。
レコード数を数える
テーブル内のレコード数を数えるにはSELECT文でCOUNT(*)関数を使用します。
blogテーブルからCOUNT(*)関数を用いてレコード数を数える場合は以下のようになります。
SELECT COUNT(*) FROM blog;
先程レコードを削除しているためCOUNT(*)の値は0と表示されているはずです。
mysql> SELECT COUNT(*) FROM blog;
+----------+
| COUNT(*) |
+----------+
| 0 |
+----------+
1 row in set (0.01 sec)
もう一度レコードを挿入して、レコード数を確認してみましょう。以下のようにCOUNT(*)の値が1になっているはずです。
mysql> INSERT INTO blog (id, title, text, date) VALUES ('1', 'データベースのご勉強', '今日はデータベースのお勉強をしました。', NOW());
Query OK, 1 row affected (0.10 sec)
mysql> SELECT COUNT(*) FROM blog;
+----------+
| COUNT(*) |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
文字の検索
テーブル内から特定のキーワードを含むレコードを抽出する場合は、WHERE句の条件にLIKE句を使用してキーワードを指定します。
本文に「データベース」というキーワードを含むレコードを抽出する場合は以下のようになります。
SELECT * FROM blog WHERE text LIKE '%データベース%';
以下のように表示されれば成功です。
mysql> SELECT * FROM blog WHERE text LIKE '%データベース%';
+------+--------------------------------+-----------------------------------------------------------+---------------------+
| id | title | text | date |
+------+--------------------------------+-----------------------------------------------------------+---------------------+
| 1 | データベースのご勉強 | 今日はデータベースのお勉強をしました。 | 2020-05-02 17:21:20 |
+------+--------------------------------+-----------------------------------------------------------+---------------------+
1 row in set (0.07 sec)
Note%記号はLIKE句においてワイルドカードを意味します。つまりキーワードの両端に%を指定すれば部分一致、末尾にのみ%を指定すれば前方一致、先頭にのみ%を指定すれば後方一致となります。
但し日本語の場合、英語のように単語や語句をスペースで区切るという習慣はないため、通常はキーワードの両端に%記号を付与することになるかと思います。
以上、SQLの基本構文について解説いたしました。なお、ここで「id値に自動で連番が振られればいいのに」と思った事でしょう。次回は自動インクリメントとカラムの制約について解説いたします。
公開日時:2020年05月02日 17:43:55