こんにちは、ねこです。

自称プログラマのおばちゃんのブログです。いろいろあるよねぇ~。

Netlify, Gatsbyのお勉強3➡LMで成功したHelloWorldのbranch/hello02をつかってデプロイ、LMおさらい。

2019-10-31 17:58:08 | プログラム 勉強

LMで成功したHelloWorldのnetligy-helloworld-LargeMedia/masterはそのままのこしてある。だって、LMが成功してるからね。cfhopmkghedecay

Netlifyにはnetligy-helloworld-LargeMedia/hello02にデプロイするよう設定済み。

それから、ここ、大事。

いったん、全て設定完了して(こちらから設定見れます。)ここからがすごい!!!

gitでpushするたびに勝手にデプロイしてくれます!

では、いまから続きのお勉強します。

【続き】

先日は『LINK』まで勉強しました。https://www.gatsbyjs.org/tutorial/part-one/#linking-between-pages

おぉ、SURGEが出てきてますが、ここではNetlifyを使ってます。またSurge使えたらいいですけどね。

Netlifyだったら、上記のように勝手にデプロイしてくれます!

【Large Mediaがんばてみましょう】

前回のおさらい

さぁ、いまから1時間ほど集中してやります!

netlify login

Authorize Application

Netlify CLI is asking for permission to access Netlify on your behalf.

This app will be able to create and manage sites in your Netlify teams. You can revoke access at any time.

netlify lm:info

アップデートしてって書いてあるので、そうします。

Update available 2.19.3 → 2.20.1
npm i -g netlify-cli to update

 

.lfsconfig fileをチェックします。ここにイメージファイルが入ります。

[lfs]
url = https://xxxx-xxxxxx-xxxxxxx.netlify.com/.netlify/large-media

さーて、新しいイメージを入れていみようか。

1.新しいイメージファイルを用意してローカルに表示されるようにする。

<img src="../images/beerneko.jpg" style={width:`50%` }} alt="" />
を以下のように入れる。
 
<src/pages/index.js>
import React from "react"
import Header from "../components/header"
import { Link } from "gatsby"

export default () => (
    <div style={color: `blue` }}>
    <Header headerText="Index Page" />
    <Link to="/about/">about</Link>
    <p>Yuri neko nya.</p>
    <img src="https://source.unsplash.com/random/400x200" alt="" />
    <img src="../images/peekingcat.jpg" style={width:`50%` }} alt="" />
    <img src="../images/beerneko.jpg" style={{ width:`50%` }} alt="" />
    <button class="primary-button">Click me</button>
    </div>
)
 

起動

gatsby develop

2.Git LFSを確認

git lfs track

Listing tracked patterns
peekingcat.jpg (.gitattributes)
Listing excluded patterns

ふむ、前回のpeekingcat.jpgがちゃんと入ってる。よしよし。

では、新たにbeerneko.jpgをいれよう。

3.新しいファイルをトラックする。

git lfs track "beerneko.jpg"

git lfs track

Listing tracked patterns
peekingcat.jpg (.gitattributes) upgrade to the latest version.
beerneko.jpg (.gitattributes) upgrade to the latest version.
Listing excluded patterns

よし、入った。

ここで、NetlifyのLMサイトを確認

peekingcat.jpgだけです。

4.commitしてpushする。

$ git add .

npm\node_modules\netlify-cli\bin\run
ng\npm\node_modules\update\bin\update.js

$ git status

Your branch is up to date with 'origin/hello02'. 

olyfilling JavaScript standard library!
Changes to be committed:
(use "git restore --staged <file>..." to unstage) n Collective or Patreon:
modified: .gitattributes
modified: src/pages/index.js
new file: static/images/beerneko.jpg

$ git commit -m "The second uploding beerneko.jpg img file"

[hello02 0c042d4] The second uploding beerneko.jpg img file
3 files changed, 5 insertions(+)
create mode 100644 static/images/beerneko.jpg

$ git push
Uploading LFS objects: 100% (1/1), 9.1 KB | 0 B/s, done

さぁ、も一回LMサイトのチェック

➞入ってない…

ぉぅ????Githubにはちゃんとある。。。

➞入ったぉー!!!!


5.デプロイされてるか、チェック!

