MySQLで学ぶ SQL 入門

SQL とは、データベースのデータを操作するための言語です。

以下の users テーブルを例に説明をしていきます。


+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| name    | varchar(255) | YES  |     | NULL    |                |
| age     | int(11)      | YES  |     | NULL    |                |
| country | varchar(255) | YES  |     | 日本     |                |
+---------+--------------+------+-----+---------+----------------+

新規追加

insert

データを新しく追加します。

insert into テーブル名 values (値1, 値2, ...);

# 列を指定
insert into テーブル名 (列名1, 列名2, ...) values (値1, 値2, ...);

試しにデータを3件追加してみましょう。

insert into users (name, age) values ('田中', 15);
insert into users (name, age) values ('鈴木', 22);
insert into users (name, age) values ('佐藤', 38);
insert into users (name, age, country) values ('John', 22, 'アメリカ');

Query OK, 1 row affected (0.01 sec) というようなメッセージが表示されたら追加成功です。文字列の場合は”(シングルクォーテーション) または “”(ダブルクォーテーション)で囲みます。

値は指定した列の並び順どおりに設定されていくので、順番を間違えないようにしましょう。指定されていない列にはデフォルト値もしくは NULL が入ります。id は auto increment になっているので、何もしなくても追加のたびにユニークな連番がデフォルト値として入ります。country にもデフォルト値が設定されていて、値が何も指定されていない場合は自動的にデフォルト値が入ります。

ちなみに、列を全く指定せずに追加する場合は、テーブルに定義されている順に値を全て指定します。デフォルト値を指定する場合は DEFAULT と指定します。上記の1つ目のinsert 文の場合は以下のように書いても同じ動作になります。

insert into users values (DEFAULT, '田中', 15, DEFAULT);

取得

select

データを取得します。

# 特定の列のみ
select 列名 from テーブル名;

# 複数の列
select 列名, 列名 from テーブル名;

# すべての列
select * from テーブル名;

先程追加した3件のデータを取得してみましょう。

select * from users;
+----+--------+------+--------------+
| id | name   | age  | country      |
+----+--------+------+--------------+
|  1 | 田中    |  15  | 日本         |
|  2 | 鈴木    |  22  | 日本         |
|  3 | 佐藤    |  38  | 日本         |
|  4 | John   |  22  | アメリカ        |
+----+--------+------+--------------+

as

列名に別名をつけて取得します。

select 列名 as 別名 from テーブル名;

例として、列名を日本語にしてみます。

select name as 名前, age as 年齢 from users;
+--------+-------+
| 名前    | 年齢  |
+--------+-------+
| 田中    |  15   |
| 鈴木    |  22   |
| 佐藤    |  38   |
| John   |  22   |
+--------+-------+

where

条件をつけて取得します。

select 列名 from テーブル名 where 条件;

# 複数条件(全部にマッチ)
select 列名 from テーブル名 where 条件 and 条件;

# 複数条件(いずれかにマッチ)
select 列名 from テーブル名 where 条件 or 条件;

条件にはいくつか指定方法があります。

比較演算子

値を比較する時に使用します。

        

        

        

        

        

比較演算子 説明
= 等しい
<> 等しくない
< より小さい
<= 以下
> より大きい
>= 以上

例として、年齢が20才以上のユーザを取得してみます。

select * from users where age >= 20;
+----+--------+------+--------------+
| id | name   | age  | country      |
+----+--------+------+--------------+
|  2 | 鈴木    |  22  | 日本          |
|  3 | 佐藤    |  38  | 日本          |
|  4 | John   |  22  | アメリカ        |
+----+--------+------+--------------+

IN 述語

値が含まれるかどうかを調べます。

// 含む
列名 in (値1, 値2, ...)

// 含まない
列名 not in (値1, 値2, ...)

例として、年齢が15才と22才のユーザを取得してみます。

select * from users where age in (15, 22);
+----+--------+------+----------+
| id | name   | age  | group_id |
+----+--------+------+----------+
|  1 | 田中    |   15 |       1  |
|  2 | 鈴木    |   22 |       2  |
+----+--------+------+----------+

IS NULL述語

NULL値を検索する場合に使用します。

// NULLである
列名 is null

// NULLでない
列名 is not null

例として、名前が NULL のユーザを取得してみます。

select * from users where name is null;
empty

今回は名前が NULL のユーザはいないため何も取得できません。

LIKE 述語

文字列の一部だけを比較する場合に使用します。LIKE 述語では%
_ という2つのメタ文字を使用できます。

        

メタ文字 説明
% 任意の文字列
_ 任意の1文字

