題材はプロゲートを参考にしました。
例題
平均得点数より得点数が多い選手名を調べたい。
テーブルは以下の通り。
id | name | goals | height |
---|---|---|---|
〜レコードは各種省略〜 | 〜レコードは各種省略〜 | 〜レコードは各種省略〜 | 〜レコードは各種省略〜 |
上記のようなテーブルがあった際、例題通りのデータを取り出したい場合、
SELECT 選手、得点数
FROM playerテーブル
where 得点数が > (
select 平均得点 from playerテーブル
);
日本語を散りばめると以下のようになります。そして、
SELECT カラム名
FROM テーブル名
where カラム名 > (
select カラム名 from テーブル名
);
こうなります。最終的には、
SELECT name,goals
FROM players
where goals > (
select avg(goals) from players
);
こうなります。
###例題
グレーパーカーより値段が高い商品の名前と値段を取得する。
テーブルは以下の通り。
Left align | Right align | Center align |
---|---|---|
This | This | This |
column | column | column |
will | will | will |
be | be | be |
left | right | center |
aligned | aligned | aligned |
select name, price
from items
where price > (
select price from items
where name = "グレーパーカー"
);
###例題
7000円以下の商品で、グレーパーカーより利益が高い商品
####考え方
・7000円以下の商品かつ、利益が高い商品をまずselect文で取得。
・サブクエリ内で名前がグレーパーカーである利益を取得する。
SELECT name, price - cost
FROM items
WHERE price <= 7000 AND price - cost > (
SELECT price - cost
FROM items
WHERE name = "グレーパーカー"
);
###例題
平均以上の所持金を持っている人を取得する。
テーブルは以下の通り。
userID | name | gold |
---|---|---|
-- 平均以上の所持金を持つユーザー数を表示する
SELECT userID, name, gold
FROM users
where gold >= (
select avg(gold) from users
);
##ポイント
where の後のカラム名とサブクエリ内のselectの後のカラムは同じ。平均とか合計とかは使える。
##注意
・サブクエリ内のテーブル名を忘れがちなので忘れないように指定する。
・日本語に置き換えて、SQL文にしてあげるのが理解しやすいと思います。
SQL文は英語と文法が似ているので英語を読むイメージで学習するようにしましょう。