https://helloworld-largemedia.netlify.com/

うぅ、うれしい!!!

こんなに簡単だとは。

最初はどのタイミングでデプロイしてくれるのかさえ分からなかったから、セッションとかタイミングとかがっつり悪いものをつかんでやってたんでしょうね。

だから、今日の発見、『gitでpushするたびに勝手にデプロイしてくれます!』は私にとって意外と大切なんでした。もう、時間差があってもあたふたせずに、でんとまっていられる!!!

結局20分ぐらいでできた!

次は、フォームだぁ!!!PHPでやり取りできないって、あったけど。ちょっとだけ不安。

https://docs.netlify.com/forms/setup/#html-forms

よし、掃除機かけよう。

本日は今日解禁の「ターミネータ」見に行こう。

アメリカの映画館のビールってドラフトがあっておいしいのよね!!!ふっふ。



Microsoft MCSA SQL Server 2016 (70-761) むぼーな挑戦 4

2019-10-31 07:23:39 | プログラム 勉強

どこかの有名youtuberが、「朝が一番賢い時間です」と書いてあったので、今7:15、掃除、家事せずに8時半ごろまで勉強することにしました。

1.読み落とし

パターン1

『Each Transact-SQL segment may be used once, more than once, or not at all.

何回使ってもいいって。。。泣けてくるぜ。

…って、まてよ!これまちがってませんか?

『WHERE』じゃなくて『HAVING』じゃないの?


(参照SamuraiBlogさま ありがとうございます。)

『「WHERE」も「HAING」と同じく「抽出条件を指定」するコマンドでのです。つまり、先ほどの処理は「WHERE」で書いても全く同じ結果が返ってくるんです。』

SELECT文を使用した時の、命令の呼ばれる順番です。

今回の主役である「WHERE」と「HAVING」は画像の通り「WHERE」→「GROUP BY」→「HAVING」の順に呼ばれるわけです。つまり間にある「GROUP BY」が関わってこなければ、全く同じ挙動をしますが、
「GROUP BY」を使って、グループ化を行った際には、以下の違いが出てくるわけです。


では、この場合をみてみましょう!

『WHERE COUNT(Cust.CustomerId) > 5』

そして、『Group By』は『Cust.CustomerId』コラムがふくまれてない。

『CustCat.CustomerCategoryName』と『CustAccountOpenedDate』でグループされてますよ!

とういことは、『HAVING』は使えない!!!

はぁ~、そういうことか。。。

 

4.ふたを開けたらわかってなかった

Note: This question is part of a series of questions that use the same scenario. For your convenience, the scenario is repeated in each question. Each question presents a different goal and answer choices, but the text of the scenario is exactly the same in each question on this series.

You have a database that tracks orders and deliveries for customers in North America. System versioning is enabled for all tables. The database contains the
Sales.Customers, Application.Cities, and Sales.CustomerCategories tables.
Details for the Sales.Customers table are shown in the following table:

Details for the Application.Cities table are shown in the following table:

Details for the Application.Cities table are shown in the following table:

Details for the Sales.CustomerCategories table are shown in the following table:



パターン1

複数選択式
A.
B.
C.
D.
あきらかに、CとDは違う。Aも『CROSS JOIN』だから、CartesianProduct(直積集合)になってしまいます。
なので答えはA。
ちょーとまったあっ!
 
WHERE (IsOnCreditHold = 0 AND DeliveryCityID = CityID)
OR (IsOnCreditHOld = 1 AND PostalCityID = CityyID)
 
とあります。ちゃんとよんだかぁ!
『You need to create a query that meets the following requirements:
-> For customers that are not on a credit hold, return the CustomerID and the latest recorded population for the delivery city that is associated with the customer.
-> For customers that are on a credit hold, return the CustomerID and the latest recorded population for the postal city that is associated with the customer.』
これで、しっかりコンディションが網羅されてるから、『CROSS JOIN』でも大丈夫です。
<答え>A,B
 
 

パターン2

You discover an application bug that impacts customer data for records created on or after January 1, 2014. In order to fix the data impacted by the bug, application programmers require a report that contains customer data as it existed on December 31, 2013.
You need to provide the query for the report.

