クロピグログ

職業訓練で学んだことまとめ

【DB授業二日目】MariaDB

データベースで昨日のテーブル表示

●まずMariaDBクライアントプログラム起動

mysql -u root -p

 

●データベース領域の変更

USE lesson

 

●テーブル表示

SELECT * FROM stationery;

 

 

条件をつけて検索する WHERE

●goods内のitemが「米」を表示

SELECT * FROM goods WHERE item='米';
+----+------+-------+
| id | item | price |
+----+------+-------+
| 6 | 米 | 2000 |
+----+------+-------+

 

●goods内のIDの3以上を表示

SELECT * FROM goods WHERE id>=3;
+----+---------------+-------+
| id | item | price |
+----+---------------+-------+
| 3 | カフェ'チョコ | 150 |
| 4 | アボカド | 260 |
| 5 | チョコパン | 240 |
| 6 | 米 | 2000 |
| 7 | たまねぎ | 0 |
| 8 | NULL | 9800 |
+----+---------------+-------+

 

●goods内のIDの6以外を表示

1.パターン1

 SELECT * FROM goods WHERE id!=6;
+----+----------------------+-------+
| id | item | price |
+----+----------------------+-------+
| 1 | おいしい水 | 190 |
| 2 | ポテトチップスバター | 120 |
| 3 | カフェ'チョコ | 150 |
| 4 | アボカド | 260 |
| 5 | チョコパン | 240 |
| 7 | たまねぎ | 0 |
| 8 | NULL | 9800 |
+----+----------------------+-------+

 

2.パターン2

SELECT * FROM goods WHERE id<>6;
+----+----------------------+-------+
| id | item | price |
+----+----------------------+-------+
| 1 | おいしい水 | 190 |
| 2 | ポテトチップスバター | 120 |
| 3 | カフェ'チョコ | 150 |
| 4 | アボカド | 260 |
| 5 | チョコパン | 240 |
| 7 | たまねぎ | 0 |
| 8 | NULL | 9800 |
+----+----------------------+-------+

 

●goods内のitemが「NULL」を表示

SELECT * FROM goods WHERE item IS NULL;
+----+------+-------+
| id | item | price |
+----+------+-------+
| 8 | NULL | 9800 |
+----+------+-------+

 

●goods内のitemが「NULL」じゃないものを表示

SELECT * FROM goods WHERE item IS NOT NULL;
+----+----------------------+-------+
| id | item | price |
+----+----------------------+-------+
| 1 | おいしい水 | 190 |
| 2 | ポテトチップスバター | 120 |
| 3 | カフェ'チョコ | 150 |
| 4 | アボカド | 260 |
| 5 | チョコパン | 240 |
| 6 | 米 | 2000 |
| 7 | たまねぎ | 0 |
+----+----------------------+-------+

 

範囲・条件を組み合わせ検索する

●BETWEEN:範囲

SELECT フィールド名 FROM テーブル名

WHERE フィールド名 BETWEEN 値 AND 値;

SELECT * FROM goods WHERE id BETWEEN 2 AND 5;

+----+----------------------+-------+
| id | item | price |
+----+----------------------+-------+
| 2 | ポテトチップスバター | 120 |
| 3 | カフェ'チョコ | 150 |
| 4 | アボカド | 260 |
| 5 | チョコパン | 240 |
+----+----------------------+-------+

 

●AND:複数の条件をすべて満たすレコードの検索

SELECT フィールド名 FROM テーブル名

WHERE 条件1 AND 条件2;

 SELECT * FROM goods WHERE id>=2 AND price<200;
+----+----------------------+-------+
| id | item | price |
+----+----------------------+-------+
| 2 | ポテトチップスバター | 120 |
| 3 | カフェ'チョコ | 150 |
| 7 | たまねぎ | 0 |
+----+----------------------+-------+

 

●OR:複数の条件のどれかを満たすレコードの検索

SELECT フィールド名 FROM テーブル名

WHERE 条件1 OR 条件2;

 SELECT * FROM goods WHERE id<2 OR price>=2000;
