[Server & Network General] MySQL: ドットインストール「MySQL入門」のまとめ
memo.
やっぱり忘れてしまうので、長いけれどもまとめておく。
Contents
#01 MySQLとは何か?
#02 データベース用語について
スプレッドシートでたとえると。
- データベース(ファイル)
- テーブル(シート)
- フィールド(列)
- レコード(行)
#03 データベースを操作してみよう
% mysql -u root
/* パスワードを設定する */
> set password for root@localhost=password('hogehoge');
> exit;
% mysql -u root -p
/* データベースを作成する */
> create database blog_app;
/* データベースの一覧を表示する */
> show databases;
/* データベースを削除する */
> drop database blog_app;
/* 利用するデータベースを指定する */
> use blog_app;
#04 作業ユーザーを設定しよう
/* 作業ユーザーを作成する */
> grant all on blog_app.* to dbuser@localhost identified by 'dbuserpass';
> exit;
/* 作業ユーザーでログインする */
% mysql -u dbuser -p blog_app;
#05 テーブルを操作してみよう
/* テーブルを作成する */
create table users (
id int,
name varchar(255),
email varchar(255),
password char(32)
);
/* テーブルの一覧を表示する */
> show tables;
/* テーブルを削除する */
> drop table users;
#06 扱えるデータ型について
create table users (
id int,
name varchar(255),
email varchar(255),
password char(32),
score double,
sex enum('male', 'female'),
memo text,
created datetime
);
- 数値
- int 整数
- double 小数点
- 文字列
- char 固定長(長さの決まっている)
- varchar 可変長
- text
- 日付
- date
- datetime
- それ以外
- enum 列挙型(あらかじめ入力値が決まっている)
#07 フィールドの高度な設定について
create table users (
id int not null auto_increment primary key,
name varchar(255),
email varchar(255) unique,
password char(32),
score double,
sex enum('male', 'female') default 'male',
memo text,
created datetime,
key score (score)
);
- not null — 入力を必須とする
- default ‘male’ — ディフォルト値
- auto_increment — 自動連番
- 索引(インデックス)
検索時に速くなる。挿入時にはインデックスを張り直すので遅くなる。バランス。
- primary key — 主キー(1つ。テーブル内でレコードを一意に特定する。)
- key score (score) — キー(いくつでも。索引キー。よく検索するものに。)
- unique — ユニークキー(テーブル内で重複値が入ってきたらエラーではじく。)
#08 レコードを挿入してみよう
/* テーブルの構造を表示する */
> desc users;
insert into users (name,email,password,score,memo,created) values ('suzuki','suzuki@exsample.com','password','4.6','memommmm.','2012-06-12 11:00:00');
#09 レコードを抽出してみよう
/* テーブル(users)から、すべて(*)のフィールドを抽出する */
select * from users;
select name, email from users;
/* フィールドを縦に並べて表示するオプション */
select * from users \G
#10 条件付きで抽出してみよう (1)
/* 条件付きでレコードを抽出する */
select * from users where score >= 5.0;
select * from users where team != 'red';
select * from users where created > '2012-06-01 00:00:00';
/* あいまいな条件で抽出する */
select * from users where email like '%@example.com';
select * from users where email like '%@example.__'; -- この場合は2文字のみ(ex. jp)
#11 条件付きで抽出してみよう (2)
/* 範囲を指定して抽出する */
select * from users where score between 5.0 and 8.0;
select * from users where team in ('red', 'yellow');
/* 条件を組み合わせる */
select * from users where score >= 4.0 and team = 'blue';
#12 並び替え、件数の制限について
/* 並び替え */
select * from users order by score; -- 昇順
select * from users order by score desc; -- 降順
/* 件数の制限 */
select * from users limit 3;
select * from users limit 3, 2; -- 開始位置 3 から 2 件
#13 データの集計をしてみよう
/* 件数のカウント */
select count(*) from users;
/* 重複のないフィールドに含まれる値 */
select distinct team from users;
/* 最大値(max), min, avg, sum */
select max(score) from users;
/* group by グループ毎の集計 */
select team, avg(score) from users group by team;
/* 乱数を発生 */
select rand();
select * from users order by rand() limit 1;
#14 文字列、日付関数を使ってみよう
/* 文字列の長さを求める */
select email,length(email) from users;
/* 文字列を結合する */
select concat(name,'(',team,')') from users;
/* 結果表示時の命令に別名を付ける
concat(name,'(',team,')') を label とスッキリ表示
*/
select concat(name,'(',team,')') as label from users;
/* 文字列の一部のみを表示
team の 1文字目から 1文字目 */
select name,substring(team,1,1) from users;
/* 日付関数
2012-06-27 19:30:00 */
select now();
/* create された月を表示する */
select name,month(created) from users;
/* 日付の差分を日数で求める */
select name, datediff(now(), created) from users;
#15 レコードの更新、削除をしてみよう
/* レコードの更新
update テーブル名 set フィールド名 where 条件; */
update users set email = 'kimura@dotinstall.jp' where id = 5;
/* レコードの削除
delete from テーブル名 where 条件;
*/
delete from users where score<= 3.0;
#16 テーブルの構造を変更してみよう
/* フィールドを追加する
alter table テーブル名 add 追加するフィールド名 型 after fooの後に;
*/
alter table users add full_name varchar(255) after name;
/* 変更する */
alter table users change full_name full_name varchar(100);
/* 削除する */
alter table users drop full_name;
/* インデックスを付ける
alter table テーブル名 add index 付ける名前 (フィールド名);
*/
alter table users add index email (email);
alter table users drop index email;
/* テーブル名を変更する */
alter table users rename blog_users;
#17 複数のテーブルを扱ってみよう
select users.name,posts.title from users,posts where users.id=posts.user_id;
select users.name,posts.title,posts.created from users,posts where users.id=posts.user_id order by posts.created desc;
#18 外部ファイルのコマンドを実行する
drop table if exists users; -- 上書き
create table users (
name varchar(255),
email varchar(255)
);
insert into users (name,email) values ('tom','tom@example.com');
% mysql -u dbuser -p blog_app < commands.sql
#19 バックアップ、復元をしてみよう
/* バックアップ */
% mysqldump -u dbuser -p blog_app > blog_app.dump.sql
/* 復元 */
% mysql -u dbuser -p blog_app < blog_app.dump.sql