mcp 70-461 microsoft sql server 2012 へのクエリ 試験対策...
TRANSCRIPT
1
MCP 70-461:Microsoft® SQL Server 2012 へのクエリ試験対策コース
エディフィストラーニング株式会社ラーニングソリューション部
2 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
目標と前提条件
目標
「MCP 70-461:Microsoft® SQL Server 2012 へのクエリ」資格に対応する知識を学習
前提条件
リレーショナル データベースに関する基本知識を有していること
SQL Server データベース エンジンに関する基本知識を有し、管理ツールの操作に慣れていること
3 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
MCSA:SQL Server 2012SQL Server 2012 コア プラットフォーム スキルの所有を証明
2 種類の資格
MCSA (マイクロソフト認定ソリューション アソシエイト)
コア プラットフォーム スキルの所有を証明
MCSE (マイクロソフト認定ソリューション エキスパート)
卓越した IT スキルのスタンダードとして世界中で認知
多様なソリューションにわたって奥深い専門技術を実証
変わり続けるテクノロジーに対応する最先端のスキルを証明
MCSE:Data Platform大規模データ ソリューションの構築と管理のた
めの幅広いスキルセットを証明
MCSE:BusinessIntelligence
BI に関する専門スキルを証明
4 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
MCSA: SQL Server 2012
SQL Server の MCP 資格に初めて挑戦される方
SQL Server 2008 で SQL Server の MCP 資格を取得している方
http://www.microsoft.com/ja-jp/learning/certification/mcsa/sql-server/default.aspx
5 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
MCSE: Data Platform
SQL Server の MCP 資格に初めて挑戦される方
SQL Server 2008 で SQL Server の MCP 資格を取得している方
http://www.microsoft.com/ja-jp/learning/certification/mcse/sql-server/data-platform/default.aspx
6 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
MCSE: Business Intelligence
SQL Server の MCP 資格に初めて挑戦される方
SQL Server 2008 で SQL Server の MCP 資格を取得している方
http://www.microsoft.com/ja-jp/learning/certification/mcse/sql-server/business-intelligence/default.aspx
7 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
70-461 試験内容
受験対象者
SQL Server データベースの管理者、導入者、システム エンジニア、およびデータベース アプリケーションの開発者
出題範囲
1. データベースオブジェクトの作成 (24%)
2. データの操作 (27%)
3. データの変更 (24%)
4. クエリのトラブルシューティングと最適化 (25%)
所要時間
170 分
http://www.microsoft.com/ja-jp/learning/mcp/exam.aspx?cert=1&id=70-461
8 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
コースの概要
第1章 データベース オブジェクトの作成
T-SQL を使用したテーブルの作成と変更
ビューの作成と変更
DML トリガーの作成と変更
第2章 データの取得と変更
SELECT ステートメントによる基本的なクエリ
集計クエリと順位付け
XML データへのクエリ
DML ステートメントによるデータの変更
第3章 関数とストアド プロシージャ
関数
ストアド プロシージャ
第4章 クエリのトラブル シューティングと最適化
クエリの最適化
トランザクション管理
エラー処理
9 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
章の構成
T-SQL を使用したテーブルの作成と変更
ビューの作成と変更
DML トリガーの作成と変更
10 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
テーブルとは?
テーブルはデータを表形式の構造に格納
列の集まりとして定義される
各行には一意なレコードが置かれる
社員ID 部門ID 社員名 電話番号 住所 生年月日 更新日
1000 10 鈴木 和康 03-0123-0022 東京都杉並区 1972/1/11 2002/4/1
1001 11 矢嶋 聡 03-1234-0023 東京都板橋区 1978/4/3 2004/4/1
1002 11 荒木 達也 045-456-0024 神奈川県横浜市 1974/12/5 2001/4/1
1003 12 西 昭彦 03-7890-0025 東京都墨田区 1969/10/12 2003/4/1
← 行に置かれたレコード
列→
← 列名
11 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
テーブル定義の基本構文
CREATE TABLE ステートメント
ALTER TABLE ステートメントによる列の追加
CREATE TABLE <スキーマ名>.<テーブル名>(<列名1> <データ型> (NULL | NOT NULL)
, <列名2> <データ型> (NULL | NOT NULL)・・
)
ALTER TABLE <スキーマ名>.<テーブル名>ADD <列名1> <データ型> (NULL | NOT NULL)
12 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
システム データ型 (1/2)
カテゴリ データ型 バイト数 説明
整数
bigintintsmallinttinyint
8421
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 の整数値-2,147,483,648 ~ 2,147,483,647 の整数値-32,768 ~ 32,767 の整数値0 ~ 255の整数値
真数decimal[(p[, s])]numeric[(p[, s])]
5 ~ 17 - 10^38 +1 ~ 10^38 – 1の固定長の有効桁数と小数点部桁数を持つ数値
概数float[(n)]real
84
-1.79E + 308 ~ 1.79E + 308 の浮動小数点数-3.40E + 38 ~ 3.40E + 38 の浮動小数点数
通貨moneysmallmoney
84
-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 の金額データ値-214,748.3648 ~ 214,748.3647の金額データ値
日付と時刻
datetimeoffsetdatetimeDatetime2smalldatetimedatetime
8 ~ 1086 ~ 8433 ~ 5
1年1月1日 ~ 9999年12月31日の日付とタイム ゾーン オフセットが付いた時刻データ1753年1月1日 ~ 9999年12月31日の日付と時刻データ1年1月1日 ~ 9999年12月31日の日付と時刻データ1990年1月1日 ~ 2079年6月6日の日付と時刻データ1年1月1日 ~ 9999年12月31日の日付データ0:00:00.0000000 ~ 23:59:59.9999999
非 Unicode 文字
char[(n)]varchar[(n)]varchar(max)text
0 ~ 8,0000 ~ 8,0000 ~ 2 GB0 ~ 2 GB
8,000文字以内の固定長非Unicodeデータ8,000文字以内の可変長非Unicodeデータ2,147,483,647文字以内の可変長非Unicodeデータ2,147,483,647文字以内の可変長非Unicodeデータ
Unicode 文字
nchar[(n)]nvarchar[(n)]nvarchar(max)ntext
0 ~ 8,0000 ~ 8,0000 ~ 2 GB0 ~ 2 GB
4,000文字以内の固定長Unicodeデータ4,000文字以内の可変長Unicodeデータ1,073,741,823文字以内の可変長非Unicodeデータ1,073,741,823 文字以内の可変長非Unicodeデータ
13 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
システム データ型 (2/2)
カテゴリ データ型 バイト数 説明
バイナリbinary[(n)]varbinary[(n)]varbinary(max)
0 ~ 8,0000 ~ 8,0000 ~ 2 GB (または16バイト ポインタ)
8,000 バイト以内の固定長バイナリ データ8,000 バイト以内の可変長バイナリ データ2,147,483,647 バイト以内の可変長バイナリ データ
画像 image 0 ~ 2 GB (または16バイト ポインタ) 2,147,483,647 バイト以内の可変長バイナリ データ
グローバル識別子
uniqueidentifier 16 グローバルな一意識別子 (GUID) を格納するデータ型
xml xml 0 ~ 2 GB 2,147,483,647 バイト以内の可変長XMLデータ
特殊
bitcursortimestampsysnamesql_varianttablehierarchyidgeometrygeography
10 ~ 882560 ~ 8,016テーブルの定義内容による0 ~ 8920 ~ 8,060 (Undocumented)0 ~ 8,060 (Undocumented)
1 または 0カーソルへの参照を格納データベース タイムスタンプ値オブジェクト名を格納するユーザー定義データ型(nvarchar(128))int 値、binary 値、および char 値を格納できるテーブル形式のデータを格納階層内の位置情報を格納する CLR のデータ型ユークリッド座標系のデータを格納する CLR データ型球体地球座標系のデータを格納する CLR データ型
8,000 バイト以上のドキュメントや動画などのメディア ファイルは、varbinary(max) を使用
14 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
計算列と PERSISTED の効果
PERSISTED とマークされた計算列
計算値をテーブルに物理的に保存し、計算列のいずれかが更新された場合、その値を更新するように指定できる
次のテーブルに StockInStore と StockInWarehouse を合計した値を持つPERSISTED とマークされた計算列 (TotalCount) を追加する
次の ALTER TABLE ステートメントを実行する
内部的にはインデックスが作成される
インデックスが不要の場合は、PERSISTED を記述しない
ALTER TABLE Inventory ADD TotalCount AS (ProductsInStore + ProductsInWarehouse) PERSISTED
15 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
データ整合性
ドメインの整合性
列に格納される値が取りうる範囲を定義域(ドメイン)と呼ぶ
例
社員年齢は 18歳 以上 65 歳未満
性別は「男性」、「女性」の2種類
列に適正な値が格納されるように値の種類、形式、範囲、NULL 値を許容するかなどを規定する
データ型、NULL 値許容属性、CHECK 制約、DEFAULT 制約で設定
エンティティの整合性
テーブルに格納される行の一意性の保証
PRIMARY KEY 制約、UNIQUE 制約で設定
参照整合性
テーブル間の参照関係に矛盾がない状態を維持
FOREIGN KEY 制約、トリガーで設定
16 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
データ整合性と制約
データ整合性 対象 制約 説明
ドメイン
整合性
列 DEFAULT INSERT ステートメントの VALUE 句に明示的な値が指定さ
れていない場合、既定値を挿入
CHECK INSERT、UPDATE ステートメント実行時に格納される値を
制限
NULL NULL 値を許可するか拒否 (NOT NULL) するかを指定
テーブル FOREIGN KEY 格納できるデータ値を同一テーブル、または外部テーブルの
指定された列に格納される値の範囲に制限
エンティティ
整合性
テーブル PRIMARY KEY 各行を一意に識別する
内部的には、インデックスが作成される
NULL 値は許可されない
列 UNIQUE 各行を一意に識別する
内部的には、インデックスが作成される
NULL 値は 1 件入力できる
参照整合性 テーブル FOREIGN KEY 格納できるデータ値を同一テーブル、または外部テーブルの
指定された列に格納される値の範囲に制限
参照されているキー値の変更時の動作が指定できる
列 CHECK 格納できるデータ値を同一テーブルの別の列にに格納される
値の範囲に制限
17 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
制約の構文
PRIMARY KEY 制約
主キーとして設定し、列に重複した値が入力されないようにする
内部的に一意なクラスター化インデックスが作成される
FOREIGN KEY 制約格納できるデータ値を同一テーブル、または外部テーブルの指定された列に格納される値の範囲に制限
DEFAULT 制約列に既定値を格納
ALTER TABLE <テーブル名>ADD CONSTRAINT <制約名> FOREIGN KEY (<列名>)REFERENCES <テーブル名> (<列名>)
ALTER TABLE <テーブル名>ADD CONSTRAINT <制約名> PRIMARY KEY CLUSTERED (<列名1>, <列名n>))
ALTER TABLE <テーブル名>ADD CONSTRAINT <制約名> DEFAULT (<既定値>))
18 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
参照整合性
PRIMARY KEY 制約と FOREIGN KEY 制約により実装
部門ID
部門名
社員ID
部門ID
上司ID
社員名
電話番号
E メール
更新日
部門 社員
PK PK
FK
FK自己テーブル参照
1
2外部テーブル参照
19 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
制約の定義例
CREATE TABLE [部門](
[部門ID] int IDENTITY(1,1) NOT NULL
,[部門名] nvarchar(50) NOT NULL
CONSTRAINT [PK_部門] PRIMARY KEY CLUSTERED ([部門ID]) )
GO
CREATE TABLE [社員](
[社員ID] int IDENTITY(1000,1) NOT NULL
,[部門ID] int NOT NULL
,[上司ID] int NOT NULL
,[社員名] nvarchar(50) NOT NULL
,[電話番号] nchar(12) NOT NULL
,[Eメール] nvarchar(125) NOT NULL
,[生年月日] date NOT NULL
,[更新日] datetime NOT NULL CONSTRAINT [DF_社員_更新日] DEFAULT(GETDATE()),
CONSTRAINT [PK_社員] PRIMARY KEY CLUSTERED ([社員ID])
,CONSTRAINT [UQ_社員] UNIQUE ([Eメール]))
GO
ALTER TABLE [社員]ADD CONSTRAINT [FK_社員_上司] FOREIGN KEY([上司ID])
REFERENCES [社員]([社員ID])
GO
ALTER TABLE [社員]ADD CONSTRAINT [FK_社員_部門] FOREIGN KEY([部門ID])
REFERENCES [部門]([部門ID])
GO
20 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q1:PRIMARY KEY 制約
問:Customers テーブルは複数のソース テーブルから顧客データをインポートする。ここで Customers テーブルの各行が一意であることを保証したい
次の CREATE TABLE ステートメントを実行する
SourceID CustID Name
1 121 鈴木 和康
2 7856 矢嶋 聡
2 7859 荒木 達也
1 122 西 昭彦
CustID (PK) Name
121 鈴木 和康
122 西 昭彦
CustID (PK) Name
7856 矢嶋 聡
7859 荒木 達也
Customers
CREATE TABLE Customers (SourceID int NOT NULL,CustID int NOT NULL,Name nvarchar(255) NOT NULL,CONSTRAINT PK_Customers PRIMARY KEY CLUSTERED (SourceID, CustID))
21 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q2:FOREIGN KEY 制約
テーブル間の参照整合性を設定する
問:Orders テーブルの CustomerID が Customers テーブルのCustomerID の値の範囲であることを保証したい
次の ALTER TABLE ステートメントを実行する
ALTER TABLE OrdersADD CONSTRAINT FX_Order_CusomerID FOREIGN KEY (CusomerID)REFERENCES Cusomers (CusomerID)
22 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
一意な値の発行
IDENTITY プロパティによる整数値の発行
IDENTITY (シード値、増分値)
列のプロパティとして設定
引数で指定されたシード値から開始し、以降、増分値を加算した値を発行
NEWID() 関数による GUID 値の発行
uniqueidentifier 型に GUID 値を格納
ネットワーク上のサーバー間で複製されるテーブルの一意性を確保
SEQUENCE オブジェクト
NEXT VALUE FOR <シーケンス名> でシーケンス値を取得
CREATE TABLE Sales.受注(
受注ID int NOT NULL IDENTITY(1,1)
,製品ID int NOT NULL
,数量 smallint NULL,rowguid uniqueidentifier NOT NULL
CONSTRAINT DF_rowguid DEFAULT (newid() WITH VALUES)
)
CREATE SEQUENCE <オブジェクト名> AS <整数型>START WITH <初期値>INCREMENT BY <増分値>MINVALUE <最小値> MAXVALUE <最大値>(CYCLE | NO CYCLE)
UPDATE <テーブル名> SET <列名> = NEXT VALUE FOR <オブジェクト名>
23 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q3:GUID 値を発行する DEFAULT 制約
NEWID() 関数
GUID (グローバル一意識別子) として機能する 16 バイトの 2 進数値(Uniqueidentifier 型) を発行する
問:既存データを格納している Accounts テーブルに、新規データが挿入された時、GUID 値を生成し、格納するための列としてAccountGUID を追加したい
次の ALTER TABLE ステートメントを実行する
ALTER TABLE dbo.AccountsADD AccountGUID Uniqueidentifier NOT NULLCONSTRAINT DF_AccountGUID DEFAULTNEWID()WITH VALUES
24 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q4:SEQUENCE を使用した連番の発行
問:100 人の生徒情報を格納している Students テーブルに Class 列が追加された。その列に 1 から 10 の値を 1 ずつ増分しながら、循環させて格納したい
次の CREATE SEQUENCE と UPDATE ステートメントを実行する
CREATE SEQUENCE CLASS_Sequence AS intSTART WITH 1INCREMENT BY 1MINVALUE 1 MAXVALUE 10CYCLE
UPDATE Students SET CLASS = NEXT VALUE FOR CLASS_Sequence
25 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
SQL Server のインデックス
クラスター化インデックス
テーブルに 1 個
リーフノードには、インデックス付けされた列の値に基づきソートされたデータ行を格納
非クラスター化インデックス
テーブルに 999 個まで
リーフノードには、データ行へのポインタ (行識別子:RID) を格納
但し、既にクラスター化インデックスがある場合は、クラスター化インデックスのキー値を格納
一意なインデックスの作成では、UNIQUE キーワードを指定する
インデックス キーのサイズと複合インデックス列の数の制約
キー列の最大サイズ 900 バイト、16 列まで
PRIMARY KEY 制約を設定した列
他の列にクラスター化インデックスが存在しない場合
自動的に一意のクラスター化インデックスが作成される
他の列にクラスター化インデックスが存在する場合
一意の非クラスター化インデックスが作成される
CREATE CLUSTERED INDEX <インデックス名> ON <テーブル名>(<列名>,・・)
CREATE INDEX <インデックス名> ON <テーブル名>(<列名>,・・)
26 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
680 FR-R92B-58 Black ・・・
706 FR-R92R-58 Red ・・・
707 HL-U509-R Red ・・・
708 HL-U509 Black ・・・
709 SO-B909-M White ・・・
・・ ・・・ ・・・ ・・・
710 SO-B909-L White ・・・
711 HL-U509-B Blue ・・・
712 CA-1098 Multi ・・・
713 LJ-0192-S Multi ・・・
714 LJ-0192-M Multi ・・・
・・ ・・・ ・・・ ・・・
715 LJ-0192-L Multi ・・・
716 LJ-0192-X Multi ・・・
717 FR-R92R-62 Red ・・・
718 FR-R92R-44 Red ・・・
719 FR-R92R-48 Red ・・・
・・ ・・・ ・・・ ・・・
720 FR-R92R-52 Red ・・・
721 FR-R92R-56 Red ・・・
722 FR-R38B-58 Black ・・・
723 FR-R38B-60 Black ・・・
724 FR-R38B-62 Black ・・・
・・ ・・・ ・・・ ・・・
680 01:100
710 01:101
・・ ・・・・
715 01:102
720 01:103・・ ・・・・
680 01:141
715 01:142
・・ ・・・・
ページ:100 ページ:101 ページ:103
ページ:141
①
②
③
ページ:142
ページ:140
ProductID で並び替えられたデータ行
リンクリスト
ProductID
Clustered Index Seek
クラスター化インデックス
ページ:102
SELECT ProductID,ProductNumber,ColorFROM Production.ProductWHERE ProductID = 714
クラスター化インデックスの構造ProductID にクラスター化インデックスを作成した場合
生成される実行プラン
完全一致検索クエリ
27 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
680 01:180
710 01:181
・・ ・・・・
715 01:182720 01:183・・ ・・・・
710 01:110:03
711 01:130:04
712 01:100:04
713 01:110:01
714 01:120:05
・・ ・・・・・・
720 01:130:02
721 01:130:01
722 01:130:05
723 01:100:01
724 01:100:02
・・ ・・・・・・
715 01:100:03
716 01:130:03
717 01:120:04
718 01:120:02
719 01:110:05
・・ ・・・・・・
680 01:171715 01:172・・ ・・・・ページ:171 ページ:172
ページ:170
ページ:180 ページ:181 ページ:182 ページ:183
①
②
③
④
ファイル番号:ページ番号
Index Seek + RID Lookup
非クラスター化インデックス
680 01:120:03
706 01:110:04
707 01:110:02
708 01:120:01
709 01:100:05
・・ ・・・・・・
SELECT ProductID,ProductNumber,ColorFROM Production.ProductWHERE ProductID = 714
RID LOOKUP
RIDファイル番号:
ページ番号:行番号
ProductID
721 FR-R92R-56 Red ・・・
720 FR-R92R-52 Red ・・・
716 LJ-0192-X Multi ・・・
711 HL-U509-B Blue ・・・
722 FR-R38B-58 Black ・・・
・・ ・・・ ・・・ ・・・
708 HL-U509 Black ・・・
718 FR-R92R-44 Red ・・・
680 FR-R92B-58 Black ・・・
717 FR-R92R-62 Red ・・・
714 LJ-0192-M Multi ・・・
・・ ・・・ ・・・ ・・・
713 LJ-0192-S Multi ・・・
707 HL-U509-R Red ・・・
710 SO-B909-L White ・・・
706 FR-R92R-58 Red ・・・
719 FR-R92R-48 Red ・・・
・・ ・・・ ・・・ ・・・
723 FR-R38B-60 Black ・・・
724 FR-R38B-62 Black ・・・
715 LJ-0192-L Multi ・・・
712 CA-1098 Multi ・・・
709 SO-B909-M White ・・・
・・ ・・・ ・・・ ・・・
ページ:100 ページ:120 ページ:130ページ:110
非クラスター化インデックスの構造ProductID に非クラスター化インデックスを作成した場合
ヒープ
生成される実行プラン
完全一致検索クエリ
28 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
スキーマデータベース オブジェクトはスキーマ に置かれる
アプリケーションに対する名前空間の形成
<サーバー名>.<データベース名>.<スキーマ名>.<オブジェクト名>
スキーマ作成の基本構文
スキーマ変更の基本構文
データベース
Production Salesdbo
データベース
dbo
インスタンス
スキーマ
ALTER SCHEMA <新しいスキーマ名> TRANSFER <既存のスキーマ名>.<オブジェクト名>
CREATE SCHEMA <スキーマ名> AUTHORIZATION <所有者名>
29 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
章の構成
T-SQL を使用したテーブルの作成と変更
ビューの作成と変更
DML トリガーの作成と変更
30 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
ビューとは?
クエリにより定義される仮想テーブル
ビューが参照するベース テーブルに対するフィルターの役目をする
ベース テーブルへの直接のアクセスを許可したくない場合に使用
ビューの種類
標準のビュー
1 つ以上のベース テーブルまたは、ビューのデータを 1 つの新しい仮想テーブルに組み合わせる
インデックス付きビュー
ビューに一意なクラスター化インデックスを作成することによりビューを具体化 (永続化) する
パーティション ビュー
1 つ以上のサーバーに分散した 1 つ以上のベース テーブルを基に、行方向にパーティション分割されたデータを結合する
31 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
標準のビューの定義例
社員ID 部門ID 社員名 電話番号 生年月日 更新日
1001 10 鈴木 和康 03-0123-〇△×〇 1972/1/11 2002/4/1
1002 11 矢嶋 聡 03-1234-〇☐×△ 1978/4/3 2004/4/1
1003 11 荒木 達也 045-456-△×△〇 1974/12/5 2001/4/1
1004 12 西 昭彦 03-7890-〇×△△ 1969/10/12 2003/4/1
WITH SCHEMABINDINGベーステーブルの定義にビューをバインド
ベーステーブルに対し、ビュー定義に影響を与える変更は行えない
WITH CHECK OPTION行がビューに表示されなくなるような変更は実行できない
部門ID 部門名
10 企画部
11 営業部
12 生産部
社員テーブル部門テーブル
部門名 社員名 電話番号
企画部 鈴木 和康 03-0123-〇△×〇
営業部 矢嶋 聡 03-1234-〇☐×△
営業部 荒木 達也 045-456-△×△〇
vw_部門別社員情報
CREATE VIEW vw_部門別社員情報WITH SCHEMABINDING
AS
SELECT 部門名,社員名,電話番号
FROM dbo.部門
JOIN dbo.社員
ON 部門.部門ID
= 社員.部門ID
WHERE 部門.部門ID IN (10,11)
WITH CHECK OPTION
32 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
ビューを使用したデータの変更
元になる複数のテーブルを同時に変更することはできない
以下の列は変更できない
集計関数または計算から得られた列を変更できない
GROUP BY、HAVING、または DISTINCT 句の影響を受ける列を変更できない
33 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
インデックス付きビュー
インデックス付きビューの利点
ビューを永続化し、パフォーマンスを向上させる
クエリ オプティマイザーがクエリの解決にビューを使用できるようになる
インデックス付きビューの選択シナリオ
パフォーマンス向上がメンテナンスのオーバー ヘッドより重要
基になるテーブルのデータが頻繁に変更されない
クエリで多数のテーブルの結合や集計を実行する
インデックス付きビューの要件ビューに作成する最初のインデックスの種類は一意なクラスター化インデックス
SCHEMABINDING オプションを使用する
スキーマ バインドによって、ベース テーブルのスキーマにビューをバインドする
ビューから他のビューは参照できない
ベース テーブルはビューと同じデータベース内にあり、ビューと同じ所有者にする
ビューが参照するテーブルやユーザー定義関数は、<スキーマ名>.<オブジェクト名>の 2 部構成の形式で参照する
1 部、3 部、または 4 部構成の形式で構成されるオブジェクト名は使用できない
ビューから非決定的関数は参照できない
GROUP BY を記述する場合、ビュー定義に COUNT_BIG(*) を記述する
34 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q5:インデックス付きビューの定義
問:次の要件を満たす dbo.vwTokyoStudents という名前のビューを定義するProvince が「Tokyo」の生徒のすべての情報を表示する
ビューから Address テーブルにデータを挿入する場合、Province が「Tokyo」以外の生徒の情報は、挿入させないようにする
作成するビューにインデックスを作成できるようにする
次の CREATE VIEW ステートメントを実行する
CREATE VIEW dbo.vwTokyoStudentsWITH SCHEMABINDING AS SELECT *FROM Student sINNER JOIN Address a ON s.AddressID = a.AddressIDINNER JOIN EducationHistory e ON s.StudentID = e.StudentIDWHERE a.Province = 'Tokyo'WITH CHECK OPTION
35 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q6:インデックス付きビューの定義
問:次のビュー参照のパフォーマンスを向上させるには?
次のステートメントを実行する
CREATE VIEW Sales.vwCustomerSalesAmountWITH SCHEMABINDING AS SELECT
O.CustomerID,C.Name,SUM(O.SalesAmount) AS CustomerTotal,COUNT_BIG(*) AS Count
FROM Sales.Orders AS OINNER JOIN Sales.Customers AS CON O.CustomerID = C.CustomerIDGROUP BY O.CustomerID,C.Name
CREATE UNIQUE CLUSTERED INDEX idx_vwCustomerSalesAmountON Sales.vwCustomerSalesAmount (CustomerID)
36 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
章の構成
T-SQL を使用したテーブルの作成と変更
ビューの作成と変更
DML トリガーの作成と変更
37 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
トリガーとは?
特別な種類のストアド プロシージャ
トリガーとトリガーを引き起こしたステートメントは 1 つのトランザクションに含まれる
DML トリガー
テーブルに作成
INSERT、UPDATE、または DELETE ステートメントによりテーブル変更時にデータベース エンジンにより起動される
2 つの種類
AFTER トリガー
INSERT、UPDATE、または DELETE ステートメントの実行後に起動される
INSTEAD OF トリガー
テーブル、またはビューに作成
INSERT、UPDATE、または DELETE のステートメントの代わりに起動される
DDL トリガー
サーバーに作成
DDL ステートメント実行時に起動される
データベースオブジェクトの変更を監査
38 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
DMLトリガー定義の基本構文
DML トリガー
FOR と記述した場合、AFTER と同じ
CREATE TRIGGER <スキーマ名>.<トリガー名>
ON {<テーブル名>| <ビュー名>}
{FOR | AFTER | INSTEAD OF}
{[INSERT][,][UPDATE][,][DELETE]}
AS
BEGIN
・・・END
39 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
DML AFTER トリガーの例
inserted テーブル
挿入されたデータ行を保持
deleted テーブル
削除されたデータ行を保持
例:Products テーブルの RetailPrice 列、または SalesPrice 列の値が変更された場合、PriceUpdateHistory テーブルに変更前の値を記録するトリガー
CREATE TRIGGER dbo.TrgPriceUpdateON Products AFTER UPDATEASIF UPDATE(RetailPrice) OR UPDATE(SalePrice) INSERT INTO dbo.PriceUpdateHistorySELECT ProductID,RetailPrice AS OldRetailPrice,SalePrice AS OldSalePrice,GETDATE() AS UpdatedDateTimeFROM DELETED
40 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
DML INSTEAD OF トリガー
トリガーを起動するステートメントの動作を置き換える
使用例
1 つ以上の列に対するエラー チェックや値チェックの実行
行の挿入、更新、削除操作に対する追加の処理を実行
UNION ALL や INNER JOIN で結合された複数のベース テーブルを持つビューに対する挿入、更新、削除操作
41 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
DML INSTEAD OF トリガーの例
次の要件を満たすトリガーを Transactions テーブルに作成する
Transactions テーブルにデータが挿入される場合、Accounts テーブルにAccountNumber が存在する場合のみ データが挿入されるようにする
複数データが挿入される場合でも正しく動作する必要がある
次の CREATE TRIGGER ステートメントを実行する
CREATE TRIGGER TrgValidateAccountNumberON TransactionsINSTEAD OF INSERT ASBEGININSERT INTO TransactionsSELECT TransactionID ,AccountNumber ,Amount ,DateFROM INSERTEDWHERE AccountNumber IN (SELECT AccountNumber FROM Accounts)
END
42 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q7 ビューへのトリガーの作成
リレーションシップが設定された Employee と Address テーブル
各テーブルの主キー列には、IDENTITY プロパティが設定されている
次の定義文で vwEmployeeInfo という名前のビューを作成した
ビューに対して、INSERT や INSERT ・・・ SELECT ステートメントが実行された場合、Employee と Address テーブルにデータの挿入を可能にするためのトリガーを定義する
CREATE VIEW vwEmployeeInfoAS SELECTe.LastName
,e.FirstName,e.BirthDate,a.AddressID,a.Province,a.City,a.Address1,a.Address2FROM dbo.employee eINNER JOIN dbo.address aON e.AddressID = a.AddressID
CREATE TRIGGER trgVwEmployeeInfoON VwEmployeeInfoINSTEAD OF INSERTASBEGINDECLARE @AddressID intINSERT INTO dbo.Address(Province,City,Address1,Address2)SELECT Province,City,Address1,Address2 FROM INSERTEDSELECT @AddressID = SCOPE_IDENTITY()INSERT INTO dbo.Employee(LastName,FirstName,BirthDate,AddressID)SELECT LastName,FirstName,BirthDate,@AddressID FROM INSERTEDEND
43 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
コースの概要
第1章 データベース オブジェクトの作成
T-SQL を使用したテーブルの作成と変更
ビューの作成と変更
DML トリガーの作成と変更
第2章 データの取得と変更
SELECT ステートメントによる基本的なクエリ
集計クエリと順位付け
XML データへのクエリ
DML ステートメントによるデータの変更
第3章 関数とストアド プロシージャ
関数
ストアド プロシージャ
第4章 クエリのトラブル シューティングと最適化
クエリの最適化
トランザクション管理
エラー処理
44 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
章の構成
SELECT ステートメントによる基本的なクエリ
集計クエリと順位付け
XML データへのクエリ
DMLステートメントによるデータの変更
45 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
SELECT ステートメント
基本構文
テーブルの結合 (ANSI 89)・・・内部結合のみ
テーブルの結合 (ANSI 92)
SELECT <選択リスト> [ INTO <新しいテーブル名>]FROM <スキーマ名>.<テーブル名> [ WHERE <検索条件> ][ ORDER BY <並べ替えで使用する列名> [ ASC | DESC ] ]
SELECT <選択リスト>FROM <スキーマ名>.<テーブル名> , <スキーマ名>.<テーブル名> WHERE <結合条件>
SELECT <選択リスト>FROM <スキーマ名>.<テーブル名> JOIN <スキーマ名>.<テーブル名> ON <結合条件>
46 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
テーブルの結合
社員と部門テーブルの定義内容
各テーブルに格納されたデータ
47 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
内部結合
内部結合
結果セット
SELECT d.DepartmentName,e.EmployeeNameFROM dbo.Department d INNER JOIN dbo.Employee eON d.DepartmentID = e.DepartmentID
48 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
外部結合
左外部結合
結果セット
右外部結合
結果セット
SELECT d.DepartmentName,e.EmployeeNameFROM dbo.Department d LEFT OUTER JOIN dbo.Employee eON d.DepartmentID = e.DepartmentID
SELECT d.DepartmentName,e.EmployeeNameFROM dbo.Department d RIGHT OUTER JOIN dbo.Employee eON d.DepartmentID = e.DepartmentID
49 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
外部結合
完全外部結合
結果セット
SELECT d.DepartmentName,e.EmployeeNameFROM dbo.Department d FULL OUTER JOIN dbo.Employee eON d.DepartmentID = e.DepartmentID
50 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
クロス結合
クロス結合
結果セット
SELECT d.DepartmentName,e.EmployeeNameFROM dbo.Department d CROSS JOIN dbo.Employee e
51 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q8:テーブルの結合
問:次の要件を満たす SELECT ステートメントを記述する
顧客が購買した日を確認するため、Customers テーブルの Name 列とOrders テーブルの OrderDate 列を表示する
何も購買していない顧客の情報も表示する
次の SELECT ステートメントを実行する
SELECT c.Name
,o.OrderDateFROM Customers AS cLEFT OUTER JOIN Orders AS oON c.CustomerID = o.CustomerID
52 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
サブ クエリの記述
SELECT、INSERT、UPDATE、および DELETE ステートメントの内部、または別のサブクエリの内部で入れ子になっているクエリ
別のクエリの結果セットに依存するクエリ
式が使えるところであればどこにでも記述できる
SOME、ANY
サブ クエリが返すスカラー値のいずれかの値と比較
比較演算子の条件が一つでも True になる場合、True を返す
条件がすべて False になる場合、False を返す
ALL
サブ クエリが返すスカラー値のすべての値と比較
比較演算子の条件がすべて True になる場合、True を返す
条件が一つでも False になる場合、False を返す
53 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
SOME、ANY、ALL、IN 演算子
テーブルに格納されているデータ
比較演算子の条件が一つでも True になる場合、True を返す (<> ANY と同等)
比較演算子の条件がすべて True になる場合、True を返す (NOT IN と同等)
--社員の Tanakaが所属していない部署SELECT * FROM dbo.DepartmentWHERE DepartmentID <> SOME(SELECT DepartmentID FROM dbo.EmployeeWHERE EmployeeName = 'Tanaka')
--社員が誰も所属していない部署SELECT * FROM dbo.DepartmentWHERE DepartmentID <> ALL(SELECT DepartmentID FROM dbo.Employee)
54 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q9: SOME、ANY、ALL、IN 演算子
問:営業担当がいない地域に住む顧客の一覧を表示する
A. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID < > SOME (SELECT CityID FROM Sales.Salesperson)
B. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID < > ALL (SELECT CityID FROM Sales.Salesperson)
C. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID < > ANY (SELECT CityID FROM Sales.Salesperson)
D. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID NOT IN (SELECT CityID FROM Sales.Salesperson)
A. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID < > SOME (SELECT CityID FROM Sales.Salesperson)
B. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID < > ALL (SELECT CityID FROM Sales.Salesperson)
C. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID < > ANY (SELECT CityID FROM Sales.Salesperson)
D. SELECT CustomerID ,Name ,CityID FROM Sales.CustomersWHERE CityID NOT IN (SELECT CityID FROM Sales.Salesperson)
55 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
共通テーブル式 (CTE)
ANSI-99 SQL 規格に準拠した一時的な名前付き結果セット
派生テーブルの改良
一度だけ評価されステートメントが完了するまで保持される
複数回の参照、自己参照が可能
WITH 句で開始
名前 AS に続き丸括弧内に表現式
複数の CTE を記述する場合、カンマで区切る
結果セットを返す SELECT ステートメントが続く
WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear)
AS
( SELECT
SalesPersonID
, SalesOrderID
, YEAR(OrderDate) AS SalesYear
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL)
SELECT
SalesPersonID
, COUNT(SalesOrderID) AS TotalSales
, SalesYear
FROM Sales_CTE
GROUP BY SalesYear, SalesPersonID
ORDER BY SalesPersonID, SalesYear
GO
「Sales_CTE」という名前の CTE の定義
CTE のデータを取得する SELECT
CTE を参照する SELECT
WITH <CTE名>AS(<SELECTステートメント>)<DMLステートメント>
56 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q10:共通テーブル式 (CTE)
問:次の要件を満たす CTE を使用した SELECT ステートメントを記述する
最後に商品を購入してから 2 年間、商品を購入していない顧客名と最新の購入日を表示する
次の SELECT ステートメントを実行する
WITH CTE (CustomerID, MostResentOrderDate) AS (SELECT CustomerID, MAX(OrderDate) AS MostResentOrderDateFROM dbo.OrderSummaryGROUP BY CustomerID)SELECT ci.CustomerName,MostResentOrderDateFROM CTEINNER JOIN dbo.CustomerInfo ci ON CTE.CustomerID = ci.CustomerIDWHERE cte.MostResentOrderDate < DATEADD(YEAR, -2, GETDATE() )
57 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q11:共通テーブル式 (CTE)
問:次の要件を満たす CTE を使用した DELETE ステートメントを記述する
Products テーブルの Name 列に重複した値がある場合、削除する
UpdatedDate 列の値が古い方を削除する
次の DELETE ステートメントを実行する
WITH CTEDupRecordsAS(SELECT MAX(UpdatedDate) AS UpdatedDate, NameFROM ProductsGROUP BY NameHAVING COUNT(*) > 1)DELETE pFROM Products AS pJOIN CTEDupRecords AS cte ONcte.Name = p.NameAND cte.UpdatedDate > p.UpdatedDate
58 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
章の構成
SELECT ステートメントによる基本的なクエリ
集計クエリと順位付け
XML データへのクエリ
DMLステートメントによるデータの変更
59 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
集計クエリの SELECT ステートメント
基本構文
集計関数
集計クエリの例
SELECT <選択リスト>FROM <スキーマ名>.<テーブル名>[ WHERE <検索条件> ][ GROUP BY <グループ化する列名> ][ HAVING <検索条件> ][ ORDER BY <並べ替えで使用する列名> [ ASC | DESC ] ]
集計関数 説明
AVG 値の平均値
COUNT 値の数
COUNT(*) 行の数
MAX 最大値
MIN 最小値
SUM 値の合計値
SELECT ProductID, SUM (LineTotal) AS TotalSalesAmountFROM Sales.SalesOrderDetailGROUP BY ProductIDORDER BY ProductID
60 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q12:集計クエリ
問:次の集計クエリを記述しましたが、実行するとエラーになる
この集計クエリを次の要件を満たすようにして完成する
SELECT と FROM 句は上記クエリを利用する
SalesOrderID ごとに降順に並び替えて ProductID ごとに集計する
ProductID は昇順に表示する
SELECT SalesOrderID,ProductID,AVG (OrderQty),SUM (UnitPrice),MAX (UnitPriceDiscount)FROM Sales.SalesOrderDetail
SELECT SalesOrderID,ProductID,AVG (OrderQty),SUM (UnitPrice),MAX (UnitPriceDiscount)FROM Sales.SalesOrderDetailGROUP BY SalesOrderID ,ProductIDORDER BY SalesOrderID DESC ,ProductID ASC
61 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q13:集計クエリ
問:次の要件を満たす集計クエリを記述する
結果セットには顧客の名前、注文日の順序で表示する
注文日は顧客ごとに最新の日付のみを表示し、列名を「MostResentOrderDate」とする
注文日を降順に並び替えて表示する
ANSI 92 以降の構文に準拠する
次の SELECT ステートメントを実行する
SELECT C.Name
, MAX(O.OrderDate) AS MostRecentOrderDateFROM Customers AS C INNER JOIN Orders AS OON C.CustomerID = O.CustomerIDGROUP BY C.NameORDER BY MostRecentOrderDate DESC
62 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
ROLLUP、CUBE、GROUPING SETS
ROLLUP
単純な GROUP BY 集計行と小計行、および総計行を生成
CUBEROLLUP 集計行とクロス集計行を生成
GROUPING SETS指定したグループの集計のみを生成する
SELECT CustomerID, ProductID, SUM([Total Amount] AS TotalFROM dbo.v_OrderSummaryGROUP BY ROLLUP (CustomerID, ProductID)
SELECT CustomerID, ProductID, SUM([Total Amount] AS TotalFROM dbo.v_OrderSummaryGROUP BY CUBE (CustomerID, ProductID)
SELECT CustomerID, ProductID, SUM([Total Amount] AS TotalFROM dbo.v_OrderSummaryGROUP BY GROUPING SETS ((CustomerID, (ProductID),
(ProductID),())
63 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
順位付けの対象となる行セットのパーティション分割と並べ替え方法を指定
構文
順位付け関数
順位付け関数 説明
ROW_NUMBER() 順序番号を生成
RANK() 対象行より 1 つ前の行数に 1 を加算した値 (同じ順位の行には同じ順位番号が付けられ、番号が飛ぶ)
DENSE_RANK() 対象行より 1 つ前の行の順位数に 1 を加算した値
NTILE() 対象の結果セットを指定された数で分割
SELECT <選択リスト>,<順位付け関数>RANK() OVER (ODER BY <列名> [ ASC | DESC ] ) AS <別名>FROM <スキーマ名>.<テーブル名>ORDER BY <スキーマ名>. <列名> [ ASC | DESC ]
64 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
サンプル クエリ
結果セット
順位付け関数
SELECT CustomerID,[Total Amount]
,ROW_NUMBER()OVER(ORDER BY [Total Amount] DESC) AS Order_ROW_NUMBER
,RANK() OVER(ORDER BY [Total Amount] DESC) AS Order_Rank
,DENSE_RANK() OVER(ORDER BY [Total Amount] DESC) AS Order_Dense_Rank
,NTILE(100) OVER(ORDER BY [Total Amount] DESC) AS Ntile_100
FROM dbo.OrderSummary2
ORDER BY [Total Amount] DESC
65 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q14 順位付け関数
問:次の要件を満たす順位付け関数を使用したクエリを記述する
ProductCatalog テーブルの列を参照し、製品リストを作成する
テーブルに定義された列の順序ですべての列の値を表示し、最後の列に RriceRank という名前の列を追加し、SalesPrice 列の値で行の順位付けをする
SalesPrice の値を降順で表示する
複数の製品で SalesPrice 列の値が同じ場合、同じ順序を付けて番号を飛ばす
次の SELECT ステートメントを実行する
SELECT ProductCatalog.ProductID,ProductCatalog.Name,ProductCatalog.RetailPrice,ProductCatalog.SalesPrice,RANK() OVER (ORDER BY ProductCatalog.SalesPrice DESC) AS PriceRankFROM Sales.ProductCatalogORDER BY ProductCatalog.SalesPrice DESC
66 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q15 順位付け関数
科目ごとに最高得点の生徒を得点と一緒に表示する
A. SELECT StudentID, Name, RANK() OVER (ORDER BY AVG (Score) DESC) AS Value FROM dbo.StudentScore GROUP BY StudentID, Name ORDER BY Value
B. SELECT StudentID, Name, DENSE_RANK() OVER (ORDER BY AVG (Score) DESC) AS Value FROM dbo.StudentScore GROUP BY StudentID, Name ORDER BY Value
C. SELECT StudentID, Name, NTILE(3) OVER (ORDER BY AVG (Score) DESC) AS Value FROM dbo.StudentScore GROUP BY StudentID, Name ORDER BY Value
D. SELECT Subject, StudentID, Score AS ValueFROM (SELECT Subject, StudentID, Score AS Score,RANK () OVER (PARTITION BY Subject ORDER BY Score ASC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1
E. SELECT Subject, StudentID, Score AS ValueFROM (SELECT Subject, StudentID, Score AS Score,RANK () OVER (PARTITION BY Subject ORDER BY Score DESC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1
F. SELECT StudentID, Name, Score AS Value FROM (SELECT StudentID, Name, Score AS Score,RANK () OVER (PARTITION BY StudentID ORDER BY Score ASC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1
G. SELECT StudentID, Name, Score AS Value FROM (SELECT StudentID, Name, Score AS Score,RANK () OVER (PARTITION BY StudentID ORDER BY Score DESC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1
A. SELECT StudentID, Name, RANK() OVER (ORDER BY AVG (Score) DESC) AS Value FROM dbo.StudentScore GROUP BY StudentID, Name ORDER BY Value
B. SELECT StudentID, Name, DENSE_RANK() OVER (ORDER BY AVG (Score) DESC) AS Value FROM dbo.StudentScore GROUP BY StudentID, Name ORDER BY Value
C. SELECT StudentID, Name, NTILE(3) OVER (ORDER BY AVG (Score) DESC) AS Value FROM dbo.StudentScore GROUP BY StudentID, Name ORDER BY Value
D. SELECT Subject, StudentID, Score AS ValueFROM (SELECT Subject, StudentID, Score AS Score,RANK () OVER (PARTITION BY Subject ORDER BY Score ASC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1
E. SELECT Subject, StudentID, Score AS ValueFROM (SELECT Subject, StudentID, Score AS Score,RANK () OVER (PARTITION BY Subject ORDER BY Score DESC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1
F. SELECT StudentID, Name, Score AS Value FROM (SELECT StudentID, Name, Score AS Score,RANK () OVER (PARTITION BY StudentID ORDER BY Score ASC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1
G. SELECT StudentID, Name, Score AS Value FROM (SELECT StudentID, Name, Score AS Score,RANK () OVER (PARTITION BY StudentID ORDER BY Score DESC) AS Rank FROM dbo.StudentScore) tmp WHERE Rank = 1
67 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
LAG 関数と LEAD 関数
LAG 関数
自己結合を使用せずに同じ結果セットの前の行からデータにアクセス
LEAD 関数
自己結合を使用せずに同じ結果セットの後続の行からデータにアクセス
SELECT YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota, LAG(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS PreviousQuota
FROM Sales.SalesPersonQuotaHistoryWHERE BusinessEntityID = 275 and YEAR(QuotaDate) IN ('2005','2006')
SELECT YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota, LEAD(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS PreviousQuota
FROM Sales.SalesPersonQuotaHistoryWHERE BusinessEntityID = 275 and YEAR(QuotaDate) IN ('2005','2006')
68 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
UNION と UNION ALL
UNION 演算子
結果セットを結合する
複数のステートメントの選択リスト内の式 (列名、算術式、集計関数など) の数は、すべて同じにする
重複する行は削除される
重複する行を削除したくない場合、UNION ALL を記述する
SELECT COUNT (*) AS NumberOf Sales
,SUM (SalesAmount) AS TotalSalesAmountFROM DomesticSalesOrdersUNION ALL SELECT COUNT (*) AS NumberOfSales
,SUM (SalesAmount) AS TotalSalesAmountFROM InternationalSalesOrders
69 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
章の構成
SELECT ステートメントによる基本的なクエリ
集計クエリと順位付け
XML データへのクエリ
DMLステートメントによるデータの変更
70 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
XML クエリ
SQL クエリを XML データに変換
FOR XML モード
FOR XML モード XML の構造
RAW 行セットを汎用識別子 <row> を持つ XML に変換属性(既定)、または要素 (ELEMENTS ディレクティブを記述) に展開
AUTO 行セットを XML に変換複数テーブルの親子関係を階層に反映属性(既定)、または要素 (ELEMENTS ディレクティブを記述) に展開
PATH XML 構造の厳密な制御が可能列の別名に XPath 式を記述し要素と属性の展開パターン、および階層構造を制御する(要素 (既定) または属性(AS 句で XPath 式を記述) に展開)
71 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q16:XML クエリ
適切な FOR XML モードを指定する
SELECT
OrderID
,OrderDate
,SalesAmount
,Name
,City
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID = Customers.CustomerID
WHERE Customers.CustomerID = 1
FOR XML RAW
<row OrderID="1" OrderDate="2013-04-01" SalesAmount="1000.0000" Name="Tanaka" City="Chiba" />
<row OrderID="6" OrderDate="2013-04-02" SalesAmount="280.0000" Name="Tanaka" City="Chiba" />
72 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q17:XML クエリ
<Orders OrderID="1" OrderDate="2013-04-01" SalesAmount="1000.0000">
<Customers Name="Tanaka" City="Chiba" />
</Orders>
<Orders OrderID="6" OrderDate="2013-04-02" SalesAmount="280.0000">
<Customers Name="Tanaka" City="Chiba" />
</Orders>
SELECT
OrderID
,OrderDate
,SalesAmount
,Name
,City
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID = Customers.CustomerID
WHERE Customers.CustomerID = 1
FOR XML AUTO
適切な FOR XML モードを指定する
73 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q18:XML クエリ
<Orders><OrderID>1</OrderID><OrderDate>2013-04-01</OrderDate><SalesAmount>1000.0000</SalesAmount><Customers>
<Name>Tanaka</Name><City>Chiba</City>
</Customers></Orders>
SELECT
OrderID
,OrderDate
,SalesAmount
,Name
,City
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID = Customers.CustomerID
WHERE Customers.CustomerID = 1
FOR XML AUTO ,ELEMENTS
適切な FOR XML モードを指定する
74 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q19:XML クエリ
<Customers Name="Tanaka" City="Chiba"><OrderID>1</OrderID><OrderDate>2013-04-01</OrderDate><SalesAmount>1000.0000</SalesAmount>
</Customers><Customers Name="Tanaka" City="Chiba">
<OrderID>6</OrderID><OrderDate>2013-04-02</OrderDate><SalesAmount>280.0000</SalesAmount>
</Customers>
SELECT
Name AS '@Name'
,City AS '@City'
,OrderID
,OrderDate
,SalesAmount
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID = Customers.CustomerID
WHERE Customers.CustomerID = 1
FOR XML PATH ('Customers')
属性として展開
属性として展開
適切な FOR XML モードを指定する
75 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
章の構成
SELECT ステートメントによる基本的なクエリ
集計クエリと順位付け
XML データへのクエリ
DML ステートメントによるデータの変更
76 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
OUTPUT 句を使用したデータの更新
OUTPUT ・・・ INTO 句
更新されたデータのアーカイブや検証で使用
UPDATE ステートメントで影響を受ける行の情報を INSERTED、およびDELETED テーブルの値として返す
INTO に指定したテーブル、またはテーブル型変数にデータを挿入
価格変更の情報を格納する例
UPDATE Production.ProductSET ListPrice = ListPrice * 1.05OUTPUT INSERTED.ProductID
,DELETED.ListPrice,INSERTED.ListPrice
INTO Production.ProductListPrice_Log (ProductID, OldPrice, NewPrice)GO
77 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
バイナリ ラージ オブジェクト (BLOB) の更新
BLOB データ型
varchar(max)、 nvarchar(max)、varbinary(max)
8000 バイト以上のデータを格納
varbinary(max) には文書ファイル、画像、動画などを格納できる
Windows API からもアクセスする場合は、FILESTREAM 属性を指定
データの更新方法
UPDATE ステートメントに列に対する WRITE メソッドを記述
WRITE メソッドの構文
サンプル コード
<列名>.WRITE (<新しい値>,@Offset,@Length)
DECLARE @MyTableVar table (SummaryBefore nvarchar(max)
, SummaryAfter nvarchar(max))GOUPDATE Production.DocumentSET DocumentSummary.WRITE (N'features',28,10) OUTPUT DELETED.DocumentSummary
, INSERTED.DocumentSummaryINTO @MyTableVarWHERE Title = N'Front Reflector Bracket Installation'GOSELECT SummaryBefore, SummaryAfter FROM @MyTableVar
78 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
MERGE ステートメント
ANSI SQL 2006 準拠
データソースを対象のテーブル、またはビューと結合し、その結合結果に基づいて複数の操作を実行
単一ステートメントで INSERT、UPDATE、および DELETE 操作を実行できる
複数の行セット入力に使用
MERGE <対象テーブル> USING <ソース テーブル> ON <結合条件>
WHEN MATCHED
THEN UPDATE SET <対象テーブル>.<列名> = <ソース テーブル>.<列名>
WHEN MATCHED AND <式>
THEN DELETE
WHEN NOT MATCHED BY TARGET
THEN INSERT VALUES(・・・)
79 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q20:MERGE ステートメント
問:TerritoryInfo テーブルのデータをメンテナンスするストアドプロシージャを完成させる
TerritoryCode が存在する場合は更新する
TerritoryCode が存在しない場合は挿入する
CREATE PROCEDURE dbo.InsertTerritoryInfo@TerritoryCode int,@TerritoryName nvarchar(50),@Country nvarchar(10)ASBEGINSET NOCOUNT ONMERGE dbo.TerritoryInfo AS targetUSING (SELECT @TerritoryCode, @TerritoryName, @Country)AS source (TerritoryCode, TerritoryName, Country)ON (target.TerritoryCode = source.TerritoryCode)
WHEN MATCHED THEN UPDATE SET target.TerritoryName = source.TerritoryName,
target.Country = source.CountryWHEN NOT MATCHED BY TARGET THEN INSERT(TerritoryCode, TerritoryName, Country)VALUES(source.TerritoryCode, source.TerritoryName, source.Country);
END
80 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
コースの概要
第1章 データベース オブジェクトの作成
T-SQL を使用したテーブルの作成と変更
ビューの作成と変更
DML トリガーの作成と変更
第2章 データの取得と変更
SELECT ステートメントによる基本的なクエリ
集計クエリと順位付け
XML データへのクエリ
DML ステートメントによるデータの変更
第3章 関数とストアド プロシージャ
関数
ストアド プロシージャ
第4章 クエリのトラブル シューティングと最適化
クエリの最適化
トランザクション管理
エラー処理
81 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
章の構成
関数の使用
関数の作成
ストアド プロシージャの作成と変更
82 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
CONVERT() 関数
値を指定されたデータ型に変換する
基本構文
使用例
CONVERT ( <データ型> , <値> )
CREATE PROCEDURE usp_GetOrderInfo@Parameter1 varchar(20)ASSELECT Orders.OrderIDFROM OrdersWHERE Orders.OrderDate > CONVERT(datetime,@Parameter1)
SELECT COUNT(*)FROM PurchasesWHERE PurchaseTime >= CONVERT(date, GETDATE())AND PurchaseTime < DATEADD(day, 1, CONVERT(date, GETDATE()))
83 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
TRY_PARSE() 関数
値を指定されたデータ型に変換する
変換に失敗する場合 NULL を返す
基本構文
使用例
DECLARE @var varchar(MAX) = '1234567.123' SELECT IIF(TRY_PARSE(@var AS decimal(10,3)) IS NULL,
'True', 'False')
AS Result
TRY_PARSE (<値> AS <データ型> )
84 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
FORMAT() 関数
形式とオプションのカルチャを指定し、書式設定された値を返す
基本構文
使用例
カルチャ情報に基づく各国対応した形式への変換が可能
FORMAT (<値> , <形式> [, <カルチャ>] )
SELECT FORMAT(GETDATE(), 'yyyy-mm-dd', 'ja-JP')
85 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
EOMONTH 関数
オプションのオフセットを使用し、指定された日付の月の最終日を返す
基本構文
使用例
DECLARE @date DATETIME SET @date = GETDATE() SELECT EOMONTH ( @date ) AS '当月末日' SELECT EOMONTH ( @date, 1 ) AS '来月末日' SELECT EOMONTH ( @date, -1 ) AS '先月末日'
EOMONTH ( <日付> [, <月数>] )
86 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
章の構成
関数の使用
関数の作成
ストアド プロシージャの作成と変更
87 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
関数を使用するシナリオ
SELECT などの Transact-SQL ステートメント内で使用する
関数を呼び出すアプリケーション内で使用する
別のユーザー定義関数の定義内で使用する
ビューをパラメータ化したり、インデックス付きビューの機能を向上させる
テーブルの計算列を定義する
他のテーブルを参照するような場合
列の CHECK 制約を定義する
88 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
関数の種類
スカラー値関数
単一値を返す
式を記述できる箇所で使用
テーブル値関数
結果セットを返す
FROM 句に使用
パラメータを持つビューに似ている
89 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
関数定義の基本構文
インライン関数単一の SELECT ステートメントの結果を返す
複数ステートメント関数BEGIN ~ END ブロック構造
CREATE FUNCTION スキーマ名.関数名(@パラメータ名1 データ型, @パラメータ名2 データ型, ・・・) RETURNS データ型[WITH オプション]AS RETURN(
SELECT 列名1,列名2,・・FROM スキーマ名.テーブル名WHERE 行の検索条件)
CREATE FUNCTION スキーマ名.関数名(@パラメータ名1 データ型, @パラメータ名2 データ型, ・・・) RETURNS データ型[WITH オプション]AS
BEGIN
・・・RETURN
END
90 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
スカラー値関数の例
RETURNS 句で戻り値のデータ型を指定
同じデータ型のスカラー式が許容される任意の場所で呼び出せる
CREATE FUNCTION dbo.LeapYearCheck (@Date datetime)
RETURNS int
AS
BEGIN
DECLARE @Year int
DECLARE @LeapYear bit
SET @Year = YEAR(@Date)
IF((@Year % 4 = 0 AND @Year % 100 != 0) OR @Year % 400 = 0)
SET @LeapYear = 1
ELSE
SET @LeapYear = 0
RETURN (@LeapYear)
END
SELECT
FirstName
,LastName
,year(BirthDate) AS BirthYear
,dbo.LeapYearCheck(BirthDate) AS LeapYear
FROM HumanResources.Employee
91 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
テーブル値関数の例
RETURNS に table データ型を指定
関数の内容は 単一の SELECT ステートメント
返されるデータ構造はクエリ定義によって決まる
依存するテーブルの構造を変更させたくない場合 WITH 句に SHEMABINDING を記述
FROM 句に記述して呼び出す
CREATE FUNCTION dbo.GetStockQty
(@ProductID int)
RETURNS table
WITH SCHEMABINDING
AS
RETURN(
SELECT
l.Name
,pi.Bin
,pi.Shelf
,pi.Quantity
FROM Production.ProductInventory pi
INNER JOIN Production.Location l
ON pi.LocationID = l.LocationID
WHERE ProductID = @ProductID
)
SELECT *
FROM dbo.GetStockQty(2)
92 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
テーブル値関数の結合
CROSS APPLY を使用したテーブル値関数の結果との結合
外部テーブルを左入力、テーブル値関数は右入力とする
外部結合の場合は OUTER APPLY を記述
SELECTcp.plan_handle
,OBJECT_NAME(qp.objectid) AS 'object_name',qp.query_plan,cp.objtypeFROM sys.dm_exec_cached_plans cpCROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qpWHERE cp.objtype ='Proc'
93 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
章の構成
関数の使用
関数の作成
ストアド プロシージャの作成と変更
94 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
ストアド プロシージャとは?
Transact-SQL ステートメント、または Microsoft .NET Framework コードのコレクションに名前を付けたもの
EXECUTE ステートメントで実行
入力パラメータを受け入れ、出力パラメータ値を返す
成功または失敗を示すステータス値を返す
ストアド プロシージャの種類
システム ストアド プロシージャ
拡張システム ストアド プロシージャ
ユーザー定義の Transact-SQL ストアド プロシージャ
ユーザー定義の SQLCLR ストアド プロシージャ
関数との違い
エラー ハンドリングが可能
DDL ステートメントが記述できる
EXECUTE で呼び出すため、クエリやビューの中には記述できない
95 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
ストアド プロシージャの定義
ストアド プロシージャの構文
主要なオプション
ENCRYPTION
CREATE PROCEDURE ステートメントの元のテキストを、暗号化した形式に変換することを
EXECUTE AS
プロシージャを実行するコンテキストの指定
RECOMPILE
プロシージャのプランをキャッシュしない
CREATE PROCEDURE <プロシージャ名>[@<入力パラメーター1> <データ型>[= <既定値>]]
,[@<入力パラメーター2> <データ型>[= <既定値>]], …,[@<出力パラメーター1> <データ型> OUTPUT],[@<出力パラメーター2> <データ型> OUTPUT], …WITH <オプション>AS <SQLステートメント>
96 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
EXECUTE AS による実行コンテキスト制御
所有者が異なるオブジェクトの場合
EXECUTE AS で所有者に偽装できる
EXECUTE AS に設定できる引数
山本さん
佐藤さんが所有する
テーブル
鈴木さんが所有する
ストアドプロシージャ
(EXECUTE AS ‘佐藤’)
山本さんのEXECUTE 権限がチェックされる
佐藤さんのSELECT 権限が
チェックされる!
引数 説明
CALLER モジュール内のステートメントは、モジュールを実行しているユーザー本人のコンテキストで動作するため、モジュールを実行したユーザーは、そのモジュールが参照するすべてのデータベース オブジェクトに対して適切な権限が付与されている必要がある
OWNER モジュール内のステートメントを、モジュールの所有者のコンテキストで実行する。所有者が指定されていないモジュールについては、そのモジュールのスキーマの所有者のコンテキストが使用される。この引数は、DDLトリガーまたはログオントリガでは指定できない
データベースユーザー名 指定したデータベースユーザーのコンテキストで実行する。サーバースコープの DDL トリガー、またはログオントリガーには指定できない
ログイン名 指定したログインのコンテキストで実行する。サーバースコープの DDL トリガーまたはログオン トリガーにのみ指定できる
97 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
ストアド プロシージャ定義と実行
プロシージャの定義出力パラメーターの指定
OUTPUT 句を指定すると呼び出し元に値が返る戻り値の指定
RETURN 句を指定すると呼び出し元に int 型の値が返る
プロシージャの実行出力パラメーターの指定
OUTPUT 句を指定した変数に値が渡る
CREATE PROCEDURE dbo.usp_GetProductInfo@ID int
,@Price money OUTPUTAS SET NOCOUNT ONSELECT @Price = SalesPriceFROM dbo.ProductsWHERE ProductID = @IDRETURN
DECLARE @Price moneyDECLARE @RC intEXECUTE @RC = dbo.usp_GetProductInfo 771 ,@Price OUTPUTPRINT N'Return Code = ' + CAST(@RC AS nvarchar(8)) +
N' Price = ' + CAST(@Price AS nvarchar(8))
98 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
ストアド プロシージャ実行時の情報取得
@@ERROR
直前に実行したステートメントの整数値のエラー番号を返す
次のステートメントの実行前に変数に退避しないと上書きされる
@@ROWCOUNT
直前に実行したステートメントに影響を受けた行数を返す
次のステートメントの実行前に変数に退避しないと上書きされる
DECLARE @Error intDECLARE @RowCount int
EXECUTE usp_DeleteProductsSELECT @Error = @@ERROR, @RowCount = @@RowCountIF (@Error <> 0)PRINT N'ERROR = ' + CAST(@Error AS nvarchar(8))
+ CAST(@Rowcount AS nvarchar(8)) + N' Rows Deleted!'
99 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
カーソルを使用した呼び出しの例
結果セットの値によりプロシージャを実行したい場合などに使用する
DECLARE @EmpID intDECLARE contact_cursor CURSOR FORSELECT EmployeeID FROM dbo.Employee
OPEN contact_cursorFETCH NEXT FROM contact_cursorINTO @EmpID
WHILE @@FETCH_STATUS = 0BEGIN
EXECUTE usp_EmpReport @EmpIDFETCH NEXT FROM contact_cursorINTO @EmpID
ENDCLOSE contact_cursorDEALLOCATE contact_cursorGO
100 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q21:ストアド プロシージャの作成
問:次の要件を満たすストアド プロシージャを記述する
@Count という名前のひとつの int 型のパラメーターを使用する usp_GetProductInfoという名前のストアド プロシージャを作成する
製品名と販売価格のみを返す
@Count パラメーターで指定された値の行数のみを返す
SalesPrice の値を降順で表示する
定義内容を暗号化する
次の CREATE PROCEDURE ステートメントを実行する
CREATE PROCEDURE usp_GetProductInfo@Count intWITH ENCRYPTIONASSELECT TOP(@Count) Products.Name,Products.SalesPriceFROM dbo.ProductsORDER BY Products.SalesPrice DESC
101 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
コースの概要
第1章 データベース オブジェクトの作成
T-SQL を使用したテーブルの作成と変更
ビューの作成と変更
DML トリガーの作成と変更
第2章 データの取得と変更
SELECT ステートメントによる基本的なクエリ
集計クエリと順位付け
XML データへのクエリ
DML ステートメントによるデータの変更
第3章 関数とストアド プロシージャ
関数
ストアド プロシージャ
第4章 クエリのトラブル シューティングと最適化
クエリの最適化
トランザクション管理
エラー処理
102 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
章の構成
クエリの最適化
トランザクション管理
エラー処理
103 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
実行プラン
クエリ エンジンが生成するクエリ プランとユーザー コンテキスト
クエリ プラン
ユーザー コンテキストを含まない再入可能な読み取り専用のデータ構造体
実行コンテキスト
検索条件の値やパラメータ値など実行に固有のデータ
104 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
実行プランを発見 コンパイル済みプランを発見
クエリ プラン生成のフロー
実行プランを生成
メモリ割当ての許可 と並列プラン化
実行
プランが発見できない
自動パラメータ化
ビルド、ビューの展開
解析
クエリの最適化
プランをキャッシュに格納
新しいステートメント
プロシージャキャッシュ
の検索
インデックスと統計情報を参照
インデックス 統計情報
クエリ オプティマイザ クエリ実行
言語処理
クエリ エンジン
105 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
実行プランの表示と制御
ステートメント解析時に推定のグラフィカル プランを表示
ステートメント解析時に推定のテキスト プランを表示
ステートメント実行時に実際に使用したグラフィカル プランを表示
ステートメント実行時に実際に使用したテキスト プランを表示
グラフィカル プランは、クエリ実行に不足するインデックスが見つかると推奨されるインデックスを提案する機能も含む
SET SHOWPLAN_XML ON
GO
SET SHOWPLAN_ALL ON
GO
SET STATISTICS XML ON
GO
SET STATISTICS PROFILE ON
GO
106 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
クエリの最適化
アドホック クエリの最適化
optimize for ad hoc workloads サーバー構成オプション
毎回、動的に作成される再利用性が低いアドホック クエリのプランでプロシージャ キャッシュがいっぱいにならないように指定できる
EXECUTE sys.sp_configure N'optimize for ad hoc workloads', N'1'GORECONFIGURE WITH OVERRIDEGO
107 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
統計情報の表示
統計のプロパティ
108 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
手動による統計情報の作成と更新
統計情報の作成
CREATE STATISTICS
テーブル サイズが大きい場合、サンプリングにより統計情報を生成できる
統計情報の手動更新
統計情報の行数見積もりと実際の行数が異なるような場合、実行する
更新のためのステートメント
UPDATE STATISTICS
sp_updatestats
CREATE STATISTICS <統計情報名>
ON { <テーブル名> | <ビュー名> } ( <列名> [ ,...n ] )
[ WHERE <フィルター述部> ]
[ WITH
[ [ FULLSCAN
| SAMPLE <数値> { PERCENT | ROWS }[ , ] ]
[ NORECOMPUTE ]
]
109 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
章の構成
クエリの最適化
トランザクション管理
エラー処理
110 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
トランザクションとは?
論理的な 1 つの作業単位として実行される一連の操作
トランザクション処理に要求される ACID プロパティ
ACID プロパティ 説明
原子性 (Atomicity) トランザクションは分離できない 1 つの作業単位トランザクション内のデータ変更は、すべて実行されるか、まったく実行されないかのどちらかでなければならない
一貫性 (Consistency) トランザクション完了時、すべてのデータが一貫した状態になければならない
分離性 (Isolation ) 同時実行トランザクションからの変更は、他のトランザクションによって行われる変更から独立している
持続性 (Durability ) トランザクション中にインスタンス停止が発生しても完了したトランザクションによる変更結果は持続されなければならない
111 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
トランザクションの記述
暗黙的なトランザクション
SET IMPLICIT_TRANSACTIONS ON で開始
トランザクションは自動的に開始され終了または取り消しを記述
ANSI-92 標準、Oracle の既定モード
処理1
処理2
処理3
SET IMPLICIT_TRANSACTIONS ON
COMMIT
ROLLBACK
明示的なトランザクション明示的にトランザクションの開始、終了、取り消しを記述
明示的に開始しない場合ステートメント実行時に一文ずつ確定する(自動コミットモード)
SQL Server の既定モード
トランザクション
トランザクション
処理1
処理2
処理3
BEGIN TRAN TRN1
COMMIT TRAN TR1
ROLLBACK TRAN TR2
BEGIN TRAN TRN2
トランザクション
トランザクション
112 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
XACT_ABORT
ステートメント実行時にエラーが発生した場合、トランザクション全体を確実にロールバックさせる場合、XACT_ABORT を ON に設定する
例文
XACT_ABORT が OFF の場合、エラーの重大度レベルにより、エラーが発生したステートメントのみが、ロールバックされ、トランザクション処理は継続される場合がある
SET XACT_ABORT ON
GO
113 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
既定のトランザクション分離レベルでのロック動作
基本的なロック モード
基本的なロックの互換性
トランザクション分離レベルで制御可能
ロックモードの種類 説明
共有 (Shared:S) SELECT ステートメントなどデータ変更を伴わない読み取り操作で使用
更新 (Update:U) INSERT、UPDATE、DELETE ステートメントによるデータ変更を前提とした読み取り操作で使用
排他 (eXclusive:X) INSERT、UPDATE、DELETE ステートメントによるデータ変更で使用
要求されたモード 既に許可されているモード
IS S U IX X
インテント共有 (IS) ○ ○ ○ ○ ×
共有 (S) ○ ○ ○ × ×
更新 (U) ○ ○ × × ×
インテント排他 (IX) ○ × × ○ ×
排他 (X) × × × × ×
114 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
ロック ヒント オプション
DML 文で指定
既定は行ロック
INSERT ステートメントを テーブル ロックを使用して実行する例
INSERT INTO dbo.OrderHistorical WITH (TABLOCK)SELECT * FROM dbo.OrderSummary
ロック ヒントの種類 ロック ヒント
トランザクション分離レベルの指定
SERIALIZABLEREPEATABLEREADREADCOMMITTEDREADCOMMITTEDLOCKREADUNCOMMITTEDNOLOCK
ロック粒度の指定 ROWLOCKPAGLOCKTABLOCKTABLOCKX
ロック期間の指定 HOLDLOCK
ロック モードの指定 UPDLOCKXLOCK
•データベース (S)
•テーブル (IX)
•ページ (IX)
•行 (X)
115 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
トランザクションの同時実行時の問題
複数のユーザーにより開始されるトランザクション間の相互関係
同時に処理しても良いか?
もしくは完全な分離が必要か?
トランザクション実行時の同時実行時の問題
発生する問題 説明
更新データの損失 更新されたデータが上書きされる
ダーティ リード 未コミットデータが読み込まれる
反復不可能読み取り 参照の都度、変化するデータ
ファントム 現れたり消えたりするレコード
116 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
トランザクション分離レベルの種類
ロック方式 (ANSI/ISO 標準)
READ UNCOMMITED (未コミット読み取り)
READ COMMITTED (コミット済み読み取り)データベース エンジンの既定の分離レベル
REPEATABLE READ (再読み込み可能読み取り)
SERIALIZABLE (直列化)
SET ステートメントによりセッション レベルで制御可能
マルチ バージョニング方式 (SQL Server 2005 よりサポート)
READ COMMITTED SNAPSHOT
SNAPSHOT (スナップショット分離)
バージョン管理
更新時間と SELECT ステートメント開始時のトランザクション シーケンス番号(XSN)を使用して、tempdb 上に確実に更新前イメージが残るように管理される
tempdb 上のデータは 1 分ごとにチェックされ、参照される可能性がなくなった時点でガベージ コレクションによって自動的に削除される参考 - http://technet.microsoft.com/ja-jp/library/ms175492.aspx
参考 - http://technet.microsoft.com/ja-jp/library/ms186327.aspx
SET TRANSACTION ISOLATION LEVEL <トランザクション分離レベル名>
117 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
トランザクション分離レベルと同時実行制御
問題点
分離レベル
ダーティリード
反復不可能読み取り
ファントム 同時実行制御
READ UNCOMMITTED 可 可 可 物理排他
(悲観的ロック)
READ COMMITTED 不可 可 可 物理排他
(悲観的ロック)
REPEATABLE READ 不可 不可 可 物理排他
(悲観的ロック)
SERIALIZABLE 不可 不可 不可 物理排他
(悲観的ロック)
READ COMMITTED
SNAPSHOT
不可 可 可 論理排他(楽観的ロック)
SNAPSHOT 不可 不可 不可 論理排他(楽観的ロック)
118 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
ロック方式
ID Price
1001 263
BEGIN TRANSACTION
UPDATE ProductsSET Price = 263WHERE ID = 1001
COMMIT TRANSACTION
TX1
更新後データ(未確定)
更新後データ(確定済み)
BEGIN TRANSACTION
SELECT ID,PriceFROM ProductsWHERE ID = 1001
SELECT ID,PriceFROM ProductsWHERE ID = 1001
COMMIT TRANSACTION
TX2
更新後データを取得
ID Price
1001 263
ID Price
1001 263
READ COMMITTED (既定)
T2
T4
T6
T7
T1
T3
T5
ブロックされる
119 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
ロック方式
ID Price
1001 263
BEGIN TRANSACTION
UPDATE ProductsSET Price = 263WHERE ID = 1001
COMMIT TRANSACTION
TX1
更新後データ(未確定)
更新後データ(確定済み)
BEGIN TRANSACTION
SELECT ID,PriceFROM ProductsWHERE ID = 1001
SELECT ID,PriceFROM ProductsWHERE ID = 1001
COMMIT TRANSACTION
TX2
ID Price
1001 263
REPEATABLE READ、SERIALIZABLE
T2
T4
T6
T7
T1
T3
T5
ブロックされる
ブロックされる
120 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
マルチ バージョニング方式
ID Price
1001 263
ID Price
1001 210
tempdb
BEGIN TRANSACTION
UPDATE ProductsSET Price = 263WHERE ID = 1001
COMMIT TRANSACTION
TX1
更新前データ
更新後データ(未確定)
更新後データ(確定済み)
BEGIN TRANSACTION
SELECT ID,PriceFROM ProductsWHERE ID = 1001
SELECT ID,PriceFROM ProductsWHERE ID = 1001
COMMIT TRANSACTION
TX2
更新前データを取得
更新後データを取得
ID Price
1001 210
ID Price
1001 263
ID Price
1001 263
READ COMMITTED SNAPSHOT
T2
T4
T6
T7
T1
T3
T5
ステートメント実行時点の確定済みデータを返す
121 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
マルチ バージョニング方式
ID Price
1001 263
ID Price
1001 210
tempdb
BEGIN TRANSACTION
UPDATE ProductsSET Price = 263WHERE ID = 1001
COMMIT TRANSACTION
TX1
更新前データ
更新後データ(未確定)
更新後データ(確定済み)
BEGIN TRANSACTION
SELECT ID,PriceFROM ProductsWHERE ID = 1001
SELECT ID,PriceFROM ProductsWHERE ID = 1001
COMMIT TRANSACTION
TX2
更新前データを取得
ID Price
1001 210
ID Price
1001 263
SNAPSHOT
T2
ID Price
1001 210
更新前データを取得
T4
T6
T7
T1
T3
T5
トランザクション開始時点の確定済みデータを返す
122 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
READ_COMMITTED_SNAPSHOT の設定
ステートメント レベルの読み取り一貫性
SELECT を発行した時点でのデータを読み取ることを保証
更新前データは tempdb に格納
データベースに対して有効化する (既定は無効)
ALTER DATABASEデータベース名SET READ_COMMITTED_SNAPSHOT ON
123 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
SNAPSHOT の設定
トランザクション レベルの読み取り一貫性
トランザクション発行時点でのデータ保証
更新前データは tempdb に格納
排他ロックを無視して旧バージョンの読み取りが可能
データベースに対して有効化(既定は無効)
SNAPSHOT 分離レベルを使用するセッションで分離レベルを変更
ALTER DATABASEデータベース名SET ALLOW_SNAPSHOT_ISOLATION ON
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
124 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
マルチ バージョニング方式の選択肢
読み取りと書き込みの競合を回避
READ COMMITTED SNAPSHOT
ステートメント レベルの読み取り一貫性
ステートメント実行時点の確定済みデータを返す
SNAPSHOT
トランザクション レベルの読み取り一貫性
トランザクション開始時点の確定済みデータを返す
READ_COMMITED_SNAPSHOT に比べるとtempdb への負荷が高い
125 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
章の構成
クエリの最適化
トランザクション管理
エラー処理
126 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
例外処理の実装
実行コードの記述
BEGIN TRY ~ END TRY ブロック
エラー処理の記述
BEGIN CATCH ~ END
BEGIN TRANSACTIONBEGIN TRY
EXEC dbo.usp_UpdateDataCOMMIT TRANSACTION
END TRYBEGIN CATCH
IF @@ERROR != 0ROLLBACK TRANSACTION
END CATCH
127 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
エラー情報の取得
ERROR_ 関数
TRY ブロックで発生した例外のエラー情報を返す
CATCH ブロック内で値が不変
エラー関数の種類 返される情報 型
ERROR_NUMBER() エラー番号 int
ERROR_SEVERITY() 重大度 int
ERROR_STATE() エラー状態番号 int
ERROR_PROCEDURE() エラーが発生したストアド プロシージャ、トリガの名前 nvarchar(126)
ERROR_LINE() エラーを発生させたルーチン内の行番号 Int
ERROR_MESSAGE() エラーの完全なテキスト メッセージ nvarchar(2048)
128 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
トランザクションの検査
@@TRANCOUNT
実行中のトランザクションの数
XACT_STATE() 関数
アクティブなトランザクションの有無
戻り値 説明
1 アクティブなユーザー トランザクションが存在してトランザクションのコミットなど、任意の操作を実行できる
0 アクティブなユーザー トランザクションが存在しない
-1 アクティブなユーザー トランザクションが存在するが、コミットできないトランザクションとして分類されるエラーが発生した
129 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
Q22:トランザクションの検査
次の要件を満たすように顧客データを削除するストアドプロシージャを完成する
このストアドプロシージャは、他のトランザクションから呼び出される
顧客データの削除に成功した場合、監査ログの記録に失敗してもトランザクションをコミットしたい
この要件を見た右ために 14 行目に入力するべきコードは?
1: CREATE PROC DeleteCustomer @CustomerID int2: AS3: BEGIN4: DECLARE @ERROR int5: BEGIN TRANSACTION6: BEGIN TRY7: DELETE dbo.Customers WHERE Customers.CustomerID = @CustomerID8: SELECT @ERROR = @@ERROR9: INSERT INTO Audit.Log(Operation,ErrorCode,OperationDate)10: VALUES ('DELETE ' + CONVERT(varchar(10),@CustomerID),@ERROR,SYSDATETIME())11: COMMIT TRANSACTION12: END TRY13: BEGIN CATCH14: IF (XACT_STATE()) = 115: COMMIT TRANSACTION16: ELSE17: ROLLBACK TRANSACTION18: END CATCH19: END
130 © 2013 Copyright Microsoft Japan Co.,Ltd. and Edifist Learning Inc All rights reserved.
解答集
# Answers # Answers
Q1 (SourceID, CustID) Q12 SalesOrderID ,ProductIDSalesOrderID DESC ,ProductID ASC
Q2 FOREIGN KEY (CusomerID)、REFERENCES Cusomers (CusomerID)
Q13 MostRecentOrderDate DESC
Q3 DEFAULT NEWID() WITH VALUES Q14 RANK() OVER (ORDER BY ProductCatalog.SalesPrice DESC)
Q4 1、1、1、10、NEXT VALUE FOR CLASS_Sequence Q15 E
Q5 WITH SCHEMABINDING AS 、WITH CHECK OPTION
Q16 RAW
Q6 UNIQUE CLUSTERED INDEX Q17 AUTO
Q7 ON VwEmployeeInfo INSTEAD OF INSERT Q18 AUTO ,ELEMENTS
Q8 LEFT OUTER JOIN Q19 PATH ('Customers')
Q9 B、D Q20 UPDATE SET target.TerritoryName = source.TerritoryName,target.Country = source.Country、INSERT(TerritoryCode, TerritoryName, Country)VALUES(source.TerritoryCode, source.TerritoryName,
source.Country);
Q10 cte.MostResentOrderDate < DATEADD(YEAR, -2, GETDATE()
Q21 WITH ENCRYPTION、TOP、Products.SalesPrice DESC
Q11 MAX、cte.UpdatedDate > p.UpdatedDate Q22 IF (XACT_STATE()) = 1
131
© 2013 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.