+----+------------+-------+
| id | item | price |
+----+------------+-------+
| 1 | おいしい水 | 190 |
| 6 | 米 | 2000 |
| 8 | NULL | 9800 |
+----+------------+-------+

 

・同じフィールドに対して複数の値指定

 SELECT * FROM goods WHERE id=1 OR id=2 OR id=6;

↓この書き方でもOK

 SELECT * FROM goods WHERE id IN(1,2,6);

 

●NOT:条件を反転させる

SELECT フィールド名 FROM テーブル名

WHERE NOT いままでの条件式;

SELECT * FROM goods WHERE NOT id BETWEEN 2 AND 6;

+----+------------+-------+
| id | item | price |
+----+------------+-------+
| 1 | おいしい水 | 190 |
| 7 | たまねぎ | 0 |
| 8 | NULL | 9800 |
+----+------------+-------+

 

問題8

1.価格が「150円」より安い商品とカフェ'チョコのレコードを表示しなさい

SELECT * FROM goods WHERE item='カフェ\'チョコ' OR price<150;
+----+----------------------+-------+
| id | item | price |
+----+----------------------+-------+
| 2 | ポテトチップスバター | 120 |
| 3 | カフェ'チョコ | 150 |
| 7 | たまねぎ | 0 |
+----+----------------------+-------+

 

2.id番号「3」以下、かつ価格が「150円」以上のレコードを表示しなさい

SELECT * FROM goods WHERE id<=3 AND price>=150;
+----+---------------+-------+
| id | item | price |
+----+---------------+-------+
| 1 | おいしい水 | 190 |
| 3 | カフェ'チョコ | 150 |
+----+---------------+-------+

 

3.商品名に値を入れ忘れているレコードと価格が「0」のレコードを表示しなさい

SELECT * FROM goods WHERE item IS NULL OR price=0;
+----+----------+-------+
| id | item | price |
+----+----------+-------+
| 7 | たまねぎ | 0 |
| 8 | NULL | 9800 |
+----+----------+-------+

 

部分一致検索する LIKE

SELECT フィールド名 FROM テーブル名

WHERE フィールド名 LIKE 部分一致検索文;

●任意の文字列をあらわす「%」

 

SELECT * FROM customer WHERE name LIKE '木村%';
+----+------------+---------+
| id | name | address |
+----+------------+---------+
| 3 | 木村大五郎 | 北海道 |
| 5 | 木村太郎 | 大阪府 |
+----+------------+---------+

SELECT * FROM customer WHERE address LIKE '%県';
+----+------------------+----------+
| id | name | address |
+----+------------------+----------+
| 2 | Shaquille O'Neal | 栃木県 |
| 6 | 佐々木美樹 | 和歌山県 |
+----+------------------+----------+

SELECT * FROM customer WHERE name LIKE '%木%';
+----+------------+----------+
| id | name | address |
+----+------------+----------+
| 3 | 木村大五郎 | 北海道 |
| 5 | 木村太郎 | 大阪府 |
| 6 | 佐々木美樹 | 和歌山県 |

+----+------------+----------+

 

●任意の1文字をあらわす「_」アンダースコア

SELECT * FROM customer WHERE name LIKE '木村_郎';
+----+----------+---------+
| id | name | address |
+----+----------+---------+
| 5 | 木村太郎 | 大阪府 |
+----+----------+---------+

 

●もし「木村_拓哉」という「_」アンダースコア入りの名前を検索するときは...

SELECT * FROM customer WHERE name LIKE '%\_%';

 

 

検索件数の制限 LIMIT

SELECT フィールド名 FROM テーブル名 LIMIT 件数件数;

●検索件数の指定

SELECT * FROM goods LIMIT 5;
+----+----------------------+-------+
| id | item | price |
+----+----------------------+-------+
| 1 | おいしい水 | 190 |
| 2 | ポテトチップスバター | 120 |
| 3 | カフェ'チョコ | 150 |
| 5 | チョコパン | 240 |
| 6 | 米 | 2000 |
+----+----------------------+-------+

 