A.
B.
C.
D.
E.
さてと、まずは『an application bug that impacts customer data for records created on or after January 1, 2014』
ふむふむ。(2014,1,1)にバグがあったんだな。
programmers require a report that contains customer data as it existed on December 31, 2013
おっと、ここが本当に聞いてきているぶぶんだ、だから最初の(2014,1,1)はデコイ、ひっかけです。
<E>
すると、Eは『@date』が二つも出てきて比べてるんで、完全に間違い。
 
<D>
Dは『@date』が(2013,12,31)のままで変わってないし、『BETWEEN』は以下を確認。
SELECT * FROM employees WHERE start_date BETWEEN '2013,12,31' AND '2014,01,01';
SELECT * FROM employees WHERE start_date >= '2013,12,31' AND start_date <= '2014,01,01';
同じです。
 ということなので、『programmers require a report that contains customer data as it existed on December 31, 2013』の部分でDecember 31, 2013(2013,12,31)の日だけ聞いているから、両日を含む『BETWEEN』は間違え。
<C>
Cは『SYSTEM_TIME AS OF』をよく覚えてないけど、December 31, 2013(2013,12,31)の日を聞いてないから、外す。いえいえ、この日の結果をしりたいんです!
<B>
Bは『DATEADD(d, -1, @sdate)』で、December 31, 2013(2013,12,31)の前の日を当ててるから、完全にアウト。
<A>
Aは@sdate = December 31, 2013(2013,12,31)、@edateとあって、『DATEADD(d, 1, sdate)』でJanuary 1, 2014(2014,01,01)を設定してるんだよね。でも
『WHERE ValidFrom >@sdate AND ValidTo < @edate』
 = 『WHERE ValidFrom >December 31, 2013(2013,12,31) AND ValidTo < January 1, 2014(2014,01,01)』
となってるから、あれっ?どっちの日も含まれてないことになってるじゃん!!!
一体どれなんや。。。
 
 
『SYSTEM_TIME AS OF』
はい。一番怪しい『SYSTEM_TIME AS OF』を調べます。
もし、‘2015-12-29 07:51’のデータが欲しい場合は、
SELECT Id, Name, StartTime, EndTime
FROM dbo.Customer
FOR SYSTEM_TIME AS OF '2015-12-29 07:51'
これは
StartTime<= @PointInTime AND EndTime > @PointInTime

と同じになります。
FOR SYSTEM_TIME AS OF TimeLine Graph
 
 
FOR SYSTEM_TIME AS OF Example 1
 
そして、もしこの『SYSTEM_TIME AS OF』を使わずにクエリをつくると、
DECLARE @PointInTime DATETIME = '2015-12-29 07:51'
SELECT Id, Name, StartTime, EndTime
FROM dbo.Customer
WHERE StartTime<= @PointInTime  AND EndTime > @PointInTime 
UNION ALL
SELECT Id, Name, StartTime, EndTime
FROM dbo.CustomerHistory
WHERE StartTime<= @PointInTime  AND EndTime > @PointInTime 

となり、『Temporal Table』と『History Table』を『UNION ALL』で比べて結果を出すことになります。

まだよーわからんのですが、とにかく『StartTime<=@PintInTime』という部分がみそなんでしょうね。だから、『BETWEEN』は使えないのね。

<結果>
Equivalent of FOR SYSTEM_TIME AS OF

 <答え>C

ここにある問題は過去問と全く同じですね。

さぁ、掃除しよう。全然答えられなかったから、なんかモヤモヤするなぁ。

 
 

Netlify, Gatsbyのお勉強2➡LMで成功したHelloWorldを変更して違うgit branchからデプロイしてみた。

2019-10-30 19:23:11 | プログラム 勉強

【GatsbyをSurgeにあげましょう、と思ったけど、Netlifyにしときます。】ーーーSurgeはこの次~。

Surge-static site hosts、完全に無料だ!でも詳細がまだわからん。

設定を詳しく知りたい人はこちらをご覧ください。『Netlify & Gatsby勉強』(Neltlify Large Mediaを中心だから、こちらの『Gatsby CMSやってます。』の『2.サイトでは、NetlifyにこのCMSを登録するようです。』も読んでください。)

 


【デプロイ】

前回はLarge Mediaでデプロイしていたので、Gatsbyのフレームワークは関係なかったです。

