PDOによるMySQLのSELECT文を使って、データベースからデータを取得します。
mysql_query()
がPHP5.5で非推奨となり7.0で削除されたため、現在のPHPによるデータベース接続はPDOが主流となっています。
今回は、SELECT文とこのPDOを使ったMySQLのデータ取得をご紹介します。
WHERE
句やORDER BY
句などで、並び替えや特定の値を検索したり、件数を制限したりなどさまざまな条件を指定する方法もご紹介しています。
目次
SELECT文の基本
本記事のテーブル構文
SELECT文を使ったデータ取得を見て行く前に、まず本記事で使用するデータベーステーブルを見てみましょう。
テーブル名:cities
id | name | population |
---|---|---|
1 | 相模原 | 717500 |
2 | 大和 | 230700 |
3 | 海老名 | 127700 |
4 | 厚木 | 224400 |
5 | 藤沢 | 409700 |
神奈川県の都市名と人口がまとめられたテーブルになっています。
基本的なコード
それでは、SELECT文でMySQLのデータを取得し、PHPでブラウザに出力するまでをひと通り見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// SELECT文を変数に格納 $sql = "SELECT * FROM cities"; // SQLステートメントを実行し、結果を変数に格納 $stmt = $dbh->query($sql); // foreach文で配列の中身を一行ずつ出力 foreach ($stmt as $row) { // データベースのフィールド名で出力 echo $row['name'].':'.$row['population'].'人'; // 改行を入れる echo '<br>'; } |
相模原:717500人
大和:230700人
海老名:127700人
厚木:224400人
藤沢:409700人
上記のようにデータベースの中身が出力されました。
「フィールド」とは?
フィールドは「列」のことで、「カラム」とも呼ばれます。
この例では都市名(name)や人口(population)などの列になります。
ちなみに「行」はレコードと呼びます。
※当サンプルはデータベース接続後からのコードを記載しています。データベースの接続を知りたい方は下記ページをご覧ください。
※当サンプルの変数$dbh
は、上記ページでもご紹介しているデータベースの接続に関するプログラムが格納されています。
説明
上記サンプルの概要は以下のようになっています。
cities
テーブルにある全てのデータを取得するSQL文を、変数に格納
$sql = “SELECT * FROM cities”;- SQL文を実行するコードを、変数に格納
$stmt = $dbh->query($sql); - foreach文でデータベースより取得したデータを1行ずつループ処理(連想配列で取得したデータのうち、1行文が
$row
に格納される)
foreach ($stmt as $row) { - 連想配列形式の1行のデータから、キーを指定し、出力する
echo $row[‘name’].’:’.$row[‘population’].’人’; - データがなくなるまで
foreach()
内をループ処理
SQL文は大文字で記述されることが多いですが、小文字で記述することもできます。
SELECT文の基本的な構文
SELECT フィールド名 FROM テーブル名
上記のようなシンプルなSQL文であれば、上記のような構文になっています。
次からご紹介するWHERE
句やORDER BY
句などを任意に指定していくこともできます。
いろいろなSELECT文
先ほどのサンプルのような全データを取得する方法以外にも、特定の条件に当てはまるものだけを取得したり、件数を指定したり、並び替えたりと、いろいろなことができます。
特定のフィールドで並び替えて取得 – ORDER BY 句
データを都市の人口が格納されている列で並び替えて、取得してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// SELECT文を変数に格納 $sql = "SELECT * FROM cities ORDER BY population"; // SQLステートメントを実行し、結果を変数に格納 $stmt = $dbh->query($sql); // foreach文で配列の中身を一行ずつ出力 foreach ($stmt as $row) { // データベースのフィールド名で出力 echo $row['name'].':'.$row['population'].'人'; // 改行を入れる echo '<br>'; } |
海老名:127700人
厚木:224400人
大和:230700人
藤沢:409700人
相模原:717500人
上記のように、人口が少ない順で並び替わりました。
先ほどのサンプルと違うのは、以下の部分だけです。
1 2 |
// SELECT文を変数に格納 $sql = "SELECT * FROM cities ORDER BY population"; |
SELECT文以外は同じコードです。
全てのデータを取得し、以下の並び替えるORDER BY
のSQL文が追加されています。
ORDER BY 並び替えの基準のフィールド
ORDER BY
に続くフィールド名を基準にして、昇順に並び替えて取得できます。
特定の値を検索して取得 – WHERE 句
次に、特定の値を検索して一致したものだけを取得してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
// SELECT文を変数に格納 $sql = "SELECT * FROM cities WHERE id = 2"; // SQLステートメントを実行し、結果を変数に格納 $stmt = $dbh->query($sql); // foreach文で配列の中身を一行ずつ出力 foreach ($stmt as $row) { // データベースのフィールド名で出力 echo $row['name'].':'.$row['population'].'人'; } |
大和:230700人
今度は データベースのID
フィールドにある 2 という値に該当するデータが1つだけ取得されました。
このサンプルも以下のSELECT文のみが違います。
1 2 |
// SELECT文を変数に格納 $sql = "SELECT * FROM cities WHERE id = 2"; |
WHERE
句と呼ばれる、特定のフィールドの値のみを取得するSQL文となります。
WHERE 検索するフィールド = 値
WHERE
に続くフィールドとその値に該当するデータのみ取得できます。
特定の値以上を検索して取得
都市の人口が30万人以上のみを取得してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// SELECT文を変数に格納 $sql = "SELECT * FROM cities WHERE population >= 300000"; // SQLステートメントを実行し、結果を変数に格納 $stmt = $dbh->query($sql); // foreach文で配列の中身を一行ずつ出力 foreach ($stmt as $row) { // データベースのフィールド名で出力 echo $row['name'].':'.$row['population'].'人'; // 改行を入れる echo '<br>'; } |
相模原:717500人
藤沢:409700人
上記のように人口30万人以上の都市のみ取得できました。
WHERE
句の=
(イコール)を比較演算子にして、特定のフィールドの値より大きいデータだけ取得したり、小さいデータを取得できます。
WHERE 検索するフィールド 比較演算子 値
比較演算子は下記ページでご紹介しています。
参考:PHPの比較演算子
特定の値以下を検索し、並べ替えて取得
WHERE
句とORDER BY
句を併せて指定し、より複雑なSQL文も記述できます。
以下では人口30万人以下の都市を、人口が多い順に並べ替えて取得しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// SELECT文を変数に格納 $sql = "SELECT * FROM cities WHERE population <= 300000 ORDER BY population DESC"; // SQLステートメントを実行し、結果を変数に格納 $stmt = $dbh->query($sql); // foreach文で配列の中身を一行ずつ出力 foreach ($stmt as $row) { // データベースのフィールド名で出力 echo $row['name'].':'.$row['population'].'人'; // 改行を入れる echo '<br>'; } |
大和:230700人
厚木:224400人
海老名:127700人
上記のように、人口30万人以下で人口が多い順に並び替えて取得できました。
WHERE
句を指定した後に、ORDER BY
句を指定し、最後に降順に並び替えるDESC
を指定します。
順番が入れ替わるとエラーとなるため注意しましょう。
WHERE 検索するフィールド 比較演算子 値 ORDER BY 並び替えの基準のフィールド DESC
昇順の場合はASC
を指定しますが、ORDER BY
句は昇順がデフォルトなので、省略してもよいでしょう。
特定の行数から指定の行数だけ取得 – LIMIT句
LIMIT
句を使えば、取得するテーブルの行数を指定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// SELECT文を変数に格納 $sql = "SELECT * FROM cities LIMIT 1,3"; // SQLステートメントを実行し、結果を変数に格納 $stmt = $dbh->query($sql); // foreach文で配列の中身を一行ずつ出力 foreach ($stmt as $row) { // データベースのフィールド名で出力 echo $row['name'].':'.$row['population'].'人'; // 改行を入れる echo '<br>'; } |
大和:230700人
海老名:127700人
厚木:224400人
テーブルの2行目から3行分のデータが取得できました。
LIMIT [ 開始位置, ] 行数([ ]は省略可)
テーブルの2行目から3行分取得したい場合は、LIMIT 1,3
と指定します。
LIMIT
の第一引数は0
スタートなので注意しましょう。
第一引数の開始位置を省略した場合、先頭から指定行数が取得されます。
特定の範囲の値のみ取得 – WHERE句 – BETWEEN 句
都市の人口が20〜50万人の都市のみを取得してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// SELECT文を変数に格納 $sql = "SELECT * FROM cities WHERE population BETWEEN 200000 AND 500000"; // SQLステートメントを実行し、結果を変数に格納 $stmt = $dbh->query($sql); // foreach文で配列の中身を一行ずつ出力 foreach ($stmt as $row) { // データベースのフィールド名で出力 echo $row['name'].':'.$row['population'].'人'; // 改行を入れる echo '<br>'; } |
大和:230700人
厚木:224400人
藤沢:409700人
上記のように、人口20〜50万人の都市だけ取得できました。
この方法は、まずWHERE
句で基準となるフィールドを指定し、その後にBETWEEN
句で範囲を指定します。
WHERE 検索するフィールド BETWEEN 値1 AND 値2
特定の値を検索して取得 – IN句
特定の都市のみ取得してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// SELECT文を変数に格納 $sql = "SELECT * FROM cities WHERE name IN('相模原','海老名')"; // SQLステートメントを実行し、結果を変数に格納 $stmt = $dbh->query($sql); // foreach文で配列の中身を一行ずつ出力 foreach ($stmt as $row) { // データベースのフィールド名で出力 echo $row['name'].':'.$row['population'].'人'; // 改行を入れる echo '<br>'; } |
相模原:717500人
海老名:127700人
上記のように、検索した2つの都市のデータのみ取得できました。
この方法は、まずWHERE
句で検索したいフィールドを指定し、その後にIN
句で検索する値カンマ区切りで指定します。
WHERE 検索するフィールド IN ( 検索する値1 , 検索する値2 … )
IN
句は検索したい値をカンマ区切りで指定していき、カッコで囲ってやります。
1個だけ指定することももちろん可能です。
RENAME TABLE “citys” TO “cities”;
Oh!mistaken!!
to correct.
Thank you!
とてもわかりやすかったです!
ずっと超えられなかった壁を超えることができました!
ありがとうございます♪
ありがとうございます。
分からなかったことが分かるようになったと言っていただけることが一番の励みになります。
今後ともよろしくお願いいたします。
すごい解りやすいです! ありがとうございます!
事情があり php&csvベース のサイト構築をやり続けてまして(汗) このページのお陰で、実務の場でcsv系のスキルが生きる見通しが立ちました! ありがとうございます!
初心者向けの初歩のSQLがよく纏められてると思いました。次は条件を複雑にして、複数のテーブルから(論理積,排他)で参照するとか2つの円を図解で説明して頂くと分かりやすいと思います。
SE一年目は一つのテーブルから抽出したデータに紐付いたデータを全て抽出や、それ以外を抽出する事がかなり面倒くさく感じましたもので。
コメント遅くなり申し訳ありません。
確かに今回は初歩的なSQL文しか載せていませんでしたので、別記事で複数テーブルやグループ化なども解説したいなとは思っています。
また更新した際はよろしくお願いします。