Check

SQLの知らないとわからない技11

| | コメント(0) | トラックバック(0)
「知らないとわからない」は「推測しにくい」って意味で。

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変わるのもいただけない。

トラックバック(0)

このブログ記事を参照しているブログ一覧: SQLの知らないとわからない技11

このブログ記事に対するトラックバックURL: http://0-9.sakura.ne.jp/mt/mt-tb.cgi/316

コメントする