そして、このHelloWorldサイトは、https://helloworld-largemedia.netlify.com/ 唯一Large Mediaが成功しているサイトなんで、あんまり触りたくないので、GITのブランチをマスターからhello02に変えて、まずは手動でデプロイしてみようとおもます。

1.まずは、Netlify logoutして接続を切っときます。

2.git checkout -b hello02

---以下のファイルを作成、または編集し終える

---admin/config.yml

---gatsby-config.js

git add .

git commit -m "Edited admin/config.yml gatsby-config.js"

git diff master
diff --git a/gatsby-config.js b/gatsby-config.js
index 823925d..97903d1 100644
--- a/gatsby-config.js
+++ b/gatsby-config.js
@@ -5,5 +5,5 @@
*/

............

............

git push --set-upstream origin hello02

 

3.『Deploy settings for beerneko/netligy-helloworld-LargeMedia』から「hello02」を設定してデプロイしてみる。うまくいってくれぇ~。

…怒られました。

 

8:34:48 PM: error Unable to find plugin "gatsby-plugin-netlify-cms". Perhaps you need to install its package?

 

8:34:48 PM:

 

8:34:48 PM: Error:Unable to find plugin "gatsby-plugin-netlify-cms". Perhaps you need to install its package?
 
なんのパッケージだろう。。。
これみて、インスピレーションうけました。
 
とにかく、 yarn.lock と 古いpackage-lock.jsonさがしてみたけどなかったんで、node-moduleも削除しませんでした。
そして、
npm install -g gatsby-cli 
と、
npm install --save netlify-cms-app gatsby-plugin-netlify-cms
をもう一度流しました。
 
『reinstalled cli and packages』
そして、やたあっ
 
できました。
https://helloworld-largemedia.netlify.com/
 
無事変更箇所が表示されてます。
 
さぁ、ねよ。
おやすみぃ~、本日のお夕食は「筑前煮」でした。
七味をすこしきかした、ピリ辛のおいしいぃ~のができました!
だんなちゃんは、外人やから食べてくれへんかった。およよ。作り置きのラザニア食べてました。
 
 おっと、その前にタイトルがもっとわからいやすいものに変更しとこう。



Microsoft MCSA SQL Server 2016 (70-761) むぼーな挑戦 3

2019-10-30 13:19:11 | プログラム 勉強

さてと、12時から勉強始めたので、今で1時間20分か。

CBTNugett のKaplanという会社(オンライン大学とかやってる)がつくったプレップテストを20問に絞ってやってみた。

これを考察していこうと思う。点数は驚異の50点!

おわた。

でも、驚くべきことは過去問とはほぼかけ離れた難しさでアール。なんでや。


 


 


 


【間違いの理由別考察】

1.読み落とし

パターン1「Which clauses should you luse to construct a common table expression for the Transact-SQL query?」

でこの「a common table expression」を読み落として一つチェックマークが抜けていた。

 A) GROUP BY

B) INTO

C) OVER

D) WITH

E) HAVING

ここからだったら、問題読まなくても明らかにA,D,Eだ。Eのチェックを忘れていた。

 


2.忘れている

パターン1 DELETE Products output ProdID, Desciption, AltDescription, UnitPrice;

A)All rows are permanently removed from the Products table, and the deleted rows are stored in a temporary table.
B)All rows are permanently removed from the Products table, and the deleted rows are displayed.
C)The DELETE statement fails because it does not include the FROM keyword.
D)The DELETE statement fails because the OUTPUT clause is invalid.
完全に忘れている。では、今からも一度調べます。自分へのパニッシュメントです。
OUTPUT clauseを使うなら、INSERTED や DELETED
 prefixesをつかってコラム名を明記しなければならない。だから答えはDです。

で、正しくは、

DELETE Products
OUTPUT DELETED.ProdID, DELETED.Description, DELETED.AltDescription, DELETED.UnitPrice;

 

では、OUTPUTについて。

①OUTPUTを使ってDMLオペレーションの『inserts, updates, deletes, merges』を格納することができる。
②INTO clauseをつかって、本チャンのテーブルに移すか、もしくはSQLServer v16.0からOKAYになった、Temporary Tableに格納することができる。
 
 
パターン2

