#リレーショナルデータベース(RDB)
データベースとは、一言で言い表せばデータを保持しておく場所のこと。
データベースにデータを保存したり、データベースから特定のデータを探してきたりすることを可能にするのが、データベース管理システム(DBMS)です。
現在一般的に利用されているデータベースが、リレーショナルデータベースで、言語としてSQLが使用されています。
リレーショナルデータベースには以下のような特徴があります。
- データが二次元の表の形式で表現される。この表一つ一つをテーブルという。
- 複数の表のデータを関連づけることで、すべてのデータを一つのデータベースとして活用出来る。
#SQL
今回はOracle社が買収したことで話題になったMYSQLを利用してSQLの書き方を見ていきましょう。
##データベース操作に関するコマンド
>show databases;
データベースの参照
>create database example;
exampleデータベースを作成
>drop database example;
exampleデータベースを削除
>use example;
操作するデータベースをexampleデータベースに変更する。
##テーブル操作に関するコマンド
テーブルの作成
>create table users (
name varchar(255) not null,
email varchar(255) unique,
score double
);
create table テーブル名 (列名 データ型 [オプション], 列名 データ型...)
と書きます。オプションによって必須項目の設定や、一意性の設定をすることができます。
主なオプション
primary key => テーブルのデータを一意に識別するためのキーに設定する。
unique => 同列での一意性を設定する。同じ値を異なるデータに設定できなくなる。
not null => 必須項目に設定。データの入力を強制させたい時に。
default 値 => 値をその項目のデフォルト値に設定する。列に値が指定されなかった時にデフォルト値をとる。
テーブルの変更
/ usersテーブルにsex列を追加。 /
>alter table users add sex enum('male','female');
/ usersテーブルからscore列を削除 /
>alter table users drop score;
テーブルの削除
>drop table users;
usersテーブルを削除する。
##データの操作
-データの挿入
>insert into users (name, email, score, sex) values ("Taro", "taro@gmail.com", 8.5, "male");
usersテーブルにデータを挿入する。
-データの削除
>delete from users; /* usersテーブルのデータをすべて削除 */
>delete from users where score >= 5.0; /* usersテーブルからscoreが5.0以下のデータを削除 */
-データの変更
/* usersテーブルのnameがTaroのscoreを8.0にする。 */
>update users set score = 8.0 where name = "Taro";
##データの参照
usersテーブルの全列を参照する。
>select * from users;
usersテーブルのscore列を参照する
>select score from users;
usersテーブルの列を条件付きで参照する。scoreが5.0より大きい。(where句)
>select * from users where score > 5.0;
where句を用いるときは、and, or を用いて複数の条件で参照することができる。
where句で指定できる条件はもっと複雑な条件を指定できるものもあります。
##テーブルの結合
複数のテーブルに定義された関連に基づいて複数のテーブルからデータを参照することができる。
ここでは、usersテーブルと、usersのidで紐づくuser_id列をもつpostsテーブルというものがあるとします。
usersテーブル
id, name, email, score
postsテーブル
id, user_id, body
select users.name, users.score, body.posts
from users, posts
where users.id = posts.user_id;
このように、複数のテーブルからデータを結合して参照したい場合は
- select で参照したい列は、テーブル名.列名で表す。
- from のあとには複数のテーブル名を列挙する。
- where句で結合する条件を記す。この場合はusersテーブルのid列とpostsテーブルのuser_id列が等しいという条件でデータの結合を行っている。
##サブクエリ
クエリを入れ子にして参照するデータを制御できる。
> select body from posts
where user_id =
(select id from users where score >= 5.0);
scoreが5.0以上のuserのpostsのbodyを参照。
##クエリの結合
- Union演算子
二つのクエリの結果を結合して、重複する行を削除する。
select * from team_a
union
select * from team_b ;
union all とすると重複を削除しないですべての
行を取り出す。
- intersect演算子
二つのクエリの重複部分のみを出力する。
select * from team_a
intersect
select * from team_b ;
- except演算子
二つのクエリの差を出力する。
select * from team_a
except
select * from team_b ;
team_aからteam_bの出力を差し引いたものが出力される。
##インデックス
インデックスとは、データの検索をより高速に行うためのものです。
ふつうのデータの参照は、目的のデータが見つかるまで1行ずつデータを参照していくが、インデックスを用いると、目的の行の場所を先に見つけてからその行のデータを参照することができる。
表の結合条件に使用されている列や、ユニークな値をもつ列などに対してインデックスを作成すると検索速度が上昇する。