以前の記事ではMySQLをphpMyAdminで操作する基本を解説しました。
しかし、実際これだけでは困ったことも多いです。例えば1つ前の血圧管理すると言っても、他の人のも管理するようになると都度その人にphpMyAdminを開いてもらって間違いなく入力してもらって…と言ったのは中々現実的ではありません。
もっとシンプルなUIが必要になってくると思います。
そうなると、phpMyAdminによらず、自分で何かツールを作り上げる事になります。
以前の記事
SQL
RDBではSQLというものを使ってデータベースを操作します。
SQLはStructured Query Languageの略と言われる事もあるようですが、特に何かの略と決まっているわけではないようです。
SQLはある程度リレーショナルモデルの考え方に則った構文でデータベース内のデータを検索したり、追加・変更したりと言った事ができる、プログラムのようなものです。
DBと連携するツールを作る際はツールでこのSQLを実行しデータを操作する事になります。
以下代表的な構文を解説します。
ただし、以下で解説するものはMySQLでのものです。
(※SQLはシステム毎にかなり方言が強く、基本は一緒ではあるものの使いまわしが効かない事が多いです…)
SELECT文
SELECT文はデータベース内の情報を検索する際に利用する構文です。
SELECT 取り出すカラム FROM 対象テーブル WHERE 検索条件 ORDER BY ソートする際の基準カラム LIMIT 取り出す際のオフセット, 取り出す件数 ;
ざっくりこのような形です。phpMyAdminで表示してみるとこのような文が上の方に書かれていると思います。
改行やらスペースで見やすくしていますが、別に改行なしで1行にばーと書いてしまっても問題はありません。ただ、読みにくいです。
では実例です。
- 血圧テーブルから
- 脈拍が100以上の行を
- 脈拍カラムの情報だけ取得したい
となると
SELECT pulse FROM blood_pressures WHERE pulse>=100 ;
と記述します。
SELECTの後に検索した行の内にデータとして欲しいカラムを記述し、FROMの後にはどのテーブルから欲しいのかを書いています。
WHEREの後には脈拍100以上という条件を書いています。
実際に試したいときはphpMyAdminのSQLタブから実行してみてください。
確かに取得されています。
脈拍だけではまったく意味が分からないので、脈拍が100以上の行の他の情報も取得します。
SELECT id, timing, pulse FROM blood_pressures WHERE pulse>=100 ;
idとtimingとpulseの3つを取得するようにしました。
ちなみに、もうすべてのカラムのデータが欲しいという場合は*を指定する事も可能です。
SELECT * FROM blood_pressures WHRE pulse >= 100 ;
この場合はテーブルが持つすべてのカラムの情報が取得できます。
余談「``」
余談ですが、phpMyAdminでSQLタブを開くと
SELECT * FROM `blood_pressures`;というよううに``(バッククォート、Shift+@で入力できます)で囲まれています。
これもMySQL特有の方言でテーブル名やカラム名をこれで囲むというルールになっています。
と言っても、別に囲まなくてもシステムがテーブル名やカラム名と判断できるなら問題ありません。
例えば、テーブル名をMySQL内で別な意味を持つ「select」や「from」や「int」といった名前にしている場合はシステムがそれは名前なのか、構文の一部か判断できない為``で囲んでやる必要があります。
他にも名前の中でスペースを含んでる場合も、どこからどこまでが名前か判断できない為囲ってやる必要があります。
-- 「select」という名前のテーブルから「from」というカラムの情報を取得する -- 条件は「last updated」というカラムが5/1以降のもの SELECT `from` FROM `select` WHERE `last updated`>='2016-05-01' ;
上記の例では``で囲まなければエラーが出てしまいます。
例えばPostgreSQLでは「””」で囲ったり、SQLServerでは「[]」で囲ったりとみんな違う為もし、別のDB触る際は注意が必要です。
UPDATE文
次はUPDATEに触れます。見てわかる通りこれは既存の行の値を変更する構文です。
UPDATE テーブル名 SET カラム名1=値, カラム名2=値 ... WHERE 条件 ;
このままです。
もし、WHEREを省略した場合は指定のテーブルのすべての行が変更されます。
また、WHEREの条件が作った人の思った通りかどうかも勿論システムからはわかりませんの。間違った条件でも構文が正しければ更新されてしまうので、条件が仕様に合致してるかはしっかり確認する必要があります。
これも実際の例を出します。
- 28日(id=1)の最高血圧が実は115の打ち間違いだった
UPDATE blood_pressures SET high=115 WHERE id=1 ;
実行してみると110から115に更新されているはずです。
INSERT文
次も名前のとおりです。
この構文では行を追加します。基本的には1度に1行ずつしか追加できません。
INSERT INTO テーブル名 (カラム1, カラム2) VALUES (カラム1に設定する値, カラム2に設定する値);
カラムでは、初期値が設定されているカラムを省略できます。もちろんその場合は初期値が設定されます。
また、カラムと設定する値は順番を合わせる必要があります。
では血圧テーブルに追加してみます。
INSERT INTO blood_pressures (timing, high, low, pulse) VALUES ('2016-05-31 09:00:00', 105, 90, 80) ;
idは自動採番なので省略しています。実行してみると、行が1つ増えていると思います。
DELETE文
これは行を削除する構文です。UPDATEと似たような感じです。
DELETE FROM テーブル名 WHERE 条件 ;
条件に合致する行が消えます。UPDATE同様WHEREを省略したらすべての行が消えますし、間違った条件を設定してしまっても、作った人の気持ちを汲み取ってくれず間違ったまま実行されます。
少し発展
基本操作を解説しましたが、少し発展させます。
計算式
SELECT文のカラムの指定や、WHEREの条件では計算式が使えます。
例として、最高血圧と最低血圧の平均を取得するようにします。(この計算に意味があるかは置いておいて・・・)
SELECT timing, (high+low)/2 FROM blood_pressures ;
実行すると
出ました。
同様にWHEREにも計算式が使えます。
今度は平均が100以上のものを取得してみます。28日と29日の分が取得できれば成功ですね。
SELECT * FROM blood_pressures WHERE (high+low)/2>=100 ;
無事検索できました。
統計関数
いくらか行の平均などの統計をとることが出来ます。
この辺は少しややこしいルールがあったりしますので基本を触れるだけにします。
(詳しい事が知りたい場合はGROUP BYで調べてみてください。)
COUNT
条件に合致する行の件数を取得できます。
SELECT COUNT(*) FROM blood_pressures WHERE (high+low)/2>=100 ;
2が取得できます。
SUM
条件に合致する行の合算を取得できます。
SELECT SUM(high) FROM blood_pressures WHERE (high+low)/2>=100 ;
これは条件に合致する行のhighカラムの値の合計と言う事で、115+120=235が取得できます。
AVG
これは平均です。
SELECT AVG(high) FROM blood_pressures WHERE (high+low)/2>=100 ;
115と120の平均で117.5が取得できます。
MAX、MIN
それぞれ合致する行の内の最大と最小を取得できます。
SELECT MAX(high), MIN(high) FROM blood_pressures ;
120と100が取得できます。
次の記事ではツールから実際にSQL文を使ってデータベースを操作してみます。