<question id="1.2.3.51" type="SAMC">
  <question>こんな感じでXMLの例がかいてあるけど、しっかり読まなくてもいいかなと思う</question>
  <alternatives>
  <option>tissue</option>
  <option correct="true">cell</option>
  <option>organism</option>
  <option>organ</option>
  <opton>system</option>
  </alternatives>
</question>

You need to choose a data type for the table column and justify your choice to the database administrator.

A)The varbinary data type, because varbinary supports conversion to xml.
B)The ntext data type, because xml supports conversion to ntext.
C)The nvarchar(max) data type, because the id attribute can then be indexed.
D)The xml data type, because the value can exceed 2GB.
 
完全に忘れている。「nvarchar」と「varbinary」だけがコンバージョンサポートされている。
「nvarchar(max)」を選ぶと自動的にIDがインデックス化されてしまうそうだ。だからダメ。
「ntext」ってのは、「nvarchar」と「varbinary」がコンバージョンされた後にこの形になるそうです。
これは、『3.詳細勉強不足』にもなるね。
 

 
3.ケアレスミス
 
パターン1

The query must return only those products that have no matching sales orders, as well as those sales orders that are not matched to a product .

You create the following query to meet the objective:

USE NutexSales;
GO
SELECT p.Name, sod.SalesOrderID
FROM Production.Product p
OUTER JOIN Sales.SalesOrderDetail sod
ON p.ProductID = sod.ProductID
WHERE p.ProductID IS NULL
OR sod.ProductID IS NULL
ORDER BY p.Name

これは痛い。。。だいたい、「

WHERE p.ProductID IS NULL
OR sod.ProductID IS NULL

」を見た時点で、完全に『FULL OUTER JOIN』なのに、なぜ『FULL』をわすれたのか!!!おわてよし!

 

パターン2

To create this stored procedure, fill in the missing code that meets the stated requirements. (Do not use a BEGIN and END statements when writing this code.)  

CREATE PROCEDURE CustRowsReturned @Count integer ASselect top @Count, Name from Customer
ORDER BY Name

<答え>

  • SELECT TOP (@Count) Name FROM Customer
  • SELECT TOP(@Count) Name FROM Customer
まぁね、コンピュータ試験だからね。。。あぁ~っ、ビール飲んで寝よ。って感じですな。
 

4.ふたを開けたらわかってなかった

パターン1

複数選択式

Which of the following statements are true?

A)The MONTH function is always nondeterministic
B)The CHECKSUM function is always deterministic
C)The ISDATE function is always deterministic
D)The YEAR function is always deterministic
E)The CAST function is always deterministic
F)The RANK function is always nondeterministic
G)The GETDATE
 function is always deterministic
昨日で『nondeterministic』『deterministic』はわかったはずやったのに。。。
【Deterministic and Nondeterministic Functionsってなに?】

確定的関数(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」とは違うよ。

Related image

 

 

5.もう諦めなきゃならんレベル

パターン1

What is the most appropriate data type for the column that holds the resume content?

A)ntext
B)varbinary(max)
C)binary
D)varbinary(8000)
 
これは『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?

A)Heap
B)Check Constraint
C)Indexed View
D)Non-Clustered
E)View
F)Default
 
この問題の大事なところは、辛抱して読み続ける能力と、『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?
A)Heap
B)Check Constraint
C)Indexed View
D)Non-Clustered
E)View
F)Default
➡おぉ、これはもう『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 ではビューにインデックスを設定してパフォーマンスの向上を図ることができます。

インデックス付きのビューを作成するには以下の条件があります。
  1. CREATE VIEW ステートメント実行時、ANSI_NULLSオプションとQUOTED_IDENTIFIERオプションがONに設定されていること。
  2. ビューで参照するベーステーブルの作成時にもANSI_NULLSオプションがONに設定されていること。
  3. ビューが参照しているのはベーステーブルのみで、他のビュー参照していないこと
  4. ビューで参照されるすべてのベーステーブルは、ビューと同じデータベース内に存在し、ビューと同じ所有者であること。
  5. ビューはWITH SCHEMABINDINGオプションを使用して作成されていること。
  6. ビューで参照されるユーザ定義関数は、SCHEMABINDINGオプションを使用して作成済みであること。
  7. ビューでは、テーブルとユーザ定義関数について、スキマー名.オブジェクト名の2つの要素で構成される名前で参照すること。
  8. ビュー内の式で参照される関数は決定的であること。決定的であるとは、関数の引数に同じ値を渡した場合、常に同じ値が返される状態を指す。これに対して、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分かかりました。「わかること」って難しい。。。
 

