ããã¯ãã¹ãŠå¹³å¡ã«å§ãŸã£ã...ãªãã¿ãŒã«ãã£ãŠèªãŸããéäžçã«ã·ã«ããç 究ããã ç§ã¯
.NETã®éçºã«æºãããšæã£ãããéåœã¯ä»äºã®æåã®1ãæã§å¥ã®æ¹æ³ã§æ±ºå®ããã åŸæ¥å¡ã®1人ãäºæãããããžã§ã¯ããå»ããæ°ãã圢æãããç©Žã«åœŒãã¯æ°é®®ãªäººéã®çŽ æãæããŸããã ããããã
SQL Serverã«ã€ããŠç¥ãåãã«ãªã
ãŸãã ã
ãã以æ¥ã6幎匱ãçµéããå€ãã®ããšãæãåºãããšãã§ããŸã...
ã¿ã€ã§ã®äŒæäžã«äººçãåèããã€ã®ãªã¹ããã®ãžã§ã»ãã®åã®ã¯ã©ã€ã¢ã³ãã«ã€ããŠããžã§ã»ãã£ã³ã¯ã¹ã«ã€ãã§ç§ã«çœ²åãå§ããŸããã åãéšå±ã«åº§ã£ãŠããªããã°ãªããªãã£ãéœæ°ãªãªãã£ã¹ã®é£äººã«ã€ããŠïŒ1ã€ã¯æ°é®®ãªç©ºæ°ã«å¯Ÿããã¢ã¬ã«ã®ãŒã«èŠãã¿ããã1ã€ã¯æ¥å
ã«å¯Ÿããã¢ã¬ã«ã®ãŒã§è£å®ããC ++ãžã®çæãã®æã«èŠããã§ããŸããã ãã€ãŠãäžããã®åœä»€ã§ãç§ã¯ã¹ãã«ã§èã«èŠããã
JSãè£
ãããã«ãäžæçã«2人ã®åäŸã®ç¶ã¢ã¬ã¯ãµã³ããŒã«ãªããªããã°ãªããŸããã§ããã
ããããæãæ¿ãããŽãã¯ããããããŽã 補ã®ã¢ãã«ã®é³Žã声ã®ç©èªã«é¢ä¿ããŠããŸãã ããååã¯åœŒå¥³ãã¹ãã¬ã¹ãã解æŸãããã€ãŠã¯ææ
ã«ãµãã£ãŠé ãããã£ãã ãã以æ¥ãã¢ãã«ã¯ä»¥åã®å
æ²¢ã倱ããããã«ããŒã«ã«åã£ãŠä»£ããããŸããã
ãªããããèšãããã®ã§ããïŒ ããŒã¿ããŒã¹ã®æäœã«äººçãæ§ãããå Žåãæåã«åŠã¶å¿
èŠãããã®ã¯...ã¹ãã¬ã¹èæ§ã§ãã 2ã€ç®ã¯ãåå¿è
éçºè
ã®å€ããç¥ããªãããŸãã¯åã«ç¡èŠãã
T-SQLã¯ãšãªãäœæãããšãã«ããã€ãã®ã«ãŒã«ãæ¡çšãã座ã£ãŠé ãæ©ãŸãããšã§ã...ãªãæ©èœããªãã®ã§ããïŒ
å
容ïŒ
1.
ããŒã¿å2.
*3.
ãšã€ãªã¢ã¹4.
åã®é åº5.
NOT IN vs NULL6.
æ¥ä»åœ¢åŒ7.
æ¥ä»ãã£ã«ã¿ãŒ8.
èšç®9.
æé»ã®å€æ10.
LIKEããã³æå¶ãããã€ã³ããã¯ã¹11.
UnicodeãšANSI12.
ã³ã¬ãŒã13.
ãã€ããªã³ã¬ãŒã14.
ã³ãŒãã¹ã¿ã€ã«15.
[var] char16.
ããŒã¿é·17.
ISNULL察COALESCE18.
æ°åŠ19.
UNION vs UNION ALL20.
åèªã¿èŸŒã¿21.
ãµãã¯ãšãª22.
ã±ãŒã¹23.
ã¹ã«ã©ãŒé¢æ°24.
ãã¥ãŒ25.
ã«ãŒãœã«26.
STRING_CONCAT27.
SQLã€ã³ãžã§ã¯ã·ã§ã³äŸä»ãã®ãããª1.ããŒã¿å
SQL Serverã§äœæ¥ãããšãã«ã»ãšãã©ã®åé¡ãåŒãèµ·ããæãåºæ¬çãªããšã¯ãããŒã¿åã®éžæã®èª€ãã§ãã 2ã€ã®åºæ¬çã«åäžã®ããŒãã«ã䜿çšããæ¶ç©ºã®äŸãèããŸã
DECLARE @Employees1 TABLE ( EmployeeID BIGINT PRIMARY KEY , IsMale VARCHAR(3) , BirthDate VARCHAR(20) ) INSERT INTO @Employees1 VALUES (123, 'YES', '2012-09-01')
DECLARE @Employees2 TABLE ( EmployeeID INT PRIMARY KEY , IsMale BIT , BirthDate DATE ) INSERT INTO @Employees2 VALUES (123, 1, '2012-09-01')
ãªã¯ãšã¹ããå®è¡ããŠãéããèŠãŠã¿ãŸãããã
DECLARE @BirthDate DATE = '2012-09-01' SELECT * FROM @Employees1 WHERE BirthDate = @BirthDate SELECT * FROM @Employees2 WHERE BirthDate = @BirthDate
åè
ã®å ŽåãããŒã¿åã¯å¿
èŠä»¥äžã«åé·ã§ãã ãªããããèšå·ã
YES / NOæååãšããŠä¿åããã®ã§ããïŒ ãªãæ¥ä»ãæååãšããŠä¿åããã®ã§ããïŒ åŸæ¥å¡ãããããŒãã«ã§
BIGINTã䜿çšããçç± åçŽãª
INTãåãŸããªãã£ãã®ã§ããïŒ
ããã«ã¯ããã€ãã®çç±ããããŸããããŒãã«ãããå€ãã®ãã£ã¹ã¯é åãå æããããããã£ã¹ã¯ããããå€ãã®ããŒãžãèªã¿èŸŒãå¿
èŠãããããã®ããŒã¿ãåŠçããããã«
BufferPoolã«ããå€ãã®ããŒãžã
é
眮ããå¿
èŠããã ããã«ãæ·±å»ãªããã©ãŒãã³ã¹ã®åé¡ãããå¯èœæ§ããããŸã-çå笊ã¯ãããç°¡åã«ç€ºåããŸãããããã«ã€ããŠã¯åŸã§èª¬æããŸãã
2. *
å€ãã®å Žåãã油絵ããæºããå¿
èŠããããŸããããã¹ãŠã®ããŒã¿ã¯ããŒãã«ããååŸããããã®åŸãå®éã«å¿
èŠãªåã®ã¿ã
DataReaderãä»ããŠã¯ã©ã€ã¢ã³ãã§éžæãããŸãã ããã¯éåžžã«éå¹ççã§ããããããã®ãã©ã¯ãã£ã¹ã䜿çšããªãããšããå§ãããŸãã
USE AdventureWorks2014 GO SET STATISTICS TIME, IO ON SELECT * FROM Person.Person SELECT BusinessEntityID , FirstName , MiddleName , LastName FROM Person.Person SET STATISTICS TIME, IO OFF
éãã¯ãã¯ãšãªå®è¡ã®æéãšãã«ããŒããã€ã³ããã¯ã¹ã«ããè«ççãªèªã¿åããå°ãªãããããšãã§ãããšããäºå®ã®äž¡æ¹ã«ãããŸãã
Table 'Person'. Scan count 1, logical reads 3819, physical reads 3, ... SQL Server Execution Times: CPU time = 31 ms, elapsed time = 1235 ms. Table 'Person'. Scan count 1, logical reads 109, physical reads 1, ... SQL Server Execution Times: CPU time = 0 ms, elapsed time = 227 ms.
3.ãšã€ãªã¢ã¹
ããŒãã«ãäœæããŸãã
USE AdventureWorks2014 GO IF OBJECT_ID('Sales.UserCurrency') IS NOT NULL DROP TABLE Sales.UserCurrency GO CREATE TABLE Sales.UserCurrency ( CurrencyCode NCHAR(3) PRIMARY KEY ) INSERT INTO Sales.UserCurrency VALUES ('USD')
äž¡æ¹ã®ããŒãã«ã«ããåäžã®è¡ã®æ°ãè¿ãã¯ãšãªããããšããŸãïŒ
SELECT COUNT_BIG(*) FROM Sales.Currency WHERE CurrencyCode IN ( SELECT CurrencyCode FROM Sales.UserCurrency )
äºæ³ã©ãããããŒãã«
Sales.UserCurrencyã®åã®ååãå€æŽãããŸã§ããã¹ãŠãæ©èœããŸãã
EXEC sys.sp_rename 'Sales.UserCurrency.CurrencyCode', 'Code', 'COLUMN'
ã¯ãšãªãå®è¡ãããšãè¿ãããã®ã¯1è¡ã§ã¯ãªãããã¹ãŠã
Sales.Currencyã«ããããšã
ããããŸãã å®è¡ãã©ã³ãæ§ç¯ãããšãã
SQL Serverã¯ãã€ã³ã段éã§
Sales.UserCurrencyåã調ã¹ã
ãã㧠CurrencyCodeãèŠã€ããããã®åã
Sales.CurrencyããŒãã«ã«å±ããŠãããšã¯èããŸãã
ããã®åŸããªããã£ãã€ã¶ãŒã¯
CurrencyCode = CurrencyCodeæ¡ä»¶ãåé€ããŸãã
é埳-ãšã€ãªã¢ã¹ã䜿çšïŒ
SELECT COUNT_BIG(*) FROM Sales.Currency c WHERE c.CurrencyCode IN ( SELECT u.CurrencyCode FROM Sales.UserCurrency u )
4.åã®é åº
äœããã®çš®é¡ã®ããŒãã«ããããšããŸãïŒ
IF OBJECT_ID('dbo.DatePeriod') IS NOT NULL DROP TABLE dbo.DatePeriod GO CREATE TABLE dbo.DatePeriod ( StartDate DATE , EndDate DATE )
ãããŠãåãã©ã®ããã«é åºä»ããããŠããããç¥ã£ãŠãããšããä»®å®ãããåžžã«ããŒã¿ãæ¿å
¥ããŸãã
INSERT INTO dbo.DatePeriod SELECT '2015-01-01', '2015-01-31'
ãã®åŸã誰ããåã䞊ã¹æ¿ããŸãïŒ
CREATE TABLE dbo.DatePeriod ( EndDate DATE , StartDate DATE )
ãããŠãããŒã¿ã¯ãã§ã«éçºè
ãæåŸ
ããééã£ãåã«æ¿å
¥ãããŸãã ãããã£ãŠã
INSERTæ§é ã§åãæ瀺çã«æå®ããããšãåžžã«æšå¥šãããŸãã
INSERT INTO dbo.DatePeriod (StartDate, EndDate) SELECT '2015-01-01', '2015-01-31'
å¥ã®èå³æ·±ãäŸããããŸãïŒ
SELECT TOP(1) * FROM dbo.DatePeriod ORDER BY 2 DESC
ã©ã®åããœãŒããããŸããïŒ ãããŠãããã¯ãã¹ãŠããŒãã«å
ã®çŸåšã®é åºã«äŸåããŸãã 誰ãããããå€æŽãããšããªã¯ãšã¹ãã¯æåŸ
ãããã®ã衚瀺ããŸããã
5. NOT IN vs NULL
ãžã¥ãã¢DBéçºè
ã€ã³ã¿ãã¥ãŒã®è³ªåã®äžã§è°è«ã®äœå°ã®ãªããªãŒããŒã¯ã
NOT INæ§é ã§ãã
ããšãã°ãããã€ãã®ã¯ãšãªãäœæããå¿
èŠããããŸãã2çªç®ã®ããŒãã«ã«ãªãæåã®ããŒãã«ãããã¹ãŠã®ã¬ã³ãŒããè¿ããŸãã éåžžã«å€ãã®å Žåãåå¿è
ã®éçºè
ã¯ãããã
INãš
NOT INã䜿çšã
ãŸãã ã
DECLARE @t1 TABLE (t1 INT, UNIQUE CLUSTERED(t1)) INSERT INTO @t1 VALUES (1), (2) DECLARE @t2 TABLE (t2 INT, UNIQUE CLUSTERED(t2)) INSERT INTO @t2 VALUES (1) SELECT * FROM @t1 WHERE t1 NOT IN (SELECT t2 FROM @t2) SELECT * FROM @t1 WHERE t1 IN (SELECT t2 FROM @t2)
æåã®ã¯ãšãªã¯ãã¥ãŒã¹ãè¿ãã2çªç®ã®ã¯ãšãªã¯ãŠããããè¿ããŸããã 次ã«ã2çªç®ã®ããŒãã«ã«å¥ã®å€-NULLãè¿œå ã
ãŸã ã
INSERT INTO @t2 VALUES (1), (NULL)
NOT INã䜿çšããŠã¯ãšãªãå®è¡ãããšãçµæãåŸãããŸããã æ¬åœã«ããçš®ã®éæ³ãä»å
¥ããŸãã
-INã¯åäœããŸããã
NOT INã¯æåŠããŸãã ããã¯ãæ¯èŒæäœäžã®3次ããžãã¯ã«ãã£ãŠå°ãããã
TRUE ã
FALSE ã
UNKNOWNã® SQL Serverã
䜿çšããå Žåã«æåã«ãç解ããŠèš±ããããšã§ãã
å®è¡ããããšã
SQL Serverã¯
INå¥ã解éã
ãŸã ã
a IN (1, NULL) == a=1 OR a=NULL
å
¥ã£ãŠããªã ïŒ
a NOT IN (1, NULL) == a<>1 AND a<>NULL
å€ã
NULLãšæ¯èŒãããš
UNKNOWNã
è¿ãããŸãã
1 = NULL ã
NULL = NULL ã çµæã¯1-
UNKNOWNã«ãªããŸãã ãŸããæ¡ä»¶ã§
ANDæŒç®åã䜿çšãããŠãããããåŒå
šäœãæªå®çŸ©ã®å€ãè¿ããçµæãšããŠç©ºã«ãªããŸãã
å°ãéå±ã«æžãããŠããŸãã ãããããã®ãããªç¶æ³ã¯ååã«äžè¬çã§ããããšãç解ããããšãéèŠã§ãã ããšãã°ãåã
NOT NULLãšããŠå®£èšãããåã«ãããçš®ã®äººããã®åã«
NULLå€ãæžã蟌ãããšãèš±å¯ããŸããã çµè«ïŒã¯ã©ã€ã¢ã³ãã¯ãå°ãªããšã1ã€ã®
NULLå€ãããŒãã«ã«å
¥ã£ãåŸã«ã¬ããŒãã®åäœãåæ¢ããŸãã
ã©ããã
NULLå€ãæ瀺çã«åé€ã§ããŸãã
SELECT * FROM @t1 WHERE t1 NOT IN ( SELECT t2 FROM @t2 WHERE t2 IS NOT NULL )
EXCEPTã䜿çšã§ããŸãïŒ
SELECT * FROM @t1 EXCEPT SELECT * FROM @t2
å€ãã®ããšãèããããªãå Žåã¯ã
NOT EXISTSã䜿çšããæ¹ãç°¡åã§ãã
SELECT * FROM @t1 WHERE NOT EXISTS( SELECT 1 FROM @t2 WHERE t1 = t2 )
ã©ã®ã¯ãšãªãªãã·ã§ã³ãæé©ã§ããïŒ
NOT EXISTSã䜿çšããæåŸã®ãªãã·ã§ã³ã¯ã2çªç®ã®ããŒãã«ã®ããŒã¿ã«ã¢ã¯ã»ã¹ãããšãã«ãããæé©ãª
è¿°èªããã·ã¥ããŠã³ã¹ããŒãã¡ã³ããçæããããšãæãŸããããã§ãã
äžè¬ã«ã
NULLå€ã§ã¯å€ãã®åè«ããããŸãã 次ã®ãªã¯ãšã¹ãã§éã¶ããšãã§ããŸãïŒ
USE AdventureWorks2014 GO SELECT COUNT_BIG(*) FROM Production.Product SELECT COUNT_BIG(*) FROM Production.Product WHERE Color = 'Grey' SELECT COUNT_BIG(*) FROM Production.Product WHERE Color <> 'Grey'
NULLå€ã«å¯ŸããŠåå¥ã®æ¯èŒæŒç®åãæäŸãããŠãããšããçç±ã ãã§ãæåŸ
ãããçµæãåŸãããŸããã
SELECT COUNT_BIG(*) FROM Production.Product WHERE Color IS NULL SELECT COUNT_BIG(*) FROM Production.Product WHERE Color IS NOT NULL
CHECKå®æ°ã®ããç¶æ³ã¯ããã«å¥åŠã«èŠããŸãïŒ
IF OBJECT_ID('tempdb.dbo.
çœãšé»ã®è²ã®ã¿ãèšé²ã§ããããŒãã«ãäœæããŸãã
INSERT INTO
(1 row(s) affected)
ãã¹ãŠãæåŸ
ã©ããã«æ©èœããŸãã
INSERT INTO
The INSERT statement conflicted with the CHECK constraint... The statement has been terminated.
ãããã
NULLãæ¿å
¥ããŸãããïŒ
INSERT INTO
(1 row(s) affected)
æžã蟌ã¿ã«ã¯
NOT FALSEæ¡ä»¶ã§ååãªã®ã§ã
CHECKå®æ°ã¯æ©èœããŸããã§ããã
TRUEãš
UNKNOWNã¯çãéã«é©ããŠããŸãã ãã®åäœãåé¿ããããã®ããã€ãã®ãªãã·ã§ã³ããããŸããæ瀺çã«åã
NOT NULLãšããŠå®£èšããããå¶çŽã§
NULLãèæ
®ã
ãŸã ã
6.æ¥ä»åœ¢åŒ
ããã§ããããŒã¿åã®ããŸããŸãªãã¥ã¢ã³ã¹ã«ã€ãŸããããšããããããŸãã ããšãã°ãçŸåšã®æå»ãååŸããå¿
èŠããããŸãã GETDATEé¢æ°ãå®è¡ããŸãã
SELECT GETDATE()
çµæãã³ããŒããã¯ãšãªã«ãã®ãŸãŸè²Œãä»ããŠãæéãåé€ããŸããã
SELECT * FROM sys.objects WHERE create_date < '2016-11-14'
ããã¯æ£ããã§ããïŒ
æ¥ä»ã¯æååå®æ°ã§æå®ãã
ãŸããã
SQL Serverã§ã¯ãæžã蟌ã¿æã«ããçšåºŠã®èªç±åºŠãèš±å¯ãããŸãã
SET LANGUAGE English SET DATEFORMAT DMY DECLARE @d1 DATETIME = '05/12/2016' , @d2 DATETIME = '2016/12/05' , @d3 DATETIME = '2016-12-05' , @d4 DATETIME = '05-dec-2016' SELECT @d1, @d2, @d3, @d4
ãã¹ãŠã®å€ã¯ã»ãŒã©ãã§ãæ確ã«è§£éãããŸãã
----------- ----------- ----------- ----------- 2016-12-05 2016-05-12 2016-05-12 2016-12-05
ãããŠããã®ãããªããžãã¹ããžãã¯ã®ãªã¯ãšã¹ããå¥ã®ãµãŒããŒã§éå§ããããŸã§ãåé¡ã¯çºçããŸãããå¥ã®ãµãŒããŒã§ã¯ãèšå®ãç°ãªãå ŽåããããŸãã
SET DATEFORMAT MDY DECLARE @d1 DATETIME = '05/12/2016' , @d2 DATETIME = '2016/12/05' , @d3 DATETIME = '2016-12-05' , @d4 DATETIME = '05-dec-2016' SELECT @d1, @d2, @d3, @d4
ãããã®ãªãã·ã§ã³ã¯ãã¹ãŠãæ¥ä»ã®èª€ã£ã解éã«ã€ãªããå¯èœæ§ããããŸãã
----------- ----------- ----------- ----------- 2016-05-12 2016-12-05 2016-12-05 2016-12-05
ããã«ããã®ãããªã³ãŒãã¯ãæ瀺çããã³é衚瀺ã®äž¡æ¹ã®ãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãã ããšãã°ãããŒãã«ã«ããŒã¿ãæ¿å
¥ããå¿
èŠããããŸãã ãã¹ããµãŒããŒã§ã¯ãã¹ãŠæ£åžžã«åäœããŸãã
DECLARE @t TABLE (a DATETIME) INSERT INTO @t VALUES ('05/13/2016')
ãããŠãã¯ã©ã€ã¢ã³ãã¯ããµãŒããŒèšå®ã®éãã«ããããã®ãããªãªã¯ãšã¹ãã¯åé¡ã«ã€ãªãããŸãïŒ
DECLARE @t TABLE (a DATETIME) SET DATEFORMAT DMY INSERT INTO @t VALUES ('05/13/2016')
Msg 242, Level 16, State 3, Line 28 The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
ã§ã¯ãæ¥ä»ã®å®æ°ãèšå®ãã圢åŒã¯äœã§ããïŒ å¥ã®äŸãèŠãŠã¿ãŸãããã
SET DATEFORMAT YMD SET LANGUAGE English DECLARE @d1 DATETIME = '2016/01/12' , @d2 DATETIME = '2016-01-12' , @d3 DATETIME = '12-jan-2016' , @d4 DATETIME = '20160112' SELECT @d1, @d2, @d3, @d4 GO SET LANGUAGE Deutsch DECLARE @d1 DATETIME = '2016/01/12' , @d2 DATETIME = '2016-01-12' , @d3 DATETIME = '12-jan-2016' , @d4 DATETIME = '20160112' SELECT @d1, @d2, @d3, @d4
ã€ã³ã¹ããŒã«ãããŠããèšèªã«å¿ããŠãå®æ°ã¯ããŸããŸãªæ¹æ³ã§è§£éããããšãã§ããŸãã
----------- ----------- ----------- ----------- 2016-01-12 2016-01-12 2016-01-12 2016-01-12 ----------- ----------- ----------- ----------- 2016-12-01 2016-12-01 2016-01-12 2016-01-12
ãããŠãçµè«ã¯æåŸã®2ã€ã®ãªãã·ã§ã³ã䜿çšããããšãèŠæ±ããŸãã æãæ瀺çã«èšå®ããããšã¯ããNo crap sis jourããšã©ãŒã«ééããè¯ãæ©äŒã§ãããšããã«èšããªããã°ãªããŸããã
SET LANGUAGE French DECLARE @d DATETIME = '12-jan-2016'
Msg 241, Level 16, State 1, Line 29 Ãchec de la conversion de la date et/ou de l'heure à partir d'une chaîne de caractÚres.
åèš-æåŸã®ãªãã·ã§ã³ãæ®ããŸãã æã®èšå®ãäœçžã«é¢ä¿ãªããæ¥ä»ãå«ãå®æ°ãã·ã¹ãã ã§æ確ã«è§£éããå Žåã¯ããã«ããåŒçšç¬Šãã¹ã©ãã·ã¥ãªãã§
YYYYMMDD圢åŒã§æå®ããŸãã
ãŸããäžéšã®ããŒã¿åã®åäœã®éãã«æ³šæãã䟡å€ããããŸãã
SET LANGUAGE English SET DATEFORMAT YMD DECLARE @d1 DATE = '2016-01-12' , @d2 DATETIME = '2016-01-12' SELECT @d1, @d2 GO SET LANGUAGE Deutsch SET DATEFORMAT DMY DECLARE @d1 DATE = '2016-01-12' , @d2 DATETIME = '2016-01-12' SELECT @d1, @d2
DATETIMEãšã¯ç°ãªãã
DATEã¿ã€ãã¯ãµãŒããŒã®ããŸããŸãªèšå®ã§æ£ãã解éãããŸãã
---------- ---------- 2016-01-12 2016-01-12 ---------- ---------- 2016-01-12 2016-12-01
ãããããã®ãã¥ã¢ã³ã¹ã念é ã«çœ®ãå¿
èŠããããŸããïŒ ã»ãšãã©ãªãã èŠããŠããã¹ãäž»ãªããšã¯ã
YYYYMMDDã®åœ¢åŒã§æ¥ä»ãèšå®ããå¿
èŠããããåé¡ããªãããšã§ãã
7.æ¥ä»ãã£ã«ã¿ãŒ
次ã«ãããŒã¿ãå¹ççã«ãã£ã«ã¿ãªã³ã°ããæ¹æ³ãæ€èšããŸãã äœããã®çç±ã§ã
DATETIME / DATEåã®æŸèæã®æ°ãæãå€ãããããã®ããŒã¿åããå§ããŸãã
USE AdventureWorks2014 GO UPDATE TOP(1) dbo.DatabaseLog SET PostTime = '20140716 12:12:12'
次ã«ãç¹å®ã®æ¥ã«ã¯ãšãªãè¿ãè¡æ°ã調ã¹ãŠã¿ãŸãããã
SELECT COUNT_BIG(*) FROM dbo.DatabaseLog WHERE PostTime = '20140716'
èŠæ±ã¯0ãè¿ããŸãããªãã§ããïŒ ãã©ã³ãäœæããéã
SQL Serverã¯æååå®æ°ããã£ã«ã¿ãŒåŠçããåã®ããŒã¿åã«å€æããããšã
ãŸã ã
ã€ã³ããã¯ã¹ãäœæããŸãã
CREATE NONCLUSTERED INDEX IX_PostTime ON dbo.DatabaseLog (PostTime)
å¿
èŠãªããŒã¿ã衚瀺ããããã®æ£ãããªãã·ã§ã³ãšééã£ããªãã·ã§ã³ããããŸãã ããšãã°ãåãåãæéïŒ
SELECT COUNT_BIG(*) FROM dbo.DatabaseLog WHERE CONVERT(CHAR(8), PostTime, 112) = '20140716' SELECT COUNT_BIG(*) FROM dbo.DatabaseLog WHERE CAST(PostTime AS DATE) = '20140716'
ãŸãã¯ãç¯å²ãèšå®ããŸãã
SELECT COUNT_BIG(*) FROM dbo.DatabaseLog WHERE PostTime BETWEEN '20140716' AND '20140716 23:59:59.997' SELECT COUNT_BIG(*) FROM dbo.DatabaseLog WHERE PostTime >= '20140716' AND PostTime < '20140717'
æé©åã«é¢ããŠããæ£ç¢ºãªã®ã¯ãæåŸã®2ã€ã®ã¯ãšãªã§ãã å®éãæ€çŽ¢å¯Ÿè±¡ã®ã€ã³ããã¯ã¹åã§ã®ãã¹ãŠã®å€æãšèšç®ã¯ãããã©ãŒãã³ã¹ã倧å¹
ã«äœäžãããè«çèªã¿åãå€ãå¢ãããŸãïŒæåãšæåŸã®3ã€ã®ã¯ãšãªãªãã·ã§ã³ïŒã
Table 'DatabaseLog'. Scan count 1, logical reads 7, ... Table 'DatabaseLog'. Scan count 1, logical reads 2, ...
PostTimeãã£ãŒã«ãã¯ä»¥åã¯ã€ã³ããã¯ã¹ã«å«ãŸããŠããªãã£ãããããã£ã«ã¿ãªã³ã°æã«ãæ£ãããã¢ãããŒãã䜿çšããŠãç¹å¥ãªå¹æã¯èŠãããŸããã§ããã ãã1ã€ã¯ã1ãæéã®ããŒã¿ã衚瀺ããå¿
èŠãããå Žåã§ãã ãã èŠãå¿
èŠããªãã£ããã®ïŒ
SELECT COUNT_BIG(*) FROM dbo.DatabaseLog WHERE CONVERT(CHAR(8), PostTime, 112) LIKE '201407%' SELECT COUNT_BIG(*) FROM dbo.DatabaseLog WHERE DATEPART(YEAR, PostTime) = 2014 AND DATEPART(MONTH, PostTime) = 7 SELECT COUNT_BIG(*) FROM dbo.DatabaseLog WHERE YEAR(PostTime) = 2014 AND MONTH(PostTime) = 7 SELECT COUNT_BIG(*) FROM dbo.DatabaseLog WHERE EOMONTH(PostTime) = '20140731' SELECT COUNT_BIG(*) FROM dbo.DatabaseLog WHERE PostTime >= '20140701' AND PostTime < '20140801'
ç¹°ãè¿ããŸãããæåŸã®ãªãã·ã§ã³ã¯ä»ã®ãã¹ãŠã®ãªãã·ã§ã³ãããåãå
¥ããããŸãã
ããã«ããã€ã§ãèšç®ãã£ãŒã«ããäœæããããã«åºã¥ããŠã€ã³ããã¯ã¹ãäœæã§ããŸãã
IF COL_LENGTH('dbo.DatabaseLog', 'MonthLastDay') IS NOT NULL ALTER TABLE dbo.DatabaseLog DROP COLUMN MonthLastDay GO ALTER TABLE dbo.DatabaseLog ADD MonthLastDay AS EOMONTH(PostTime)
åã®ã¯ãšãªãšæ¯èŒããŠãè«çèªã¿åãå€ã®éãã¯éèŠã§ãïŒå€§ããªããŒãã«ã«ã€ããŠè©±ããŠããå ŽåïŒã
SET STATISTICS IO ON SELECT COUNT_BIG(*) FROM dbo.DatabaseLog WHERE PostTime >= '20140701' AND PostTime < '20140801' SELECT COUNT_BIG(*) FROM dbo.DatabaseLog WHERE MonthLastDay = '20140731' SET STATISTICS IO OFF
Table 'DatabaseLog'. Scan count 1, logical reads 7, ... Table 'DatabaseLog'. Scan count 1, logical reads 3, ...
8.èšç®
å
ã»ã©èšã£ãããã«ãã€ã³ããã¯ã¹ãã£ãŒã«ãã®èšç®ã¯ããã©ãŒãã³ã¹ãäœäžãããè«çèªã¿åãå€ã®å¢å ã«ã€ãªãããŸãã
USE AdventureWorks2014 GO SET STATISTICS IO ON SELECT BusinessEntityID FROM Person.Person WHERE BusinessEntityID * 2 = 10000 SELECT BusinessEntityID FROM Person.Person WHERE BusinessEntityID = 2500 * 2 SELECT BusinessEntityID FROM Person.Person WHERE BusinessEntityID = 5000
Table 'Person'. Scan count 1, logical reads 67, ... Table 'Person'. Scan count 0, logical reads 3, ...
å®è¡èšç»ãèŠããšãæåã®ã±ãŒã¹ã§ã¯ã
SQL Serverã¯
IndexScanãå®è¡ããå¿
èŠããã
ãŸã ã
2çªç®ãš3çªç®ã®ã±ãŒã¹ã§ã¯ãã€ã³ããã¯ã¹ãã£ãŒã«ãã«èšç®ããªãå Žåã
IndexSeekã衚瀺ãã
ãŸã ã
9.æé»ã®å€æ
æåã«ãåãå€ã§ãã£ã«ã¿ãªã³ã°ããããã2ã€ã®ã¯ãšãªãèŠãŠãã ããã
USE AdventureWorks2014 GO SELECT BusinessEntityID, NationalIDNumber FROM HumanResources.Employee WHERE NationalIDNumber = 30845 SELECT BusinessEntityID, NationalIDNumber FROM HumanResources.Employee WHERE NationalIDNumber = '30845'
å®è£
èšç»ãèŠããšïŒ
åè
ã®å Žå-èŠåãš
IndexScanãåŸè
ã®å Žå-IndexSeek ïŒ
Table 'Employee'. Scan count 1, logical reads 4, ... Table 'Employee'. Scan count 0, logical reads 2, ...
ã©ããã
NationalIDNumberåã®ããŒã¿
åã¯
NVARCHARïŒ15ïŒã§ãã
INTãšããŠããŒã¿ããã£ã«ã¿ãŒåŠçããå¿
èŠãããå€ã§å®æ°ãæž¡ããšãçµæãšããŠæé»çãªåå€æãè¡ãããããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã ããã¯ã誰ããåã®ããŒã¿åãå€æŽãããšãã«é »ç¹ã«çºçããŸãããã¯ãšãªã¯åããŸãŸã§ãã
ãã ããããã©ãŒãã³ã¹ã®åé¡ã ããåŸ
ã£ãŠããããã§ã¯ãªãããšãç解ããããšãéèŠã§ãã æé»çãªåå€æã¯ãå®è¡æãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãã ããšãã°ãPostalCodeãã£ãŒã«ããæ°å€ã«ãªãåã«ãéµäŸ¿çªå·ã«æåãå«ãŸããŠããå¯èœæ§ããããšããæ瀺ãäžããæ¥ãŸããã ããŒã¿åã¯å€æŽãããŸããããè±æ°åã®éµäŸ¿çªå·ãæ¿å
¥ããããšããã«ãå€ããªã¯ãšã¹ãã¯æ©èœããªããªããŸãã
SELECT AddressID FROM Person.[Address] WHERE PostalCode = 92700 SELECT AddressID FROM Person.[Address] WHERE PostalCode = '92700'
Msg 245, Level 16, State 1, Line 16 Conversion failed when converting the nvarchar value 'K4B 1S2' to data type int.
ããã«èå³æ·±ãããšã«ããããžã§ã¯ãã
EntityFrameworkã䜿çšããå Žåãããã©ã«ãã§ãã¹ãŠã®æååãã£ãŒã«ãã
UnicodeãšããŠè§£éããŸãã
SELECT CustomerID, AccountNumber FROM Sales.Customer WHERE AccountNumber = N'AW00000009' SELECT CustomerID, AccountNumber FROM Sales.Customer WHERE AccountNumber = 'AW00000009'
ãã®çµæãæé©ãªã¯ãšãªã¯çæãããŸããã
åé¡ã®è§£æ±ºçã¯éåžžã«ç°¡åã§ã-æ¯èŒäžã«ããŒã¿åãäžèŽããããã«å¶åŸ¡ããå¿
èŠããããŸãã
10. LIKEããã³æå¶ãããã€ã³ããã¯ã¹
ã«ããªã³ã°ã€ã³ããã¯ã¹ãããå Žåã§ãããããå¹æçã«äœ¿çšããããšããäºå®ã§ã¯ãããŸããã ããšãã°ã...ã§å§ãŸããã¹ãŠã®è¡ãå°å·ããå¿
èŠããããŸãã
USE AdventureWorks2014 GO SET STATISTICS IO ON SELECT AddressLine1 FROM Person.[Address] WHERE SUBSTRING(AddressLine1, 1, 3) = '100' SELECT AddressLine1 FROM Person.[Address] WHERE LEFT(AddressLine1, 3) = '100' SELECT AddressLine1 FROM Person.[Address] WHERE CAST(AddressLine1 AS CHAR(3)) = '100' SELECT AddressLine1 FROM Person.[Address] WHERE AddressLine1 LIKE '100%'
次ã®è«çèªã¿åãå€ãååŸããŸãã
Table 'Address'. Scan count 1, logical reads 216, ... Table 'Address'. Scan count 1, logical reads 216, ... Table 'Address'. Scan count 1, logical reads 216, ... Table 'Address'. Scan count 1, logical reads 4, ...
ããã«åè
ãèŠã€ããããšãã§ããå®è£
èšç»ïŒ
çµæã¯ãç§ãã¡ãé·ãé話ãåã£ãŠããçµæã§ãã ã€ã³ããã¯ã¹ãååšããå Žåãåãé¢æ°ãªã©ã®èšç®ãå€æã¯è¡ãããŸããã ããããŠåããŠã
SQL Serverã«ãã£ãŠå¹ççã«äœ¿çšãã
ãŸã ã
ããããæååå
ã®éšåæååã®ãã¹ãŠã®åºçŸãèŠã€ããå¿
èŠãããå Žåã¯ã©ãã§ããããïŒ ãã®ã¿ã¹ã¯ã¯æããã«èå³æ·±ããã®ã§ãã
SELECT AddressLine1 FROM Person.[Address] WHERE AddressLine1 LIKE '%100%'
ããããæåã«ãæååãšãã®ããããã£ã«ã€ããŠå€ãã®èå³æ·±ãããšãåŠã¶å¿
èŠããããŸãã
11. UnicodeãšANSI
æåã«èŠããŠããã¹ãããšã¯ãæååã
UNICODEãš
ANSIã§ããããšã§ãã åè
ã®å Žåã
NVARCHAR / NCHARããŒã¿åã
æäŸãããŸãïŒæåããã2ãã€ã-æ®å¿µãªããã
UTF8ã¯é
ä¿¡ãããŸããã§ããïŒã
ANSIæååãæ ŒçŽããã«ã¯
-VARCHAR / CHAR ïŒ1ãã€ã-1æåïŒã
TEXT / NTEXTããããŸãããæåã¯ããããå¿ããŠããæ¹ãããã§ãããïŒãããã䜿çšãããšããã©ãŒãã³ã¹ã倧å¹
ã«äœäžããå¯èœæ§ãããããïŒã
ãããŠãããã¯çµäºããå¯èœæ§ããããŸãããããã...
ãŠãã³ãŒãå®æ°ããªã¯ãšã¹ãã§æå®ãããŠããå Žåãã·ã³ãã«
Nã®åã«ãããå¿
èŠã§ãã éãã瀺ãã«ã¯ãåçŽãªã¯ãšãªã§ååã§ãã
SELECT 'ææ¬ ANSI' , N'ææ¬ UNICODE'
------- ------------ ?? ANSI ææ¬ UNICODE
å®æ°ã®åã«
Nãæå®ããªãå Žåã
SQL Serverã¯
ANSIãšã³ã³ãŒãã£ã³ã°ã§é©åãªæåãæ¢ããŸãã èŠã€ãããªãå Žåã¯ãçå笊ã«çœ®ãæããŸãã
12.ã³ã¬ãŒã
ããã«/ã·ãã¢DBéçºè
ã®ããžã·ã§ã³ã®é¢æ¥æã«åœŒããå°ããããšæãéåžžã«èå³æ·±ãäŸãæãåºããŸããã 次ã®ã¯ãšãªã¯ããŒã¿ãè¿ããŸããïŒ
DECLARE @a NCHAR(1) = '' , @b NCHAR(1) = '' SELECT @a, @b WHERE @a = @b
ãããŠãã¯ã...ãããŠããã...ããã«å¹žéããããŸãã ç§ã¯éåžžãã®ããã«çããŸãã
ãªããããªææ§ãªçããªã®ã§ããããïŒ ãŸããæååå®æ°ã«ã¯Nããªãããã
ANSIãšããŠè§£éãããŸãã 2ã€ç®-çŸåšã®
COLLATEã«å€§ããäŸåããŸããããã¯ãæååããŒã¿ã®äžŠã¹æ¿ããšæ¯èŒã®ããã®äžé£ã®ã«ãŒã«ã§ãã
USE [master] GO IF DB_ID('test') IS NOT NULL BEGIN ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE DROP DATABASE test END GO CREATE DATABASE test COLLATE Latin1_General_100_CI_AS GO USE test GO DECLARE @a NCHAR(1) = '' , @b NCHAR(1) = '' SELECT @a, @b WHERE @a = @b
ãã®
COLLATEã§ã¯ãããªã«æåã®ä»£ããã«çå笊ã衚瀺ãããŸããçå笊ã®æåãçããããã§ãã
---- ---- ? ?
COLLATEãä»ã®ããã€ãã«å€æŽããå¿
èŠããããŸãã
ALTER DATABASE test COLLATE Cyrillic_General_100_CI_AS
ãŸããããªã«æåãæ£ãã解éããããããã¯ãšãªã¯äœãè¿ããŸããã
ãããã£ãŠãããã§ã®æèšã¯åçŽã§ããæååå®æ°ã
UNICODEãåãå
¥ããå¿
èŠãããå Žåããã®åã«
Nã眮ãã®ã
æ ããªãã§ãã ããã
Nãå¯èœãªéãã¹ã¿ãã¯ããŠããå Žåãã³ã€ã³ã®è£åŽãããããªããã£ãã€ã¶ãŒã¯åå€æãå®è¡ããå¿
èŠããããŸãã
è¡ã«èšåããããšãä»ã«äœãå¿ããŸãããïŒ ãã¬ããã€ã³ã¿ãã¥ãŒããµã€ã¯ã«ããã®å¥ã®è¯ã質åïŒ
DECLARE @a VARCHAR(10) = 'TEXT' , @b VARCHAR(10) = 'text' SELECT IIF(@a = @b, 'TRUE', 'FALSE')
ãããã®ç·ã¯çããã§ããïŒ ãããŠãã¯ã...ãããŠããã...åã³ç§ã¯çããŸãã æ確ãªæ¯èŒãå¿
èŠãªå Žåã¯ãæ瀺çã«
COLLATEãæå®ããå¿
èŠããããŸãã
DECLARE @a VARCHAR(10) = 'TEXT' , @b VARCHAR(10) = 'text' SELECT IIF(@a COLLATE Latin1_General_CS_AS = @b COLLATE Latin1_General_CS_AS, 'TRUE', 'FALSE')
COLLATEã¯ãæååãæ¯èŒããã³ãœãŒããããšãã«ã倧æåãšå°æåãåºå¥ããïŒ
CS ïŒãã倧æåãšå°æåãåºå¥ããªãïŒ
CI ïŒããšãã§ããããã§ãã ã¯ã©ã€ã¢ã³ããšãã¹ãããŒã¹ã®ç°ãªã
COLLATEã¯ãããžãã¹ããžãã¯ã®è«çãšã©ãŒã ãã§ãªãæœåšçãªåå ã§ãã
ã¿ãŒã²ããããŒã¹ãš
tempdbã®éã®
COLLATEãäžèŽããªãå Žåãããã«æ¥œãããªã
ãŸã ã ããã©ã«ããšã¯ç°ãªã
COLLATEã§ããŒã¹ãäœæããŸãããïŒ
USE [master] GO IF DB_ID('test') IS NOT NULL BEGIN ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE DROP DATABASE test END GO CREATE DATABASE test COLLATE Albanian_100_CS_AS GO USE test GO CREATE TABLE t (c CHAR(1)) INSERT INTO t VALUES ('a') GO IF OBJECT_ID('tempdb.dbo.#t1') IS NOT NULL DROP TABLE
ããŒãã«ãäœæããããšã
COLLATEã¯ããŒã¿ããŒã¹ããç¶æ¿ãããŸãã å¯äžã®éãã¯ã
COLLATEãæå®ããã«æ§é ãæ瀺çã«å®çŸ©ããæåã®äžæããŒãã«ã§ãã ãã®å Žåã
tempdbããŒã¹ãã
COLLATEãç¶æ¿ã
ãŸã ã
COLLATEãäžèŽããªãå Žåãæœåšçãªåé¡ã«ã€ãªããå¯èœæ§ãããããã
ïŒt1ã䜿çšããäŸã«ã€ããŠèª¬æããŸãã
ããšãã°ã
COLLATEã§ã¯å€§æåãšå°æåãåºå¥ãããªããããããŒã¿ã¯æ£ãããã£ã«ã¿ãªã³ã°ãããŸããã
SELECT * FROM
ãŸãã¯ã
SQL Serverã¯ã
COLLATEãç°ãªãããã«ããŒãã«ãçµåã§ããªãããšãèªã
ãŸã ã
SELECT * FROM
åŸè
ã®äŸã¯éåžžã«äžè¬çã§ãã ãã¹ããµãŒããŒã§ã¯ãã¹ãŠãå®ç§ã§ãããããã¯ã¢ãããã¯ã©ã€ã¢ã³ããµãŒããŒã«å±éãããšããšã©ãŒãçºçããŸãã
Msg 468, Level 16, State 9, Line 93 Cannot resolve the collation conflict between "Albanian_100_CS_AS" and "Cyrillic_General_CI_AS" in the equal to operation.
ãããããã©ãã§ãæŸèæãäœããªããã°ãªããŸããïŒ
SELECT * FROM
13.ãã€ããªã³ã¬ãŒã
è»èã®ãã©ã€ãçµãã£ãã®ã§ã
COLLATEãã©ã®ããã«æŽ»çšã§ããããèŠãŠã¿ãŸãããã æååå
ã®éšåæååãèŠã€ããäŸã«ã€ããŠèŠããŠããŸããïŒ
SELECT AddressLine1 FROM Person.[Address] WHERE AddressLine1 LIKE '%100%'
ãã®èŠæ±ã¯å€§å¹
ã«æé©åãããå®è¡æéãççž®ãããŸãã
ããããéããèŠããããã«ããã«ã¯ã倧ããªããŒãã«ãçæããå¿
èŠããããŸãã
USE [master] GO IF DB_ID('test') IS NOT NULL BEGIN ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE DROP DATABASE test END GO CREATE DATABASE test COLLATE Latin1_General_100_CS_AS GO ALTER DATABASE test MODIFY FILE (NAME = N'test', SIZE = 64MB) GO ALTER DATABASE test MODIFY FILE (NAME = N'test_log', SIZE = 64MB) GO USE test GO CREATE TABLE t ( ansi VARCHAR(100) NOT NULL , unicod NVARCHAR(100) NOT NULL ) GO ;WITH E1(N) AS ( SELECT * FROM ( VALUES (1),(1),(1),(1),(1), (1),(1),(1),(1),(1) ) t(N) ), E2(N) AS (SELECT 1 FROM E1 a, E1 b), E4(N) AS (SELECT 1 FROM E2 a, E2 b), E8(N) AS (SELECT 1 FROM E4 a, E4 b) INSERT INTO t SELECT v, v FROM ( SELECT TOP(50000) v = REPLACE(CAST(NEWID() AS VARCHAR(36)) + CAST(NEWID() AS VARCHAR(36)), '-', '') FROM E8 ) t
ã€ã³ããã¯ã¹ã®äœæãå¿ããã«ããã€ããªCOLLATEã䜿çšããŠèšç®åãäœæããŸãã ALTER TABLE t ADD ansi_bin AS UPPER(ansi) COLLATE Latin1_General_100_Bin2 ALTER TABLE t ADD unicod_bin AS UPPER(unicod) COLLATE Latin1_General_100_BIN2 CREATE NONCLUSTERED INDEX ansi ON t (ansi) CREATE NONCLUSTERED INDEX unicod ON t (unicod) CREATE NONCLUSTERED INDEX ansi_bin ON t (ansi_bin) CREATE NONCLUSTERED INDEX unicod_bin ON t (unicod_bin)
ãã£ã«ã¿ãªã³ã°ãå®è¡ããŸãã SET STATISTICS TIME, IO ON SELECT COUNT_BIG(*) FROM t WHERE ansi LIKE '%AB%' SELECT COUNT_BIG(*) FROM t WHERE unicod LIKE '%AB%' SELECT COUNT_BIG(*) FROM t WHERE ansi_bin LIKE '%AB%'
ãããŠãå®è¡ã®çµæãèŠãããšãã§ããŸããããã¯å¬ããé©ãã§ãã SQL Server Execution Times: CPU time = 350 ms, elapsed time = 354 ms. SQL Server Execution Times: CPU time = 335 ms, elapsed time = 355 ms. SQL Server Execution Times: CPU time = 16 ms, elapsed time = 18 ms. SQL Server Execution Times: CPU time = 17 ms, elapsed time = 18 ms.
å
šäœã®ãã€ã³ãã¯ããã€ããªæ¯èŒã«åºã¥ããæ€çŽ¢ãã¯ããã«é«éã§ãããè¡ã®åºçŸãè¿
éãã€è¿
éã«æ€çŽ¢ããå¿
èŠãããå ŽåãããŒã¿ã¯BINã§çµããCOLLATEã§æ ŒçŽã§ããããšã§ããèŠããŠããã¹ãå¯äžã®ããšã¯ãæ¯èŒããéã«å€§æåãšå°æåãåºå¥ãããã¹ãŠã®ãã€ããªCOLLATEã§ãã14.ã³ãŒãã¹ã¿ã€ã«
ã³ãŒãã®èšè¿°ã¹ã¿ã€ã«ã¯å³å¯ã«åå¥ã§ãããéçºã«æ··ä¹±ããããããªãããã«ã誰ããç¹å®ã®ã«ãŒã«ãé·ãå®ã£ãŠããŸãããæãé説çãªããšã¯ãã¯ãšãªãäœæãããšãã«ã1ã€ã®ãŸãšããªã«ãŒã«ã»ãããèŠãããšããªããšããããšã§ãããããã®ãã¹ãŠã¯ããäž»ãªããšã¯åãããšã§ãããšããååã«åŸã£ãŠæžããŠããŸãããã ããã¯ã©ã€ã¢ã³ããµãŒããŒã«ããŒã¿ããŒã¹ãå±éããå ŽåãäŒæ©ãåããªã¹ã¯ããããŸããå¥ã®ããŒã¿ããŒã¹ãšãã®äžã®ããŒãã«ãäœæããŸãããïŒ USE [master] GO IF DB_ID('test') IS NOT NULL BEGIN ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE DROP DATABASE test END GO CREATE DATABASE test COLLATE Latin1_General_CI_AS GO USE test GO CREATE TABLE dbo.Employee (EmployeeID INT PRIMARY KEY)
次ã®ã¯ãšãªãäœæããŸãã select employeeid from employee
åäœããŸããïŒ
COLLATEã倧æåãšå°æåãåºå¥ããŠå€æŽããŠã¿ãŠãã ããã ALTER DATABASE test COLLATE Latin1_General_CS_AI
ãããŠããªã¯ãšã¹ããåå®è¡ããŠã¿ãŠãã ããïŒ Msg 208, Level 16, State 1, Line 19 Invalid object name 'employee'.
ãªããã£ãã€ã¶ãŒã¯ãå®è¡ãã©ã³ãäœæãããšãã«çŸåšã®COLLATEã«ãŒã«ã䜿çšããŸããããæ£ç¢ºã«ã¯ããã€ã³ãã£ã³ã°æ®µéã§ãããŒãã«ãåããã®ä»ã®ãªããžã§ã¯ãã®ååšã確èªããæ§æããªãŒã®åãªããžã§ã¯ããã·ã¹ãã ã«ã¿ãã°ã®å®éã®ãªããžã§ã¯ããšæ¯èŒãããšããã©ãã§ãåäœãããã³ã䜿çšããŠã¯ãšãªãçæããå Žåã¯ãã¯ãšãªã§äœ¿çšããããªããžã§ã¯ãã®ååã®æ£ããã¬ãžã¹ã¿ã«åžžã«æºæ ããå¿
èŠããããŸããç©äºã¯å€æ°ã§ããã«ããããã...ãããã®ããã«ãCOLLATEã¯ãã¹ã¿ãŒããŒã¹ããç¶æ¿ãããŸãããããã£ãŠãå€æ°ãæäœãããšãã¯æ£ããã¬ãžã¹ã¿ãŒã«åŸãå¿
èŠããããŸãã SELECT DATABASEPROPERTYEX('master', 'collation') DECLARE @EmpID INT = 1 SELECT @empid
ãã®ãšã©ãŒã¯ã»ãšãã©ã®å Žåããã§ã¯ãããŸããïŒ ----------------------- Cyrillic_General_CI_AS ----------- 1
åæã«ãå¥ã®ãµãŒããŒã§ã¯ãç»é²ã®ãšã©ãŒãæããããå ŽåããããŸãã -------------------------- Latin1_General_CS_AS
Msg 137, Level 15, State 2, Line 4 Must declare the scalar variable "@empid".
15. [var] char
, (
CHAR ,
NCHAR ) (
VARCHAR ,
NVARCHAR ):
DECLARE @a CHAR(20) = 'text' , @b VARCHAR(20) = 'text' SELECT LEN(@a) , LEN(@b) , DATALENGTH(@a) , DATALENGTH(@b) , '"' + @a + '"' , '"' + @b + '"' SELECT [a = b] = IIF(@a = @b, 'TRUE', 'FALSE') , [b = a] = IIF(@b = @a, 'TRUE', 'FALSE') , [a LIKE b] = IIF(@a LIKE @b, 'TRUE', 'FALSE') , [b LIKE a] = IIF(@b LIKE @a, 'TRUE', 'FALSE')
20 , 4,
SQL Server 16 ( LEN DATALENGTH -):
, â :
a = bb = aa LIKE bb LIKE a
LIKE :
SELECT 1 WHERE 'a ' LIKE 'a' SELECT 1 WHERE 'a' LIKE 'a '
.
16. Data length
, :
DECLARE @a DECIMAL , @b VARCHAR(10) = '0.1' , @c SQL_VARIANT SELECT @a = @b , @c = @a SELECT @a , @c , SQL_VARIANT_PROPERTY(@c,'BaseType') , SQL_VARIANT_PROPERTY(@c,'Precision') , SQL_VARIANT_PROPERTY(@c,'Scale')
ãã®åé¡ã®æ¬è³ªã¯äœã§ããïŒåã®æ¬¡å
ãæ瀺çã«æå®ãããå°æ°å€ã®ä»£ããã«ãæŽæ°ã®äžŠã¹æ¿ãããååŸããŸãã ---- ---- ---------- ----- ----- 0 0 decimal 18 0
ãŸã é¢çœãæååã§ïŒ DECLARE @t1 VARCHAR(MAX) = '123456789_123456789_123456789_123456789_' DECLARE @t2 VARCHAR = @t1 SELECT LEN(@t1) , @t1 , LEN(@t2) , @t2 , LEN(CONVERT(VARCHAR, @t1)) , LEN(CAST(@t1 AS VARCHAR))
次å
ãæ瀺çã«ç€ºãããŠããªãå Žåãæååã®é·ãã¯1æåã«ãªããŸãã ----- ------------------------------------------ ---- ---- ---- ---- 40 123456789_123456789_123456789_123456789_ 1 1 30 30
ãã®å Žåãåå€æã®åäœã«ã¯ç¬èªã®ç¹æ§ããããŸããCAST / CONVERTã§ãã£ã¡ã³ã·ã§ã³ãæå®ããªãã£ãå Žåãæåã®30æåã䜿çšãããŸãã17. ISNULL察COALESCE
ä»ã«æœåšçã«èå³æ·±ããã®ã¯äœã瀺ãããšãã§ããŸããïŒISNULLãšCOALESCEã® 2ã€ã®é¢æ°ããããŸããäžæ¹ã§ã¯ããã¹ãŠãåçŽã§ããæåã®æŒç®åãNULLã®å Žåã2çªç®ã®æŒç®åãè¿ããŸããCOALESCEã«ã€ããŠè©±ããŠããå Žåã¯ã次ã®æŒç®åãè¿ããŸããäžæ¹ã2ã€ã®éã«ã¯é°æ¹¿ãªéãããããŸãããããã®é¢æ°ã¯äœãè¿ããŸããïŒ DECLARE @a CHAR(1) = NULL SELECT ISNULL(@a, 'NULL'), COALESCE(@a, 'NULL') DECLARE @i INT = NULL SELECT ISNULL(@i, 7.1), COALESCE(@i, 7.1)
çãã¯æ¬åœã«æçœã§ã¯ãããŸããïŒ
ãªãã§ïŒ
ISNULLé¢æ°ã¯ã2ã€ã®ãªãã©ã³ãã®æå°ã¿ã€ãã«å€æããŸããCOALESCEã¯æ倧ã®åã«å€æãããŸããã ããç§ãã¡ã¯ããäœãééã£ãŠããã®ãããç解ããããšããŠéåžžã«é·ãæé座ã£ãã®ãåããŠã ãããã©ãŒãã³ã¹ã®èŠ³ç¹ãããISNULLã¯å€ãã®ã±ãŒã¹ã§å°ãéãåäœããŸãããCOALESCEã¯CASE WHENã¹ããŒãã¡ã³ãã§æ¡åŒµãããŸããããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã18.æ°åŠ
SQL Serverã§æ°åŠã«åºããããšãããã«èå³æ·±ããã®ã«ãªããŸããéãã¯ãªãããã§ãïŒ SELECT 1 / 3 SELECT 1.0 / 3
ãããå®éã«ã¯ãéããããããšãããããŸã-ããã¯ãã¹ãŠããªã¯ãšã¹ãã«å«ãŸããããŒã¿ã«äŸåããŸããæŽæ°ã®å Žåãçµæã¯æŽæ°ã«ãªããŸãã ----------- 0 ----------- 0.333333
é¢æ¥ã§ããèŠãããå¥ã®èå³æ·±ãäŸïŒ SELECT COUNT(*) , COUNT(1) , COUNT(val) , COUNT(DISTINCT val) , SUM(val) , SUM(DISTINCT val) FROM ( VALUES (1), (2), (2), (NULL), (NULL) ) t (val) SELECT AVG(val) , SUM(val) / COUNT(val) , AVG(val * 1.) , AVG(CAST(val AS FLOAT)) FROM ( VALUES (1), (2), (2), (NULL), (NULL) ) t (val)
äœããªã¯ãšã¹ããè¿ããŸããïŒCOUNTïŒ*ïŒ/ COUNTïŒ1ïŒã¯è¡ã®ç·æ°ãè¿ããŸããCOUNTåã¯ãéNULLè¡ã®æ°ãè¿ããŸããDISTINCTãè¿œå ãããšãNULLã§ãªãäžæã®å€ã®æ°ãå¹³åã®èšç®ã§ããèå³æ·±ããAVGæäœã¯ããªããã£ãã€ã¶ãŒã«ãã£ãŠSUMãšCOUNTã«å解ãããŸãããããŠãããã§äžèšã®äŸãæãåºããŠãã ãã-å¹³åãèšç®ãããšããNULLã¯èæ
®ãããŸããããŸããå€ãæŽæ°ã®å Žåãçµæã¯ã©ããªããŸããïŒæŽæ°ãããã¯ãã°ãã°å¿ããããŸãã19. UNION vs UNION ALL
ããã§ã¯ãã¹ãŠãåçŽã§ããããŒã¿ã亀差ããªãããšãããã£ãŠãããéè€ãæ°ã«ããªãå Žåã¯ãããã©ãŒãã³ã¹ã®èŠ³ç¹ãããUNION ALLã䜿çšããããšããå§ãããŸããéè€ãåé€ããå¿
èŠãããå Žåã¯ãUNIONã倧èã«äœ¿çšããŸããããšãã°ãéè€ãééããªãUNION ALLã䜿çšããæ¹ãé©åã§ãªãå ŽåïŒ SELECT [object_id] FROM sys.system_objects UNION SELECT [object_id] FROM sys.objects SELECT [object_id] FROM sys.system_objects UNION ALL SELECT [object_id] FROM sys.objects
2ã€ã®æ§æèŠçŽ ã®èå³æ·±ãéãã«ã€ããŠç¥ãããšã¯äŸç¶ãšããŠéèŠã§ããUNIONã¹ããŒãã¡ã³ãã¯äžŠåã§å®è¡ãããUNION ALLã¯çŽåã§å®è¡ãããŸããããã¯äžŠåãã©ã³ã«ã¯åœãŠã¯ãŸããŸãããæé©åã«åœ¹ç«ã€ã®ã¯ããŸãã«ãã®ãããªããŒã¿ã¢ã¯ã»ã¹ã®æ©èœã§ããç°ãªãæ¡ä»¶ã»ããã«åºã¥ããŠ1è¡ãè¿ãå¿
èŠããããšããŸãã DECLARE @AddressLine NVARCHAR(60) SET @AddressLine = '4775 Kentucky Dr.' SELECT TOP(1) AddressID FROM Person.[Address] WHERE AddressLine1 = @AddressLine OR AddressLine2 = @AddressLine
次ã«ãæ¡ä»¶ã§ORã䜿çšããŠãIndexScanãååŸããŸãã Table 'Address'. Scan count 1, logical reads 90, ...
UNION ALLã䜿çšããŠã¯ãšãªãæžãæããŸãã SELECT TOP(1) AddressID FROM ( SELECT TOP(1) AddressID FROM Person.[Address] WHERE AddressLine1 = @AddressLine UNION ALL SELECT TOP(1) AddressID FROM Person.[Address] WHERE AddressLine2 = @AddressLine ) t
SQL Serverã¯ãæåã®ãµãã¯ãšãªãå®è¡ããåŸãçµæãè¿ãã®ã«ååãª1è¡ãè¿ãããããšã確èªãã2çªç®ã®æ¡ä»¶ã«ããæ€çŽ¢ãç¶è¡ããŸããã Table 'Worktable'. Scan count 0, logical reads 0, ... Table 'Address'. Scan count 1, logical reads 3, ...
20.åèªã¿èŸŒã¿
å€ãã®å Žåã1ã€ã®JOINã®å©ããåããŠããŒã¿ãåŒãåºãããšãã§ããç¶æ³ãçºçããŸããããå€ãã®ãµãã¯ãšãªãèŠæ±ãèªã£ãŠããŸããã USE AdventureWorks2014 GO SET STATISTICS IO ON SELECT e.BusinessEntityID , ( SELECT p.LastName FROM Person.Person p WHERE e.BusinessEntityID = p.BusinessEntityID ) , ( SELECT p.FirstName FROM Person.Person p WHERE e.BusinessEntityID = p.BusinessEntityID ) FROM HumanResources.Employee e SELECT e.BusinessEntityID , p.LastName , p.FirstName FROM HumanResources.Employee e JOIN Person.Person p ON e.BusinessEntityID = p.BusinessEntityID
å®éãããŒãã«ãžã®äžå¿
èŠãªã¢ã¯ã»ã¹ãå°ãªãã»ã©ãè«ççãªæž¬å®å€ã¯å°ãªããªããŸãã Table 'Person'. Scan count 0, logical reads 1776, ... Table 'Employee'. Scan count 1, logical reads 2, ... Table 'Person'. Scan count 0, logical reads 888, ... Table 'Employee'. Scan count 1, logical reads 2, ...
21.ãµãã¯ãšãª
åã®äŸã¯ãããŒãã«éã®æ¥ç¶ã1察1ã®å Žåã«ã®ã¿æ©èœãããããéåžžã«æããã«ãªã£ãŠããŸããããŒãã«Person.PersonãšSales.SalesPersonQuotaHistoryã®éã«ãã®ãããªé¢ä¿ãçããåã«ã1人ã®åŸæ¥å¡ã«ã€ããŠãã¯ã©ãŒã¿ãµã€ãºããšã«æ倧1ã€ã®ã¬ã³ãŒããããããšãå€æãããšããŸãã USE AdventureWorks2014 GO SET STATISTICS IO ON SELECT p.BusinessEntityID , ( SELECT s.SalesQuota FROM Sales.SalesPersonQuotaHistory s WHERE s.BusinessEntityID = p.BusinessEntityID ) FROM Person.Person p
ã¯ã©ã€ã¢ã³ããµãŒããŒã¯ç°ãªãå Žåãããããã®èŠæ±ã«ãã次ã®ãšã©ãŒãçºçããŸãã Msg 512, Level 16, State 1, Line 6 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
ãã®ãããªåé¡ã¯ã©ã®ããã«è§£æ±ºãããŸããïŒTOPïŒ1ïŒãšORDER BYãè¿œå ãããåé¡ã¯ãªããªããŸããããã ãããã¹ãŠãèŠãç®ã»ã©åçŽã§ã¯ãããŸãããTOPæäœã䜿çšãããšããªããã£ãã€ã¶ãŒã¯IndexSeekã®äœ¿çšã匷å¶ããŸããTOPãšäžç·ã«OUTER / CROSS APPLYã䜿çšãããšãåãçµæãçããŸãã SELECT p.BusinessEntityID , ( SELECT TOP(1) s.SalesQuota FROM Sales.SalesPersonQuotaHistory s WHERE s.BusinessEntityID = p.BusinessEntityID ORDER BY s.QuotaDate DESC ) FROM Person.Person p SELECT p.BusinessEntityID , t.SalesQuota FROM Person.Person p OUTER APPLY ( SELECT TOP(1) s.SalesQuota FROM Sales.SalesPersonQuotaHistory s WHERE s.BusinessEntityID = p.BusinessEntityID ORDER BY s.QuotaDate DESC ) t
ããããå®è¡ããããšãåãåé¡ãçºçããŸã-è€æ°ã®IndexSeekæäœïŒ Table 'SalesPersonQuotaHistory'. Scan count 19972, logical reads 39944, ... Table 'Person'. Scan count 1, logical reads 67, ...
ãŠã£ã³ããŠé¢æ°ã§æŠè£
ããŠããªã¯ãšã¹ããæžãæããŸãïŒ SELECT p.BusinessEntityID , t.SalesQuota FROM Person.Person p LEFT JOIN ( SELECT s.BusinessEntityID , s.SalesQuota , RowNum = ROW_NUMBER() OVER (PARTITION BY s.BusinessEntityID ORDER BY s.QuotaDate DESC) FROM Sales.SalesPersonQuotaHistory s ) t ON p.BusinessEntityID = t.BusinessEntityID AND t.RowNum = 1
ãããŠãäœãå€ãã£ãã®ãèŠãŠã¿ãŸãããïŒ Table 'Person'. Scan count 1, logical reads 67, ... Table 'SalesPersonQuotaHistory'. Scan count 1, logical reads 4, ...
22.ã±ãŒã¹
ãã®èšèªæ§ââæäœã«ã€ããŠäœãèšããã§ããããïŒãã䜿çšãããããŸãç¥ãããŠããªãæ©èœã«ã€ããŠç¥ã£ãŠããå¿
èŠããããŸããããããããæã
ã¯ãªãã¬ãŒã¿æžãæ¹ã®CASEã®ãïŒ USE AdventureWorks2014 GO SELECT BusinessEntityID , Gender , Gender = CASE Gender WHEN 'M' THEN 'Male' WHEN 'F' THEN 'Female' ELSE 'Unknown' END FROM HumanResources.Employee
SQL Serverã¯åŒã次ã®åœ¢åŒã«å±éããŸãã SELECT BusinessEntityID , Gender , Gender = CASE WHEN Gender = 'M' THEN 'Male' WHEN Gender = 'F' THEN 'Female' ELSE 'Unknown' END FROM HumanResources.Employee
ãããäž»ãªåé¡ã§ããåæ¡ä»¶ã¯ããã®ãã¡ã®1ã€ãTRUEãè¿ãããELSEãããã¯ã«å°éãããŸã§é 次å®è¡ãããŸããåé¡ãããæ確ã«ç€ºããŸãããããããè¡ãã«ã¯ãéµéå
äœæã®å³åŽãè¿ãã¹ã«ã©ãŒé¢æ°ãäœæããŸãã IF OBJECT_ID('dbo.GetMailUrl') IS NOT NULL DROP FUNCTION dbo.GetMailUrl GO CREATE FUNCTION dbo.GetMailUrl ( @Email NVARCHAR(50) ) RETURNS NVARCHAR(50) AS BEGIN RETURN SUBSTRING(@Email, CHARINDEX('@', @Email) + 1, LEN(@Email)) END
SQL Profiler SQL:StmtStarting / SP:StmtCompleted (
XEvents :
sp_statement_starting / sp_statement_completed ).
:
SELECT TOP(10) EmailAddressID , EmailAddress , CASE dbo.GetMailUrl(EmailAddress)
10 . :
SELECT TOP(10) EmailAddressID , EmailAddress , CASE dbo.GetMailUrl(EmailAddress) WHEN 'microsoft.com' THEN 'Microsoft' WHEN 'adventure-works.com' THEN 'AdventureWorks' END FROM Person.EmailAddress
20 . ,
CASE . - . ,
CASE â .
:
SELECT EmailAddressID , EmailAddress , CASE MailUrl WHEN 'microsoft.com' THEN 'Microsoft' WHEN 'adventure-works.com' THEN 'AdventureWorks' END FROM ( SELECT TOP(10) EmailAddressID , EmailAddress , MailUrl = dbo.GetMailUrl(EmailAddress) FROM Person.EmailAddress ) t
é¢æ°ã¯10åå®è¡ãããŸããããã«ãCASEã¹ããŒãã¡ã³ããéè€ããŠããŒãããªãããã«ããå¿
èŠããããŸãã SELECT DISTINCT CASE WHEN Gender = 'M' THEN 'Male' WHEN Gender = 'M' THEN '...' WHEN Gender = 'M' THEN '......' WHEN Gender = 'F' THEN 'Female' WHEN Gender = 'F' THEN '...' ELSE 'Unknown' END FROM HumanResources.Employee
CASEã®åŒã¯é çªã«èšç®ãããŸããïŒèšè¿°ãããšããã®é åºã§ïŒãå Žåã«ãã£ãŠã¯ããã®ã¹ããŒãã¡ã³ãã¯éçŽãããé¢æ°ã䜿çšããŠSQL Serverã«ãã£ãŠå®è¡ãããŸãã DECLARE @i INT = 1 SELECT CASE WHEN @i = 1 THEN 1 ELSE 1/0 END GO DECLARE @i INT = 1 SELECT CASE WHEN @i = 1 THEN 1 ELSE MIN(1/0) END
23.ã¹ã«ã©ãŒé¢æ°
ç¹ã«OOPã奜ããªäºº- å€æ°ã®è¡ãæäœããT-SQLã¯ãšãªã§ã¯ã¹ã«ã©ãŒé¢æ°ã䜿çšããªãã§ãã ãããããã¯ãã¹ã«ã©ãŒé¢æ°ã®æœåšçãªæ¬ ç¹ã«ã€ããŠãŸã ç¥ããªãã£ããšãã«èŠããã 人çã®äŸã§ãã USE AdventureWorks2014 GO UPDATE TOP(1) Person.[Address] SET AddressLine2 = AddressLine1 GO IF OBJECT_ID('dbo.isEqual') IS NOT NULL DROP FUNCTION dbo.isEqual GO CREATE FUNCTION dbo.isEqual ( @val1 NVARCHAR(100), @val2 NVARCHAR(100) ) RETURNS BIT AS BEGIN RETURN CASE WHEN (@val1 IS NULL AND @val2 IS NULL) OR @val1 = @val2 THEN 1 ELSE 0 END END
ã¯ãšãªã¯åäžã®ããŒã¿ãè¿ããŸãïŒ SET STATISTICS TIME ON SELECT AddressID, AddressLine1, AddressLine2 FROM Person.[Address] WHERE dbo.IsEqual(AddressLine1, AddressLine2) = 1 SELECT AddressID, AddressLine1, AddressLine2 FROM Person.[Address] WHERE (AddressLine1 IS NULL AND AddressLine2 IS NULL) OR AddressLine1 = AddressLine2 SELECT AddressID, AddressLine1, AddressLine2 FROM Person.[Address] WHERE AddressLine1 = ISNULL(AddressLine2, '') SET STATISTICS TIME OFF
ããããã¹ã«ã©ãŒé¢æ°ã®ååŒã³åºãã¯ãªãœãŒã¹ãéäžçã«äœ¿çšããããããã®éããçããŸãã SQL Server Execution Times: CPU time = 63 ms, elapsed time = 57 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 1 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 1 ms.
ããã«ãã¯ãšãªã§ã¹ã«ã©ãŒé¢æ°ã䜿çšãããšãSQL Serverã䞊åå®è¡ãã©ã³ãäœæã§ããªããªããŸããããã«ããã倧éã®ããŒã¿ãããå Žåãããã©ãŒãã³ã¹ã倧å¹
ã«äœäžããå¯èœæ§ããããŸãããã¹ãŠã®å Žåã«ãããŠãã¹ã«ã©ãŒé¢æ°ã¯æªã§ããïŒãã
ãªãã·ã§ã³ã䜿çšããŠé¢æ°ãäœæã§ããŸã SCHEMABINDINGã䜿çšããŠãå
¥åãã©ã¡ãŒã¿ãŒã䜿çšããã«ãŸãã IF OBJECT_ID('dbo.GetPI') IS NOT NULL DROP FUNCTION dbo.GetPI GO CREATE FUNCTION dbo.GetPI () RETURNS FLOAT WITH SCHEMABINDING AS BEGIN RETURN PI() END GO SELECT dbo.GetPI() FROM Sales.Currency
ãã®å Žåãé¢æ°ã¯ç¢ºå®çã§ãããšèŠãªããã1åã ãå®è¡ãããŸãã24.ãã¥ãŒ
誰ããããã©ãŒãã³ã¹ãæããŠããŸã...誰ãã¯å¥œãã§ã¯ãããŸããããã¥ãŒã䜿çšããªãããšã«ã€ããŠæèŠãè¿°ã¹ãæ¹ãè²»çšã¯ããããŸããããã¥ãŒãæäœããéã«ã¯ããã€ãã®æ©èœã«ã€ããŠç¥ãå¿
èŠããããŸãããã¹ãããŒãã«ãšããã«åºã¥ãããã¥ãŒãäœæããŸãã IF OBJECT_ID('dbo.tbl', 'U') IS NOT NULL DROP TABLE dbo.tbl GO CREATE TABLE dbo.tbl (a INT, b INT) GO INSERT INTO dbo.tbl VALUES (0, 1) GO IF OBJECT_ID('dbo.vw_tbl', 'V') IS NOT NULL DROP VIEW dbo.vw_tbl GO CREATE VIEW dbo.vw_tbl AS SELECT * FROM dbo.tbl GO SELECT * FROM dbo.vw_tbl
å€ã¯æ£ããè¿ãããŸãã ab ----------- ----------- 0 1
次ã«ãããŒãã«ã«æ°ããåãè¿œå ãããã¥ãŒããããŒã¿ã®æžç®ãåè©Šè¡ããŸãã ALTER TABLE dbo.tbl ADD c INT NOT NULL DEFAULT 2 GO SELECT * FROM dbo.vw_tbl
åãçµæãåŸãããŸãã ab ----------- ----------- 0 1
ãããŠããã¹ãŠæ瀺çã«åãèšå®ããããã¹ã¯ãªãããªããžã§ã¯ããåã³ã³ãã€ã«ããå¿
èŠãããããã§ãã EXEC sys.sp_refreshview @viewname = N'dbo.vw_tbl' GO SELECT * FROM dbo.vw_tbl
æ£ããçµæãåŸãã«ã¯ïŒ abc ----------- ----------- ----------- 0 1 2
ããŒãã«ãžã®çŽæ¥åç
§ã§ã¯ããã®ãããªåè«ã¯ãããŸããããã¹ãŠã®ããŒã¿ãçµåãããã¹ãŠã1ã€ã®ãã¥ãŒã«ãŸãšãããšãã1ã€ã®èŠæ±ã«ã¢ããã¥ã¢ãããŸããäŸãæããŠèª¬æããã®ã§ã¯ãªããAdventureWorksã®ãè¯ããã¿ãŒã³ããèŠãŠã¿ãŸãããã ALTER VIEW HumanResources.vEmployee AS SELECT e.BusinessEntityID , p.Title , p.FirstName , p.MiddleName , p.LastName , p.Suffix , e.JobTitle , pp.PhoneNumber , pnt.[Name] AS PhoneNumberType , ea.EmailAddress , p.EmailPromotion , a.AddressLine1 , a.AddressLine2 , a.City , sp.[Name] AS StateProvinceName , a.PostalCode , cr.[Name] AS CountryRegionName , p.AdditionalContactInfo FROM HumanResources.Employee e JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID JOIN Person.BusinessEntityAddress bea ON bea.BusinessEntityID = e.BusinessEntityID JOIN Person.[Address] a ON a.AddressID = bea.AddressID JOIN Person.StateProvince sp ON sp.StateProvinceID = a.StateProvinceID JOIN Person.CountryRegion cr ON cr.CountryRegionCode = sp.CountryRegionCode LEFT JOIN Person.PersonPhone pp ON pp.BusinessEntityID = p.BusinessEntityID LEFT JOIN Person.PhoneNumberType pnt ON pp.PhoneNumberTypeID = pnt.PhoneNumberTypeID LEFT JOIN Person.EmailAddress ea ON p.BusinessEntityID = ea.BusinessEntityID
ãããŠä»ã質åã¯...ãã¹ãŠã®æ
å ±ã§ã¯ãªãããã®äžéšã®ã¿ãååŸããå¿
èŠãããå Žåã¯ã©ããªããŸããïŒããšãã°ãåŸæ¥å¡ã®ååãšå§ãè¿ããŸãã SELECT BusinessEntityID , FirstName , LastName FROM HumanResources.vEmployee SELECT p.BusinessEntityID , p.FirstName , p.LastName FROM Person.Person p WHERE p.BusinessEntityID IN ( SELECT e.BusinessEntityID FROM HumanResources.Employee e )
ãã¥ãŒã䜿çšããå Žåã®å®è¡èšç»ãèŠãŠã¿ãŸãããã Table 'EmailAddress'. Scan count 290, logical reads 640, ... Table 'PersonPhone'. Scan count 290, logical reads 636, ... Table 'BusinessEntityAddress'. Scan count 290, logical reads 636, ... Table 'Person'. Scan count 0, logical reads 897, ... Table 'Employee'. Scan count 1, logical reads 2, ...
ãããŠããã³ã§ææ矩ã«æžããã¯ãšãªãšæ¯èŒããŸãã Table 'Person'. Scan count 0, logical reads 897, ... Table 'Employee'. Scan count 1, logical reads 2, ...
ãªããã£ãã€ã¶ãŒ SQL Serveréåžžã«å·§åŠã«äœæãããŠãããå®è¡ãã©ã³ãæ§ç¯ãããšãã«æŒç®åããªãŒãç°¡çŽ åãã段éã§ãæªäœ¿çšã®æ¥ç¶ãç Žæ£ã§ããŸãããã ãã圌ã¯åžžã«ãããå¹ççã«è¡ãããšã¯ã§ããŸããããæ¥ç¶ãéžæçµæã«åœ±é¿ãããã©ãããã確èªããæ¹æ³ããªãå ŽåãããŒãã«éã«æå¹ãªå€éšããŒããªãããã«åŠšããããããšããããŸãããŸãã¯ãããšãã°ãæ¥ç¶ãè€æ°ã®ãã£ãŒã«ããçµç±ããå Žå...ãŸãããªããã£ãã€ã¶ãŒã¯ããã€ãã®ããšãç¥ããŸããããããã¯äžå¿
èŠãªäœæ¥ã§ãããããŒãããçç±ã§ã¯ãããŸããã25.ã«ãŒãœã«
SQL Serverã䜿çšããå Žåã 1ã€ã®çå®ãèŠããŠãããŠãã ãããã«ãŒãœã«ã䜿çšããŠããŒã¿ãç¹°ãè¿ãå€æŽããªãã§ãã ãããããã¯Oracleã§ã¯ãããŸããïŒå€ãã®å Žåããã®ã³ãŒããèŠã€ããããšãã§ããŸãã DECLARE @BusinessEntityID INT DECLARE cur CURSOR FOR SELECT BusinessEntityID FROM HumanResources.Employee OPEN cur FETCH NEXT FROM cur INTO @BusinessEntityID WHILE @@FETCH_STATUS = 0 BEGIN UPDATE HumanResources.Employee SET VacationHours = 0 WHERE BusinessEntityID = @BusinessEntityID FETCH NEXT FROM cur INTO @BusinessEntityID END CLOSE cur DEALLOCATE cur
ãã®ã³ãŒãã¯æ¬¡ã®ããã«æžãæããããšãã§ããŸãã UPDATE HumanResources.Employee SET VacationHours = 0 WHERE VacationHours <> 0
ã©ã³ã¿ã€ã ãšè«çèªã¿åãã®æ°ããããã䟡å€ã¯ãããŸããããä¿¡ããŠãã ãããæ¬åœã«éãããããŸãããªãã·ã§ã³ãšããŠã人çã®æè¿ã®äŸã«ã€ããŠã話ãããŸãã2ã€ã®ãã¹ããããã«ãŒãœã«ãååšããã¹ã¯ãªãããæºãããŸããããã®ã³ãŒããå®è¡ãããšãã¯ã©ã€ã¢ã³ãã§ã¿ã€ã ã¢ãŠããçºçããåèšã§çŽ38ç§éå®è¡ãããŸããããªã¯ãšã¹ãããæåã®ã«ãŒãœã«ãæŸãåºãããªã¯ãšã¹ãã¯600ããªç§éå®è¡ããå§ããŸããã2çªç®ã®ã«ãŒãœã«-200ããªç§ãæšãŠãŸãããSQL Serverã®ã«ãŒãœã« -æªïŒ26. STRING_CONCAT
â , . ?
STRING_CONCAT , ⊠2016 , , SQL Server . - ?
:
IF OBJECT_ID('tempdb.dbo.
«» â :
DECLARE @txt VARCHAR(50) = '' SELECT @txt += i FROM
-------- 123
,
MS , , :
DECLARE @txt VARCHAR(50) = '' SELECT @txt += i FROM
-------- 3
ççŽã«èšã£ãŠãåããŠãäŒèšå ±åæžã«æåŸã®è¡ãã衚瀺ãããªãçç±ãèªåã§èããŸããããã®ãžã§ãŒã¯ã®åŸãCLRãUPDATEãäžæããŒãã«ãååž°ãã«ãŒããªã©ãããã«å€ãã®ããšãè¡ãããŸããããããè¡ã®æ¥çã§ããå®éã«ã¯ã90ïŒ
ã®ã±ãŒã¹ã§ãXMLã䜿çšããã ãã§ååã§ãã SELECT [text()] = i FROM
-------- 123
ãã ããããã§ã¯ããã€ãã®ãã¥ã¢ã³ã¹ãæåŸ
ã§ããŸããæåã«ããã¹ãŠã®ããŒã¿ã§ã¯ãªããäžéšã®ããŒã¿ã®ã³ã³ããã¹ãã§è¡ãæ¥çããå¿
èŠãéåžžã«é »ç¹ã«ãããŸãã SELECT [name], STUFF(( SELECT ', ' + c.[name] FROM sys.columns c WHERE c.[object_id] = t.[object_id] FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') FROM sys.objects t WHERE t.[type] = 'U'
------------------------ ------------------------------------ ScrapReason ScrapReasonID, Name, ModifiedDate Shift ShiftID, Name, StartTime, EndTime
XMLã¡ãœããã¯æ§æ解æã«äœ¿çšããªãããã«ããããšã匷ããå§ãããŸããXMLã¡ãœããã¯éåžžã«ãªãœãŒã¹ãæ¶è²»ããããã§ããäœã³ã¹ãã«ããããšãã§ããŸãïŒ SELECT [name], STUFF(( SELECT ', ' + c.[name] FROM sys.columns c WHERE c.[object_id] = t.[object_id] FOR XML PATH(''), TYPE).value('(./text())[1]', 'NVARCHAR(MAX)'), 1, 2, '') FROM sys.objects t WHERE t.[type] = 'U'
ããããããã¯æ¬è³ªãæ ¹æ¬çã«å€ãããã®ã§ã¯ãããŸãããå€ã¡ãœããã䜿çšããªãããã«ããŠãã ããïŒ SELECT t.name , STUFF(( SELECT ', ' + c.name FROM sys.columns c WHERE c.[object_id] = t.[object_id] FOR XML PATH('')), 1, 2, '') FROM sys.objects t WHERE t.[type] = 'U'
, «». :
SELECT t.name , STUFF(( SELECT ', ' + CHAR(13) + c.name FROM sys.columns c WHERE c.[object_id] = t.[object_id] FOR XML PATH('')), 1, 2, '') FROM sys.objects t WHERE t.[type] = 'U'
, , , .
: ,
value ,
value('(./text())[1]'... .
27. SQL Injection
sql injection , . :
DECLARE @param VARCHAR(MAX) SET @param = 1 DECLARE @SQL NVARCHAR(MAX) SET @SQL = 'SELECT TOP(5) name FROM sys.objects WHERE schema_id = ' + @param PRINT @SQL EXEC (@SQL)
:
SELECT TOP(5) name FROM sys.objects WHERE schema_id = 1
- :
SET @param = '1; select ''hack'''
:
SELECT TOP(5) name FROM sys.objects WHERE schema_id = 1; select 'hack'
,
sql injection , - «». â :)
String.Format ( ), ,
sql injection :
using (SqlConnection conn = new SqlConnection()) { conn.ConnectionString = @"Server=.;Database=AdventureWorks2014;Trusted_Connection=true"; conn.Open(); SqlCommand command = new SqlCommand( string.Format("SELECT TOP(5) name FROM sys.objects WHERE schema_id = {0}", value), conn); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) {} } }
,
sp_executesql :
DECLARE @param VARCHAR(MAX) SET @param = '1; select ''hack''' DECLARE @SQL NVARCHAR(MAX) SET @SQL = 'SELECT TOP(5) name FROM sys.objects WHERE schema_id = @schema_id' PRINT @SQL EXEC sys.sp_executesql @SQL , N'@schema_id INT' , @schema_id = @param
, - .
:
using (SqlConnection conn = new SqlConnection()) { conn.ConnectionString = @"Server=.;Database=AdventureWorks2014;Trusted_Connection=true"; conn.Open(); SqlCommand command = new SqlCommand( "SELECT TOP(5) name FROM sys.objects WHERE schema_id = @schema_id", conn); command.Parameters.Add(new SqlParameter("schema_id", value)); ... }
, âŠ
38
â 8- . ,
T-SQL . , .
, « »
SQL Server , , - . .
ãã®èšäºãè±èªåã®èŽè¡ãšå
±æãããå ŽåïŒ
SQL Server: Useful Tips for Newbiesæ å
, «»
russianVC :
. .
è¹å€ã«æ®ã£ãŠãããã®ã¯äœã§ããïŒ
æåã«ãäžæããŒãã«ãšããŒãã«å€æ°ã®éãã«ã€ããŠè©³çŽ°ã«èšè¿°ããããšãèšç»ããŸããæçµçã«ãç§ã¯ããã1æã«å®äºããã®ãåŸ
ã£ãŠããå¥ã®ãã¹ãã«é
眮ããããšã«ããŸãããããã«ããã©ã¡ãŒã¿ãŒã¹ãããã£ã³ã°ã«ã€ããŠããã«è©±ããããšæããŸããããè»èŒªãåçºæããã«ãDmitry PilyuginïŒSlowã§ã¢ããªã±ãŒã·ã§ã³ã®é床ãé
ããåªããæçš¿ãžã®ãªã³ã¯ãæäŸããæ¹ãè¯ãã§ãããã質åã建èšçãªææ¡ãåççãªæ¹å€ãããå Žåã¯ããããã¡ã€ã«å
ã®ãã¹ãŠã®é£çµ¡å
ã