Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

開発者の方向けの Sql server(db) t sql 振り返り

1.582 visualizaciones

Publicado el

CLR/H #clrh101 ~日本の夏、MR の夏~
http://clrh.connpass.com/event/31379/

Publicado en: Tecnología
  • Sé el primero en comentar

開発者の方向けの Sql server(db) t sql 振り返り

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

×