20. MySQLの場合
SELECT
(@num := @num + 1) AS serial,
キャラクター.*
FROM キャラクター,
(SELECT @num := 0 ) AS base
ORDER BY 戦闘力 DESC;
変数宣言をテーブルとして行い、
JOINすることで1回のクエリにする
56. 実際のSQL
SELECT
rank() OVER (
PARTITION BY "編"
ORDER BY max("戦闘力") DESC
) , "名前", MAX("戦闘力"), "編"
FROM "キャラクター2"
GROUP BY "名前","編"; 集約関数を指定する
編ごとの最大戦闘力を指定
73. クエリを減らす
ON DUPLICATE KEY UPDATE
プライマリーキー制約やユニーク制
約が設定されているカラムにデータ
を追加する際に、既にデータがあれ
ば例外後にUPDATE文を行う
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の場合
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