Microsoft MCSA SQL Server 2016 (70-761) むぼーな挑戦 2

2019-10-29 13:53:04 | プログラム 勉強

いまから以下の70-761関係勉強始めます。ご飯作る時間が4時ごろだから、それまでに2時間ぐらいしかない。。。

1.明日はパケットの#7

*outer applyとcross applyがいまいちはっきりしないので、こちらをプリントアウトして壁に張った。

http://stevestedman.com/wp-content/uploads/TSqlJoinTypePoster1.pdf 

引き続き、やっつけてしまうぞ!

*Temporal dataのクエリのメインは、

『AS OF』で時間を絞ってやるとき

『Contained In』History Table からのときのみ



*問題の読み方

➞ 'You need to create...'を探してみる。そこで、CTEをつくるのか、Stored Procedureを作るのかなど、何を聞かれているのか、はっきりわかっておくこと。

➞ 先にSQLのステートメントがないか、見ちゃう。

➞ テーブルの表があれば、だいたいどんな問題か見当がつく場合がある。すると、最初は飛ばして読める。

➞ 'Following Requirements'は必ず読むこと。

➞ 'Part of the correct Transact-SQL has been provided in the...'とあれば、これはもう『穴埋め』問題です。

➞ まず、明らかに足りてない部分、例えば、『unpivot』の『FOR』『IN』とかは先に当てはまめておく。

➞ 全部目ぼしいものが足りているのに、「なんだかなぁ、足りん!」という場合は、だいたいひっかけで、先にどんな問題か見当付けていたことが間違っている可能性がある。その場合、もう一度'Following Requirements'を読むこと。

➞ ➞ ➞ ここまでしてわからん場合は、明らかに勉強不足。今は諦めて答えを見よう!

 


 

*もう、CTEとか、UDFとか、作り方をよく覚えてないんで、ここに書いときます。こんな感じででてたら、これだって思ってください。

【CTE】*[WITH][parameter][AS]があるか、まず確認しよう!<-『Expresstion Table』を必ず読むこと

WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear)

AS

(

SELECT

・・・

)

SELECT

・・・;

【UDF】

CREATE FUNCTION dbo.ufnGetInventoryStock(@ProductID int)

RETURNS int

AS

BEGIN

・・・

RETURN @ret;

END;

【Deterministic and Nondeterministic Functionsってなに?】

【確定的と確定的ファンクション】だって。と言いつつも、日本語でどう説明されているのかわからん。なので、読むのめんどくさいからGoogle Translate使ってやった。これで十分。

Deterministic functions always return the same result any time they are called with a specific set of input values and given the same state of the database. Nondeterministic functions may return different results each time they are called with a specific set of input values even if the database state that they access remains the same.
For example, the function AVG always returns the same result given the qualifications stated above, but the GETDATE function, which returns the current datetime value, always returns a different result.

確定的関数は、特定の入力値のセットで呼び出され、データベースの状態が同じである場合、常に同じ結果を返します。 非決定的関数は、アクセスするデータベースの状態が同じ場合でも、特定の入力値のセットで呼び出されるたびに異なる結果を返す場合があります。
たとえば、関数AVGは上記の条件が与えられると常に同じ結果を返しますが、現在の日時値を返すGETDATE関数は常に異なる結果を返します。

【Stored Procedure】

CREATE PROCEDURE HumanResources.uspGetEmployeesTest2

@LastName nvarchar(50),

@FirstName nvarchar(50)

AS

SET NOCOUNT ON;

SELECT FirstName, LastName, Department FROM HumanResources.vEmployeeDepartmentHistory

WHERE FirstName = @FirstName

AND LastName = @LastName AND EndDate IS NULL;

 





えらいことに気が付いた。。。

CTEおぼえるだけじゃだめなんや。

問題の傾向について、私が解けそうなのは。

1.SQLクエリの中の穴埋め問題

