記入日: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)
| id | name1 | name2 | population | img | area |
|---|---|---|---|---|---|
| 1 | 横浜市 | 神奈川県 | 3771961 | dbsample | 関東 |
| 2 | 大阪市 | 大阪府 | 2756807 | dbsample | 関西 |
| 3 | 名古屋市 | 愛知県 | 2325778 | dbsample | 中部 |
| 4 | 札幌市 | 北海道 | 1973000 | dbsample | 北海道 |
| 5 | 福岡市 | 福岡県 | 1631409 | dbsample | 九州 |
同様に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で体裁を整えると、以下のようになります。
| 市名 | 都道府県名 | 人口 | 平均との比率 | エリア | |
|---|---|---|---|---|---|
横浜市 |
神奈川県 |
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化のディレクションなどを行っています。