Cộng đồng chia sẻ tri thức Lib24.vn

SQLServerCh09

1b11b642f9ba8871b36b513408ad9b4b
Gửi bởi: Khoa CNTT - HCEM 24 tháng 2 2021 lúc 9:19:23 | Được cập nhật: hôm kia lúc 10:51:40 Kiểu file: PPTX | Lượt xem: 157 | Lượt Download: 1 | File size: 1.47086 Mb

Nội dung tài liệu

Tải xuống
Link tài liệu:
Tải xuống

Các tài liệu liên quan


Có thể bạn quan tâm


Thông tin tài liệu

Chapter 9 How to use functions Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 1 Objectives Applied  Code queries that require any of the functions presented in this chapter for working with string, numeric, and date/time data.  Code queries that use any of the general purpose functions presented in this chapter. Knowledge  Describe how the use of functions can solve the problems associated with (1) sorting string data that contains numeric values, and (2) doing date or time searches. Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 2 Some of the string functions LEN(string) LTRIM(string) RTRIM(string) LEFT(string,length) RIGHT(string,length) SUBSTRING(string,start,length) REPLACE(search,find,replace) REVERSE(string) CHARINDEX(find,search[,start]) PATINDEX(find,search) CONCAT(value1,value2[,value3]... LOWER(string) UPPER(string) SPACE(integer) Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 3 String function examples Function Result LEN('SQL Server') LEN(' SQL Server ') LEFT('SQL Server', 3) LTRIM(' SQL Server ') RTRIM(' SQL Server ') LTRIM(RTRIM(' SQL Server ')) LOWER('SQL Server') UPPER('ca') PATINDEX('%v_r%', 'SQL Server') CHARINDEX('SQL', ' SQL Server') CHARINDEX('-', '(559) 555-1212') SUBSTRING('(559) 555-1212', 7, 8) REPLACE(RIGHT('(559) 555-1212', 13), 10 12 'SQL' 'SQL Server ' ' SQL Server' 'SQL Server' 'sql server' CA 8 3 10 555-1212 ') ', '-') 559-555-1212 CONCAT('Run time: ',1.52,' seconds') Run time: 1.52 seconds Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 4 A SELECT statement that uses three functions Select VendorName, VendorContactLName + ', ' + LEFT(VendorContactFName, 1) + '.' AS ContactName, RIGHT(VendorPhone, 8) AS Phone FROM Vendors WHERE SUBSTRING(VendorPhone, 2, 3) = 559 ORDER BY VendorName; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 5 How to sort by a string column that contains numbers Sorted by the ID column SELECT * FROM StringSample ORDER BY ID; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 6 How to sort by a string column that contains numbers (continued) Sorted by the ID column cast to an integer SELECT * FROM StringSample ORDER BY CAST(ID AS int); Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 7 How to use the string functions to parse a string SELECT Name, LEFT(Name, CHARINDEX(' ', Name) - 1) AS First, RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name) ) AS Last FROM StringSample; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 8 Some of the numeric functions ROUND(number,length[,function]) ISNUMERIC(expression) ABS(number) CEILING(number) FLOOR(number) SQUARE(float_number) SQRT(float_number) RAND([integer]) Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 9 Examples that use the numeric functions Function Result ROUND(12.5,0) ROUND(12.4999,0) ROUND(12.4999,1) ROUND(12.4999,-1) ROUND(12.5,0,1) 13.0 12.0000 12.5000 10.0000 12.0 ISNUMERIC(-1.25) ISNUMERIC('SQL Server') ISNUMERIC('2012-09-30') 1 0 0 Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 10 Examples that use the numeric functions (cont.) Function Result ABS(-1.25) CEILING(-1.25) FLOOR(-1.25) CEILING(1.25) FLOOR(1.25) 1.25 -1 -2 2 1 SQUARE(5.2786) SQRT(125.43) 27.86361796 11.199553562531 RAND() 0.243729 Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 11 The RealSample table How to search for approximate real values A SELECT statement that searches for a range of values SELECT * FROM RealSample WHERE R BETWEEN 0.99 AND 1.01; A SELECT statement that searches for rounded values SELECT * FROM RealSample WHERE ROUND(R,2) = 1; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 12 A SELECT statement that formats real numbers SELECT ID, R, CAST(R AS decimal(9,3)) AS R_decimal, CAST(CAST(R AS decimal(9,3)) AS varchar(9)) AS R_varchar, LEN(CAST(CAST(R AS decimal(9,3)) AS varchar(9))) AS R_LEN, SPACE(9 - LEN(CAST(CAST(R AS decimal(9,3)) AS varchar(9)))) + CAST(CAST(R AS decimal(9,3)) AS varchar(9)) AS R_Formatted FROM RealSample; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 13 Some of the date/time functions GETDATE() GETUTCDATE() SYSDATETIME() SYSUTCDATETIME() SYSDATETIMEOFFSET() DAY(date) MONTH(date) YEAR(date) DATENAME(datepart,date) DATEPART(datepart,date) Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 14 Some of the date/time functions (continued) DATEADD(datepart,number,date) DATEDIFF(datepart,startdate,enddate) TODATETIMEOFFSET(datetime2,tzoffset) SWITCHOFFSET(datetimeoffset,tzoffset) EOMONTH(startdate[,months]) DATEFROMPARTS(year,month,day) ISDATE(expression) Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 15 Date part values and abbreviations Argument year quarter month dayofyear day week weekday Murach's SQL Server 2012, C9 Abbreviations yy, yyyy qq, q mm, m dy, y dd, d wk, ww dw © 2012, Mike Murach & Associates, Inc. Slide 16 Date part values and abbreviations (continued) Argument hour minute second millisecond microsecond nanosecond tzoffset Murach's SQL Server 2012, C9 Abbreviations hh mi, n ss, s ms mcs ns tz © 2012, Mike Murach & Associates, Inc. Slide 17 Examples that use date/time functions Function Result GETDATE() GETUTCDATE() 2012-09-30 14:10:13.813 2012-09-30 21:10:13.813 SYSDATETIME() SYSUTCDATETIME() SYSDATETIMEOFFSET() 2012-09-30 14:10:13.8160822 2012-09-30 21:10:13.8160822 2012-09-30 14:10:13.8160822 -07.00 MONTH('2012-09-30') DATEPART(month,'2012-09-30') DATENAME(month,'2012-09-30') DATENAME(m,'2012-09-30') 9 9 September September Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 18 Examples that use date/time functions (continued) Function Result EOMONTH('2012-02-01') EOMONTH('2012-02-01',2) DATEFROMPARTS(2012,4,3) 2012-02-29 2012-04-30 2012-04-03 ISDATE('2012-09-30') ISDATE('2012-09-31') ISDATE('23:59:59') ISDATE('23:99:99') 1 0 1 0 Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 19 Examples that use the DAY, MONTH, and YEAR functions Function Result DAY('2012-09-30') MONTH('2012-09-30') YEAR('2012-09-30') 30 9 2012 Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 20 Examples that use the DATEPART function Function Result DATEPART(day, '2012-09-30 11:35:00') DATEPART(month, '2012-09-30 11:35:00') DATEPART(year, '2012-09-30 11:35:00') DATEPART(hour, '2012-09-30 11:35:00') DATEPART(minute, '2012-09-30 11:35:00') DATEPART(second, '2012-09-30 11:35:00') DATEPART(quarter, '2012-09-30 11:35:00') DATEPART(dayofyear, '2012-09-30 11:35:00') DATEPART(week, '2012-09-30 11:35:00') DATEPART(weekday, '2012-09-30 11:35:00') DATEPART(millisecond, '11:35:00.1234567') DATEPART(microsecond, '11:35:00.1234567') DATEPART(nanosecond, '11:35:00.1234567') DATEPART(tzoffset, '11:35:00.1234567 -07:00') 30 9 2012 11 35 0 3 273 40 1 123 123456 123456700 -420 Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 21 Examples that use the DATENAME function Function Result DATENAME(day, '2012-09-30 11:35:00') DATENAME(month, '2012-09-30 11:35:00') DATENAME(year, '2012-09-30 11:35:00') DATENAME(hour, '2012-09-30 11:35:00') DATENAME(minute, '2012-09-30 11:35:00') DATENAME(second, '2012-09-30 11:35:00') DATENAME(quarter, '2012-09-30 11:35:00') DATENAME(dayofyear, '2012-09-30 11:35:00') DATENAME(week, '2012-09-30 11:35:00') DATENAME(weekday, '2012-09-30 11:35:00') DATENAME(millisecond, '11:35:00.1234567') DATENAME(microsecond, '11:35:00.1234567') DATENAME(nanosecond, '11:35:00.1234567') DATENAME(tzoffset, '11:35:00.1234567 -07:00') 30 September 2012 11 35 0 3 274 40 Sunday 123 123456 123456700 -07:00 Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 22 Examples that use the DATEADD function Function Result DATEADD(day, 1, '2012-09-30 11:35:00') DATEADD(month, 1, '2012-09-30 11:35:00') DATEADD(year, 1, '2012-09-30 11:35:00') DATEADD(hour, 1, '2012-09-30 11:35:00') DATEADD(minute, 1, '2012-09-30 11:35:00') DATEADD(second, 1, '2012-09-30 11:35:00') DATEADD(quarter, 1, '2012-09-30 11:35:00') DATEADD(week, 1, '2012-09-30 11:35:00') DATEADD(month, -1, '2012-09-30 11:35:00') DATEADD(year, 1.5, '2012-09-30 11:35:00') 2012-10-01 2012-10-30 2013-09-30 2012-09-30 2012-09-30 2012-09-30 2012-12-30 2012-10-07 2012-08-30 2013-09-30 Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. 11:35:00.000 11:35:00.000 11:35:00.000 12:35:00.000 11:36:00.000 11:35:01.000 11:35:00.000 11:35:00.000 11:35:00.000 11:35:00.000 Slide 23 Examples that use the DATEDIFF function Function Result DATEDIFF(day, '2011-12-01', '2012-09-30') DATEDIFF(month, '2011-12-01', '2012-09-30') DATEDIFF(year, '2011-12-01', '2012-09-30') DATEDIFF(hour, '06:46:45', '11:35:00') DATEDIFF(minute, '06:46:45', '11:35:00') DATEDIFF(second, '06:46:45', '11:35:00') DATEDIFF(quarter, '2011-12-01', '2012-09-30') DATEDIFF(week, '2011-12-01', '2012-09-30') DATEDIFF(day, '2012-09-30', '2011-12-01') 304 9 1 5 289 17295 3 44 -304 Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 24 Examples that use the addition and subtraction operators Operation Result CAST('2012-09-30 11:35:00' AS smalldatetime) + 1 2012-10-01 11:35:00 CAST('2012-09-30 11:35:00' AS smalldatetime) – 1 2012-09-29 11:35:00 CAST(CAST('2012-09-30' AS datetime) - CAST('2011-12-01' AS datetime) AS int) 304 Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 25 The contents of the DateSample table A search condition that fails to return a row SELECT * FROM DateSample WHERE StartDate = '2011-10-28'; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 26 SELECT statements that ignore time values Use the date type to remove time values (SQL Server 2008 or later) SELECT * FROM DateSample WHERE CONVERT(date, StartDate) = '2011-10-28'; Search for a range of dates SELECT * FROM DateSample WHERE StartDate >= '2011-10-28' AND StartDate < '2011-10-29'; Search for month, day, and year components SELECT * FROM DateSample WHERE MONTH(StartDate) = 10 AND DAY(StartDate) = 28 AND YEAR(StartDate) = 2011; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 27 SELECT statements that ignore time values (continued) Use the CAST function to remove time values SELECT * FROM DateSample WHERE CAST(CAST(StartDate AS char(11)) AS datetime) = '2011-10-28'; Use the CONVERT function to remove time values SELECT * FROM DateSample WHERE CONVERT(datetime, CONVERT(char(10), StartDate, 110)) = '2011-10-28'; The result set Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 28 The contents of the DateSample table Two search conditions that fail to return a row SELECT * FROM DateSample WHERE StartDate = CAST('10:00:00' AS datetime); SELECT * FROM DateSample WHERE StartDate >= '09:00:00' AND StartDate < '12:59:59:999'; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 29 Two SELECT statements that ignore date values Use the time type to remove date values (SQL Server 2008 or later) SELECT * FROM DateSample WHERE CONVERT(time, StartDate) >= '09:00:00' AND CONVERT(time, StartDate) < '12:59:59:999'; Use the CONVERT function to remove date values (prior to SQL Server 2008) SELECT * FROM DateSample WHERE CONVERT(datetime, CONVERT(char(12), StartDate, 8)) >= '09:00:00' AND CONVERT(datetime, CONVERT(char(12), StartDate, 8)) < '12:59:59:999'; The result set Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 30 The syntax of the simple CASE function CASE input_expression WHEN when_expression_1 THEN result_expression_1 [WHEN when_expression_2 THEN result_expression_2]... [ELSE else_result_expression] END A SELECT statement with a simple CASE function SELECT InvoiceNumber, TermsID, CASE TermsID WHEN 1 THEN 'Net due 10 WHEN 2 THEN 'Net due 20 WHEN 3 THEN 'Net due 30 WHEN 4 THEN 'Net due 60 WHEN 5 THEN 'Net due 90 END AS Terms FROM Invoices; Murach's SQL Server 2012, C9 days' days' days' days' days' © 2012, Mike Murach & Associates, Inc. Slide 31 The syntax of the searched CASE function CASE WHEN conditional_expression_1 THEN result_expression_1 [WHEN conditional_expression_2 THEN result_expression_2]... [ELSE else_result_expression] END A SELECT statement with a searched CASE function SELECT InvoiceNumber, InvoiceTotal, InvoiceDate, InvoiceDueDate, CASE WHEN DATEDIFF(day, InvoiceDueDate, GETDATE()) > 30 THEN 'Over 30 days past due' WHEN DATEDIFF(day, InvoiceDueDate, GETDATE()) > 0 THEN '1 to 30 days past due' ELSE 'Current' END AS Status FROM Invoices WHERE InvoiceTotal - PaymentTotal - CreditTotal > 0; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 32 The result set Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 33 The syntax of the IIF function IIF(conditional_expression, true_value, false_value) A SELECT statement with an IIF function SELECT VendorID, SUM(InvoiceTotal) AS SumInvoices, IIF(SUM(InvoiceTotal) < 1000, 'Low', 'High') AS InvoiceRange FROM Invoices GROUP BY VendorID; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 34 The syntax of the CHOOSE function CHOOSE(index, value1, value2 [,value3]...) A SELECT statement with a CHOOSE function SELECT InvoiceNumber, InvoiceDate, InvoiceTotal, CHOOSE(TermsID, '10 days', '20 days', '30 days', '60 days', '90 days') AS NetDue FROM Invoices WHERE InvoiceTotal - PaymentTotal - CreditTotal > 0; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 35 The syntax of the COALESCE function COALESCE(expression_1 [, expression_2]...) The syntax of the ISNULL function ISNULL(check_expression, replacement_value) A SELECT statement with a COALESCE function SELECT PaymentDate, COALESCE(PaymentDate, '1900-01-01') AS NewDate FROM Invoices; The same statement with an ISNULL function SELECT PaymentDate, ISNULL(PaymentDate, '1900-01-01') AS NewDate FROM Invoices; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 36 The result set Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 37 A SELECT statement that substitutes a different data type SELECT VendorName, COALESCE(CAST(InvoiceTotal AS varchar), 'No invoices') AS InvoiceTotal FROM Vendors LEFT JOIN Invoices ON Vendors.VendorID = Invoices.VendorID ORDER BY VendorName; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 38 The syntax of the GROUPING function GROUPING(column_name) A summary query with a GROUPING function SELECT CASE WHEN GROUPING(VendorState) = 1 THEN 'All' ELSE VendorState END AS VendorState, CASE WHEN GROUPING(VendorCity) = 1 THEN 'All' ELSE VendorCity END AS VendorCity, COUNT(*) AS QtyVendors FROM Vendors WHERE VendorState IN ('IA', 'NJ') GROUP BY VendorState, VendorCity WITH ROLLUP ORDER BY VendorState DESC, VendorCity DESC; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 39 The result set Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 40 The syntax for the four ranking functions ROW_NUMBER() OVER ([partition_by_clause] order_by_clause) RANK() OVER ([partition_by_clause] order_by_clause) DENSE_RANK() OVER ([partition_by_clause] order_by_clause) NTILE(integer_expression) OVER ([partition_by_clause] order_by_clause) Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 41 A query with a ROW_NUMBER function SELECT ROW_NUMBER() OVER(ORDER BY VendorName) AS RowNumber, VendorName FROM Vendors; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 42 A query that uses the PARTITION BY clause SELECT ROW_NUMBER() OVER(PARTITION BY VendorState ORDER BY VendorName) As RowNumber, VendorName, VendorState FROM Vendors; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 43 A query with RANK and DENSE_RANK functions SELECT RANK() OVER (ORDER BY InvoiceTotal) As Rank, DENSE_RANK() OVER (ORDER BY InvoiceTotal) As DenseRank, InvoiceTotal, InvoiceNumber FROM Invoices; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 44 A query that uses the NTILE function SELECT TermsDescription, NTILE(2) OVER (ORDER BY TermsID) AS Tile2, NTILE(3) OVER (ORDER BY TermsID) AS Tile3, NTILE(4) OVER (ORDER BY TermsID) AS Tile4 FROM Terms; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 45 The syntax of the analytic functions {FIRST_VALUE|LAST_VALUE}(scalar_expression) OVER ([partition_by_clause] order_by_clause [rows_range_clause]) {LEAD|LAG}(scalar_expression [, offset [, default]]) OVER ([partition_by_clause] order_by_clause) {PERCENT_RANK()|CUME_DIST} OVER ([partition_by_clause] order_by_clause) {PERCENTILE_CONT|PERCENTILE_DISC}(numeric_literal) WITHIN GROUP (ORDER BY expression [ASC|DESC]) OVER (partition_by_clause) Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 46 The columns in the SalesReps table Column name RepID RepFirstName RepLastName Data type int varchar(50) varchar(50) The columns in the SalesTotals table Column name RepID SalesYear SalesTotal Murach's SQL Server 2012, C9 Data type int char(4) money © 2012, Mike Murach & Associates, Inc. Slide 47 A query that uses the FIRST_VALUE and LAST_VALUE functions SELECT SalesYear, RepFirstName + ' ' + RepLastName AS RepName, SalesTotal, FIRST_VALUE(RepFirstName + ' ' + RepLastName) OVER (PARTITION BY SalesYear ORDER BY SalesTotal DESC) AS HighestSales, LAST_VALUE(RepFirstName + ' ' + RepLastName) OVER (PARTITION BY SalesYear ORDER BY SalesTotal DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS LowestSales FROM SalesTotals JOIN SalesReps ON SalesTotals.RepID = SalesReps.RepID; Murach's SQL Server 2012, C9 © 2012, Mike Murach & Associates, Inc. Slide 48