「xxx」という文字が値のどこかに含まれていれば取得する、という場合は以下のように3パターン書くことができます。

// 前方一致
列名 like 'xxx%'

// 中間一致
列名 like '%xxx%'

// 後方一致
列名 like '%xxx'

例として、名前の最初が「田」で始まるユーザを取得してみます。

select * from users where name like '田%';
+----+--------+------+----------+
| id | name   | age  | group_id |
+----+--------+------+----------+
|  1 | 田中   |   15  |       1  |
+----+--------+------+----------+

ちなみに、メタ文字自体を検索対象にする場合は、「\%」「\_」のように「\」(Windowsなら「¥」)をつけてエスケープします。

条件に指定する列は select に含まれている必要があります。select でアスタリスク(*) ではなく、列名を個別に指定している場合は注意しましょう。

order by

並び替えて取得します。

# 昇順
select 列名 from テーブル名 order by 列名;
select 列名 from テーブル名 order by 列名 asc; # 明示的に書く場合

# 降順
select 列名 from テーブル名 order by 列名 desc;

# 複数指定
select 列名 from テーブル名 order by 列名1, 列名2;

例として、年齢の降順で取得してみます。

select * from users order by age desc;
+----+--------+------+--------------+
| id | name   | age  | country      |
+----+--------+------+--------------+
|  3 | 佐藤   |   38  | 日本         |
|  2 | 鈴木   |   22  | 日本         |
|  4 | John  |   22  | アメリカ        |
|  1 | 田中   |   15  | 日本         |
+----+--------+------+--------------+

distinct

特定の列のユニークな値を取得します。

select distinct 列名 from テーブル名;

例として、ユニークな国名一覧を取得してみます。

select distinct country from users;
+-------------+
| country     |
+-------------+
| 日本         |
| アメリカ       |
+-------------+

集約関数

データを集計するための関数です。よく使われているのは以下の5つです。

        

        

        

        

関数 説明
count 件数
max 最大値
min 最小値
avg 平均値
sum 合計値

例として、平均年齢を出してみます。

select avg(age) from users;
+----------+
| avg(age) |
+----------+
|  24.2500 |
+----------+

group by

特定の列でグルーピングしてデータを集計します。集約関数と一緒に使用します。

select 列名 from テーブル名 group by 列名;

# 複数指定
select 列名 from テーブル名 group by 列名1, 列名2, ...;

# 条件つき
select 列名 from テーブル名 group by 列名1 having 条件;

例として、国でグルーピングして平均年齢を出してみます。

select country, avg(age) from users group by country;
+--------------+----------+
| country      | avg(age) |
+--------------+----------+
| アメリカ        |  22.0000 |
| 日本          |  25.0000 |
+--------------+----------+
where と同じように、条件に指定する列は select に含まれている必要があります。また、「集計」という性質上、select に指定できる列は group by で指定された列に限られ、それ以外は集約関数を使用する必要があります。

また、集計するデータの条件を指定してみます。例として、集計対象を日本のユーザに限定してみます。

select country, avg(age) from users group by country having country = '日本';
+--------------+----------+
| country      | avg(age) |
+--------------+----------+
| 日本          |  25.0000 |
+--------------+----------+

having の条件に select で使用した集約関数も使用することができます。例として、平均年齢が25才未満の国を出してみます。

select country, avg(age) from users group by country having avg(age) < 25;
+--------------+----------+
| country      | avg(age) |
+--------------+----------+
| アメリカ        |  22.0000 |
+--------------+----------+

サブクエリ

select 文の中にさらにselect 文を記述することができ、その select の結果を値やテーブルとして扱うことができます。この入れ子になった select 文を「サブクエリ」(副問合せ)といいます。

例として、年齢が全体の平均年齢よりも上のユーザを出してみます。サブクエリは括弧で囲みます。

select * from users where age > (select avg(age) from users);
+----+--------+------+---------+
| id | name   | age  | country |
+----+--------+------+---------+
|  3 | 佐藤    |  38  | 日本    |
+----+--------+------+---------+

更新

update

データを更新します。

update テーブル名 set 列名=値;

# 複数列
update テーブル名 set 列名1=値1, 列名2=値2, ...;

# 条件つき
update テーブル名 set 列名=値 where 条件;

例として、「佐藤」を「中田」に変えてみましょう。

update users set name='中田' where name='佐藤';

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

条件に一致した数と、更新に成功したデータ数が表示されます。

削除

delete

データを削除します。

# すべてのデータを削除
delete from テーブル名;

# 条件つき
delete from テーブル名 where 条件;

以上で SQL の説明は終了です。次のステップとして、MySQL で学ぶテーブル結合 に進むのをおすすめします。