コンテストの制限時間が終了しました。
以降も提出を行うことができますが、順位集計には反映されません。
以降も提出を行うことができますが、順位集計には反映されません。
問題1~4では試験コードが'T00001'のデータしか用意されていません。
そのため、試験コードの条件指定がなくても正解できるようになっています。
【問題1】固定値で更新
UPDATE subjects
SET subject_name = '数学'
WHERE subject_name = '算数'
【問題2】値を参照して更新
SQLiteにおける四則演算では式の中に小数が存在する場合、計算結果も小数になります。
今回はCAST(X AS INT)
で計算結果をINT型(整数型)に変換し、小数切捨を行っています。
UPDATE scores
SET score = CAST(score / 0.9 AS INT)
WHERE subject_code = 'S00001'
【問題3】テーブル結合して更新
UPDATE文ではFROM句を利用することで「別テーブルの内容で検索する」「別テーブルの値で更新する」といった処理を行うことができます。
UPDATE scores AS sc
SET score = CASE WHEN score > 95 THEN 100 ELSE score + 5 END
FROM students AS st
WHERE sc.student_code = st.student_code
AND student_name IN ('佐藤 幸平', '山田 康介')
student_code
を結合条件として、scores
テーブルとstudents
テーブルを結合しています。今回は更新対象のテーブルと結合しているため、結合条件をWHERE句に記述しています。
FROM句の中ではJOINを利用して、さらに他のテーブルと結合することも可能です。
【問題4】
FROM句では副問合せの結果と結合することもできます。
UPDATE total_scores AS ts
SET total_score = sub.sum
FROM (
SELECT student_code, SUM(score) AS sum
FROM scores
GROUP BY student_code
) AS sub
WHERE ts.student_code = sub.student_code
FROM句内の副問合せでは各学生の合計点を集計しています。student_code
を条件として副問合せの結果とtotal_scores
テーブルを結合しています。結合条件はWHERE句に記載しています。
良くない例
UPDATE total_scores AS ts
SET total_score = (
SELECT SUM(score)
FROM scores AS s
WHERE ts.student_code = s.student_code
)
SET句で相関副問合せの結果を直接代入することも可能です。
しかし、これではクエリのパフォーマンスが著しく悪化してしまうため、本問題では良い書き方とはいえません。