応用1)全期間における平均客単価を知りたい!
補足:単価は小数第1位で四捨五入
客単価とは1回の購買によってユーザー1人当たりが支払う総額のこと。
例えばユーザーAさんがカフェで飲食をしたとき
コーヒー300円とケーキ400円を購入したとき、この場合客単価は700円
select round(avg(amount), 0) from orders o;
補足:単価は小数第1位で四捨五入
客単価とは1回の購買によってユーザー1人当たりが支払う総額のこと。
例えばユーザーAさんがカフェで飲食をしたとき
コーヒー300円とケーキ400円を購入したとき、この場合客単価は700円
select round(avg(amount), 0) from orders o;
alter table, drop table, drop database等
・操作は基本的には取り消せない
・特に実務において本番環境を操作するときはサービスをメンテナンスモードにしてバックアップを取ってからalter tableなどを実行するのが安全
・想定外に時間がかかりシステムトラブルになる場合があるので注意!
・テスト環境でalter tableなどのテストをして問題点を洗い出してから
本番環境で実行するのがオススメ
例:新商品を1件追加したい!商品名は”新商品A”で価格を1000円とする
insert into products(name,price)values('新商品A', 1000);
ある問い合わせの結果に基づいて、異なる問い合わせを行う仕組み
select id,last_name,email from users where id not in( select user_id from orders where order_time >= '2017-012-01 00:00:00' and order_time < '2018-01-01 00:00:00');
・実際のデータを保存
・ビューの中にはセレクト文が保存される
・ビュー自体はデータを持たない
・order by句が使えない=並び替えできない
・ビューに対する更新は不可能ではないが制限があるデータを保存しないので記憶装置の容量を節約できる。
・よく使うセレクト文をビューにしておくことで使い回しができるが
パフォーマンス低下を招く場合がある
select p.name, count(*) from users as u inner join prefectures as p on u.prefecture_id = p.id group by prefecture_id;
これをviewにすることもできる。
片方のテーブルの情報がすべて出力されるテーブルの結合
外部結合は欠落のあるデータを取り扱う結合
select テーブル名1.列名,テーブル名2.列名・・・
from
テーブル名1
left outer join
テーブル名2
on テーブル名1.列名 = テーブル名2.列名;
left outer join・・・左側(from句で最初に書いたテーブル)をマスターとする。
right outer join・・・右側(from句で後に書いたテーブル)をマスターとする。
select u.last_name, u.id, o.user_id, o.id from users u left outer join orders as o on u.id = o.user_id order by u.id;
例:ユーザー一覧を取得したい!都道府県IDで出力されてもよくわからないので都道府県名も表示したい!
select users.id, users.last_name, users.first_name, prefectures.name from users inner join prefectures on users.prefecture_id = prefectures.id;
まず名字と名前と県IDを取得
select id, last_name, first_name, prefecture_id from users;
次にprefecture_idと都道府県名(prefectures.nane)を結びつける(inner join on)
select u.id, u.last_name,u.first_name, p.name from users as u inner join prefectures as p on u.prefecture_id = p.id;
select u.id, u.last_name,u.first_name, p.name from users u inner join prefectures p on u.prefecture_id = p.id;
現在の日付 (current_date)
select current_date();
現在の時刻 (current_timestamp)
select current_timestamp();
n日後の日付
select current_date() + 3;
n日前の日付
select current_date() – 3;
x時間後の時刻
select current_timestamp() + interval 6 hour;
x時間前の時刻
select current_time() – interval 6 hour;
extract 日付や時刻の特定の部分 (年や月)までを取り出す
select * from orders where extract(year_month from order_time)=201701;
select * from orders where extract(year from order_time)=2017;
select
*
from
orders
where
extract(month from order_time)=1;
テーブルを分けて情報の重複をなくしていく作業のこと。
データの管理が容易になること、データ容量の削減ができることなどの
メリットが有るため、特別な意図がなければテーブルは正規化する。
テーブル同士をある条件で結合することにより正規化なしの状態を作り出すこと
基本は正規化だが、パフォーマンスの問題が解消できない
またはできなくなりそうな場合はあえて非正規化することもある。