感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

ちょっと高度なSQLのまとめ(ギークな意味ではない)

スポンサーリンク

CASEを使ったUPDATE文

CASE式は既存の列を条件にして確認することで、すべてのUPDATE文を結合する。
無駄に同じようなUPDATE文を書かなくても済む。
構文は以下の通り。

UPDATE some_table
CASE
  WHEN hoge_column = hoge_value
    THEN new_hoge_value
  WHEN foo_column = foo_value
    THEN new_foo_value
  ELSE new_some_value
END;

CASEを使って、条件に合致するもののUPDATEをまとめて行うことができる。
もちろん、WHEN~という条件は、ANDで結合することも可能。
また最後のELSEはオプションで、省略可能である。

結果を順番に並べるSQL

アルファベット順/50音順などに並べ替えたい時は、ORDER BY句を使う。

SELECT name. job
FROM member_list
WHERE
name LIKE 'A%'
AND
job = 'SE'
ORDER BY name;

上記のようなSQLを実行すると、name(名前)がアルファベット順/50音順に並べ替えられて表示される。
名前と、同名の人をさらに誕生日順に並べたい場合は、

ORDER BY name, birthday;

のように、ORDER BYに2つ記載する。
1番目で並び替えされてから、2番目で並べる。

並べ替えには2種類あって、
昇順(ASCENDING)というのは、AからZ,1から9の順で並べる。
降順(DESCENDING)というのは、ZからA,9から1の順で並べる。
デフォルトはASCなので、ASCは省略してもよい。

ORDER BY name ASC, birthday DESC;

のように書くことができる。

SQLで足し算をする

関数SUMを使うと、SQLが足し算をやってくれる。

SELECT SUM(sales)
FROM car_sales
WHERE first_name = 'sho322';

こうすると、sho322の売上だけを合計してくれる。
上記だとsho322に限定しているが、nameでグループ化して、そのグループに対してSUMしてみる。

SELECT first_name, SUM(sales)
FROM car_sales
GROUP BY first_name
ORDER BY SUM(sales) DESC;

上記のようなSQLを使うと、名前ごとの合計を、合計が多い名前順に表示してくれる。

平均を出したい時はAVG関数を使う。

SELECT first_name, AVG(sales)
FROM car_sales
GROUP BY first_name

各人の平均が表示される。
AVGの部分をMAXにしたら、各人の最大のsalesが、MINにしたら最低のsalesが表示される。

ある列の行数を返す

ある列の行数を調べるには、COUNT関数を使う。

SELECT COUNT(name)
FROM member_list;

とやると、member_listをSELECTして抽出されるnameの行数を返す。
COUNT関数において、NULLは数にカウントされない。

重複を排除したい時はDISTINCTを使う。
DISTINCTはCOUNTと一緒に使うこともできる。

SELECT COUNT(DISTINCT sale_date)
FROM car_sales;

勉強した本

Head First SQL ―頭とからだで覚えるSQLの基本

Head First SQL ―頭とからだで覚えるSQLの基本


見た目で敬遠する人もいるかもしれないけれど、中身は至って真面目で、しかもわかりやすく解説してくれる。アメリカンジョークっぽいところはスルーしても、頭に残りやすい作りになっている。

感謝のプログラミング

今回で感謝のプログラミングは【533時間目】
10000時間まで、あと【9467時間】