2.専門的なターム(CAUCSESや、IIFなど)に対してのチェックマーク問題

3.エラーの位置問題(begin, commit, rollback, try, catch, @@trancount)

だとしてたら、『1.SQLクエリの中の穴埋め問題』の問題を確実にするために、最低でも覚えりゃ住む問題を解くこと。

『Expresstion Table』,『UDF』、『Outer Apply, Crossf Apply, Except, Intersect, Union, Union Allの違い』

問題には、大きく分けて、①覚えりゃよいもの ②考えて解くもの ③ひっかけ と傾向がある。

 


では、まずは、

『Expresstion Table』

CTE (Common Table Expression)*self-referencable *Can be referenced more than once without query.ここがDerived Tableと違うよ。

1.『WITH』からはじまること

2.パラメータと『AS(』の後のSELECTのコラムがマップされていなければならいこと

3.CTEを呼ぶときには『FROM』からフツーに呼ぶこと

4.CTEを呼ぶときには『SELECT』のコラムがマップされていること

5.CTEは一つのトランザクションの中に何回も入れて使うことができるそうだ。(追加)

WITH CTEA(ID, colA,colB)

AS(Select ID, colA,colb from tableA group by colA, colB)

WITH CTEB(ID, colD, colE)

AS(Select ID,  colD,colE from tableB Group by colD, colE)

Select a.ID a.colA, a.colB, b.colD, b.colE

from CTEA a

INNER JOIN CTEB b ON a.ID = b.ID

Inline TVF(Inline Table-Valued Function)

1.『CREATE FUNCTION』からはじまること
2.パラメータは『itvf_InlineTVF(@text nvarchar(1000))』みたいにすること
3.『RETURNS』は宣言部、そして『RETURN』は『BEGIN』『END』の間にあること。
4.『BEGIN』『END』はトランザクションと勘違いしないこと
5.宣言部の『RETURNS』は『TABLE』を返すようにすること。
RETURNS @results TABLE
(
ItemID int,
SupplierID int,
ColorID int,
ItemName nvarchar(100)
)
6.『AS BEGIN~END』があること
7.『INSERT』や『DELETE』などのデータを扱えること
8.TABLEのように『FROM』から呼び出せること
 
 
Derived Tables*Not self-referencable *Cannot be referenced more than once without query.ここがCTEと違うよ。
例題)
SELECT 
CASE
WHEN UnitPrice < 100 THEN 'OK'
WHEN UnitPrice < 200 THEN 'NOT OK'
WHEN UnitPrice < 300 THEN 'Whoa!'
 ELSE 'Yikes!'
END AS PriceDescription,
COUNT(*) AS NumberOfItems
FROM WareHouse.StockItems
 
GROUP BY ⇐『FROM』『WHERE』『GROUP BY』『HAVING』『SELECT』『ORDER BY』の順番に読むから、この『SELECT』にあるコラムは丸写ししなきゃならない。だから。。。↓
CASE
WHEN UnitPrice < 100 THEN 'OK'
WHEN UnitPrice < 200 THEN 'NOT OK'
WHEN UnitPrice < 300 THEN 'Whoa!'
ELSE 'Yikes!'
END 
ORDER BY NumberOfItems ⇐これも『FROM』『WHERE』『GROUP BY』『HAVING』『SELECT』『ORDER BY』の順番だから、そのままエリアスネームが使える。
 
さぁて、Derived Tableにかえると。
SELECT 
PriceDescription,
COUNT(*) AS NumberOfItems
FROM
(
SELECT 
CASE
WHEN UnitPrice < 100 THEN 'OK'
WHEN UnitPrice < 200 THEN 'NOT OK'
WHEN UnitPrice < 300 THEN 'Whoa!'
ELSE 'Yikes!'
END AS PriceDescription
FROM WareHouse.StockItems
) si⇐『FROM』『WHERE』『GROUP BY』『HAVING』『SELECT』『ORDER BY』の順番に読むから、この『FROM』にある『CASE』はすべて最初に呼ばれるぞ!
GROUP BY PriceDescription 
ORDER BY NumberOfItems 
 
 
View *パラメータが使えない

1.『CREATE VIEW』からはじまること

2.テーブルのように『FROM』でつかうこと