Upload
oda-shinsuke
View
1.252
Download
0
Embed Size (px)
Citation preview
「開発者の方向けの」SQL Server / T-SQL 振り返り
CLR/H #clrh101 ~日本の夏、MR の夏~
2016/7/2 SQLWorld お だ
自己紹介
織田 信亮(おだ しんすけ)
大阪で開発者しています
SQLWorld の代表です
http://odashinsuke.hatenablog.com/
Twitter:@shinsukeoda
SQLWorld とは
http://sqlworld.org/
Twitter:@SQLWorld_JP
次のような情報を発信しているコミュニティです
MS の RDBMS である「SQL Server」
もちろん他の DB の話しも!
正規化/モデリング
SQL/NoSQL
World と名乗っていますが、
Worldwide
では無いです!
関西限定!
大阪で勉強会を
開催しています
このセッションの対象者
現場でSQL を書いている
開発者の方
SQL Server じゃなくても良いよ
SQL Server の使用経験が…
使ったことない!
昔のなら使ったことある
新しいのなら使ったことある
このセッションの内容
開発者の方のためのセッション!
Standard 以下で使えるものを中心に
管理 / 運用 のお話しは無し
専門外なので
知ってると開発時に便利な機能を pickup
T-SQL の構文 / 関数 等の紹介
SQL Server 2005 ~ 2016 まで順に紹介
名前だけ憶えてもらえればOK!
必要になったら詳細調べてね~
アジェンダ
SQL Server 2005
SQL Server 2008
SQL Server 2012
SQL Server 2014
SQL Server 2016 / SQL Database
SQL Server 2005
SQL CLR
T-SQL ではなく、CLR(C# や VB.NET)で、ストアドや関数、トリガー等を実装出来るしくみ
SQL Server のプロセス内で実行される
プロセス間通信とかしないよ
実際にどれ位使われてるのかは不明。。
使ってる人います?
クエリ通知 (Query Notification)
ADO.NET で利用可能
SELECT / EXECUTE に対して設定可能
使える構文の制限がきつい
対象のデータが変更されると、結果がSQL Server から PUSH されるイメージ
昔は ASP.NET の cache で使われてる感じ(専用のクラスも用意されてた)
OUTPUT 句
追加/更新/削除 された行の情報を取得
INSERT/UPDATE/DELETE/(MERGE)
よく利用するシチュエーション
INSERT後の IDENTITY列の値取得!
複数件の INSERT でもOK
プログラムからだと、ExecuteScalar / ExecuteReader 等の結果セットを返すメソッドで
WITH CTE
CTE = Common Table Expression
一時的な結果セットに名前を付けたもの
CTE は複数作成出来る
同じクエリ内で複数回参照可能
UNION ALL で自己参照 (再帰CTE)
自己結合による階層構造や連番作成 等に
TOP
2000 でもあったが構文が変わった!
TOP <integer> => TOP (<expression>)
式が書けるようになったので、変数 / サブクエリも可
旧構文は SELECT でのみ互換性のため残してある
ORDER BY 後に適用
OVER 句
ウィンドウ 関数が使えるように!
順位付け関数 / 集計関数 に partition by で関数を実行するグループを決める
RANK, ROW_NUMBER, …
SUM, MAX, MIN, COUNT, …
GROUP BY と PARTITON BY の違い
GROUP BY
集計関数で使用。結果セット全体を指定したグループで集計する。
結果セットもグループ単位になる
PARTITON BY
集計関数 / 順位付け関数 / (分析関数) で指定したグループで関数を実行する。
結果セットはグループ単位にならず、全件返る
SQL Server 2008
データ型
FILESTREAM
非構造型データをファイルシステムに保存
日付/時刻
date/time/dateitme2/datetimeoffset
Spatial Data(空間データ)
geometry/geography
hierarchyid
階層構造を表す専用の型
データの変更監視
変更データキャプチャ(CDC)
Enterprise のみ (Developer ではOK)
変更されたデータも保持
大きいストアドとかのデバッグで重宝!
変更の追跡 (Change Tracking)
Express Edition でも使える
変更された事実だけを保持
変更されたデータは保持しない
T-SQL の強化
DECLARE 時の代入
変数宣言時に代入可能
declare @hoge int = 5
複合演算子
+= -= *= /= %= ^= |=
MERGE
更新対象テーブルと元となるテーブルの結合結果に対して、更新処理を行う
MATCHED
結合結果でデータが存在していた
NOT MATCHED (BY TARGET)
更新対象にデータが無かった
NOT MATCHED BY SOURCE
元となるテーブルにデータが無かった
テーブル値コンストラクタ
行の値式のセット を表す
複数個まとめて INSERT 出来るアレの事
INSERT ~ VALUES (~), (~), (~), …
FROM や MERGE USING で利用可能
GROUPING の強化(GROUP BY)
GROUPING SETS
UNION ALL と同じ結果
ROLLUP
ROLLUP (C1, C2, C3)
C1, C2, C3 | C1, C2 | C1 | () の4パターン のUNION ALL
CUBE
CUBE (C1, C2, C3)全組み合わせ 8パターン の UNION ALL
(3C3 + 3C2 + 3C1 + 3C0) = 8
SQL Server 2012
OFFSET FETCH 句
結果セットから一部のデータだけをフェッチするオプション
ページングの実装用が主な使い道
ORDER BY は必須
TOP と同時には使えない
OVER
分析関数も使えるように!
LAG
LEAD
FIRST_VALUE
LAST_VALUE
…
関数の追加
PARSE
文字列 => 日付/時刻 or 数値
.NET に依存 (culture 指定可)
TRY_~
PARSE / CONVERT / CAST
変換失敗で null
FORMAT
書式指定文字列を返す
.NET に依存 (culture 指定可)
関数の追加
CHOOSE
値の一覧から index にある項目を返す
CHOOSE(index, val1, val2, …)
IIF
CASE の簡略化
CONCAT
N個の文字列結合で、null は空文字扱い
EOMONTH
月の最終日を返す
SQL Server 2014
なし!!
SQL Server 2016Azure SQL Database
Live Query Statistics
実行中のクエリの進行状況を表示する
SSMS クエリエディタ / 利用状況モニター で確認
Query Store
名前の通りクエリの実行情報を保持
時系列でクエリの情報を取得
同一クエリで実行プランが変わっても、プラン単位で実行情報を取得可能
特定の実行プランを強制することも
Stretch Database
テーブルのデータを SQL DB に自動的に移動
テーブル検索時に、透過的に SQL DB のテーブルもリモートクエリにより検索
どっちにデータがあるか意識しなくてOK
フィルター述語により、移行対象のデータをフィルター可
SQL DB に移動したデータは変更不可
制限も色々と
JSON サポート
SQLの実行結果をJSONとして出力
FOR JSON
JSON を テーブルっぽく展開する
OPENJSON
JSON 型が追加されたわけではない
文字列データ型に JSON を格納
他にも JSON 関数が追加
Temporal Tables
ANSI SQL:2011 規格
テーブルの変更履歴を自動で取得、任意のタイミング/期間のデータを検索可能
履歴テーブルに更新データを保持
期間指定の検索は透過的に行われる
通常の運用では履歴は過去のみ
来月社員増えるから先に登録して、来月から参照可能みたいなのは無理ー
Row-Level Security
テーブルにフィルターを設定することで、条件にマッチするデータのみ取得
INSERT / UPDATE / DELETE も制限可
ルールに一致しないデータの登録NG
INSERT / UPDATE
ルールに一致しないデータの操作NG
UPDATE / DELETE
Dynamic Data Masking
特定の列のデータを取得時に透過的にマスキングした結果を返す
データ自体はマスキングされていない
権限持ってるユーザーはマスクされていないデータを取得可能
よくあるのは メールアドレス や クレジットカード番号 のマスキングとか
関数
SESSION_CONTEXT
COMPRESS / DECOMPRESS
gzip での圧縮 / 展開
DATEDIFF_BIG
AT TIME ZONE
STRING_SPLIT
STRING_ESCAPE
FORMATMESSAGE の強化
まとめ
Standard 環境に絞ってもこれなので、Enterprise な人は大変ですね!!
どの RDBMS も似たり寄ったりの機能 / 構文 があると思うので、キーワード憶えておけば探せると思います。
クエリ書く人視点では、行式サポートしてないところがイケてない。
where ([受注番号], [受注枝番]) in (('JU0001', '01'), ('JU0001', '02')
)