woshidan's loose leaf

ぼんやり勉強しています

ドンドン身に付く、スラスラ書ける書き込み式SQLドリル 1章読んだ

期限が近づいてきたので、ポートフォリオの修正をいったんおしまいにしました。キャッシュが何十MBあって最初焦りました。

面接のときにお勧めしてもらったドリルやっているのですが、こういうの結構好きで、受験のとき、理系のくせにやたら漢文のドリルをやっていたのが思い出されます。

でも、ちょっと小指が痛くなってきたので、今日は一章分で止めます。

以下、曖昧だったところをメモ。 なお、メモ中のキーワードはMySQLのものです。

1章

1-3

SELECT文で列名を書いていくとき、DISTINCTキーワードは重複をのぞきたい列の前に置く。
DISTINCTキーワードの後ろに,区切りで複数の列名を置いたとき、複数列の値の組あわせの重複をのぞいた結果になる。

例:

select distinct class, grade from students;
class grade
A 1
A 2
A 3
B 1
B 2
B 3
C 1
C 2
C 3

1-4

≠は<>
BETWEEN A AND BはA,Bを含む
空文字は''(シングルクオーテーション2つ)

1-5

一文字分のワイルドカードは_

1-6

AND演算子とOR演算子ではAND演算子の優先度が高い

1-7

DESC(降順)/ASC(昇順)をORDER BY句で指定しなかった場合はASC
ソートキーは,で区切って複数個設定することも可能。

ORDER BY
  student_id ASC,
  grade ASC

1-8

LIMITキーワードに関してOFFSETの設定の仕方は他のキーワードと比べてDBMSによって結構異なる。 MySQLの場合、3件目から5件取得する時の指定は

LIMIT 2, 5; # 取得する行の位置カウントが0から始まることに注意する

1-9

GROUP BY句を使う時は、SELECTで取り出す列として指定していいのは、グループ化に使った列と集計関数で作った列のみ。
GROUP化キー(グループ化に使った列)は,で複数指定可能。

1-11

日付を加工する関数はDATE_FORMAT(date, format)

select user_id, DATE_FORMAT(updated_at, '%Y年%m月%d日') from users;
#=> updated_atの列は2015年01月24日の形式になる

現在を表すのはNOW(), 今日の日付を表すのはCURRENTDATE()。
文字列の結合はCONCAT(array of columns or strings)。
小数繰り上げはCEILING(n), 切り捨てはFLOOR(n), m桁以下で(省略時m=0)四捨五入はROUND(n, m)。

1-12

GROUP BYで作ったグループの集計関数の値によって絞り込みしたいときはHAVING句を使う。
HAVING句で使える条件式に書いていいのはグルーピングキーと集計結果の列(集計列)のみ。

SELECT class, AVG(score)
  FROM test_results
  GROUP BY class
  HAVING AVG(score) >= 30;

HAVINGキーワードをWHEREキーワードにしてしまうとエラーとなる。
また、グルーピング前に全体に対して絞り込みをするためにWHERE句を用いることはある。

SELECT class, AVG(score) AS 平均点
  FROM test_results
  WHERE class IN ('特進A', '特進B', '特進C')
  GROUP BY class
  HAVING AVG(score) >= 30;

1-13

(集計)列の値に対して条件式と比較した結果をselectで取り出す列として与えることが出来る
条件式の値の部分はCASEではじめてENDで終える。別名をつける場合はENDの後ろにASをつける。

SELECT
  name,
  score,
  CASE
    WHEN score >= 70 THEN 'A'
    WHEN score >= 50 THEN 'B'
    ELSE 'C'
  END AS 'ランク'
FROM result;

条件分岐による表示分けはビューのほうでやっていたからCASE書いたの始めてだったので、selectになんてごついものが出てくるのだろうと少しびびりました。

読んでる間、足腰がしっかりしないうちにレールにのることで何を失ったか的な思いが頭をよぎりました……orz