SQLの基本的なことを含む、役に立った構文をメモするページです。
SQLのRANK()と同じように順位をつける
以下はoriginal_heroesテーブルの中でcyl6テーブルとnameが一致し、かつ、sex="女"となる行の中で、vote_countの大きさによって順位付けを行って vote_rank という列を作るクエリです。
select *,(select count(*)+1 from cyl6 as p2 where "女"=(select sex from original_heroes where p2.name=name) and p2.vote_count > p1.vote_count) as vote_rank from cyl6 as p1 where "女"=(select sex from original_heroes where p1.name=name)
もう少しシンプルな例です。cyl6テーブルすべてのレコードの中で、vote_countの大きさによって順位付けを行って vote_rank という列を作るクエリです。
select *,(select count(*)+1 from cyl6 as p2 where p2.vote_count > p1.vote_count) as vote_rank from cyl6 as p1
条件分岐
case when 条件1 then 値1 when 条件2 then 値2 else 値3 end で条件分岐して値を決定できます。以下はdata項目が"true"のときは (hp_5+2)、その他はhp_5+0の値でソートします。hp_5+0を行っているのは数値に変換するため。
select * from heroes where weapon_type="赤竜" order by case data when "true" then (hp_5+2) else (hp_5+0) end;
複数段階の条件でソートする
ORDER BY 条件1, 条件2, .. というように複数条件を記述することで複数段階のソートが可能です。
SELECT * FROM my_table ORDER BY color='赤' DESC, color='青' DESC, color='緑' DESC, color='無' DESC
レコード内の特定文字列の置換
SQLでレコード内の文字列の中で特定の文字列のみを別の文字列に置き換えたいときはREPLACE(列名, 置き換えたい文字, 置き換え後の文字)を用います。
ドメイン変更などでサイトURLが変わってしまったとき、画像などのリンク先のURLを一気に置換したいときにとても便利です。例えば、main_dataテーブルのarticle列の文字列の中でwestsidepure.comという文字列をpuarts.comという文字列に置換して更新したいときはUPDATEを併用して次のように書きます。
UPDATE main_data SET article=REPLACE(article, 'westsidepure.com', 'puarts.com');
--tagの前後に"|"を付与してから、","を"|"に変換する(例えば"hoge,fuga"を"|hoge|fuga|"に変換)
UPDATE main_data SET tag=REPLACE(CONCAT("|",tag,"|"), ",", "|");
ある文字を含むレコードを探す
SQLである文字列を含む要素を見つけるにはWHERE [項目名] LIKE [%含む文字列%]を使う。
--例1: entry_dataテーブルからdate項目が2011で始まる要素を持つレコードを全て選択
SELECT* FROM entry_data WHERE date LIKE '2011%'
--例2: date項目に/10/を含む要素を持つレコードを全て選択
SELECT * FROM entry_data WHERE date LIKE '%/10/%'
--例3: UPDATEを使ってentry_dataテーブルのdate項目が2012で始まる要素を持つレコードのvisibility項目を1に更新する
UPDATE entry_data set visibility=1 WHERE date LIKE '2012%'