PHPとMySQLのSELECT文でデータ取得(PDO)

  • このエントリーをはてなブックマークに追加
  • Pocket

スポンサードリンク

PDOによるMySQLのSELECT文を使って、データベースからデータを取得します。

mysql_query()がPHP5.5で非推奨となり7.0で削除されたため、現在のPHPによるデータベース接続はPDOが主流となっています。

今回は、SELECT文とこのPDOを使ったMySQLのデータ取得をご紹介します。

WHERE句やORDER BY句などで、並び替えや特定の値を検索したり、件数を制限したりなどさまざまな条件を指定する方法もご紹介しています。

 

SELECT文の基本

本記事のテーブル構文

SELECT文を使ったデータ取得を見て行く前に、まず本記事で使用するデータベーステーブルを見てみましょう。

テーブル名:cities

idnamepopulation
1相模原717500
2大和230700
3海老名127700
4厚木224400
5藤沢409700

神奈川県の都市名と人口がまとめられたテーブルになっています。

基本的なコード

それでは、SELECT文でMySQLのデータを取得し、PHPでブラウザに出力するまでをひと通り見てみましょう。

相模原:717500人
大和:230700人
海老名:127700人
厚木:224400人
藤沢:409700人

上記のようにデータベースの中身が出力されました。

「フィールド」とは?

フィールドは「列」のことで、「カラム」とも呼ばれます。

この例では都市名(name)や人口(population)などの列になります。

ちなみに「行」はレコードと呼びます。

※当サンプルはデータベース接続後からのコードを記載しています。データベースの接続を知りたい方は下記ページをご覧ください。

参考:PHPでMySQLに接続する(PDO)

※当サンプルの変数$dbhは、上記ページでもご紹介しているデータベースの接続に関するプログラムが格納されています。

説明

