mysqlデータベースとinformation_schemaデータベースは、MySQLの動作には欠かせないデータベースですので、間違って削除などしないようにしてください。ユーザーのテーブル等もこのデータベースには作成しないようにしてください |
ホスト名とは、データベースにアクセスするコンピュータの名前を表すものです。今回の例では「localhost」を指定していますので、MySQLデータベースサーバーと同じコンピュータからアクセスすることを意味します。 |
型 | データの範囲 |
---|---|
INT | -2147483648から2147483647 (符号無しの場合0から4294967295) |
型 | データの範囲 |
---|---|
CHAR | 0から255文字 |
VARCHAR | 0から65535バイト |
型 | データの範囲 |
---|---|
DATE | '1000-01-01' から '9999-12-31' |
DATETIME | '1000-01-01 00:00:00' から '9999-12-31 23:59:59' |
型 | データの範囲 |
---|---|
TINYINT | -128から127 (符号無しの場合0から255) |
SMALLINT | -32768から32767 (符号無しの場合0から65535) |
MEDIUMINT | -8388608から8388607 (符号無しの場合0から16777215) |
BIGINT | -9223372036854775808から9223372036854775807 |
型 | データの範囲 |
---|---|
FLOAT | -3.402823466E+38 から -1.175494351E-38
0 1.175494351E-38 から 3.402823466E+38 |
DOUBLE | -1.7976931348623157E+308 から -2.2250738585072014E-308
0 2.2250738585072014E-308 から 1.7976931348623157E+308 |
型 | データの範囲 |
---|---|
TIMESTAMP | '1970-01-01 00:00:01' から '2037-12-31 23:59:59' |
TIME | '-838:59:59' から '838:59:59' |
YEAR | 1901 から 2155、そして 0000 |
型 | データの範囲 |
---|---|
BINARY | 0から255文字 |
VARBINARY | 0から65535バイト |
型 | データの範囲 |
---|---|
TINYBLOB | 最長255 (2の8乗 - 1) バイト |
BLOB | 最長65,535 (2の16乗 - 1) バイト |
MEDIUMBLOB | 最長65,535 (2の16乗 - 1) バイト |
LONGBLOB | 最長4,294,967,295、または4GB (2の32乗 - 1) バイト |
型 | データの範囲 |
---|---|
TINYTEXT | 最長255 (2の8乗 - 1) バイト |
TEXT | 最長65,535 (2の16乗 - 1) バイト |
MEDIUMTEXT | 最長65,535 (2の16乗 - 1) バイト |
LONGTEXT | 最長4,294,967,295、または4GB (2の32乗 - 1) バイト |
ポイント:主キーのルール
①重複する値を取らない ②空の状態は許されない |
属性 | 意味 |
---|---|
NOT NULL | 空のデータを許さない |
UNIQUE | データの重複を許さない |
DEFAULT | データが未指定の場合、指定した値を自動的に入力する |
AUTO_INCREMENT | 自動的に連番を入力する |
項目 | データのタイプ | 列名 | データ型 | 属性 |
---|---|---|---|---|
ISBN番号 | 文字列(最大半角20文字/全角10文字) | isbn | VARCHAR(20) | PRIMARY KEY |
タイトル | 文字列(最大半角100文字/全角50文字) | title | VARCHAR(100) | |
価格 | 数値(整数) | price | INT | NOT NULL |
isbn | title | price |
---|---|---|
00001 | SQL入門テキスト | 1050 |
isbn | title | price |
---|---|---|
00002 | SQL基礎テキスト | 2300 |
00003 | Java基礎テキスト | 1050 |
00004 | PHP基礎テキスト | 2100 |
00005 | Java Struts基礎テキスト | 3800 |
演算子 | 使用例 | 意味 |
---|---|---|
= | a = b | aとbが等しい |
<> | a <> b | aとbが等しくない |
< | a < b | aがbより少ない |
> | a > b | aがbより大きい |
<= | a <= b | aがb以下 |
>= | a >= b | aがb以上 |
isbn | title | Price |
---|---|---|
00001 | SQL入門テキスト | 1050 |
00002 | SQL基礎テキスト | 2300 |
00003 | Java基礎テキスト | 1050 |
00004 | PHP基礎テキスト | 2100 |
00005 | Java Struts基礎テキスト | 3800 |
isbn | title | Price |
---|---|---|
00001 | Android基礎テキスト | 2000 |
00002 | Android基礎テキスト | 2000 |
00003 | Android基礎テキスト | 2000 |
00004 | Android基礎テキスト | 2000 |
00005 | Android基礎テキスト | 2000 |
isbn | title | Price |
---|---|---|
00001 | SQL入門テキスト | 1050 |
00002 | SQL基礎テキスト | 3000 |
00003 | Java基礎テキスト | 1050 |
00004 | PHP基礎テキスト | 3000 |
00005 | Android基礎テキスト | 3000 |
isbn | title | Price |
---|---|---|
00001 | SQL入門テキスト | 1050 |
00002 | SQL基礎テキスト | 2300 |
00003 | Java基礎テキスト | 1050 |
00004 | PHP基礎テキスト | 2100 |
00005 | Java Struts基礎テキスト | 3800 |
isbn | title | Price |
---|---|---|
00001 | SQL入門テキスト | 1050 |
00002 | SQL基礎テキスト | 2300 |
00003 | Java基礎テキスト | 1050 |
00004 | PHP基礎テキスト | 2100 |
00005 | Java Struts基礎テキスト | 3800 |
isbn | title | Price |
---|
isbn | title | Price |
---|---|---|
00001 | SQL入門テキスト | 1050 |
00003 | Java基礎テキスト | 1050 |
isbn | title | Price |
---|---|---|
00001 | SQL入門テキスト | 1050 |
00002 | SQL基礎テキスト | 2300 |
00003 | Java基礎テキスト | 1050 |
00004 | PHP基礎テキスト | 2100 |
00005 | Java Struts基礎テキスト | 3800 |
isbn | title | Price |
---|---|---|
00001 | SQL入門テキスト | 1050 |
00002 | SQL基礎テキスト | 2300 |
00003 | Java基礎テキスト | 1050 |
00004 | PHP基礎テキスト | 2100 |
00005 | Java Struts基礎テキスト | 3800 |
isbn | title | price |
---|---|---|
00006 | Android基礎テキスト | 2000 |
isbn | title | price |
---|---|---|
00007 | NULL | 2800 |
NULL(ヌルまたはナルと読みます)とは何でしょうか?
NULLとは、テーブルの列に値が何も設定されていない状態を指します。 これは、0でも空文字(長さが0の文字)でもスペースでもありません。 MySQLクライアントでは、表示上「NULL」となります。 試しに「bookinfo」に、書籍タイトルが0、空文字、スペースのデータを登録して、違いを見てみましょう。 ※操作はしないでください。 データを見てみます。 SELECT * FROM bookinfo WHERE ISBN BETWEEN '00007' AND '00010'; 0も空文字もスペースも、(表示上見えなくても)値は設定されている状態なのですが、NULLは実際には値が何もない状態ですので、注意が必要です。 |
演算子 | 使用例 | 意味 |
---|---|---|
+ | a+b | aとbを足す |
- | a-b | aからbを引く |
* | a*b | aとbをかける |
/ | a/b | aをbで割る |
% | a%b | aをbで割った余り |
isbn | title | price |
---|---|---|
00001 | SQL入門テキスト | 1050 * 1.05 = 1102.50 |
00002 | SQL基礎テキスト | 2300 * 1.05 = 2415.00 |
00003 | Java基礎テキスト | 1050 * 1.05 = 1102.50 |
00004 | PHP基礎テキスト | 2100 * 1.05 = 2205.00 |
00005 | Java Struts基礎テキスト | 3800 * 1.05 = 3990.00 |
00006 | Android基礎テキスト | 2000 * 1.05 = 2100.00 |
00007 | NULL | 2800 * 1.05 = 2940.00 |
「WHERE」句で計算した結果は、「SELECT」句の検索結果とは無関係なので注意しましょう。
計算結果表示させたい場合は、「SELECT」句でも計算する必要があります。 |
関数名 | 機能 |
---|---|
AVG | 平均値を求める |
SUM | 合計を求める |
COUNT | 行の数を求める |
MAX | 最高値を求める |
MIN | 最低値を求める |
上記の例のように、MIN関数では同一の最低値が複数あっても戻り値は一つ(最低値)です。これは、MAX関数も同様です。 |
* 新規テーブルの作成
下表のテーブル「orderinfo」テーブルを作成してください。 テーブル名:「orderinfo」
orderno INTEGER AUTO_INCREMENT PRIMARY KEY, user VARCHAR(20), isbn VARCHAR(20), quantity INTEGER, date date )ENGINE=InnoDB; * 新規テーブルへのデータ登録 次に下記のデータを登録してください。
INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00001',2,'2010-07-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00001',1,'2010-08-02'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00001',3,'2010-07-17'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00002',1,'2010-08-22'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00002',3,'2010-09-03'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00002',1,'2010-07-25'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00003',4,'2010-07-30'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00003',1,'2010-08-12'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00003',1,'2010-08-21'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00004',2,'2010-09-14'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00004',3,'2010-07-11'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00004',6,'2010-07-19'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00004',1,'2010-08-19'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00005',4,'2010-09-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00005',2,'2010-08-22'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00005',1,'2010-07-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00006',1,'2010-07-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('osaki','00006',1,'2010-08-20'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00006',3,'2010-07-30'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00006',2,'2010-09-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00006',6,'2010-09-30'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00007',1,'2010-07-11'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00007',3,'2010-07-21'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00007',2,'2010-08-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00007',1,'2010-07-02'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00007',4,'2010-07-25'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00007',1,'2010-08-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00001',1,'2010-08-14'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00002',1,'2010-07-15'); * データの確認 データの中身を確認してみましょう。 SELECT * FROM orderinfo; |
「GROUP BY」句と似たような働きをする句に、「DISTINCT」句があります。
「DISTINCT」句は、検索結果の重複を排除する機能があります。 書式は下記のようになります。 SELECT DISTINCT 列名 FROM テーブル名; 先程「orderinfo」をuser列でグルーピング化したように、user列の重複を排除するには SELECT DISTINCT user FROM orderinfo; となります。 但し「DISTINCT」句は重複を排除するためのものであり、「GROUP BY」句のように、集計関数と同時に使ってグループごとの集計を取るような使い方はできません。 |
グループ化キーは複数指定することもできます。
下記のようになります。 SELECT グループ化キー1, グループ化キー2・・・,集計関数(列名) FROM テーブル名 GROUP BY グループ化キー1, グループ化キー2・・・; 例えば「orderinfo」で、ユーザーごと、ISBN番号ごとの注文数合計をとる場合は、 SELECT user,isbn,SUM(quantity) FROM orderinfo GROUP BY user,isbn; となります。 また、グループ化キーは「SELECT」句に必ず含めなければならないわけではありません。 例えば下記のように、ユーザーごとの注文数量合計を出す場合に、ユーザー名を出さないように書いても、SQLの構文上はエラーにはなりません。 SELECT SUM(quantity) FROM orderinfo GROUP BY user; 但し結果を見てもわかるように、どのデータの集計結果かはわからないので、特殊な使用例と言えるでしょう。 |
最後の行は値がないので、表示上は「NULL」となります。 |
最後の行は値がないので、文字列連結の対象外になります。 |
最後の行は値がないので、文字列抽出の対象外になります。 |
MySQLのSELECT文では、参照するテーブルがなく、単にデータを表示したいような場合は「FROM」句を省略できます。
例えば、単に「A」という文字列を表示したい場合は、 SELECT 'A'; と記述できます。 |
その他の関数には、下記のようなものがあります。
|
orderno | user | isbn | title | price | quantity | date |
---|---|---|---|---|---|---|
1 | kanda | 00001 | SQL入門テキスト | 1050 | 1 | 2010-07-01 |
5 | kanda | 00002 | SQL基礎テキスト | 2300 | 1 | 2010-08-22 |
isbn | title | price |
---|---|---|
00001 | SQL入門テキスト | 1050 |
00002 | SQL基礎テキスト | 2300 |
00003 | Java基礎テキスト | 1050 |
00004 | PHP基礎テキスト | 2100 |
00005 | Java Struts基礎テキスト | 3800 |
00006 | Android基礎テキスト | 2000 |
00007 | NULL | 2800 |
* 「orderinfo」テーブルの再作成
下表のテーブル「orderinfo」テーブルのisbn列に、「bookinfo」のisbn列を参照する外部キー制約をつけてテーブルを再作成してください。 DROP TABLE orderinfo; CREATE TABLE orderinfo ( orderno INTEGER AUTO_INCREMENT PRIMARY KEY, user VARCHAR(20), isbn VARCHAR(20), quantity INTEGER, date date, FOREIGN KEY (isbn) REFERENCES bookinfo(isbn) )ENGINE=InnoDB; * 「orderinfo」テーブルのへのデータ登録 注文データを再登録してください。 INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00001',1,'2010-07-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00001',2,'2010-07-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00001',1,'2010-08-02'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00001',3,'2010-07-17'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00002',1,'2010-08-22'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00002',3,'2010-09-03'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00002',1,'2010-07-25'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00003',4,'2010-07-30'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00003',1,'2010-08-12'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00003',1,'2010-08-21'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00004',2,'2010-09-14'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00004',3,'2010-07-11'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00004',6,'2010-07-19'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00004',1,'2010-08-19'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00005',4,'2010-09-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00005',2,'2010-08-22'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00005',1,'2010-07-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00006',1,'2010-07-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('osaki','00006',1,'2010-08-20'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00006',3,'2010-07-30'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00006',2,'2010-09-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00006',6,'2010-09-30'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00007',1,'2010-07-11'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00007',3,'2010-07-21'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00007',2,'2010-08-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00007',1,'2010-07-02'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00007',4,'2010-07-25'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00007',1,'2010-08-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00001',1,'2010-08-14'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00002',1,'2010-07-15'); * データの確認 データの中身を確認してみましょう。 SELECT * FROM orderinfo; |
orderno | user | isbn | quantity | date |
---|---|---|---|---|
31 | kanda | 0008 | 1 | 2010-07-01 |
* 「orderinfo」テーブルの再作成
「orderinfo」テーブルの外部キー制約に、「ON UPDATE CASCADE」オプションと「ON DELETE CASCADE」オプションをつけてテーブルを再作成してください。 DROP TABLE orderinfo; CREATE TABLE orderinfo ( orderno INTEGER AUTO_INCREMENT PRIMARY KEY, user VARCHAR(20), isbn VARCHAR(20), quantity INTEGER, date date, FOREIGN KEY (isbn) REFERENCES bookinfo(isbn) ON UPDATE CASCADE ON DELETE CASCADE )ENGINE=InnoDB; * 「orderinfo」テーブルのへのデータ再登録 注文データを再登録してください。 INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00001',1,'2010-07-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00001',2,'2010-07-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00001',1,'2010-08-02'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00001',3,'2010-07-17'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00002',1,'2010-08-22'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00002',3,'2010-09-03'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00002',1,'2010-07-25'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00003',4,'2010-07-30'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00003',1,'2010-08-12'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00003',1,'2010-08-21'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00004',2,'2010-09-14'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00004',3,'2010-07-11'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00004',6,'2010-07-19'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00004',1,'2010-08-19'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00005',4,'2010-09-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00005',2,'2010-08-22'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00005',1,'2010-07-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00006',1,'2010-07-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('osaki','00006',1,'2010-08-20'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00006',3,'2010-07-30'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00006',2,'2010-09-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00006',6,'2010-09-30'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00007',1,'2010-07-11'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00007',3,'2010-07-21'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00007',2,'2010-08-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00007',1,'2010-07-02'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00007',4,'2010-07-25'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00007',1,'2010-08-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00001',1,'2010-08-14'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00002',1,'2010-07-15'); * データの確認 データの中身を確認してみましょう。 SELECT * FROM orderinfo; |
orderno | user | isbn | title | price | quantity | date |
---|---|---|---|---|---|---|
1 | kanda | 00001 | SQL入門テキスト | 1050 | 1 | 2010-07-01 |
5 | kanda | 00002 | SQL基礎テキスト | 2300 | 1 | 2010-08-22 |
テーブルを結合する場合の「SELECT」句では、「テーブル名.列名」という指定がルールになっていますが、片方のテーブルにしか存在しない列はテーブル名を省略することができます。
例えば「bookinfo」のtitle列とprice列、「orderinfo」のorderno列・user列・quantity列・date列は片方の列にしか存在しませんので、DDL文は下記のように書き換えることができます。 SELECT orderno,user,A.isbn,title,price,quantity,date FROM bookinfo A INNER JOIN orderinfo B ON A.isbn=B.isbn; |
* 「bookinfo」テーブルへの新規データ登録
「bookinfo」テーブルに下記のデータを登録してください。
INSERT INTO bookinfo(isbn,title,price) VALUES('00008','C++入門テキスト',2100); * 新規テーブルの作成 下表のテーブル「userinfo」を作成してください。 テーブル名「userinfo」
user VARCHAR(20) PRIMARY KEY, password VARCHAR(20), email VARCHAR(100) )ENGINE=InnoDB; * 新規テーブルへのデータ登録 「userinfo」下記のデータを登録してください。
INSERT INTO userinfo(user,password,email) VALUES('ebisu','ebisupass','ebisu@kanda-it-school.com'); INSERT INTO userinfo(user,password,email) VALUES('kanda','kandapass','kanda@kanda-it-school.com'); INSERT INTO userinfo(user,password,email) VALUES('meguro','meguropass','meguro@kanda-it-school.com'); INSERT INTO userinfo(user,password,email) VALUES('osaki','osakipass','osaki@kanda-it-school.com'); INSERT INTO userinfo(user,password,email) VALUES('shibuya','shibuyapass','shibuya@kanda-it-school.com'); INSERT INTO userinfo(user,password,email) VALUES('sugamo','sugamopass','sugamo@kanda-it-school.com'); INSERT INTO userinfo(user,password,email) VALUES('tamachi','tamachipass','tamachi@kanda-it-school.com'); INSERT INTO userinfo(user,password,email) VALUES('ueno','uenopass','ueno@kanda-it-school.com'); * データの確認 データを確認しておきましょう。 SELECT * FROM userinfo; * 「orderinfo」テーブルの再作成 「orderinfo」テーブルに「userinfo」テーブルへの外部キー制約を設定するためにデータとテーブルを再作成します。 外部キー制約は「orderinfo」テーブルのuser列に設定し、参照先は「userinfo」テーブルのuser列とします。 外部キー制約には、「ON UPDATE CASCADE」オプションと「ON DELETE CASCADE」オプションをつけてください。 DROP TABLE orderinfo; CREATE TABLE orderinfo ( orderno INTEGER AUTO_INCREMENT PRIMARY KEY, user VARCHAR(20), isbn VARCHAR(20), quantity INTEGER, date date, FOREIGN KEY (isbn) REFERENCES bookinfo(isbn) ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (user) REFERENCES userinfo(user) ON UPDATE CASCADE ON DELETE CASCADE )ENGINE=InnoDB; DROP TABLE orderinfo; * 「orderinfo」テーブルのへのデータ再登録 「orderinfo」のデータを再登録しておきましょう。 INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00001',1,'2010-07-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00001',2,'2010-07-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00001',1,'2010-08-02'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00001',3,'2010-07-17'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00002',1,'2010-08-22'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00002',3,'2010-09-03'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00002',1,'2010-07-25'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00003',4,'2010-07-30'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00003',1,'2010-08-12'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00003',1,'2010-08-21'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00004',2,'2010-09-14'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00004',3,'2010-07-11'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00004',6,'2010-07-19'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00004',1,'2010-08-19'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00005',4,'2010-09-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00005',2,'2010-08-22'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00005',1,'2010-07-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00006',1,'2010-07-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('osaki','00006',1,'2010-08-20'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00006',3,'2010-07-30'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00006',2,'2010-09-01'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('tamachi','00006',6,'2010-09-30'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00007',1,'2010-07-11'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('shibuya','00007',3,'2010-07-21'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('kanda','00007',2,'2010-08-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('meguro','00007',1,'2010-07-02'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('akiba','00007',4,'2010-07-25'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00007',1,'2010-08-15'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00001',1,'2010-08-14'); INSERT INTO orderinfo(user,isbn,quantity,date) VALUES('ueno','00002',1,'2010-07-15'); |
orderno | user | isbn | quantity | date |
---|---|---|---|---|
3 | akiba | 00001 | 1 | 2010-08-02 |
5 | kanda | 00002 | 1 | 2010-08-22 |
8 | meguro | 00003 | 4 | 2010-07-30 |
19 | osaki | 00006 | 1 | 2010-08-20 |
10 | shibuya | 00003 | 1 | 2010-08-21 |
22 | tamachi | 00006 | 6 | 2010-09-30 |
30 | ueno | 00002 | 1 | 2010-07-15 |
user | password | |
---|---|---|
akiba | akibapass | akiba@kanda-it-school.com |
ebisu | ebisupass | ebisu@kanda-it-school.com |
kanda | kandapass | kanda@kanda-it-school.com |
meguro | meguropass | meguro@kanda-it-school.com |
osaki | osakipass | osaki@kanda-it-school.com |
shibuya | shibuyapass | shibuya@kanda-it-school.com |
sugamo | sugamopass | sugamo@kanda-it-school.com |
tamachi | tamachipass | tamachi@kanda-it-school.com |
ueno | uenopass | ueno@kanda-it-school.com |
orderno | user | isbn | quantity | date | password | |
---|---|---|---|---|---|---|
3 | akiba | 00001 | 1 | 2010-08-02 | akibapass | akiba@kanda-it-school.com |
ebisupass | ebisu@kanda-it-school.com | |||||
5 | kanda | 00002 | 1 | 2010-08-22 | kandapass | kanda@kanda-it-school.com |
8 | meguro | 00003 | 4 | 2010-07-30 | meguropass | meguro@kanda-it-school.com |
19 | osaki | 00006 | 1 | 2010-08-20 | osakipass | osaki@kanda-it-school.com |
10 | shibuya | 00003 | 1 | 2010-08-21 | shibuyapass | shibuya@kanda-it-school.com |
sugamopass | sugamo@kanda-it-school.com | |||||
22 | tamachi | 00006 | 6 | 2010-09-30 | tamachipass | tamachi@kanda-it-school.com |
30 | ueno | 00002 | 1 | 2010-07-15 | uenopass | ueno@kanda-it-school.com |
左外部結合と右外部結合はどちらのテーブルを中心に取り出すかだけで本質的な違いはありません。
できるだけ統一して使うほうが、混乱が少ないでしょう。 |
テーブルの結合は2つだけに限定されるわけではありません。3つ以上のテーブルを結合することもできます。
「bookinfo」テーブル、「orderinfo」テーブル、「userinfo」テーブルの3テーブルを結合する場合を見てみましょう。 SELECT * FROM bookinfo A INNER JOIN orderinfo B ON A.isbn=B.isbn INNER JOIN userinfo C ON B.user=C.user ; 上記のように2番目のテーブル名に続けて「INNER JOIN」(「LEFT JOIN」「RIGHT JOIN」も可)を指定し、 さらに結合したいテーブル名と「ON」で結合条件を指定します。それ以上のテーブルを結合する場合もこれの繰り返しになります。 |
テーブルの結合はいままで解説した結合方法の他にも全結合、自己結合、非等価結合、クロス結合等様々な結合方法があります。
これらの結合方法は、本テキストの範囲を超えるため解説しませんが、興味のある方は専門の書籍等を参照してください。 |