●開始行と検索件数の指定

SELECT * FROM goods LIMIT 5,5;

+----+----------+-------+
| id | item | price |
+----+----------+-------+
| 7 | たまねぎ | 0 |
| 8 | NULL | 9800 |
+----+----------+-------+

※5レコード分表示したいが、今回の場合は実際に表示されるのは2行だけ

 

 

並び替え ORDER BY

●高い順

SELECT フィールド名 FROM テーブル名 ORDER BY フィールド名;

SELECT * FROM goods ORDER BY price;
+----+----------------------+-------+
| id | item | price |
+----+----------------------+-------+
| 7 | たまねぎ | 0 |
| 2 | ポテトチップスバター | 120 |
| 3 | カフェ'チョコ | 150 |
| 1 | おいしい水 | 190 |
| 5 | チョコパン | 240 |
| 6 | 米 | 2000 |
| 8 | NULL | 9800 |
+----+----------------------+-------+

 

●安い順

SELECT フィールド名 FROM テーブル名 ORDER BY フィールド名 DESC;

 SELECT * FROM goods ORDER BY price DESC;
+----+----------------------+-------+
| id | item | price |
+----+----------------------+-------+
| 8 | NULL | 9800 |
| 6 | 米 | 2000 |
| 5 | チョコパン | 240 |
| 1 | おいしい水 | 190 |
| 3 | カフェ'チョコ | 150 |
| 2 | ポテトチップスバター | 120 |
| 7 | たまねぎ | 0 |
+----+----------------------+-------+

 

◇問題

価格が500円以下の商品を安い順に表示しなさい

SELECT * FROM goods WHERE price<500 ORDER BY price DESC;
+----+----------------------+-------+
| id | item | price |
+----+----------------------+-------+
| 5 | チョコパン | 240 |
| 1 | おいしい水 | 190 |
| 3 | カフェ'チョコ | 150 |
| 2 | ポテトチップスバター | 120 |
| 7 | たまねぎ | 0 |
+----+----------------------+-------+

 

 

計算や集計

●合計値の出力

SELECT SUM(合計値を出力するフィールド名)  FROM テーブル名;

SELECT SUM(price) FROM goods;
+------------+
| SUM(price) |
+------------+
| 12500 |
+------------+

 

●平均値の出力

SELECT AVG(平均値を出力するフィールド名)  FROM テーブル名;

SELECT AVG(price) FROM goods;
+------------+
| AVG(price) |
+------------+
| 1785.7143 |
+------------+

 

●最大値の出力

SELECT MAX(最大値を出力するフィールド名)  FROM テーブル名;

SELECT MAX(price) FROM goods;
+------------+
| MAX(price) |
+------------+
| 9800 |
+------------+

 

●最小値の出力

SELECT MIN(最小値を出力するフィールド名)  FROM テーブル名;

SELECT MIN(price) FROM goods;
+------------+
| MIN(price) |
+------------+
| 0 |
+------------+

 

●該当件数取り出す

SELECT COUNT(該当件数を出力するフィールド名)  FROM テーブル名;

SELECT COUNT(id) FROM goods;
+-----------+
| COUNT(id) |
+-----------+
| 7 |
+-----------+

※NULL値は該当件数に含まれないので注意!

 

●フィールド名に別名つける

SELECT フィールド名 AS 別名 FROM テーブル名;

SELECT COUNT(id) AS total FROM goods;
+-------+
| total |
+-------+
| 7 |
+-------+

・わかりやすくするために別名つける

 

●問題9

「ポテトチップバターし」と「チョコパン」と「米」の値段の合計値をSUMを使って表示せよ。

SELECT SUM(price) FROM goods WHERE item='ポテトチップバターし' OR item='チョコパン' OR item='米';

これでもOK

SELECT SUM(price) FROM goods WHERE item In('ポテトチップバターし','チョコパン','米');
+------------+
| SUM(price) |
+------------+
| 2360 |
+------------+

 

●問題10

