ざっくり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`;