サブクエリとは
ある問い合わせの結果に基づいて、異なる問い合わせを行う仕組みで、複雑な問い合わせができます。
where句の中で使うことが多いですが、where句以外にも、select句、from句、having句など様々な場所で利用できます。
サブクエリを使うと
日々の業務改善のデータ分析に役立つデータがデータベースから直接SQLで取り出せます。
例:全商品の平均単価より高い商品を取得 など。
サブクエリの構文
select 列名,... from テーブル名 where 列名 演算子 (select 列名 from テーブル名2...);
サブクエリ記述サンプル
2017年12月に商品を購入していないユーザー一覧を出力してみます。
必要な情報は、ユーザーid・苗字・email
- ユーザーテーブル=users
- ユーザーid(列名)=id
- 苗字(列名)=last_name
- email(列名)=email
- オーダーテーブル=orders
- 注文日時を持っている=order_time
とした場合
まず、ユーザー一覧から必要な列だけを取得します。
select id, last_name, email from users; select user_id from orders where order_time >= '2017-12-01 00:00:00' and order_time < '2018-01-01 00:00:00';
上記の記述では、商品を購入した一覧になってますので、まず、以下の部分をサブクエリとして使用します。
select user_id from orders where order_time >= '2017-12-01 00:00:00' and order_time < '2018-01-01 00:00:00';
次に、いないにはnot in演算子を使用
select * from テーブル名 where id not in (1,2,3);
以下がnot in演算子を使用したサブクエリの記述例になります。
select id, last_name, email from users where id not in( select user_id from orders where order_time >= '2017-12-01 00:00:00' and order_time < '2018-01-01 00:00:00');
実行結果は以下のように2017年12月に商品を購入していないユーザー一覧が出力できます。
スカラ・サブクエリ
スカラ:単一のという意味です。
スカラ・サブクエリとは
必ず1行1列だけの戻り値を返すサブクエリのことです。
※絶対にサブクエリが複数行返さないようにします。
スカラ・サブクエリ記述サンプル
このサンプルは、全商品の平均単価より、高い商品を取得するサンプルで
商品テーブル(products)の金額(price)から
平均単価をavg(price)で求めています。
select * from products where price > ( select avg(price) from products );
これを
商品単価の高い順
商品単価が同じ時は、登録順
に並び変えるには、order byを使います。
select * from products where price > ( select avg(price) from products ) order by price desc, id asc;
実行結果は、商品単価の高い順に並び替えられました。
この記事が役に立ったと思ったらポチッ!っと応援お願いします。
↓ ↓
もっとスキルアップしたい方は
↓ ↓
時間や場所に縛られず学習できるMySQL3選
コメント