More Related Content Similar to Webで役立つRDBの使い方 (20) More from Soudai Sone (20) Webで役立つRDBの使い方13. ID 名前 戦闘力 編
1 フリーザ 530000 フリーザ編
2 悟飯(幼少期) 1307 ラディッツ編
3 クリリン 206 ラディッツ編
4 ヤムチャ 177 ラディッツ編
5 農夫 5 ラディッツ編
6 ギニュー 120000 フリーザ編
7 クリリン 1500 フリーザ編
8 亀仙人 139 ラディッツ編
※実務では編は正規化するべき
16. MySQLの場合
SET @num := 0;
SELECT
(@num := @num + 1) AS serial,
キャラクター.*
FROM キャラクター
ORDER BY 戦闘力 DESC;
17. MySQLの場合
SET @num := 0;
SELECT
(@num := @num + 1) AS serial,
キャラクター.*
FROM キャラクター
ORDER BY 戦闘力 DESC;
変数宣言
18. MySQLの場合
SET @num := 0;
SELECT
(@num := @num + 1) AS serial,
キャラクター.*
FROM キャラクター
ORDER BY 戦闘力 DESC;
変数宣言
変数をインクリメントしながら表示
20. MySQLの場合
SELECT
(@num := @num + 1) AS serial,
キャラクター.*
FROM キャラクター,
(SELECT @num := 0 ) AS base
ORDER BY 戦闘力 DESC;
変数宣言をテーブルとして行い、
JOINすることで1回のクエリにする
21. 連番 ID 名前 戦闘力 編
1 1 フリーザ 530000 フリーザ編
2 6 ギニュー 120000 フリーザ編
3 7 クリリン 1500 フリーザ編
4 2 悟飯(幼少期) 1307 ラディッツ編
5 3 クリリン 206 ラディッツ編
6 4 ヤムチャ 177 ラディッツ編
7 8 亀仙人 139 ラディッツ編
8 5 農夫 5 ラディッツ編
※実行結果
23. MySQLの場合
SET sql_mode = 'PIPES_AS_CONCAT';
SET @num := 1;
INSERT INTO users (name)
VALUES (
'soudai+' || (@num := @num + 1)
);
24. MySQLの場合
SET sql_mode = 'PIPES_AS_CONCAT';
SET @num := 1;
INSERT INTO users (name)
VALUES (
'soudai+' || (@num := @num + 1)
);
文字結合を¦¦で出来るようにモード変更
25. MySQLの場合
SET sql_mode = 'PIPES_AS_CONCAT';
SET @num := 1;
INSERT INTO users (name)
VALUES (
'soudai+' || (@num := @num + 1)
);
INSERTを実行するたびに
nameが変わる
文字結合を¦¦で出来るようにモード変更
26. ID 名前 作成日
15 soudai+16 "2015-05-30 04:15:24"
14 soudai+15 "2015-05-30 04:15:24"
13 soudai+14 "2015-05-30 04:15:24"
12 soudai+13 "2015-05-30 04:15:24"
11 soudai+12 "2015-05-30 04:15:24"
10 soudai+11 "2015-05-30 04:15:24"
9 soudai+10 "2015-05-30 04:15:24"
8 soudai+9 "2015-05-30 04:15:23"
7 soudai+8 "2015-05-30 04:15:23"
6 soudai+7 "2015-05-30 04:15:23"
5 soudai+6 "2015-05-30 04:15:23"
4 soudai+5 "2015-05-30 04:15:23"
3 soudai+4 "2015-05-30 04:15:23"
2 soudai+3 "2015-05-30 04:15:23"
1 soudai+2 "2015-05-30 04:15:22"
※実行結果
42. 連番 ID 名前 戦闘力 編
1 1 フリーザ 530000 フリーザ編
2 6 ギニュー 120000 フリーザ編
3 7 クリリン 1500 フリーザ編
4 2 悟飯(幼少期) 1307 ラディッツ編
5 3 クリリン 206 ラディッツ編
6 4 ヤムチャ 177 ラディッツ編
7 8 亀仙人 139 ラディッツ編
8 5 農夫 5 ラディッツ編
※実行結果
43. 連番 ID 名前 戦闘力 編
1 1 フリーザ 530000 フリーザ編
2 6 ギニュー 120000 フリーザ編
3 7 クリリン 1500 フリーザ編
4 2 悟飯(幼少期) 1307 ラディッツ編
5 3 クリリン 206 ラディッツ編
6 4 ヤムチャ 177 ラディッツ編
7 8 亀仙人 139 ラディッツ編
8 5 農夫 5 ラディッツ編
※実行結果
MySQLと同じ結果
48. RANK ID 名前 戦闘力 編
1 2 悟飯(幼少期) 1307 ラディッツ編
2 3 クリリン 206 ラディッツ編
3 4 ヤムチャ 177 ラディッツ編
4 8 亀仙人 139 ラディッツ編
5 5 農夫 5 ラディッツ編
1 1 フリーザ 530000 フリーザ編
2 6 ギニュー 120000 フリーザ編
3 7 クリリン 1500 フリーザ編
※実行結果
49. RANK ID 名前 戦闘力 編
1 2 悟飯(幼少期) 1307 ラディッツ編
2 3 クリリン 206 ラディッツ編
3 4 ヤムチャ 177 ラディッツ編
4 8 亀仙人 139 ラディッツ編
5 5 農夫 5 ラディッツ編
1 1 フリーザ 530000 フリーザ編
2 6 ギニュー 120000 フリーザ編
3 7 クリリン 1500 フリーザ編
※実行結果
ラディッツ編で集計
フリーザ編で集計
50. RANK ID 名前 戦闘力 編
1 2 悟飯(幼少期) 1307 ラディッツ編
2 3 クリリン 206 ラディッツ編
3 4 ヤムチャ 177 ラディッツ編
4 8 亀仙人 139 ラディッツ編
5 5 農夫 5 ラディッツ編
1 1 フリーザ 530000 フリーザ編
2 6 ギニュー 120000 フリーザ編
3 7 クリリン 1500 フリーザ編
※実行結果
ラディッツ編で集計
フリーザ編で集計
RANKが別々に振られる
52. 名前 戦闘力 編
フリーザ 530000 フリーザ編
フリーザ 10000000 フリーザ編
フリーザ 20000000 フリーザ編
悟飯(幼少期) 1307 ラディッツ編
クリリン 206 ラディッツ編
ヤムチャ 177 ラディッツ編
農夫 5 ラディッツ編
ギニュー 120000 フリーザ編
クリリン 1500 フリーザ編
クリリン 0 フリーザ編
クリリン 10000 フリーザ編
亀仙人 139 ラディッツ編
57. RANK 名前 戦闘力 編
1 悟飯(幼少期) 1307 ラディッツ編
2 クリリン 206 ラディッツ編
3 ヤムチャ 177 ラディッツ編
4 亀仙人 139 ラディッツ編
5 農夫 5 ラディッツ編
1 フリーザ 20000000 フリーザ編
2 ギニュー 120000 フリーザ編
3 クリリン 10000 フリーザ編
※実行結果
58. 関数 説明
row_number() 行番号
rank() ランキング (同率で番号を飛ばす)
dense_rank() ランキング (同率で番号を飛ばさない)
percent_rank() ランキング (%で表示) : (rank - 1) / (全行数 - 1)
cume_dist() percent_rank に類似 : (現在の行の位置) / (全行数)
ntile(N) ランキング (1..N に分割)
lag(value, offset, default) ソート状態での前の行の値
lead(value, offset, default) ソート状態での後の行の値
first_value(value) 最初の値
last_value(value) 最後の値
nth_value(value, N) N番目の値 (1から数える)
※Window関数で指定できる関数
65. 連番 ステップ指定 日付
1 1 2015-05-30
2 3 2015-05-31
3 5 2015-06-01
4 7 2015-06-02
5 9 2015-06-03
6 1 2015-06-04
7 3 2015-06-05
8 5 2015-06-06
9 7 2015-06-07
10 9 2015-06-08
※実行結果
66. 連番 ステップ指定 日付
1 1 2015-05-30
2 3 2015-05-31
3 5 2015-06-01
4 7 2015-06-02
5 9 2015-06-03
6 1 2015-06-04
7 3 2015-06-05
8 5 2015-06-06
9 7 2015-06-07
10 9 2015-06-08
※実行結果
endの値を超えたので1に戻る
74. ON DUPLICATE KEY UPDATE
INSERT users (id, name)
SELECT
id + 5 AS id,
@num := @num + 1 AS name
FROM users,
(SELECT @num := 0) AS num
ON DUPLICATE KEY UPDATE
name = CONCAT('taketomo', @num := @num + 1)
75. ON DUPLICATE KEY UPDATE
INSERT users (id, name)
SELECT
id + 5 AS id,
@num := @num + 1 AS name
FROM users,
(SELECT @num := 0) AS num
ON DUPLICATE KEY UPDATE
name = CONCAT('taketomo', @num := @num + 1)
既存のIDの+5を指定
76. ON DUPLICATE KEY UPDATE
INSERT users (id, name)
SELECT
id + 5 AS id,
@num := @num + 1 AS name
FROM users,
(SELECT @num := 0) AS num
ON DUPLICATE KEY UPDATE
name = CONCAT('taketomo', @num := @num + 1)
既存のIDの+5を指定
INSERTの場合
77. ON DUPLICATE KEY UPDATE
INSERT users (id, name)
SELECT
id + 5 AS id,
@num := @num + 1 AS name
FROM users,
(SELECT @num := 0) AS num
ON DUPLICATE KEY UPDATE
name = CONCAT('taketomo', @num := @num + 1)
既存のIDの+5を指定
INSERTの場合
UPDATEの場合
78. ID 名前 作成日
1 soudai+1 "2015-05-30 06:21:50"
2 soudai+2 "2015-05-30 06:21:53"
3 soudai+3 "2015-05-30 06:21:54"
4 soudai+4 "2015-05-30 06:21:55"
5 soudai+5 "2015-05-30 06:21:55"
6 taketomo10 "2015-05-30 06:21:56"
7 taketomo11 "2015-05-30 06:21:58"
8 taketomo12 "2015-05-30 06:21:58"
9 taketomo13 "2015-05-30 06:21:59"
10 5 "2015-05-30 06:22:05"
11 6 "2015-05-30 06:22:05"
12 7 "2015-05-30 06:22:05"
13 8 "2015-05-30 06:22:05"
14 9 "2015-05-30 06:22:05"
※実行結果
79. ID 名前 作成日
1 soudai+1 "2015-05-30 06:21:50"
2 soudai+2 "2015-05-30 06:21:53"
3 soudai+3 "2015-05-30 06:21:54"
4 soudai+4 "2015-05-30 06:21:55"
5 soudai+5 "2015-05-30 06:21:55"
6 taketomo10 "2015-05-30 06:21:56"
7 taketomo11 "2015-05-30 06:21:58"
8 taketomo12 "2015-05-30 06:21:58"
9 taketomo13 "2015-05-30 06:21:59"
10 5 "2015-05-30 06:22:05"
11 6 "2015-05-30 06:22:05"
12 7 "2015-05-30 06:22:05"
13 8 "2015-05-30 06:22:05"
14 9 "2015-05-30 06:22:05"
※実行結果
IDが衝突したのでUPADTEした
80. ID 名前 作成日
1 soudai+1 "2015-05-30 06:21:50"
2 soudai+2 "2015-05-30 06:21:53"
3 soudai+3 "2015-05-30 06:21:54"
4 soudai+4 "2015-05-30 06:21:55"
5 soudai+5 "2015-05-30 06:21:55"
6 taketomo10 "2015-05-30 06:21:56"
7 taketomo11 "2015-05-30 06:21:58"
8 taketomo12 "2015-05-30 06:21:58"
9 taketomo13 "2015-05-30 06:21:59"
10 5 "2015-05-30 06:22:05"
11 6 "2015-05-30 06:22:05"
12 7 "2015-05-30 06:22:05"
13 8 "2015-05-30 06:22:05"
14 9 "2015-05-30 06:22:05"
※実行結果
IDが衝突したのでUPADTEした
新規のINSERT
83. REPLACE
REPLACE users (id, name)
SELECT
id + 5 AS id,
CONCAT('replace', @num := @num + 1)
FROM users,
(SELECT @num := 0) AS num;
INSERTの条件
既存のIDの+5を指定
84. ID 名前 作成日
1 soudai+1 "2015-05-30 06:21:50"
2 soudai+2 "2015-05-30 06:21:53"
3 soudai+3 "2015-05-30 06:21:54"
4 soudai+4 "2015-05-30 06:21:55"
5 soudai+5 "2015-05-30 06:21:55"
6 replace1 "2015-05-30 08:06:59"
7 replace2 "2015-05-30 08:06:59"
8 replace3 "2015-05-30 08:06:59"
9 replace4 "2015-05-30 08:06:59"
10 replace5 "2015-05-30 08:06:59"
11 replace6 "2015-05-30 08:06:59"
12 replace7 "2015-05-30 08:06:59"
13 replace8 "2015-05-30 08:06:59"
14 replace9 "2015-05-30 08:06:59"
15 replace10 "2015-05-30 08:06:59"
※実行結果
85. ID 名前 作成日
1 soudai+1 "2015-05-30 06:21:50"
2 soudai+2 "2015-05-30 06:21:53"
3 soudai+3 "2015-05-30 06:21:54"
4 soudai+4 "2015-05-30 06:21:55"
5 soudai+5 "2015-05-30 06:21:55"
6 replace1 "2015-05-30 08:06:59"
7 replace2 "2015-05-30 08:06:59"
8 replace3 "2015-05-30 08:06:59"
9 replace4 "2015-05-30 08:06:59"
10 replace5 "2015-05-30 08:06:59"
11 replace6 "2015-05-30 08:06:59"
12 replace7 "2015-05-30 08:06:59"
13 replace8 "2015-05-30 08:06:59"
14 replace9 "2015-05-30 08:06:59"
15 replace10 "2015-05-30 08:06:59"
※実行結果
IDがかぶっていないので直接
INSERTしている
86. ID 名前 作成日
1 soudai+1 "2015-05-30 06:21:50"
2 soudai+2 "2015-05-30 06:21:53"
3 soudai+3 "2015-05-30 06:21:54"
4 soudai+4 "2015-05-30 06:21:55"
5 soudai+5 "2015-05-30 06:21:55"
6 replace1 "2015-05-30 08:06:59"
7 replace2 "2015-05-30 08:06:59"
8 replace3 "2015-05-30 08:06:59"
9 replace4 "2015-05-30 08:06:59"
10 replace5 "2015-05-30 08:06:59"
11 replace6 "2015-05-30 08:06:59"
12 replace7 "2015-05-30 08:06:59"
13 replace8 "2015-05-30 08:06:59"
14 replace9 "2015-05-30 08:06:59"
15 replace10 "2015-05-30 08:06:59"
※実行結果
IDが衝突したのでDELETEして
INSERTしている
IDがかぶっていないので直接
INSERTしている
95. ID 名前 作成日
1 test1 "2015-05-30 21:25:18.699022"
2 test2 "2015-05-30 21:25:18.699022"
3 test3 "2015-05-30 21:25:18.699022"
4 test4 "2015-05-30 21:25:18.699022"
5 test5 "2015-05-30 21:25:18.699022"
6 test6 "2015-05-30 21:25:18.699022"
7 test7 "2015-05-30 21:25:18.699022"
※実行結果
97. WITH+RETURNING
WITH base AS (
SELECT * FROM tmp_log
), upd AS (
UPDATE tmp_log
SET value = base.value || ' update' FROM base
WHERE tmp_log.id > 2 RETURNING tmp_log.id
)
INSERT INTO tmp_log (value)
SELECT value || ‘ INSERT’ FROM base AS ins
WHERE id NOT IN (SELECT id FROM upd);
98. WITH+RETURNING
WITH base AS (
SELECT * FROM tmp_log
), upd AS (
UPDATE tmp_log
SET value = base.value || ' update' FROM base
WHERE tmp_log.id > 2 RETURNING tmp_log.id
)
INSERT INTO tmp_log (value)
SELECT value || ‘INSERT’ FROM base AS ins
WHERE id NOT IN (SELECT id FROM upd);
対象のテーブルを指定する
99. WITH+RETURNING
WITH base AS (
SELECT * FROM tmp_log
), upd AS (
UPDATE tmp_log
SET value = base.value || ' update' FROM base
WHERE tmp_log.id > 2 RETURNING tmp_log.id
)
INSERT INTO tmp_log (value)
SELECT value || ‘INSERT’ FROM base AS ins
WHERE id NOT IN (SELECT id FROM upd);
対象のテーブルを指定する
UPDATEを行う
UPDATEしたIDを返す
100. WITH+RETURNING
WITH base AS (
SELECT * FROM tmp_log
), upd AS (
UPDATE tmp_log
SET value = base.value || ' update' FROM base
WHERE tmp_log.id > 2 RETURNING tmp_log.id
)
INSERT INTO tmp_log (value)
SELECT value || ‘INSERT’ FROM base AS ins
WHERE id NOT IN (SELECT id FROM upd);
対象のテーブルを指定する
UPDATEを行う
UPDATEしたIDを返す
UPDATE以外の結果を
INSERT
107. ID 名前 作成日
1 test1 "2015-05-30 21:41:15.014615"
2 test2 "2015-05-30 21:41:15.014615"
3 test1 update "2015-05-30 21:41:15.014615"
4 test1 update "2015-05-30 21:41:15.014615"
5 test1 update "2015-05-30 21:41:15.014615"
6 test1 update "2015-05-30 21:41:15.014615"
7 test1 update "2015-05-30 21:41:15.014615"
8 test1INSERT "2015-05-30 21:42:32.749261"
9 test2INSERT "2015-05-30 21:42:32.749261"
※実行結果