200円以下の商品の数を表示しなさい。なお、フィールド名は「sales_item」にすること。

SELECT COUNT(id) AS sales_item FROM goods WHERE price<200;
+------------+
| sales_item |
+------------+
| 4 |
+------------+

 

 

テーブルの構成を変更する ALTER TABLE

●ADD:フィールドの追加

ATLER TABLE テーブル名 ADD フィールド名 型 [DEFAULT 値];

ALTER TABLE goods ADD stock INT DEFAULT 0;

・「DEFAULT 0」を省略すると、「NULL」が入る

 

●MODIFY:フィールドのデータ型の変更

ATLER TABLE テーブル名 MODIFY フィールド名 新しい型;

ALTER TABLE goods MODIFY item CHAR(20) ;

・文字列型(char)から整数型(int)に変更するような場合も使えるが、格納できない値は切り捨てられるため基本使わない

・文字数増やしたりするときに基本的に使う

 

●CHANGE:フィールドとデータ型の変更

ATLER TABLE テーブル名 CHANGE 

旧フィールド名 新フィールド名 新データ型;

ALTER TABLE goods CHANGE

item item_new VARCHAR(255);

 

DROP:フィールドの削除

ATLER TABLE テーブル名 DROP フィールド名;

ALTER TABLE goods DROP stock;

 

●RENAME AS:テーブル名の変更

ATLER TABLE 旧テーブル名 RENAME AS 新テーブル名;

ALTER TABLE goods RENAME AS commodity;

 

 

リレーション

●テーブルを結びつけるためのフィールド

・商品管理テーブル

id item price maker
1 おいしい水 190 3
2 ポテトチップバターしょうゆ味 120 4
3 カフェ'チョコ 150 4
5 チョコパン 240 1
6 2000 2
7 たまねぎ 0 NULL
8 NULL 9800 NULL

 ・メーカー管理テーブル  

id company address tel
1 東京パン 東京都 03-0000-0000
2 宇都宮米店 栃木県 028-111-1111
3 札幌農場 北海道 01-222-2222
4 浦安製菓 千葉県 047-XXX-3333

 

 ・この二つを準備する

 

 ●JOIN:テーブルの結合(内部結合)

・書式1

SELECT フィールド名 FROM テーブル名1 JOIN テーブル名2 

ON テーブル1照合用フィールド名=テーブル2照合用フィールド名;

・書式2

SELECT フィールド名 FROM テーブル名1, テーブル名2 

WHERE テーブル1照合用フィールド名=テーブル2照合用フィールド名;

 SELECT * FROM commodity JOIN trader

ON maker = id;

↓こちらのほうがよい

 SELECT * FROM commodity JOIN trader

ON commodity.maker = trader.id;
+----+------------------------------+-------+-------+----+------------+---------+--------------+
| id | item | price | maker | id | company | address | tel |
+----+------------------------------+-------+-------+----+------------+---------+--------------+
| 1 | おいしい水 | 190 | 3 | 3 | 札幌農場 | 北海道 | 011-222-2222 |
| 2 | ポテトチップバターしょうゆ味 | 120 | 4 | 4 | 浦安製菓 | 千葉県 | 047-XXX-3333 |
| 3 | カフェ'チョコ | 150 | 4 | 4 | 浦安製菓 | 千葉県 | 047-XXX-3333 |
| 5 | チョコパン | 240 | 1 | 1 | 東京パン | 東京都 | 03-0000-0000 |
| 6 | 米 | 2000 | 2 | 2 | 宇都宮米店 | 栃木県 | 028-111-1111 |
+----+------------------------------+-------+-------+----+------------+---------+--------------+

 

※どのテーブルのフィールドかわかるようにするため

「テーブル名」+「.」+「フィールド名」でつないでおく

 

●テーブル名のショートカット

 SELECT * FROM commodity c JOIN trader t

ON c.maker = t.id;

・「commodity c」で「c」、「trader t」で「t」を短縮することを宣言して、そのあと使うときに短く使える

 

●LEFT JOIN:テーブルの結合(外部結合)

