確定的関数(Deterministic )は、特定の入力値のセットで呼び出され、データベースの状態が同じである場合、常に同じ結果を返します。 非決定的関数(Nondeterministic )は、アクセスするデータベースの状態が同じ場合でも、特定の入力値のセットで呼び出されるたびに異なる結果を返す場合があります。
たとえば、関数AVGは上記の条件が与えられると常に同じ結果を返しますが、現在の日時値を返すGETDATE関数は常に異なる結果を返します。
なんてことを書いてたけど、どうやらファンクションのターゲットにもよるようなことを書いてある。例えば、『CONVERT』のターゲットが『DATETIME』だったりしたら、非決定的関数(Nondeterministic )になるそうです。
だったら、もう覚えてしまおう!
【確定的関数(Deterministic )表】ーここにないのは、非決定的関数(Nondeterministic )だと思えばよいさ。
パターン2
『CROSS JOIN』と『FULL JOIN』、いっつも勘違いします。
『CROSS JOIN』Cartesian productはこちら。ぜーんぶのマッチングパターンを出すから、気を付けてね、のほうです。
『FULL JOIN』『FROM』で指定したベーステーブルのIDに対して、マッチしてようが、してまいが『FULL JOIN』したパターンが全部出てきます。でもCartesian productではないです。
Each instructor can teach several courses. The course schedule changes frequently as old courses are cancelled and new courses are made available. Some of the instructors whose courses have been cancelled may not be currently assigned to teach any courses. Some of the new courses may not have instructors assigned to them. To facilitate the assignment of instructors to courses, you must produce a report that will list all courses and all instructors. The courses for which no instructors are currently assigned should be grouped together.
これはもう、英語力がものを言いますな。全然わからんかった。絶対『LEFT JOIN』やと思った。
さて、読み方を考えてみよう。
『Each instructor can teach several courses』
➡こんな関係かな? instructor*->⁂courses
『Some of the instructors whose courses have been cancelled may not be currently assigned to teach any courses』
➡coursesが『NULL』の可能性があるな?
『Some of the new courses may not have instructors assigned to them』
➡おぉ、instructorが『NULL』と表示されるようにJOINさせなきゃならないのか。
『you must produce a report that will list all courses and all instructors』
➡ここかぁっ!『all courses』 と『all instructors』だ!ということは、両者『NULL』が含まれているテーブルであるということかな?
『The courses for which no instructors are currently assigned should be grouped together』
➡これは、ちょっとひっかけもあるかな。。。最後に『ORDER BY』でくくってやればよいだけのように思う。
<答え>
SELECT CourseID, Subject, i.InstructorID, FirstName, LastName
FROM Courses c FULL JOIN Instructors i
ON c.InstructorID = i.InstructorID
ORDER BY i.InstructorID
なぜなら、『FULL JOIN』はこんな感じになるからです。そう、どっちに『NULL』が入ってもよいのです。!!!でも、気を付けて、「CROSS JOIN」とは違うよ。
5.もう諦めなきゃならんレベル
パターン1
What is the most appropriate data type for the column that holds the resume content?
これは『varbinary(max)』を使うそうです。まる。
パターン2
You run the following Transact-SQL statement:
CREATE PRIMARY XML INDEX PIdx_Customer_Demographics ON Customer(Demographics);
You need to create a secondary XML index for queries searching for the Active attribute value. The index should be named SIdx_Customer_Active. Which Transact-SQL statement should you use? (To answer, type the Transact-SQL statement in the textbox.)
XML_VALUE();
もちろん間違ってますがな。これが答え。
CREATE XML INDEX SIdx_Customer_Active ON Customer(Demographics) USING XML INDEX PIdx_Customer_Demographics FOR PATH
これは余裕があったら勉強しよう。。。
パターン3
The Verigon Company maintains the Customers table and the Orders table in a SQL Server 2016 application.
You need to create a historical table that contains data on orders placed during 2012.The table should aggregate (sum) the Amount column by month, so that the table would only contain twelve rows, regardless of the number of customers or orders placed. The sum of all the amounts ordered in January would be the first row, the sum of all the amounts ordered in February would be the second row, and so forth. No updates, insertions, or deletions would be performed on the data.
What object type most efficiently supports these requirements?
この問題の大事なところは、辛抱して読み続ける能力と、『VIEW』と『INdexed VIEW』の使い分けを知っているかどうかにかかってる。。。
『You need to create a historical table that contains data on orders placed during 2012.』
➡DMLオペレーションの『inserts, updates, deletes, merges』は必要ないな。
『 No updates, insertions, or deletions would be performed on the data.』
➡DMLオペレーションの『inserts, updates, deletes, merges』がないって、しっかりかいてある。
『What object type most efficiently supports these requirements?
』
➡おぉ、これはもう『VIEW』しかないな。でも『VIEW』と『Indexed VIEW』のどっちだろう。
➡。。。わからん。
『The Verigon Company maintains the Customers table and the Orders table in a SQL Server 2016 application.』
➡なるほど、2016年からってかいてあるから、2012年の分を格納させてやらなければならない。そしたら、名前つけて格納できる『Indexed VIEW』だ!(実際はてんでわかりませんでした。。。でも同じ問題出たらだいじょうぶ。ばかじゃないから。)
ここに書いてありました。
- An indexed view is physically stored ("materialised") on disk = requires memory
- ➡インデックス付きVIEWは物理的に名前がついて格納されているってことですね。
- A standard view is simply an expandable macro: there is no persistence of the data and the base tables are always used
- ➡普通のVIEWは、その場だけの処理で終わるようです。
それから、こちらの方のサイトがとってもわかりやすいので、参照させていただきました。ありがとうございます。(Microsoft.Docでは情報量多すぎ、読むの大変!)
SQL Server ではビューにインデックスを設定してパフォーマンスの向上を図ることができます。インデックス付きのビューを作成するには以下の条件があります。
- CREATE VIEW ステートメント実行時、ANSI_NULLSオプションとQUOTED_IDENTIFIERオプションがONに設定されていること。
- ビューで参照するベーステーブルの作成時にもANSI_NULLSオプションがONに設定されていること。
- ビューが参照しているのはベーステーブルのみで、他のビュー参照していないこと
- ビューで参照されるすべてのベーステーブルは、ビューと同じデータベース内に存在し、ビューと同じ所有者であること。
- ビューはWITH SCHEMABINDINGオプションを使用して作成されていること。
- ビューで参照されるユーザ定義関数は、SCHEMABINDINGオプションを使用して作成済みであること。
- ビューでは、テーブルとユーザ定義関数について、スキマー名.オブジェクト名の2つの要素で構成される名前で参照すること。
- ビュー内の式で参照される関数は決定的であること。決定的であるとは、関数の引数に同じ値を渡した場合、常に同じ値が返される状態を指す。これに対して、GETDATEやNEWID関数は、実行する度に異なる値が返されるので非決定的関数と言える。
【作り方】
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--ビューを作成する
CREATE VIEW [dbo].[ビュー名] WITH SCHEMABINDING
AS
SELECT COL001
,COL002
,COL003
,COL004
FROM dbo.TABLE_A
--クラスタ化インデックスを作成する
CREATE UNIQUE CLUSTERED INDEX PK_インデックス名
ON dbo.ビュー名 ( COL001,COL002 )
--非クラスタ化インデックスを作成する
CREATE NONCLUSTERED INDEX IDX_インデックス名
ON dbo.ビュー名 ( COL003,COL004 )
疲れた。ここまでで、2時間30分かかりました。「わかること」って難しい。。。