上記サンプルの概要は以下のようになっています。

 

  1. citiesテーブルにある全てのデータを取得するSQL文を、変数に格納
    $sql = “SELECT * FROM cities”;
  2. SQL文を実行するコードを、変数に格納
    $stmt = $dbh->query($sql);
  3. foreach文でデータベースより取得したデータを1行ずつループ処理(連想配列で取得したデータのうち、1行文が$rowに格納される)
    foreach ($stmt as $row) {
  4. 連想配列形式の1行のデータから、キーを指定し、出力する
    echo $row[‘name’].’:’.$row[‘population’].’人’;
  5. データがなくなるまでforeach()内をループ処理

SQL文は大文字で記述されることが多いですが、小文字で記述することもできます。

SELECT文の基本的な構文

SELECT フィールド名 FROM テーブル名

上記のようなシンプルなSQL文であれば、上記のような構文になっています。

次からご紹介するWHERE句やORDER BY句などを任意に指定していくこともできます。

いろいろなSELECT文

先ほどのサンプルのような全データを取得する方法以外にも、特定の条件に当てはまるものだけを取得したり、件数を指定したり、並び替えたりと、いろいろなことができます。

特定のフィールドで並び替えて取得 – ORDER BY 句

データを都市の人口が格納されている列で並び替えて、取得してみましょう。

海老名:127700人
厚木:224400人
大和:230700人
藤沢:409700人
相模原:717500人

上記のように、人口が少ない順で並び替わりました。

先ほどのサンプルと違うのは、以下の部分だけです。

SELECT文以外は同じコードです。

全てのデータを取得し、以下の並び替えるORDER BYのSQL文が追加されています。

ORDER BY 並び替えの基準のフィールド

ORDER BYに続くフィールド名を基準にして、昇順に並び替えて取得できます。

特定の値を検索して取得 – WHERE 句

次に、特定の値を検索して一致したものだけを取得してみましょう。

大和:230700人

今度は データベースのIDフィールドにある 2 という値に該当するデータが1つだけ取得されました。

このサンプルも以下のSELECT文のみが違います。

WHERE句と呼ばれる、特定のフィールドの値のみを取得するSQL文となります。

WHERE 検索するフィールド = 値

WHEREに続くフィールドとその値に該当するデータのみ取得できます。

特定の値以上を検索して取得

都市の人口が30万人以上のみを取得してみましょう。

相模原:717500人
藤沢:409700人

上記のように人口30万人以上の都市のみ取得できました。

WHERE句の=(イコール)を比較演算子にして、特定のフィールドの値より大きいデータだけ取得したり、小さいデータを取得できます。

WHERE 検索するフィールド  比較演算子  値

比較演算子は下記ページでご紹介しています。

参考:PHPの比較演算子

特定の値以下を検索し、並べ替えて取得

WHERE句とORDER BY句を併せて指定し、より複雑なSQL文も記述できます。

以下では人口30万人以下の都市を、人口が多い順に並べ替えて取得しています。

大和:230700人
厚木:224400人
海老名:127700人

上記のように、人口30万人以下で人口が多い順に並び替えて取得できました。

WHERE句を指定した後に、ORDER BY句を指定し、最後に降順に並び替えるDESCを指定します。

順番が入れ替わるとエラーとなるため注意しましょう。

WHERE 検索するフィールド  比較演算子  値 ORDER BY 並び替えの基準のフィールド DESC

昇順の場合はASCを指定しますが、ORDER BY句は昇順がデフォルトなので、省略してもよいでしょう。

特定の行数から指定の行数だけ取得 – LIMIT句

LIMIT句を使えば、取得するテーブルの行数を指定できます。

大和:230700人
海老名:127700人
厚木:224400人

テーブルの2行目から3行分のデータが取得できました。

 

LIMIT [ 開始位置, ] 行数([ ]は省略可)

テーブルの2行目から3行分取得したい場合は、LIMIT 1,3と指定します。

LIMITの第一引数は0スタートなので注意しましょう。

第一引数の開始位置を省略した場合、先頭から指定行数が取得されます。

特定の範囲の値のみ取得 – WHERE句 – BETWEEN 句

都市の人口が20〜50万人の都市のみを取得してみましょう。

大和:230700人
厚木:224400人
藤沢:409700人

上記のように、人口20〜50万人の都市だけ取得できました。

この方法は、まずWHERE句で基準となるフィールドを指定し、その後にBETWEEN句で範囲を指定します。

WHERE 検索するフィールド  BETWEEN  値1 AND 値2

特定の値を検索して取得 – IN句

特定の都市のみ取得してみましょう。

相模原:717500人
海老名:127700人

上記のように、検索した2つの都市のデータのみ取得できました。

この方法は、まずWHERE句で検索したいフィールドを指定し、その後にIN句で検索する値カンマ区切りで指定します。

WHERE 検索するフィールド  IN ( 検索する値1 , 検索する値2 … )

IN句は検索したい値をカンマ区切りで指定していき、カッコで囲ってやります。

1個だけ指定することももちろん可能です。

スポンサードリンク

  • このエントリーをはてなブックマークに追加
  • Pocket

コメント

  1. vald より:

    RENAME TABLE “citys” TO “cities”;

    1. flatFlag より:

      Oh!mistaken!!
      to correct.
      Thank you!

  2. jasmine より:

    とてもわかりやすかったです!
    ずっと超えられなかった壁を超えることができました!
    ありがとうございます♪

    1. flatFlag より:

      ありがとうございます。
      分からなかったことが分かるようになったと言っていただけることが一番の励みになります。
      今後ともよろしくお願いいたします。

  3. たっちん より:

    すごい解りやすいです! ありがとうございます!

  4. たっちん より:

    事情があり php&csvベース のサイト構築をやり続けてまして(汗)  このページのお陰で、実務の場でcsv系のスキルが生きる見通しが立ちました! ありがとうございます!

  5. YAS より:

    初心者向けの初歩のSQLがよく纏められてると思いました。次は条件を複雑にして、複数のテーブルから(論理積,排他)で参照するとか2つの円を図解で説明して頂くと分かりやすいと思います。
    SE一年目は一つのテーブルから抽出したデータに紐付いたデータを全て抽出や、それ以外を抽出する事がかなり面倒くさく感じましたもので。

    1. flatFlag より:

      コメント遅くなり申し訳ありません。
      確かに今回は初歩的なSQL文しか載せていませんでしたので、別記事で複数テーブルやグループ化なども解説したいなとは思っています。
      また更新した際はよろしくお願いします。

コメントを残す

*