SELECT フィールド名 FROM テーブル名1 LIFT JOIN テーブル名2 

ON テーブル1照合用フィールド名=テーブル2照合用フィールド名;

SELECT * FROM commodity c LEFT JOIN trader t

ON c.maker = t.id;
+----+------------------------------+-------+-------+------+------------+---------+--------------+
| id | item | price | maker | id | company | address | tel |
+----+------------------------------+-------+-------+------+------------+---------+--------------+
| 1 | おいしい水 | 190 | 3 | 3 | 札幌農場 | 北海道 | 011-222-2222 |
| 2 | ポテトチップバターしょうゆ味 | 120 | 4 | 4 | 浦安製菓 | 千葉県 | 047-XXX-3333 |
| 3 | カフェ'チョコ | 150 | 4 | 4 | 浦安製菓 | 千葉県 | 047-XXX-3333 |
| 5 | チョコパン | 240 | 1 | 1 | 東京パン | 東京都 | 03-0000-0000 |
| 6 | 米 | 2000 | 2 | 2 | 宇都宮米店 | 栃木県 | 028-111-1111 |
| 7 | たまねぎ | 0 | NULL | NULL | NULL | NULL | NULL |
| 8 | NULL | 9800 | NULL | NULL | NULL | NULL | NULL |
+----+------------------------------+-------+-------+------+------------+---------+--------------+

 

●RIGHT JOIN:テーブルの結合(外部結合)

SELECT フィールド名 FROM テーブル名1 RIGHT JOIN テーブル名2 

ON テーブル1照合用フィールド名=テーブル2照合用フィールド名;

SELECT * FROM commodity c RIGHT JOIN trader t

ON c.maker = t.id;
+------+------------------------------+-------+-------+----+--------------+---------+--------------+
| id | item | price | maker | id | company | address | tel |
+------+------------------------------+-------+-------+----+--------------+---------+--------------+
| 1 | おいしい水 | 190 | 3 | 3 | 札幌農場 | 北海道 | 011-222-2222 |
| 2 | ポテトチップバターしょうゆ味 | 120 | 4 | 4 | 浦安製菓 | 千葉県 | 047-XXX-3333 |
| 3 | カフェ'チョコ | 150 | 4 | 4 | 浦安製菓 | 千葉県 | 047-XXX-3333 |
| 5 | チョコパン | 240 | 1 | 1 | 東京パン | 東京都 | 03-0000-0000 |
| 6 | 米 | 2000 | 2 | 2 | 宇都宮米店 | 栃木県 | 028-111-1111 |
| NULL | NULL | NULL | NULL | 5 | ハイサイパン | 沖縄県 | 098-444-XXXX |
| NULL | NULL | NULL | NULL | 6 | 出雲ファーム | 島根県 | 0853-55-5555 |
+------+------------------------------+-------+-------+----+--------------+---------+--------------+

 

 ・内部結合と外部結合との違いは、照合できないレコードは表示されるかされないか

 ・基本的に左のテーブルが基準になるので、「RIGHT」は使わない

 

 

新規ユーザの追加(権限追加) GRANT

GRANT 権限1, 権限2....

ON データベース領域名, テーブル名

TO ユーザ@ホスト名 IDENTIFIED BY パスワード;

GRANT SELECT, INSERT

ON lesson. commodity

TO DBWriter@localhost IDENTIFIED BY 'Kakikomi';

 

ユーザの追加できたかの確認

●まずMariaDBクライアントプログラム起動

mysql -u DBWriter -p

 

●とりあえずデータベースのテーブル確認

SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| lesson |
| test |
+--------------------+

 

●データベース領域の変更

USE lesson

 

●テーブル表示

SHOW TABLES;

+------------------+
| Tables_in_lesson |
+------------------+
| commodity |
+------------------+

 

●テーブル表示

INSERT INTO commodity SET item='フランスパン', price=230;

 

データ領域のみ制限したユーザ作る

GRANT ALL ON lesson. * TO LessonMaster@localhost IDENTIFIED BY 'LMPass';