1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SQL ビュー、サブクエリ

Posted at

こちらの記事では、私が学んだSQLについて記載しております。
自身の忘れないためのメモとしております。
間違っている部分もあるかもしれませんので、ご了承ください。

#ビューとテーブルの違い
#####・テーブル・・・実際のデータを保存
#####・ビュー・・・ビューの中にselect文が保存され、ビュー自体はデータを持たない!!!
メリット・・・データを保存しないので、記憶装置の容量を節約できる。select文の使い回しが可能。

デメリット・・・パフォーマンス低下を招く場合がある。

create view prefecture_user_counts(prefecture_user_countsname,count)
as
select
	p.name name,
    count(*) count
from
	users u
inner join
	prefectures p
	on u.prefecture_id = p.id
group by u.prefecture_id
;

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
***ビューでの出力***
select
	name,
    count
from
	prefecture_user_counts;

#ビューの制限事項
・order byは使用できない!
・更新系 insert,delete.updateに制約がある!
・いくつかの条件を満たす場合のみ、ビューに対する更新が可能!
 ーselectにdistinctが含まれていない
 ーfromに含まれているテーブルは1つだけ
 ーgroup byを使用していない
 ーhavingを使用していない
*ビューとテーブルの更新は連動して行われるため、集約されたビューは更新不可。

#ビューの削除

・記述方法
drop view ビュー名

#サブクエリ
####ある問合せの結果に基づいて、異なる問合せを行う仕組み。複雑な問合せが可能になる。

***not in 演算子***
select 
	id,
    last_name,
    email
from 
	users u
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'
);

---------------------------------------------------------------------
***in 演算子***
select
	id,
    last_name,
    email
from 
	users
where id in (   ←サブクエリ
select
	user_id
from
	orders
where 
	order_time >= '2017-12-01 00:00:00'
    and order_time < '2018-01-01 00:00:00'
);

#スカラ・サブクエリ
必ず1行1列だけの戻り値を返す、サブクエリのこと
スカラとは、単一のと言う意味。絶対にサブクエリが複数行を返さないようにする


select
*
from
	products
where 
	price > (
    select
		avg(price)
	from 
		products
        )
order by price desc, id;
;
    

#条件式 caseを使用

記述
case
 when 条件式1 then 値1   条件式1がTrueなら値1
 [when 条件式2 then 値2]  条件式2がTrueなら値2
 [eles 値3]         どれも当てはまらない値3
end

[]部分は省略可能。最後のendは省略不可。

select
	u.id user_id,
    u.last_name,
    count(*) num,
    case
		when count(*) >= 5 then 'A'
        when count(*) >= 2 then 'B'
        else 'C'
    end as user_rank
from
	users u
inner join
	orders o
on u.id = o.user_id
group by u.id
order by user_rank
;

#取得値nullの場合は、0で置き換える

select
	p.id,
    p.name,
    case
    when sum(od.product_qty) is null then 0
    else sum(od.product_qty)
    end as num
from
	products p
left outer join
	order_details od
	on p.id = od.product_id
group by p.id;

#補足
####date_format 

・記述方法
date_format(カラム,'%Y%m') 年月でデータを取得する!

select
	date_format(order_time, '%Y%m') 年月,
    round(avg(amount), 0) 平均客単価
from
	orders
group by 
	date_format(order_time, '%Y%m')
;

##データ利用方法
###データをCSVファイルに書き出す
export recordset to an external fileというボタンから作成可能です!
フロッピーのアイコンが目標になります!

###CSVファイルに書き出した後に、「Excel」にCSVファイルを取り込むことが可能になります。
-ExcelにCSVファイルを入れる方法!
Excelを開き、ファイルをクリックします。インポートをクリックし、アップロードから作成したCSVファイルを選択することでExcelにデータを入れることができます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?