アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < イザユケエンジニャー

ざっくりSQL入門 #3:クエリを書く<SELECT編>

MySQLを前提に書いています。一部関数などは方言差がある場合もあるのでご注意ください。

今回はSELECTクエリについて。


SELECTクエリとは

データベースに入っているレコードを抜き出すクエリです。ただそれだけ。

基本の書き方

構文
SELECT 【カラム名(複数ならカンマ区切り、「*」とだけ書けば全カラム)】
FROM   【テーブル名】
WHERE  【条件式(WHERE句自体を省略すると条件なし、つまりテーブル全件)】
例文
-- 「table_name」というテーブルから、「id」が1のレコードの、「id」「hoge」カラムを抜き出す
SELECT `id`, `hoge`
FROM   `table_name`
WHERE  `id` = 1
補足

やや長くなるので、項目ごとに折りたたんでいます。(クリックで展開/折りたたみ)

いろいろなオプション

結果セットのソート(並び順)を変えたい

例えば「更新日時が新しい順で並べたい」「商品の価格の高い順で並べたい」という場合ですね。

SELECT ... FROM ... WHERE ...
ORDER BY 【並べ替え基準のカラム名】 【昇順(ASC) / 降順(DESC) ※省略した場合はASCとみなされる】

という書き方になります。
複数のソート条件を付けたい場合はカンマ区切りで書きます。
このとき、「強いソート条件」から順番に書いていきます。
例えば以下のような感じ。

-- 価格の高い順(降順)で、価格が同じ場合は商品名の昇順
SELECT ... FROM ... WHERE ...
ORDER BY
  `price` DESC
 ,`product_name` ASC

ついでに、応用編な書き方も挙げておきます。(クリックで展開/折りたたみ)

結果セットの件数を制限したい

例えば10万件の商品を扱っているECサイトで、
商品一覧ページを開いても10万件表示されたりはしませんね。
だいたいはページャーがついていて(もしくは一番下までスクロールすると新しく読み込まれて)
10件ずつだとか20件ずつだとか、少しずつ表示しますね。
こういった場合、以下のように「LIMIT」句を用います。

SELECT ... FROM ... WHERE ... ORDER BY ...
LIMIT 【何件目から取得するか ※0始まり:省略すると0とみなされる】, 【何件取得するか】

例えば以下のような感じ。

-- 1~10件目 の10件を表示
SELECT ... FROM ... WHERE ... ORDER BY ...
LIMIT 0, 10 -- 0から始まるので

-- 11件目~20件目 の10件を表示
SELECT ... FROM ... WHERE ... ORDER BY ...
LIMIT 10, 10 -- しつこいようですが、0から始まるので
同一データを省きたい

結果セットの中に全く同じレコードが存在する場合、「DISTINCT」句を使うと重複を省くことができます。

SELECT DISTINCT 【カラム名 ※通常通りの書き方】 FROM ...

具体例があった方がイメージしやすいかもしれません。
例えば以下のような「product」テーブルがあるとします。

id product_name color
1 Tシャツ
2 Tシャツ
3 Tシャツ
4 タンクトップ

ここで、「商品名(product_name)の重複がない一覧が欲しい」だとか
「商品に関わらずカラーバリエーション(color)の一覧が欲しい」という場合、以下のように書けばOKです。

-- (参考:重複あり)結果セットは「Tシャツ, Tシャツ, Tシャツ, タンクトップ」の4レコード
SELECT `product_name` FROM `product`;

-- 結果セットは「Tシャツ, タンクトップ」の2レコード
SELECT DISTINCT `product_name` FROM `product`;

-- 結果セットは「緑, 青, 白」の3レコード
SELECT DISTINCT `color` FROM `product`;