SQL 勉強メモ

SQLを勉強していて気になったことをメモとして垂れ流しておきます。

GROUP BY GROUP BYは集約関数とセットで使うもの。 集約した結果を求めたい、という時に使うものとして考えられている。

※集約関数  COUNT,SUM,AVG,MAX,MIN

単に重複していないリストが欲しいのであれば、DISTINCTを使う。

GROUP BYで間違えやすいこと。

GROUP BY句ではSELECTでつけた列の別名は使えない

GROUP BY句は結果の順序をソートしない  同じGROUP BYを実行しても結果の順序が変わることはありえる。

HAVING WHERE :行に対する条件指定 HAVING:グループに対する条件指定

グループに対する条件指定とは 例えば、含まれる行数が2行、平均値が500など

HAVING句にかける要素には制限がある。 ・定数 ・集約関数 ・GROUP BY句で指定した列名(=集約キー)

ORDER BY

SELECTで指定した列の別名が使える。

NULLは先頭か末尾のどちらかにまとめられる。どちらかは特に決まっていない。 DBMSによって、先頭か末尾かを選択することのできるものもある。

ORDER BY句では、SELECT句に含まれていない列や集約関数も使える

なぜGROUP BYでは列の別名が使えないのにORDER BYなら使えるのか↓

SELECT文の内部的な実行順序

FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY

ビュー SQLの観点から見るとビューは「テーブルと同じもの」である。 違いは、テーブルには実際のデータが登録されているが、ビューはデータを持たずSELECT文を保持しているという点。

サブクエリ

サブクエリ=使い捨てのビュー

スカラ・サブクエリ

「必ず1行1列だけの戻り値を返す」という制限をつけたサブクエリ

1行1列だけ=ただ1つの値 「10」「東京都」など

戻り値が単一のため、比較演算子を利用することが可能となる

相関サブクエリ 小分けにしたグループ内での比較をするときに使う

スカラ・サブクエリでは単体の値を返さないといけない。 Aのパターンではこの値、Bのパターンではこの値を返す、みたいなときに使える。

SELECT shohin_bunrui, shohin_mei, hanban_tanka FROM Shohin AS S1 WHERE hanbai_tanka > (SELECT AVG(hanban_tanka) FROM Shohin as S2 WHERE S1.shohin_bunrui = S2.shohin_bunrui);

テーブルの足し算と引き算 UNION(和)・INTERSECT・(交差)EXCEPT(差)

いずれも、重複行は排除される。重複行も残すにはALLというオプションを指定する。

ウィンドウ関数(OLAP関数)

OLAP = Online Analytical Processing データベースを使ってリアルタイムにデータ分析を行う処理のこと

ウィンドウ関数の基本的な構文

<ウィンドウ関数> OVER ([PARTITION BY <列リスト>] ORDER BY <ソート用列リスト>)

ウィンドウ関数として使える関数 1.集約関数(SUM,AVG,COUNT,MAX,MIN)をウィンドウ関数として使う 2.RANK,DENSE_RANK、ROW_NUMBERなどのウィンドウ専用関数

RANK関数の利用

RANK レコードのランキング(順位)を算出する関数

例えば、商品分類別に、販売単価の安い順で並べたランキング表を作る

SELECT shohin_mei, shohin_bunrui, hanbai_tanka, RANK () OVER (PARTITION BY shoshin_bunrui ORDER BY hanbai_tanka) AS ranking FROM Shohin;

PARTITION BYは順位をつける対象の範囲を設定している PARTITION BYによって区切られた部分集合をウィンドウと呼ぶ

ウィンドウ関数はカットと順序づけの両方の機能を持っている

ウィンドウ関数はSELECT句でしか使えない。 (SELECT句以外で使えてもランキングに変動があると意味がなくなるため。)

集約関数をウィンドウ関数として使う

SUMの場合 累計

SELECT shohin_id, shohin_mei, hanbai_tanka, SUM(hanbai_tanka) OVER (ORDER BY shohin_id) AS current_sum FROM Shohin;

AVGの場合 現在平均

SELECT shohin_id, shohin_mei, hanbai_tanka, AVG(hanbai_tanka) OVER (ORDER BY shohin_id) AS current_avg FROM Shohin;

集計範囲を限定するフレーム

フレームというオプションを利用することで集計範囲を限定することも可能。 これを利用することで移動平均を計算することも可能

▼直前3行までを使う場合 SELECT shohin_id, shohin_mei, hanbai_tanka, AVG(hanbai_tanka) OVER (ORDER BY shohin_id ROWS 2 PRECEDING) AS moving_avg FROM Shohin;

▼直後3行までを使う場合 SELECT shohin_id, shohin_mei, hanbai_tanka, AVG(hanbai_tanka) OVER (ORDER BY shohin_id ROWS 2 FOLLOWING) AS moving_avg FROM Shohin;

