「知らないとわからない」は「推測しにくい」って意味で。
1、DISSTINCT
GROUP BY *の代わりに
GROUP BYは暗黙のソートがあるので遅いので、重複削除だけならこっち推奨
2、ORDER BY RANDOM()
ランダムな順番でほしいとき
PostgreSQLは不可?SQLiteはいけた
3、ORDER BY ID=10 DESC, ID
10,1,2,3,4...って並ぶ
4、HAVING
GROUP BYを使わず、HAVING単独でも使える
fromここ
理解すれば便利だけど、使いどころは難しいかも
5、UNION ALL
UNIONは重複を削除するので暗黙のソートがある(遅い)
重複していいならALLが早い
6、ANY
INの演算子を指定できる版
7、REGEXP
文字列の正規表現一致。MySQL専用
ちなみにPostgreSQLでは「~」演算子
8、CASE WHEN THEN
条件分岐。非常に便利だけど、遅いし保守性悪い系
ちなみにこれはどこでも使えるので、
「SELECT CASE WHEN age > 10 THEN '10代' WHEN age > 20 THEN '20代' ...」
こんな感じのこともできるし、
「WHERE CASE WHEN age > 10 THEN true WHEN age > 20 THEN false」
見たいなことも。
(ORDER BYでも使えるんだ。。。)
9、BETWEEN AND
「n~nの間」って感じの比較ができる。日時系でも有効
指定された境界値が含まれる(<=, >=)ことに注意
10、EXISTS
INの早い版。ただし、他の列との比較ができない
SELECT 1してる感じ(ヒットすると即終了)
11、MATCH()
全文検索MySQL専用でMyISAM依存
ほかにORACLEにもあった気がする(SQL Serverだったか?)
PostgreSQLは基本的には持ってないけど、
ほかのソフトで全文検索できるようになるはず。
ほかにRDBで詰まりそうなところ。
特殊な取得順
簡単なorder byで取得できない条件での取得は難しい
(RDB自体順番の概念がないので)
行列変換
行を列に変換するのは基本無理と思ったほうがいい。
(最大列数固定ならできるけど)
ちなみに「ピボット変換」というらしい。
あんまり使われないですが、CREATE TEMPORARY TABLEも便利。
CASE WHEN THENと同じような「最後の手段」ではありますが。。。
http://oraclesqlpuzzle.hp.infoseek.co.jp/
SQLの複雑な条件集
Oracleに偏ってますが、この辺がSQLの限界なので
各項目のタイトルだけでもざっくり見とくといいかも。
とりあえず、気になったらこまめにEXPLAINかけると勉強になる。
(でも、MySQLのEXPLAINはちょっと読みにくい)
あと、MSDNは内容まとまってて質高い。
(IBMもかなりすごいが)
ただ、サイトの使い勝手は微妙だし、がんがんURI変わるのもいただけない。
Check
SQLの知らないとわからない技11
トラックバック(0)
このブログ記事を参照しているブログ一覧: SQLの知らないとわからない技11
このブログ記事に対するトラックバックURL: http://0-9.sakura.ne.jp/mt/mt-tb.cgi/316
コメントする