データベースとテーブルの違い
どちらもデータを入れる箱には違いないが、実際にデータを入れておく箱が「テーブル」に該当する。
イメージとしてデータベースが銀行、テーブルが銀行の中にある金庫にあたる。
銀行はお金をしまっておく以外にも、いろいろとやることがあり、実際にお金をしまっておくのは、銀行の中にある金庫である。
同様にデータベースは、データをしまっておく以外にも色々とやることがあり、実際にデータをしまっておくのは、データベースの中にあるテーブルである。
データベース確認・選択コマンド
#確認
mysql> show databases;
#上記の確認画面からデータベースを選択
mysql> use データベース名;
テーブル一覧
mysql> show tables;
カラム確認
mysql> DESC テーブル名;
テーブル内に関するコマンド
SELECT
*
を指定することですべてのカラムを取得する。name
を指定することでname
カラムだけを取得することもできる
mysql> SELECT * FROM users;
+------+-----------+
| id | name |
+------+-----------+
| 1 | キツネ |
| 2 | タヌキ |
| 3 | ネコ |
| 4 | イヌ |
| 5 | ヒツジ |
+------+-----------+
5 rows in set (0.00 sec)
mysql> SELECT name FROM users;
+-----------+
| name |
+-----------+
| キツネ |
| タヌキ |
| ネコ |
| イヌ |
| ヒツジ |
+-----------+
5 rows in set (0.00 sec)
WHERE
SELECT
コマンドで、条件に一致したレコードだけを取得したいときは、WHERE
句を使う。
mysql> SELECT * FROM users WHERE name = 'ヒツジ';
+------+-----------+
| id | name |
+------+-----------+
| 5 | ヒツジ |
+------+-----------+
1 row in set (0.00 sec)
GROUP BY
グループ化を行うために使用される。
GROUP BY [グループ化するカラム名]
で絞れる。
mysql> SELECT team, COUNT(team) FROM user GROUP BY team;
+------------+-------------+
| team | COUNT(team) |
+------------+-------------+
| チームA | 3 |
| チームB | 2 |
+------------+-------------+
注意点として、今回はteam
でグループ化を行ったので、team
とそのカウントのみを、select
の表示対象とする必要がある。
例えばteam
でグループ化しているのに、name
を表示しようとしたなんて場合はエラーとなる。
またグループ化した後に、さらにデータ検索をHAVING
で行うことができる。WHERE
と同じ作用をしてくれるもの。
WHERE
とHAVING
の違いは、GROUP BY
の影響の前後に条件が適応されるかの違いである。
WHERE
がGROUP BY
の影響の前に条件が適応され、
HAVING
がGROUP BY
の影響の後に条件が適応される。
つまりWHERE
は「グループ化される前に、特定ユーザーを省く」時などに使用することになり、逆に HAVING
はグループ化された後に反映されるため「人数の少ないグループを表示から省く」なんてことに利用できる。
mysql> SELECT team,COUNT(team) AS team_num FROM user GROUP BY team HAVING 3 <= team_num;
+------------+----------+
| team | team_num |
+------------+----------+
| チームA | 3 |
+------------+----------+
OEDER BY
昇順・降順に並び替える時に使う。
ORDER BY [並び替えるカラム名] [昇順・降順の指定];
で使用できる。
ASC
が昇順、DESC
が降順となる。
mysql> SELECT * FROM user ORDER BY id DESC;
+------+--------------+
| id | name |
+------+--------------+
| 5 | ワタナベ |
| 4 | タカハシ |
| 3 | タナカ |
| 2 | スズキ |
| 1 | ヤマダ |
+------+--------------+
WHERE
も同時に指定できる。同時に使用する場合の注意点としては、先にWHERE
を書く必要がある。例えば上記の命令に「idが3より大きい」という条件を付け加えら場合、以下のようになる。
mysql> SELECT id,name FROM user WHERE 3 < id ORDER BY id DESC;
+------+--------------+
| id | name |
+------+--------------+
| 5 | ワタナベ |
| 4 | タカハシ |
+------+--------------+
GROUP BY
とも同時に使用が可能。例えば、同一名ごとにグループ化して、その数を表示かつ、その数でソートをしたい場合は、以下のようになる。
mysql> SELECT name,count(name) as name_num FROM game_character GROUP BY name ORDER BY name_num DESC;
DISTINCT
SELECT
文の実行結果の重複レコード(データ行)を1つにまとめるに使う。
SELECT DISTINCT カラム名 FROM テーブル名
で使える。
+-----------+------------+
| last_name | first_name |
+-----------+------------+
| 鈴木 | 太郎 |
| 鈴木 | 花子 |
| 鈴木 | 次郎 |
+-----------+------------+
mysql> SELECT DISTINCT last_name from sample1_employees;
+-----------+
| last_name |
+-----------+
| 鈴木 |
+-----------+
1 row in set (0.00 sec)
DISTINCT
して検索したレコード件数を数えるCOUNT
関数を併用することができる。
SELECT COUNT(列名) FROM テーブル名
で使用できる。
mysql> SELECT COUNT(DISTINCT last_name) from sample1_employees;
+---------------------------+
| COUNT(DISTINCT last_name) |
+---------------------------+
| 1 |
+---------------------------+
1 row in set (0.00 sec)
日付検索
年月での抽出
SELECT * FROM テーブル名 WHERE DATE_FORMAT(カラム名, '%Y%m')=201901;
年での抽出
SELECT * FROM テーブル名 WHERE DATE_FORMAT(カラム名, '%Y')=2019;
月での抽出
SELECT * FROM テーブル名 WHERE DATE_FORMAT(カラム名, '%m')=7;
参考記事
「データベース」と「テーブル」の違い
【初心者でも簡単】MySQLコマンドの使い方!DBやテーブルをSQLで操作しよう!
SQLで並び替え!ORDER BYを基礎から応用まで学ぼう!
【SQL】GROUP BYで自在に集計!集計関数やHAVINGと合わせて使おう
【SQL入門】DISTINCTで重複行をまとめる方法をわかりやすく解説
[MySQL]月・年単位でデータを抽出する方法 (DATE_FORMAT)