MySQL
MySQLとは、データベースを管理するCUIアプリケーションの1つ。
世界的に活用されているデータベースアプリケーションであるため、これをまず押さえておけば困りません。
CUIベースであるため、基本はコマンドで扱います。
MySQLの構造
・Database (Schema)
・Table
・Column (Field)
・Record
まずはこの4つの構造がある、ということを押さえましょう。
MySQLを体験してみよう
MySQLを使う下準備
1.Windowsは「コマンドプロンプト」を、Macは「ターミナル」を起動しましょう。
※起動方法がわからなければ、自分で調べてみましょう。(自分で調べる癖をつけるのもエンジニアへの第一歩です。)
2.Windowsは「XAMPP」を、Macは「MAMP」を起動し、同時にサーバーを起動させる。
3.MySQLのアプリケーションへログイン ※引き続き「コマンドプロンプト」「ターミナル」を使用します。
Windowsの方
C:¥xampp¥mysql¥bin¥mysql -u root
Macの方
/Applications/MAMP/Library/bin/mysql -u root -p
※Enter Passwordを聞かれたら「root」と入力。表示はされませんが、気にせず入力してください。
下記のように表示されれば、ログインできています。※XAMPPの場合はmysqlでなくMariaDBとなっているはずです。
4.研修用DB、テーブルの作成
ログインができたら、下記のコマンドをすべてコピーし、ターミナルorコマンドプロンプトへ貼り付けてEnterを押下する。
DROP DATABASE IF EXISTS sql_lesson_1; CREATE DATABASE sql_lesson_1 CHARACTER SET utf8; USE sql_lesson_1; CREATE TABLE `users` (`id` int AUTO_INCREMENT PRIMARY KEY,`name` varchar(16),`pass` varchar(8)) ENGINE = InnoDB; INSERT INTO `users` (`name`, `pass`) VALUES ('斎藤ちよこ', '33gguu'),('安藤えりか', '99okok'),('西崎誠', '2323ggff'),('小林健司', '998huhj');
5.使用するDBの選択
use sql_lesson_1;
と入力し、Database Changedと表示されるのを確認しましょう。
使うDBを選択するのは忘れやすいので注意
基本のSQL
・SELECT
・INSERT
・UPDATE
この3つがSQL の中で最も出番が多く、重要なSQL になります。
まずこれらに触れて、SQL とは何か学んでいきましょう。
SELECT
Recordを取得してくるコマンドで、SQL の中で一番出番の多いコマンドになります。
select文の基本文法は
select カラム名 from テーブル名;
となります。つまり下のSQL は「users」というテーブルから「すべてのカラム」を表示しなさいというSQL です
※「*」はすべてのカラムのことを表します。
select * from users;
SELECT文は基本Recordを全件取得してきます。
全件でなく、特定のRecordだけ取得したい場合、「WHERE 条件」で対象を絞ることが可能です。
select * from users where id = 4;
id以外でも存在するColumnなら条件に指定することができます。
select * from users where name = "小林健司";
としても、同じ結果が表示されると思います。
※文字列を扱う際は、必ず「”」で括ってください。
もしエラーがでてしまったら‥
MySQL のエラー文はどこが間違っているのかちゃんと教えてくれます。
「use near ~~~」と表示されているところをです。
だいたいここで表示されている箇所(今回はusers WHERE)の手前が間違っていることが多いです。
今回は「from」が抜けていますね。このようにエラー文を見て自分で修正できるようになりましょう。
※エラー文はググればだいたい解決策が載っています。
ググって自分で解決するクセを、ぜひ今のうちに身につけてください。
ググる能力も、エンジニアの大切なスキルです。
セミコロンを入れたのにSQLが終わらない場合
「”」を入れ忘れていたり、半角でなく全角で入れてしまったりすると、こうなってしまいます。
「mysql>」でなく「”>」とでたらどこかで「”」が閉じていません。
閉じてない「”」を閉じなてから、改めて「;」を入れましょう。
AND
WHEREの条件は複数指定することもできます。
「AND」を指定すると「AかつB」2つの組み合わせで検索することができます。
select * from users where name = "斎藤ちよこ" and pass = "33gguu";
上記SQL の場合「name=”斎藤ちよこ”」かつ「pass = “33gguu”」の組み合わせを「users」テーブルから検索します。
よくあるログイン機能にこういったSQL が使用されています。
OR
今度は「OR」を使ってみましょう。
「OR」を指定すると「AもしくはB」つまりどちらかに該当すればヒットします。
select * from users where name = "斎藤ちよこ" or name = "安藤えりか";
今回のSQL では「name = “斎藤ちよこ”」「name = “安藤えりか”」どちらかに該当すればヒットするので。2件ヒットしています。
あいまい検索
次はあいまい検索についてみていきます。
例えば「名前に○○を含む人を表示する」といったことをしたい場合に使用します。
まずはusersテーブルのRecordを全件表示してください。
わからなくなったら、上に戻って見直してみましょう。
今回テーブルには名前に「藤」がつく人が2人いますね。「藤」を含む人だけを取得してみましょう。
select * from users where name like "%藤%";
ポイントは
「where name = ~」が「where name like ~」というように置き換わっている点。
「”%藤%“」のように「%」記号が使用されている点。
「%」はワイルドカードをいい、0文字以上の任意の文字列を表します。
「%」の位置によって結果が変わってきます。
種別 | 表記 | マッチする文字列 |
後方一致 | %藤 | 斎藤、安藤、佐藤など |
前方一致 | 斎藤% | 斎藤ちよこ、斎藤たかしなど |
部分一致 | %藤% | 斎藤、安藤、斎藤ちよこ、安藤えりかなど |
「%」以外にもずっと登場している記号がありますね。
select文の箇所で軽く触れましたが「*」について説明していきます。
先にも述べた通り「*」はすべてのカラムという意味です。
実際の現場に入ると、1つのテーブルに数十個のカラムが存在する場合があります。そんな時、すべてのカラムから情報をとってくると自分が欲しい情報がどこかわかりにくくなってしまいますし、画面に入りきりません。
そんな時は、「*」の場所を欲しいカラム名に変更することで表示を絞ることができます。
INSERT
次は、Recordを新たに追加してみましょう。INSERTを使います。INSERTの文法は
INSERT INTO テーブル名 (カラム名, カラム名) VALUES (追加するデータ, 追加するデータ);
下記SQL文を見てください。これは「nameカラムに”田村浩二”」「passカラムに”66huhu”」というRecordを追加するという命令です。
insert into users (name, pass) values ("田村浩二", "66huhu");
「Query OK」とでたら成功しています。select文を打って確認してみてください。
UPDATE
次はRecordの更新をします。UPDATEを使います。UPDATEの文法は
UPDATE テーブル名 SET カラム名 = “更新する値” where id = 5;
下記SQLはidが5のレコードのpassカラムを”99gugu”に更新するという命令になります。
update users set pass = "99gugu" where id = 5;
UPDATEを使用する時は更新したいRecordを「WHERE」で指定するようにしましょう。
忘れるとすべてのRecordが更新されてしまします。
ここまでで紹介した、「SELECT」「INSERT」「UPDATE」の3つは調べなくてもコマンドが打てるよう何度も繰り返し、練習しましょう。
現場で必ず必要になる知識です。
インデックス
もし先ほど作成したusersテーブルに1万件のデータが入っており、検索結果を表示するのが遅いとなったとき、インデックスを設定します。
インデックスはデータが膨大で処理速度が遅いときに使用しますので、データが少ない場合は使用する必要はありません。
また、必ずしも処理速度が短縮されるとも限りません。
現段階では、インデックスという言葉を覚えておけばいいでしょう。
インデックスを設定したりすることをDBのチューニングと呼ぶので興味のある人は調べてみてもいいでしょう。
JOIN
JOINとは複数のテーブルをくっつけて、両方のテーブルから情報を取得する際に利用する。
JOINには、内部結合(inner join)と外部結合(outer join)がある。
内部結合(inner join)
select * from テーブル名 inner join テーブル名 on 左のテーブルのカラム名 = 右のテーブルのカラム名;
外部結合(outer join)
select * from テーブル名 right outer join テーブル名 on 左のテーブルのカラム名 = 右のテーブルのカラム名;
select * from テーブル名 left outer join テーブル名 on 左のテーブルのカラム名 = 右のテーブルのカラム名;
実際にJOINを使ってみましょう。
歌手名と曲名のテーブルを作成し、情報を取得してみます。それぞれ2つのテーブルは以下です。
内部結合の結果
外部結合の結果
left outer join
right outer join
それぞれの結果の違いについて見比べてみましょう。
集計関数
データベースのレコードの平均値や、合計値、最大値などを計算できる関数
・SUM() 合計値
・AVG() 平均値
・MAX() 最大値
・MIN() 最小値
・COUNT() 個数
先ほどのartistsテーブを使って、レコードの件数をカウントしてみましょう。
select count(id) from artists;
上記のようにレコードの数を数えて表示してくれました。
サブクエリ
サブクエリとはSQL文の内部で入れ子になっているSQL文のことです。
上記のようなテーブルがあったして、売り上げが最大値のレコードを取得したい場合、どのようなSQLを打ち込む必要があるでしょうか?
1)集計関数を使用して最大値を求める。
select max(salse) from sales;
2)salesの最大値は150ということがわかりました。
select * from salse where salse = 150;
とすれば売り上げが最大値のレコードが取得できそうですが、求めたいレコードを表示するために2つのSQLを実行してますね。
サブクエリを使うと1つのSQLでいきなり求めたいレコードを取得できます。
select * from sales where salse = (select max(salse) from salse);
最初に2つのSQLに分けて結果を取得するやり方を行いましたが、サブクエリでも同じことを行ってます。
まずselect max(sales) from salesを実行し、150という値を求め、
select * from salse where sales = 150 を実行するという流れは同じです。
練習問題
集計関数とサブクエリについて練習問題を用意したので、試してみましょう。なお課題提出は不要です。
以下のコードを実行し、問題に取り組みましょう。
CREATE TABLE `users_lesson` (`id` int AUTO_INCREMENT PRIMARY KEY,`name` varchar(16),`sales` varchar(8)) ; USE users; insert into users_lesson (name,sales) values ("矢島金太郎",100),("島耕作",250),("野原ヒロシ",50),("只野仁",80),("浜崎伝助",200),("磯野波平",170);
問題)作成したテーブルを使ってsalesの平均を求め、salesがその平均の値以上のレコードを取得してみましょう!
回答は以下です。