データベースからデータを取得するにはSELECT文を使います。
SELECT文はたぶんSQLで最も使われ、奥が深いです。
データの取得と書きましたが、一般的にはデータの抽出と言います。
このデータの抽出は何をするかと言うと、条件を指定して検索し、該当するデータの指定したカラムの情報を抜き出してくるということです。
まだテーブルを作成できていない人はこちらの記事から参考にしてください。
まだテーブルにデータを挿入できていない人はこちらの記事から参考にしてください。
SELECT文の基本構成
FROM テーブル名
WHERE 抽出条件
GROUP BY カラム名
ORDER BY カラム名 ソート順
LIMIT 件数;
青色の部分はSQLの構文です。
基本は上記のような形になります。
詳細は後ほど説明しますが、以下で概要を解説します。
「SELECT カラム名」の カラム名 は、カラム1, カラム2, ・・・ のようにカンマ区切りで取得する対象のカラムを指定します。
カラム名は AS句 というものを使い下記のように別名をつけることが出来ます。
カラム1 AS 別名1, カラム2 AS 別名2, ・・・
「FROM テーブル名」はデータを抽出する対象のテーブルを指定します。
こちらもAS句を使って下記のように別名をつけることが出来ます。
FROM テーブル名 AS 別名
「WHERE 抽出条件」は抽出対象を条件で絞ることが出来ます。
不動産の検索サイトで1LDKのものだけ検索したい場合などに条件をつけるのと同じです。
「GROUP BY カラム名」は抽出結果をグルーピングする場合に使います。
「ORDER BY カラム名 ソート順」は抽出結果に順番を指定します。
実際のシステム開発の現場ではこれは必ず設定してください。
「LIMIT 開始位置, 件数」は抽出する件数を指定します。
件数は数値を指定し、その数値の件数分だけ返します。
そしてSQL文の最後には ; (セミコロン)をつけます。
データを抽出するSELECT文の基本サンプル
userテーブル
ID | ユーザー名前 |
---|---|
1 | 田中 |
2 | 鈴木 |
3 | 山田 |
これに対し全てのデータ、全てのカラムを取得する場合は以下のように書きます。
1 |
SELECT * FROM user; |
* は、「全て」という意味で、userテーブルの全てのカラムを取得するということになります。
でも * もバグの元になるのであまり使わないでください。
カラムは必ず1つ1つ指定して書きます。
1 |
SELECT id, user_name FROM user; |
ここにWHERE句などをつけ条件をつけたり、ORDER BYでソートしたりします。
これがSQLの基本です。
条件の付け方など詳細は次に説明します。
条件を指定する
検索条件はWHERE句を使います。
そして、WHERE句の基本構成は以下のようになります。
WHERE カラム名 比較演算子 値
等しい
これは指定したカラムの値を指定して結果を取得する場合に使います。
1 2 |
SELECT id, user_name FROM user WHERE id = 2; |
このように書くと、idが2のデータだけが抽出されます。
ちなみにidはプライマリーキーなので必ず結果は1件になります。
~と等しいという条件ですが、指定する値が複数ある場合は IN を使って指定することも出来ます。
1 2 |
SELECT id, user_name FROM user WHERE id in (2, 3); |
これだと id が 2 か 3 のものが取得できます。
異なる
○○では無いデータを取得する条件の書き方です。
これは2パターンあります。
1つめは、
1 2 |
SELECT id, user_name FROM user WHERE id <> 2; |
2つ目は、
1 2 |
SELECT id, user_name FROM user WHERE id != 2; |
です。
僕は1つ目を好んで使います。
MySQLだと両方動くけど、2つ目のほうは違うデータベースだと動かなかったと思います。
含む
これは曖昧検索とも言います。
条件にの = の変わりに LIKE を使い、値に % を入れて曖昧に検索する方法です。
例えば、
1 2 |
SELECT id, user_name FROM user WHERE user_name like '%田%'; |
のように書けば、ユーザー名(user_name)に ‘田’ が含まれているデータを取得するということになります。
後ろの%を外して
1 2 |
SELECT id, user_name FROM user WHERE user_name like '%田'; |
のように書けば、’田’ で終わるデータを取得するするということになります。
前の%を外して後ろにだけつければ、’田’ で始まるデータを取得するするということになります。
論理演算子
検索する条件は複数ある場合は当然あります。
その場合は AND や OR で条件を複数定義することが出来ます。
ANDは複数の条件が全て一致するものを取得します。
例えば、
1 2 3 |
SELECT id, user_name FROM user WHERE id in (2, 3) AND user_name like '%田%'; |
のように書きます。
id in (2, 3) は、idが2か3のデータが取得でき、user_name like ‘%田%’ は、idが1か3のデータが取得できます。
ANDで結合した場合は id が 3 のデータだけになります。
条件Aと条件Bがあった場合は以下のようになります。
OR は複数の条件のうち1つでも一致するものを取得します。
例えば、
1 2 3 |
SELECT id, user_name FROM user WHERE id = 2 OR user_name = '山田'; |
としましょう。
id = 2 の条件では id が 2 のデータだけ取得し、user_name = ‘山田’ の条件では id が 3 のデータだけが取得できます。
ORでこの2つの条件を結合すると id が 2 も 3 も取得できるということです。
条件Aと条件Bがあった場合は以下のようになります。
抽出結果のグルーピング
GROUP BY を使うと、検索結果のデータをグループに出来ます。
ちょっとこの GROUP BY のテストをするのにデータが足りないので1件足します。
ID | ユーザー名前 |
---|---|
1 | 田中 |
2 | 鈴木 |
3 | 山田 |
4 | 鈴木 |
id が 4 のデータを追加しました。新しく鈴木さんが登録してくれました。
ここで同じ苗字の人が何人いるかを出力したいとします。
4人程度なら見れば分かりますが、3000人ほどいたらもう大変ですね。
このときに、ユーザー名前でグルーピングをして、データのカウントを取得する COUNT() という関数を用いてサンプルを作成してみました。
1 2 |
SELECT user_name, count(0) FROM user GROUP BY user_name; |
これを実行すると、以下のような結果が得られます。
user_name | count(0) |
---|---|
山田 | 1 |
田中 | 1 |
鈴木 | 2 |
このように同じ名前の人がグルーピングされ、2カラム目に同じ名前の人の人数をカウントしてくれるようになります。
count(0) の 0 は0番目のカラムという意味です。ここは count(user_name) でも count(*) でも大丈夫です。
ちょっと抽出結果の count(0) ってカラムがダサいので名前をつけてみました。
1 2 |
SELECT user_name, count(0) AS 人数 FROM user GROUP BY user_name; |
これを実行すると、
user_name | 人数 |
---|---|
山田 | 1 |
田中 | 1 |
鈴木 | 2 |
となります。
この count() のようなものを集合関数といい、他にも以下のようなものがあります。
SUM ・・・ 合計値を求めます。
MAX ・・・ 最大値を求めます。
MIN ・・・ 最小値を求めます。
AVG ・・・ 平均値を求めます。
COUNT ・・・ データの件数を求めます。
※COUNT以外は、引数はカラム名を指定します。
抽出結果をソートする
抽出結果をソートする場合は ORDER BY を指定します。
ORDER BY カラム名 ソート順 のように、どのカラムをソートするか、ソート順は昇順か降順かを指定します。
ソート順には ASC と DESC があり、ASCは昇順でDESCは降順です。
1 2 3 |
SELECT id, user_name FROM user WHERE id != 2 ORDER BY id desc; |
のように書くと、id の降順になります。
id | user_name |
---|---|
4 | 鈴木 |
3 | 山田 |
1 | 田中 |
となります。
指定するソート順が昇順の場合、何も指定しなくても結果が同じ場合があります。
しかし、必ずそうなるといった保証はどこにもありません。
ソートしてもしなくても同じ結果になるとしても、ソートの指定は必ず行って不要なバグを無くしましょう。
抽出件数を指定する
LIMITを指定することで抽出件数を指定することが出来ます。
これは、結果が1000件くらいあった場合1度に画面に表示しようとするとものすごく重くなるのを防ぐためです。
30件ずつくらいに分けてページングする場合に使います。
LIMITは、LIMIT 開始位置, 件数 のように開始位置と取得する件数を指定します。
ただ、1件目から取得する場合は以下のように開始位置を省略しても大丈夫です。
1 2 3 |
SELECT id, user_name FROM user ORDER BY id DESC LIMIT 2; |
これで上から2件取得できます。
3番目のレコードから1件取得する場合は以下のように書きます。
1 2 3 |
SELECT id, user_name FROM user ORDER BY id DESC LIMIT 2, 1; |
まとめ
データを抽出するにはSELECT文を使う。
SELECTは単にデータを抽出するだけですが、ここで使った条件の指定などは更新や削除をするときにも同様に使えます。
SELECT文がSQLの基本になります。
コメントを残す