▼前後1行までを使う場合 SELECT shohin_id, shohin_mei, hanbai_tanka, AVG(hanbai_tanka) OVER (ORDER BY shohin_id ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS moving_avg FROM Shohin;

複数のCSVファイルを結合する方法(まとめた対象は削除する)

やりたかったこと

複数に分けて出力されたCSVを一つにまとめたかった

出力ファイルはresult_{日付}.csvというファイル名で管理したい

対象のファイルは共有サーバー上にある

まとめた後のファイルはいらないので削除したい

作成したbat

@echo off
pushd %~dp0
setlocal enabledelayedexpansion

set /a counter=0

for /f %%i in ('dir /b *.csv') do (

    echo %%i
    if !counter!==0 (
        set /p _head=<%%i
        echo !_head!>>../Merged/result_%date:~0,4%%date:~5,2%%date:~8,2%.csv
    )
    set /a counter=!counter!+1

    for /f "tokens=* skip=1" %%b in (%%i) do (
        echo %%b>>../Merged/result_%date:~0,4%%date:~5,2%%date:~8,2%.csv
    )
)

del /q *.csv

pause

参考にした記事

ほぼこちらを参考にさせていただきました!

複数のcsvファイルを結合するバッチ(1個目のファイル以外は1行目を削除) - Qiita

共有ファイルサーバー上で実行したかったので参考にしました。

ネットワークコンピュータ上でバッチ処理がエラーになる - grum’s diary

.bat(バッチファイル)のforコマンド解説。 - Qiita

ファイルの削除(DEL, ERASE) | コマンドプロンプトの使い方

基本的な書き方の復習に。

【bat】Windowsのバッチファイル(*.bat)の書き方自分用まとめ - Qiita

https://www.adminweb.jp/command/file/index1.html

forループの中で値を変化させる

オススメChrome拡張機能 気づいたらブラウザのタブが増えまくって迷子になっている人へ。

あなたのタブはどのくらい?

あなたのブラウザ、タブはどのくらい開いてますか?

私はタブをめちゃくちゃ開きまくるタイプで気づくと、ゆうに20以上はタブを開いています。

タブを開きまくった時に、困るのは何と言っても、自分が開いていたタブがどこに行ったのかわからなくなる、という点です。

ここまで読んで「わかる!」と思った方が入れば、是非以下のChrome拡張を試してみてほしいです。

タブ軍に名前をつけて管理できる「Simple Window Server」

まず一つ目は「Simple Window Server」です。

Simple Window Saver - Chrome ウェブストア

こちらは今、開いているタブ軍に名前をつけて管理することができます。

複数ウィンドウを開いて、目的ごとに分けて管理したいという人にオススメです。

例えばメールや、カレンダーなど毎日確実に開くものが複数ある場合は、名前をつけて保存しておけば、ワンクリックで複数のページを開くことができます。

デザインがシンプルすぎて、格好良くはないのが少し残念ですが、その欠点を補ってあまりある便利です!

今開いているタブが一覧で管理できる「Quick-tabs」

もう一つ、紹介したいのは「Quick-tabs」です。

Quick Tabs - Chrome Web Store

こちらは、Chrome拡張のアイコンで、今開いているタブの数を可視化してくれ、アイコンをクリックするだけで今開いているタブの一覧を見ることができます。

こんな感じ。 f:id:kiyoikawa:20190506173027p:plain

また、便利なのが、タブ名での検索が可能という点です!

例えば、Qiitaで開いてたやつが見たい、と思ったなら検索欄に「Qiita」と打てば開いているタブの中からQiitaのページを持ってきてくれます。

f:id:kiyoikawa:20190506173234p:plain

タブを閉じたり、最近閉じたタブを確認して再度開いたり、という作業も拡張機能のウィンドウ上で可能という、とてもとても便利な機能となっています。

おわり

以上、タブ管理のオススメ拡張機能を紹介してみました。

タブに関する拡張機能はまだたくさんあるみたいなので、また色々試してみてよかったものは紹介してみたいなと思っています。

便利すぎるChrome拡張機能の紹介。Gmailのテンプレート・定型文登録ならGorgiasがオススメ

記念すべき初記事

自己紹介記事に続きまして、早速初記事を投稿したいと思います。

今日の話題は、個人的に愛用しているChrome拡張機能の一つ、Gorgiasについてです。

Gmailになぜかないテンプレート保存機能

みなさん、Gmailを使ったことはあるでしょうか?

はてなブログを読みに来るような人なら100パーセント使ったことがあるのではないでしょうか。

そして、70パーセントくらいの方は思ったことがあるのではないでしょうか。

「なぜGmailにはメールのテンプレート登録機能がないんだ」と。

ここで「それな」と思われる方と「返信定型文があるやん」と思われる方、双方がいらっしゃるのではないかと思います。

返信定型文は確かに基本機能にあります。

が、しかし、残念なことに、この機能は本文にしか使えず、タイトル、宛名が入れられない

という点で正直、テンプレートという意味では、ちょっと微妙だと思ってしまいます。

そんな方に

そこでオススメしたいのが拡張機能 「Gorgias Templates: Gmailのための電子メールテンプレート」です。

chrome.google.com

簡単な使い方

この機能を使えば、本文だけでなくタイトル、宛名、またまた添付ファイルまでテンプレートとして保存しておくことができます。

呼び出すもの、登録したショートカットキー+ tab で非常にお手軽です。

では簡単な使い方を紹介したいと思います。

上記URLをクリックし、Chrome Webストアを開いたら「拡張機能を追加」というボタンをクリックしてください。

拡張機能が追加されたら、自動でGorgiasが開かれます。

もし開かれなければ、Chromeの検索バーの右側に現れた「g」というアイコンをクリックで開きます。

画面が開くと簡単なチュートリアルが表示されるので、表示される英文に従って、操作してみましょう。

英語はとても簡単な文章なので、そこまで苦労なく進められると思います。

チュートリアルのイメージです。

チュートリアルを最後まで進めると、自分でテンプレートを登録するという選択肢を選ぶことができます。

以下の画像のように「New Template」ボタンが出てくればクリックしてチュートリアルは終了です。

画面のサイズによってはボタンがパッと表示されず、少しわかりにくいので注意してください。    チュートリアルのイメージ2

 

「New Template」をクリックすると、次のようなテンプレート登録画面が開かれます。

テンプレート登録画面

Template Nameに好きな名前、Text Shortcatに好きなショートカット用の文字を登録して、Template Contentに本文を記載すれば、それでテンプレート完成です。

画面下方の「Show More fields」をクリックすれば、タイトル、宛先(To、Cc、Bcc)を登録する欄も出てきます。

さらに応用編

さらに、その日の日付をメール本文やタイトルに入れたい、なんてこともできます。

{{date '' 'days' "YYYY/MM/DD"}}

これをコピーして、本文かタイトルの欄内にコピーすればそれでOKです。

テンプレートを呼び出すと自動で日付に変換してくれます。

今日の日付じゃなくて来週の日付、形式は英語式で、とかだと以下のような感じです。

{{date '+7' 'days' 'DD MMMM'}}

色々調べると、日付以外にも宛名の名前やメールアドレスを登録したりと、かなりカスタマイズできるので気になったら是非調べてみてください!

ちなみに

すごくどうでもいい情報ですが、この拡張機能の名前、Gorgias 読み方は「ゴルギアス」のようです。

ゴルギアスというのは哲学者の名前らしい。

ゴルギアス - Wikipedia

最後に

こんなに便利なのに、なぜかあまり知名度がないので、ぜひもっと知ってほしいという思いで記事を書いてみました。 (有名になったからといって、私が何か得をするわけではないのですが。)

知名度が低いので、Gmailのテンプレート機能ないのかな、と調べた方も情報にたどり着けていない模様です。

おーこれいいやん!となった方は是非、友人知人にもオススメしてあげてください。感謝される可能性大です。

ついでに使い方の説明に、このブログのURLをぺっと貼り付けていただけると大変嬉しいです!!!!!

初ブログ。

はじめまして

2019年5月5日。

長い10連休も終わりに差し掛かり、時間を持て余し始めたところで、ブログを初めて書いて見ることにしました。

 

なんで始めたの?

時間を持て余していて思いついたから、というのもあるんですが、ブログを始めようと思った大きな理由は二つです。

 

アウトプットをする習慣をつけよう、というのが一つ。

もう一つはちょっとしたお小遣い稼ぎになればいいなあという思い。

正直、ブログは過去にやってみたこともないので、稼ぎになるのかどうかはあまりわかっていません。(ちゃんと調べてから始めればいいのにね。)

 

ゆるーい自己紹介

自己紹介を軽くしておきます。

1995年生まれの24歳。出身は兵庫県、現在は東京都在住の社会人2年目。

会社はIT系の会社です。

エンジニアを目指しつつ、会社でも自宅でもすこ〜〜〜しずつ勉強しているところです。

 

これからの方針

これから書いていく記事は、会社や休日に学んだ技術系のトピック、便利だなと感心したサービスやツール、たまーに趣味の小説や映画の感想などなど。

自分のメモも兼ねて、という程度のゆるい感じで書いていきたいなと思います。

 

最後に

いつまで続くかは見ものですが、どうぞよろしくお願いします。