UI設計したり、ウェブシステムを開発したりします。 

SQL見るだけクエリ#016 サブクエリ(SELECT句での副問合せ)の例

記入日:2023-01-24 編集日:2023-01-24

SQL見るだけクエリ。今回は、SELECT句での副問合せの例を書いてみようと思います。

この記事を読むと(約5分)
SQLの中にSQLを記述するサブクエリの使い所がわかります。例えばある条件で絞り込むSQLを書く際に条件の値をSQLを使って導く時などに使えます。

以下のようなSQLで記述できます。

SELECT 都市名, 人口, (SELECT AVG(人口) FROM 都市別人口データ) AS 平均人口
FROM 都市別人口データ
WHERE 人口 > (SELECT AVG(人口) FROM 都市別人口データ)


この例では、「SELECT AVG(人口) FROM 都市別人口データ」がSELECT句での副問合せです。 このSQL文では、SELECT句内で 都市別人口データテーブルの「人口」列の平均値を求め、その結果を「平均人口」という列名に代入しています。 その後、WHERE句で「人口」列の値が平均値よりも大きいものを抽出しています。

具体的な例では、以下の様なテーブルを用意しました。(テーブル名:table_name)

idname1name2populationimgarea
1横浜市神奈川県3771961dbsample関東
2大阪市大阪府2756807dbsample関西
3名古屋市愛知県2325778dbsample中部
4札幌市北海道1973000dbsample北海道
5福岡市福岡県1631409dbsample九州

同様に20レコード(件)

テーブルの情報を取得するSQLに関して、注目する部分は、以下の9~12行目のみです。

SELECT name1,name2,population,area,population/(SELECT AVG(population) FROM table_name) AS ratio FROM table_name WHERE population > (SELECT AVG(population) FROM table_name) この部分で、データベース内にあるtable_nameテーブルのうち、人口の平均値(今回の場合だと1,386,922人)以上のレコード(保存された内容)を取得しております。

さらに、取得された都市の人口と平均人口値を比較して、平均人口に対しての割合を計算して表記しています。

try {
    include_once '../model/class.php';

    // データベース接続
    $database = new Database();
    $db = $database->connect();

    // SQLを準備し、パラメータをバインドする
    $query = 'SELECT name1,name2,population,area,
    population/(SELECT AVG(population) FROM table_name) AS ratio 
    FROM table_name 
    WHERE population > (SELECT AVG(population) FROM table_name)';

    $stmt = $db->prepare($query);

    // 実行する
    $stmt->execute();

    // 結果を取得する
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    print_r($result);

    // データベースから切断する
    $database->disconnect();

} catch(PDOException $e) {
    echo $e->getMessage();
}

これを実行すると、二次元連想配列という形式で、情報を取得することができます。

            Array
(
    [0] => Array
        (
            [name1] => 横浜市
            [name2] => 神奈川県
            [population] => 3771961
            [area] => 関東
            [ratio] => 2.7197
        )

    [1] => Array
        (
            [name1] => 大阪市
            [name2] => 大阪府
            [population] => 2756807
            [area] => 関西
            [ratio] => 1.9877
        )

    [2] => Array
        (
            [name1] => 名古屋市
            [name2] => 愛知県
            [population] => 2325778
            [area] => 中部
            [ratio] => 1.6769
        )

    [3] => Array
        (
            [name1] => 札幌市
            [name2] => 北海道
            [population] => 1973000
            [area] => 北海道
            [ratio] => 1.4226
        )

    [4] => Array
        (
            [name1] => 福岡市
            [name2] => 福岡県
            [population] => 1631409
            [area] => 九州
            [ratio] => 1.1763
        )

    [5] => Array
        (
            [name1] => 川崎市
            [name2] => 神奈川県
            [population] => 1540890
            [area] => 関東
            [ratio] => 1.1110
        )

    [6] => Array
        (
            [name1] => 神戸市
            [name2] => 兵庫県
            [population] => 1510171
            [area] => 関西
            [ratio] => 1.0889
        )

    [7] => Array
        (
            [name1] => 京都市
            [name2] => 京都府
            [population] => 1448964
            [area] => 関西
            [ratio] => 1.0447
        )

)
			

見やすくする為に、HTMLとCSSで体裁を整えると、以下のようになります。

全国792市の人口ランキングBEST20
の人口平均(1,386,922)以上の都市

市名 都道府県名 人口 平均との比率 エリア
横浜市
神奈川県
3771961
2.7197
関東
大阪市
大阪府
2756807
1.9877
関西
名古屋市
愛知県
2325778
1.6769
中部
札幌市
北海道
1973000
1.4226
北海道
福岡市
福岡県
1631409
1.1763
九州
川崎市
神奈川県
1540890
1.1110
関東
神戸市
兵庫県
1510171
1.0889
関西
京都市
京都府
1448964
1.0447
関西

サブクエリとは、データベース内のデータを取得するための「SELECT」文です。データを取得するために、サブクエリを使用すると、一つのSQL文内で複数のSQL文を実行することができます。つまり、サブクエリを使用すると、複数の問い合わせを一つの問い合わせ内で実行することができます。

SQLの使いどころ

サイトに大量の情報を掲載することは、ユーザーにとってとても便利なことです。しかし、情報が多すぎると、目的の情報を見つけるのが困難になります。そのため、SQLを使用することで、情報を効率的に管理することができます。

SQLを使用することで、データベース内の情報を検索したり、フィルタリングしたりすることができます。これにより、ユーザーは目的の情報をスムーズかつ簡単に見つけることができます。

また、SQLを使用することで、データを集計したり、統合したりすることもできます。これにより、ユーザーはさまざまな視点から情報を分析することができます。つまり、サイトに多くの情報を掲載することが重要である一方で、その情報を効率的かつ簡単に管理することが求められる場合には、SQLが不可欠であるといえます。

KK

機械工学を専攻。工業デザイナーとして、国内及び海外の自動車・搬送ラインの設計などに従事した後、2003年にウェブシステム会社を設立。UI設計やウェブシステムの開発、DX化のディレクションなどを行っています。