今日からデータベース。
目次
phpMyAdminを利用したデータベースの作成
前に訓練とは関係なくphpMyAdminをアップグレードしたわけですが今回はデータベース作ります。
とりあえずログインします。
xamppだとコントロールパネルからMySQLのAdminを叩く。
素直にブラウザでhttp://localhost/phpmyadmin/を叩いてもOK。
何も設定していなければ
ユーザー名:root
パスワード:未設定
のはずなのでパスワード適当入力で入れるはず。
ホントはセキュリティ上問題なのでパスワードは設定しておきましょう。
ログインしたら「データベース」タブをクリック。
左の窓にDB名、右の照合順序はutf8_general_ciを選択して作成をクリック。
これだけでデータベースが作成される。
データベースユーザーの作成
作ったデータベースを左のDB一覧から選択。
続いて「特権」タブをクリック。
ログイン情報
ユーザー名:好きな名前
ホスト:今回はローカルサーバなのでプルダウンから「ローカル」を選択。すると自動でlocalhostが挿入される。
パスワード:好きなパスワード
もう一度入力してください:言われたとおりにもう一度好きなパスワードを入力してください
パスワードを生成する:触らない
ユーザー専用データベース
「データベース “データベース名” への全ての特権を与える 」のみチェック
グローバル特権
すべてのチェックを外す
全て設定したら「実行」します。
終わったらログアウトして、設定したユーザー名とパスワードでログインしてみましょう。
うまく出来ていればログインできます。
rootでログインした時より権限が制限されているのが確認出来ると思います。
アップグレード後に新規ユーザーを使うと
レコードが見れなかったり、テーブル作れなかったり結構散々な目に遭います。
これも「環境保管領域の設定」の問題です。
この問題を解決するために作ったphpmyadminテーブルの閲覧権限が無いために新規ユーザーは散々な目に遭います。
なので新規ユーザーにも権限を割り振ってあげましょう。
rootでログインして、「ユーザー」タブをクリック。
新規ユーザーの「特権を編集」を選択 > 「データベースに固有の特権」項目「Add privileges on the following database:」のプルダウンからphpmyadminを選択 > 「データベースに固有の特権」「データ」項目を全てチェック(他のはチェックしても為にならないのでつけない) > 実行
これで新規ユーザーでの各種エラーが解消されると思います。
毎回アカウント切る度に権限設定しなきゃならんくて面倒だがな!HAHAHA!!!!orz
テーブルの作成
「構造」タブを開くと
「このデータベースにはテーブルがありません。」とありがたいお言葉をいただけるので、
名前:好きなテーブル名
カラム数:必要なカラム数(ID、名前、メールアドレス、住所などなど必要項目に応じる)
を入力して「実行」する。
これだけ。
カラムの設定
引き続きカラムの設定画面が出るので、
名前:IDとか必要項目の名前
データ型:入るデータの型。IDならINT…などなどプルダウンに大まかな分類があるのでそれを目安にするとよいかも。
長さ:格納するデータの長さを制限する場合は入れておく
デフォルト値:入力が無かった場合にデフォルトで入れておく値。例えばタイトルが入ってなかったら「無題」を出したい場合は「ユーザー定義」を選んで無題と入力しておけばOK。
NULL:チェックしておけばNULLを許可するので入力情報が無くてもOKになる。
インデックス:メインのキーにするカラム(大体はIDとか)のみ「PRIMARY」にする。
A/I:オートインクリメント(自動連番)のチェック。自動的にIDが大きくなっていくようにしたい場合はチェックする。大体はIDをチェックする。
設定が済んだら「保存する」をクリック。
レコードの挿入
そのままpMAをつかってテーブルにレコードを登録してみる。
「挿入」タブをクリック。
IDのカラムなどはA/Iを設定しているので空に。
「値」だけ入れ終わったら「実行する」をクリック。
二重に入力欄が出ているけれどとりあえず上だけ入力して上の「実行する」をクリックしておけばOK。
削除やら編集やらはレコード表示すれば分かるので割愛。
SQLの基本
SQLとは、データベースを操作するための言語。
SHOW DATABASES;
既存データベースの一覧を表示する。
pMAだと適当なテーブルから「SQL」タブを選択して「SHOW DATABASES;」を入力して実行すればよい。
うまくいけば一覧が表示される。
特徴
- 大文字小文字の区別がない
- キーワードの区切りを空白で表す
- 命令はセミコロンで閉じる
- 識別子はバッククォートで囲んでもよい(作法的には囲むべき)
SQLによるレコードの登録
INSERT INTO
データの挿入。
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3);
といった感じでテーブル名 (フィールド名) VALUES(値);と入れてやる。
pMAだとSQLタブでINSERT選ぶと値以外全部用意してくれちゃう。
文字列や日付はシングルクォートで囲むこと。
INSERT INTO schedule
(date
, time
, memo
) VALUES (‘2012-10-31′,’19:00:00′,’Aさんと待ち合わせ’);
複数レコードを入れる場合は、
1 2 3 4 |
INSERT INTO `schedule`(`date`, `time`, `memo`) VALUES ('2012-10-31','19:00:00','Aさんと待ち合わせ'), ('2012-10-31','19:00:00','Aさんと待ち合わせ'), ('2012-10-31','19:00:00','Aさんと待ち合わせ'); |
って感じでカンマ区切りで入れてやればOK。
値の変更
UPDATE
存在するレコードデータの更新。
UPDATE items,month SET items.price=month.price WHERE items.id=month.id;
UPDATE テーブル名 SET フィールド名=値 WHERE 条件式;
items.idがmonth.idと等しいレコードの値を更新する。
条件式は省略できるが、省略すると無差別に全てのレコードの値が置き換わってしまうので注意。超危険。
これもpMAは用意しちゃってる。
レコードの削除
DELETE
存在するレコードの削除。
DELETE FROM somelog WHERE user = 'jcole';
DELETE FROM テーブル名 WHERE 条件式;
テーブルsomelog内でuserがjcoleのレコードを削除する。
これも条件式を省略できるがレコード全削除になってしまうので注意。
これもpMAは用意しちゃっt(ry
データを取り出す
SELECT
SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 WHERE t1.name = t2.name;
SELECT フィールド名 FROM テーブル名 WHERE 条件式
条件式は省略できる。省略すると全てのレコードを表示する。
フィールド名はアスタリスク(*)を指定すれば全てのフィールドの値を取り出せる。
演算子について
比較演算子
JavaやPHPと違い「===」は「=」である。
その他に特徴的な演算子で
- BETWEEN X AND Y
- X~Yの範囲に含まれるか
- IN (X, Y, Z)
- X,Y,Zのいずれかである
- IS NULL
- 値がNULLであるか
- LIKE
- 指定されたパターンに一致するか。
がある。
全てNOTをつけることで否定になる
ただしIS NULLはIS NOT NULLと間に挟む。
LIKEはワイルドカードを含めなければならないため、比較対象を%検索語,検索語%,%検索語%のどれかにする必要がある。
論理演算子
JavaやPHPと違い、「||」は「OR」、「&&」は「AND」と書く。
データを並べ替える
ORDER BY
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
SERECT フィールド名 FROM テーブル名 ORDER BY ソート式
ソート式は例に倣うとkey_part1というフィールドを降順ソートして、同じ値のレコードがあったらkey_part2フィールドで昇順ソートしなさい。といった感じ。
データの集計
GROUP BY
1 2 3 |
SELECT student.student_name,COUNT(*) -> FROM student,course -> GROUP BY student_name; |
SELECT フィールド名,集計式(集計関数COUNT) FROM テーブル名 GROUP BY グループキー
student_nameフィールドの値が等しい物がグループ化される。COUNT(*)で値が同一のレコード数を数えるフィールドを用意している。
他に集計関数としてAVG(フィールド名),MAX(フィールド名),MIN(フィールド名),SUM(フィールド名)などがある。
詳しくはリファレンスでどうぞ。
これPHPじゃなくね・・・・?的な!みたいな!違うくさくね!ですけどみたいな!
ごめん。適当。
コメント
No Trackbacks.