functions and set operatin in sql

30
I. Định nghĩa về Functions. Hàm là một đối tượng trong cơ sở dữ liệu bao gồm một tập nhiều câu lệnh SQL được nhóm lại với nhau thành một nhóm. Điểm khác biệt giữa hàm và thủ tục là hàm trả về một giá trị thông qua tên hàm. Điều này cho phép ta sử dụng hàm như là một thành phần của một biểu thức chẳng hạn như trong các câu lệnh truy vấn hay các câu lệnh thực hiện cập nhật dữ liệu Phân loại Functions: Trong SQL có rất nhiều các hàm được định nghĩa sẵn (Được chia theo nhóm – Trong 1 Database bạn chọn Programmability/Functions/System Functions) như các hàm về chuỗi (String Functions), các hàm về ngày tháng (Date and Time Functions), Các hàm toán học (Mathematical Function), … Ngoài những hàm do hệ quản trị cơ sở dữ liệu cung cấp sẵn, bạn có thể tự xây dựng các hàm nhằm phục vụ cho mục đích riêng của mình các hàm do người dùng định nghĩa.. 1.Hàm do hệ quản trị CSDL cung cấp Sql-server cung cấp 1 số hàm bạn có thể sử dụng để lấy những giá trị từ csdl. Chẳng hạm bạn có thể sử dụng hàm count() để lấy số lượng của hàm có trong 1 bảng, sau đây là các chức năng đã lập sẵn. Aggregate Trả về thông tin dựa vào một hoặc nhiều hàng trong bảng Mathermatical Trả về kiểu dữ liệu toán học String Thực hiên những thao tác chuỗi Date and Time Làm việc với Ngày và giờ Sytems Trả về thông tin của hệ thống SQL Configuration Trả về thông tin cấu hình trên SQL Cursor Trả về thông tin trên những con trỏ MetaData Trả về thông tin trên những CSDL và nhiều mụ trên CSDL Systems statistcal Trả về thông tin thống kê SQL

Upload: minh-nguyen-xuan

Post on 03-Jul-2015

583 views

Category:

Documents


8 download

DESCRIPTION

I. Định nghĩa về Functions.Hàm là một đối tượng trong cơ sở dữ liệu bao gồm một tập nhiều câu lệnh SQL được nhóm lại với nhau thành một nhóm. Điểm khác biệt giữa hàm và thủ tục là hàm trả về một giá trị thông qua tên hàm. Điều này cho phép ta sử dụng hàm như là một thành phần của một biểu thức chẳng hạn như trong các câu lệnh truy vấn hay các câu lệnh thực hiện cập nhật dữ liệu Phân loại Functions: Trong SQL có rất nhiều các hàm được định nghĩa sẵn (Được chia theo nhóm – Trong 1 Database bạn ch

TRANSCRIPT

I. Định nghĩa về Functions.Hàm là một đối tượng trong cơ sở dữ liệu bao gồm một tập nhiều câu lệnh

SQL được nhóm lại với nhau thành một nhóm. Điểm khác biệt giữa hàm và thủ tục là hàm trả về một giá trị thông qua tên hàm. Điều này cho phép ta sử dụng hàm như là một thành phần của một biểu thức chẳng hạn như trong các câu lệnh truy vấn hay các câu lệnh thực hiện cập nhật dữ liệuPhân loại Functions:

Trong SQL có rất nhiều các hàm được định nghĩa sẵn (Được chia theo nhóm – Trong 1 Database bạn chọn Programmability/Functions/System Functions) như các hàm về chuỗi (String Functions), các hàm về ngày tháng (Date and Time Functions), Các hàm toán học (Mathematical Function), … Ngoài những hàm do hệ quản trị cơ sở dữ liệu cung cấp sẵn, bạn có thể tự xây dựng các hàm nhằm phục vụ cho mục đích riêng của mình Là các hàm do người dùng định nghĩa..

1.Hàm do hệ quản trị CSDL cung cấpSql-server cung cấp 1 số hàm bạn có thể sử dụng để lấy những giá trị từ csdl. Chẳng hạm bạn có thể sử dụng hàm count() để lấy số lượng của hàm có trong 1 bảng, sau đây là các chức năng đã lập sẵn.Aggregate Trả về thông tin dựa vào một hoặc nhiều hàng trong

bảngMathermatical Trả về kiểu dữ liệu toán họcString Thực hiên những thao tác chuỗiDate and Time Làm việc với Ngày và giờSytems Trả về thông tin của hệ thống SQLConfiguration Trả về thông tin cấu hình trên SQLCursor Trả về thông tin trên những con trỏMetaData Trả về thông tin trên những CSDL và nhiều mụ trên

CSDLSystems statistcal Trả về thông tin thống kê SQLText and image Thực hiện thao tác hình ảnh và textsecurity Trả về thông tin người dùng Orther Functions

1/ Hàm hệ thốngNhững hàm hệ thống cho phép bạn thao tác và lấy những thông tin về những giá trị, những đối tượng và những thiết định trong SQL Server. Chẳng hạn, bạn có thể chuyển đổi một giá trị trong một kiểu tới kiểu khác. Các hàm hệ thống trả về thông tin cơ bản hoặc các cấu hình cài đặt.

HÀM MÔ TẢCONVERT(dataType expression [, style [(length )], ])

Chuyển đổi giá trị trong biểu thức (expression) tới kiểu chỉ rõ bởi dataType. Nếu bạn đang chuyển đổi một kiểu nchar, nvarchar, char, varchar, nhị phân, hay kiểu varbinary , bạn cũng có thể chỉ rõ một tùy chọn length , nó chỉ định chiều dài của giá trị mới. Bạn có thể sử dụng tùy chọn style (kiểu).Chuyển đổi dữ liệu datetime hay smalldatetime tới dữ liệu ký tự; style là định dạng cho ngày tháng và thời gian.Chuyển đổi dữ liệu float, real, money, or smallmoney tới dữ liệu ký tự ; style là định dạng chuỗi cho con số. Bạn có thể tìm xem những chi tiết cho tùy chọn style trong những tài liệu sách trực tuyến Người phục vụ SQL.

COALESCE(expression1 [ , ... expressionN])

Trả về biểu thức không null đầu tiên trong danh sách của những biểu thức.

DATALENGTH(expression) Trả lại số bytes được dùng để trình bày biểu thức.

@@ERROR Trả lại số đặc trưng của lỗi cho phát biểu T- SQL cuối cùng mà được thực hiện.

@@IDENTITY Trả lại giá trị nhận dạng được chèn vào sau cùng .

ISDATE(expression) Trả lại 1 khi biểu thức là một ngày tháng hợp lệ, nếu không số 0 được trở lại..

ISNULL(expression, replacementValue)

Nếu biểu thức có giá tri null, thì replacementValue được trả lại, cách khác biểu thức được trả lại

ISNUMERIC(expression) Trả lại 1 khi biểu thức là một số hợp lệ, cách khác 0 được trở lại

NEWID() Trả lại một giá trị duy nhất của kiểu uniqueidentifier

NULLIF(expression1, expression2) Trả lại một giá trị null nếu expression1 bằng expression2

@@ROWCOUNT Trả lại số lượng hàng được ảnh hưởng bởi câu lệnh T- SQL được thực hiện sau cùng

@@TRANCOUNT Trả lại số lượng giao dịch họat động cho kết nối hiện thời (currentconnection) tới cơ sở dữ liệu

Các hàm hệ thống thông dụng được liệt kê như sau :

db_id ( database_name ) : Mã số định danh cơ sở dữ liệu db_name (database_id ) : Tên cơ sở dữ liệu host_id() : Số định danh của trạm làm việc host_name() : Tên trạm làm việc isnull (expr , value) : Gía trị của biểu thức (expr) sẽ được thay thế với giá trị này. object_id ( ' object_name ' ) : Số định danh của đối tượng cơ sở dữ liệu. object_name ( ' object_id ') : Tên của đối tượng cơ sở dữ liệu suser_sid ( ' login_name ' ) : Số định danh bảo mật sid đối với tên đăng nhập của người sử dụng suser_id ( ' login_name ' ) : Số định danh đăng nhập người dùng suser_sname ( server_user_id ) : Trả về tên định danh đăng nhập từ số định danh bảo mật của người sử dụng suser_name ( server_user_id ) : Tên định danh đăng nhập của người sử dụng user_id (user_name ) : Số định danh cơ sở dữ liệu của người sử dụng user_name (user_id ) : Tên cơ sở dữ liệu của người sử dụng.

Chúng ta hãy xem xét những ví dụ sử dụng một số những hàm hệ thống. Bạn sử dụng hàm CONVERT() để chuyển đổi một giá trị từ kiểu này sang kiểu khác. Ví dụ sau đây chuyển đổi số 123.456 tới một nvarchar ,và 123.456 được trả lại

SELECT CONVERT(nvarchar, 123.456);

Bạn sử dụng hàm COALESCE() để thu được biểu thức không null đầu tiên trong một danh sách. Ví dụ sau đây trả lại 123.456 SELECT COALESCE(null, null, 123.456, null);

Bạn sử dụng hàm DATALENGTH() để thu được số bytes được sử dụng để trình bày một biểu thức. Ví dụ sau đây trình bày số bytes dùng để trình bày giá trị cất giữ trong cột CompanyName của bảng những khách hàng cho hàng có CustomerID bằng ALFKI:

SELECT DATALENGTH(CompanyName), CompanyName FROM Customers WHERE CustomerID = 'ALFKI';

Ví dụ này trả lại 38 và Alfreds Futterkiste, chứa 19 ký tự. mỗi ký tự được chứa trong 2 bai, và chuỗi 19-ký tự giữ tới 38 bai (2* 19).

Bạn sử dụng hàm ISDATE() để xác định phải chăng một biểu thức là một ngày tháng hợp lệ. ISDATE() trả về 1 khi biểu thức là một ngày tháng hợp lệ, cách khác nó trả lại 0. Ví dụ sau đây trả lại 1 và 0 SELECT ISDATE('12/20/2004'), ISDATE(1234);

Bạn sử dụng hàm ISNUMERIC() để xác định phải chăng một biểu thức là một số hợp lệ. Ví dụ sau đây trả lại 1 và 0 SELECT ISNUMERIC(1234), ISNUMERIC('abc');

Bạn sử dụng hàm ISNULL() để thay thế một giá trị null với giá trị khác. Ví dụ sau đây trả lại 10 và 20

SELECT ISNULL(null, 10), ISNULL(20, 10); 10 20

2/Chức năng chuỗi ký tự(String functions)Định nghĩa :Chức năng chuỗi ký tự hoạt động sử dụng khác nhau trên ký tự chuỗi nhị phân chúng trả lại giá trị chung nhất cần cho thao tác trên ký tự dữ liệu. Các chức năng thông dụng của chuỗi là char,nvarchar hoăc kiểu dữ liệu mà hoàn toàn chuyển đổi chúng. Một số chức năng có thể sử dụng binary hoặc varbinary.Bạn có thể sử dụng chức năng để:

Truy vấn một phần của chuỗi Tìm kiếm đồng dạng trong chuỗi ký tự Tìm kiếm bắt đầu vị trí chuỗi đặc biệt trong một cột hoặc biểu thức Ràng buộc vào nhau hoặc tổ hợp chuỗi Chuyển đổi giá trị không phải là chuỗi thành giá trị chuỗi Chèn thêm chuỗi vào chuỗi hiện hành

Sau đây là một số chưc năng hàm sử lý chuỗi thông dụng

Hàm Mô TảACSII( ch ) Mã ASCII của ký tự ch

CHAR( n ) : Ký tự có mã ASCII là n

LOWER( str ) : Trả về chuỗi chữ thường

UPPER(str) Trả về chuỗi chữ hoaLTRIM(str) Trả về chuỗi không có dấu cách bên trái

RTRIM(str) Trả về chuỗi không có dấu cách bên phải

LEFT(str,n): Lấy n ký tự phía trái của dãy strRIGHT(str,n): Lấy n ký tự phía phải của dãy str.

SUBSTRING(str, start, n) Lấy n ký tự của dãy str kể từ vị trí start trong dãy

REPLACE(str1, str2, str3) thay thế tất cả str2 trong str1 bằng str3STUFF(str1, start, n, str2 ) Thay thế n ký tự trong str1 từ vị trí start

bằng chuỗi str2.

Example1:Bạn sử dụng hàm ASCII() để lấy má ascii cho ký tụ mút trái của biểu thức ký tự được cung cấp

SELECT ASCII(‘A’),ASCII(‘a’)Example2: Bạn sử dụng hàm CHAR() để lấy ký tự tương ứng tới mã ASCII của biểu thức số nguyên được cung cấp

SELECT CHAR(65),CHAR(97)Example3: sử dụng hàm LEFT để lấy những ký tự mút trái của biểu thức ký tự. sau đây là

SELECT LEFT(‘My name JHON’,3)

Bạn sử dụng hàm STUFF() để thay thế những ký tự . Tham số đầu tiên là chuỗi bạn muốn thay thế những ký tự trong đó, tham số thứ hai là vị trí ký tự bắt đầu được thay thế, tham số thứ ba là tổng số lượng ký tự được thay tính từ ký tự bắt đầu thay , và tham số thứ tư là tập hợp những ký tự để thay vào. Ví dụ sau đây trả lại "Fivescore and ten":

SELECT STUFF('Four-score and ten', 1, 4, 'Five');

Bạn sử dụng hàm SUBSTRING() để lấy một phần của một chuỗi. Tham số đầu tiên là chuỗi, tham số thứ hai là vị trí bắt đầu lấy ra, và tham số thứ ba là tổng số lượng ký tự cần lấy tính từ vị trí bắt đầu . Ví dụ sau đây trả lại Four:

SELECT SUBSTRING('Four-score and ten', 1, 4); Bạn sử dụng hàm UNICODE() để thu được giá trị Unicode cho ký tự đầu tiên. Ví dụ sau đây trả lại 65 và 97 SELECT UNICODE('A'), UNICODE('a');

3/ Chức năng văn bản hình ảnh(Text and image functions)

Chức năng văn bản sử dụng thao tác trên dữ liệu văn bản và hình ảnh quá trình chuyển đổi sử dụng chức năng CONVERT hỗ trợ từ TEXT tới VARCHAR từ IMAGE tới VARBINARY hoắc BINARY, nhưng TEXT và IMAGE rút gọn tới 255 bytes

4/ Chức năng số học

Thực hiện thao tác số học trên biểu thức số và trở lại kết quả của thao tác. Chức năng số học thao tác trên hệ thống MICROSOFT SQL-SERVER cung cấp dữ liệu số(DECIMAL,INTERGER,FLOAT,RAEL,MONEY,SMALLMONEY,SMALLINT). Độ chính sác xây dựng thao tác trên loại dữ liệu động là đặt sau vị trí thập phâ bởi mặc định Sau đây là một số hàm toán học:ABS(x) : Trị tuyệt đối của xSQRT(x) : Căn bậc hai của x SQUARE( x)  : x2POWER( y, x )  : yxLOG(x) : Logarit tự nhiên của xEXP(x) : Hàm mũ cơ số e của x: ex.SIGN(x) : Lấy dấu của số x (-1: x<0, 0: x=0, +1: x>0)ROUND(x,n): Làm tròn tới n số lẻ.CEILING( x) : Số nguyên nhỏ nhất nhưng lớn hơn xFLOOR(X) : Số nguyên lớn nhất nhưng nhỏ hơn x... và các hàm lượng giác: SIN, COS, TAN, ASIN, ACOS, ATAN ... Sau đây là một số ví dụ về hàm toán họcExample1 : xử dụng ABS() để lấy giá tri tuyệt đối

SELECT ABS(-10),ABS(15)

Example2 : Xử dụng hàm ACOS(),ASIN() và ATAN(), Để lấy arccossine,arcsine,arctangent của 1 số

SELECT ACOS(1),ASIN(1),ATAN(1)Example3 : Xử dụng hàm SQRT() để lấy căn bậc hai của một số

SELECT SQRT(16)

5/ Hàm ngày tháng và thời gian(Date time functions)

Những hàm ngày tháng và thời gian cho phép bạn thao tác với ngày tháng và thời gian. Chẳng hạn, bạn có thể thêm một số ngày vào một ngày tháng đã choBảng Sau Đây Mô Tả Về Hàm Ngày Tháng Và Thời Gian

Hàm Mô TảDATEADD(interval, number, date)

Trả lại một ngày tháng (datetime) là kết quả của việc thêm số lượng (number) chỉ định của đơn vị khoảng thời gian (interval) vào ngày tháng (date). Những khoảng thời gian hợp lệ bao gồm : năm, quý, tháng ,dayofyear, ngày, tuần, giờ, phút, giây, và mili-giây (year, quarter, month, dayofyear, day, week, hour, minute, second, and millisecond)

DATEDIFF (interval, startDate, endDate)

Trả lại sự chênh lệch giữa startDate và endDate, với sự chênh lệch được tính toán theo những đơn vị khoảng thời gian (interval) như (năm, quý).

DATENAME(interval, date)

Trả lại một chuỗi ký tự đại diện cho tên của khoảng thời gian (interval) của ngày tháng (date).

DATEPART(interval, date) Trả lại một số nguyên đại diện cho khoảng thời gian (interval) của ngày tháng (date).

DAY(date) Trả lại một số nguyên mà đại diện cho ngày của ngày tháng (date).

GETDATE() Trả lại một ngày tháng (datetime) chứa ngày tháng

hệ thống hiện thời.GETUTCDATE() Trả lại một ngày tháng (datetime) chứa ngày tháng

hệ thống hiện thời theo thời gian UTC (Tọa độ giờ quốc tế hay giờ Greenwich). Giờ UTC được bắt nguồn từ giờ địa phương hiện thời và sự thiết đặt hệ thống thời gian khu vực.

MONTH(date) Trả lại một số nguyên đại diện cho tháng của ngày tháng (date).

YEAR(date) Trả lại một số nguyên đại diện cho năm của ngày tháng (date).

Sau đây là một vài ví dụ về hàm ngày tháng :Chúng ta hãy xem xét những ví dụ sử dụng một số hàm ngày tháng và thời gian. Bạn sử dụng hàm DATEADD() để thêm một số khoảng thời gian (intervals) vào một ngày tháng. Ví dụ sau đây thêm hai ngày tới ngày tháng 12/ 20/ 2003 và trả về 2003-12-22 00: 00: 00.000 SELECT DATEADD(day, 2, '12/20/2003');

Bạn sử dụng hàm DATEDIFF() để thu được sự chênh lệch giữa hai ngày tháng. Ví dụ sau đây thu được sự chênh lệch (tính theo ngày) giữa ngày 12/ 20/ 2003 và ngày 12/ 22/ 2003 và trả về 2 ngày SELECT DATEDIFF(day, '12/20/2003', '12/22/2003');

Bạn sử dụng hàm DATENAME() để thu được một chuỗi ký tự đại diện cho phần tử của một ngày tháng. Ví dụ sau đây lấy tên tháng của 12/ 20/ 2003 và December (tháng mười hai) được trả về. SELECT DATENAME(month, '12/20/2003');

Bạn sử dụng phương thức DATEPART() để thu được một số nguyên đại diện cho một phần tử của một ngày tháng . Ví dụ sau đây lấy số tháng của 12/ 20/ 2003 và trả lại 12

SELECT DATEPART(month, '12/20/2003');

Bạn sử dụng hàm DAY() để thu được một số nguyên đại diện cho một phần tử của một ngày tháng . Ví dụ sau đây lấy số ngày của 12/ 20/ 2003 và trả lại 20

SELECT DAY('12/20/2003');

Bạn sử dụng hàm MONTH() để thu được một số nguyên đại diện cho một phần tử của một ngày tháng . Ví dụ sau đây lấy số tháng của 12/ 20/ 2003 và trả lại 12 SELECT MONTH('12/20/2003');

Bạn sử dụng hàm YEAR() để thu được một số nguyên đại diện cho một phần tử của một ngày tháng . Ví dụ sau đây lấy số năm của 12/ 20/ 2003 và trả lại 2003

SELECT YEAR('12/20/2003')

Bạn sử dụng hàm DATENAME() để thu được một chuỗi ký tự đại diện cho phần tử của một ngày tháng. Ví dụ sau đây lấy tên tháng của 12/ 20/ 2003 và December (tháng mười hai) được trả về.

SELECT DATENAME(month, '12/20/2003');

Bạn sử dụng phương thức DATEPART() để thu được một số nguyên đại diện cho một phần tử của một ngày tháng . Ví dụ sau đây lấy số tháng của 12/ 20/ 2003 và trả lại 12

SELECT DATEPART(month, '12/20/2003');

Bạn sử dụng hàm DAY() để thu được một số nguyên đại diện cho một phần tử của một ngày tháng . Ví dụ sau đây lấy số ngày của 12/ 20/ 2003 và trả lại 20

SELECT DAY('12/20/2003');

Bạn sử dụng hàm MONTH() để thu được một số nguyên đại diện cho một phần tử của một ngày tháng . Ví dụ sau đây lấy số tháng của 12/ 20/ 2003 và trả lại 12

SELECT MONTH('12/20/2003'); Bạn sử dụng hàm YEAR() để thu được một số nguyên đại diện cho một phần tử của một ngày tháng . Ví dụ sau đây lấy số năm của 12/ 20/ 2003 và trả lại 2003

SELECT YEAR('12/20/2003')

2.Hàm Do người Dùng Định Nghĩa

Mang đầy đủ tính chất của một hàm. Bạn có thể tạo ra những hàm người dùng định nghĩa của riêng mình trong SQL Server. Chẳng hạn, bạn có thể muốn tạo ra hàm của riêng mình để tính toán giá chiết khấu từ một giá gốc và hệ số nhân với giá này. Bạn tạo ra một hàm sử dụng phát biểu CREATE FUNCTION. Các hàm User-Defined (được tạo ra bởi câu lệnh CREATE FUNCTION và phần body thường được gói trong cặp lệnh BEGIN...END) cũng được chia làm các nhóm như sau:

Cú pháp của hàm:

CREATE FUNCTION Ten_Ham ( [Danh_Sach_Cac_Tham_So] ) RETURNS Kieu_Du_Lieu_Tra_Ve_Cua_HamAS BEGIN   Cac_Cau_Lenh_Cua_HamEND

Có ba kiểu hàm người dùng định nghĩa

Scalar functions: (những hàm vô hướng) trả lại một giá trị đơn. Giá trị trả về có thể thuộc bất kỳ kiểu dữ liệu nào ngoại trừ text, ntext, image (ảnh), cursor (con trỏ), table, timestamp, và những kiểu dữ liệu do người dùng định nghĩa. Loại này cũng trả về một giá trị đơn bằng câu lệnh RETURNS.

Inline table-valued functions: (những hàm định trị bảng nội tuyến ) trả về một đối tượng kiểu bảng . Bạn có thể hiểu một bảng như một bảng cơ sở dữ liệu bình thường, ngoại trừ nó được cất giữ trong bộ nhớ. Một "hàm định trị bảng nội tuyến" có thể trả về những kết quả được truy xuất bởi chỉ một phát biểu SELECT đơn.

Multistatement table-valued functions (những hàm định trị bảng nhiều phát biểu): trả về một đối tượng kiểu bảng. Không giống một Inline table-valued function, một Multistatement table-valued function có thể chứa nhiều phát biểu T- SQL. Bạn sẽ xem những ví dụ của ba kiểu hàm này trong những mục sau đây.

Chú ý :Có thể cung cấp thông tin về lỗi nếu phát sinh.Có thể sử dụng các hàm do người dùng định nghĩa trong các câu lệnh SQL như SELECT2.1 Sử dụng hàm vô hướng(Scalar-functions)

Định nghĩa :Những hàm vô hướng trả lại một giá trị đơn. Ví dụ về hàm vô hướng trình bày script DiscountPrice.sql nó tạo ra hàm DiscountPrice(), hàm này trả về giá chiết khấu = giá gốc của một món được nhân với một hệ số chiết khấu. Những giá trị này được gởi qua như những tham số tới hàm DiscountPrice() . Bạn có thể tải file này vào Query Analyzer và chạy nó.

Ví dụ 1: Tiếp theo mình sẽ viết một ví dụ nữa để bạn hiểu và có thể viết cho mình các hàm tự định nghĩa: Ví dụ này sẽ có 2 tham sô trong Danh_Sach_Cac_Tham_So. Hàm sẽ trả về số ngày của tháng, năm do bạn truyền vào; Bạn biết khi lập trình với Pascal bạn đã quen với bài toán tính số ngày của thàng – Với năm nhuận thì tháng 2 có 29 ngày, các năm khác có 28 ngày. CREATE FUNCTION dbo.fuDaysInMonth (@Thang Int,@Nam Int) RETURNS intAS

BEGIN DECLARE @Ngay Int IF @Thang = 2 BEGIN IF ((@Nam % 4 = 0 AND @Nam % 100 <> 0) OR (@Nam % 400 = 0)) SET @Ngay = 29 ELSE SET @Ngay = 28 END ELSE SELECT @Ngay = CASE @Thang WHEN 1 THEN 31 WHEN 3 THEN 31 WHEN 5 THEN 31 WHEN 7 THEN 31 WHEN 8 THEN 31 WHEN 10 THEN 31 WHEN 12 THEN 31 WHEN 4 THEN 30 WHEN 6 THEN 30 WHEN 9 THEN 30 WHEN 11 THEN 30 END RETURN @NgayEND

Những tham số gởi tới hàm được đặt trong cặp dấu móc sau tên của hàm trong phát biểu CREATE FUNCTION .Mẹo nhỏ: Bạn cũng có thể xóa một hàm sử dụng phát biểu DROP FUNCTION , và Bạn có thể sửa đổi một hàm sử dụng phát biểu ALTER FUNCTION.

Một khi bạn đã tạo ra hàm , bạn có thể gọi nó. Khi gọi một hàm vô hướng , bạn sử dụng cú pháp sau đây: owner.functionName

Với owner là người sử dụng cơ sở dữ liệu -người sở hữu hàm , và functionName là tên của hàm.

Cho là bạn đã tạo ra hàm dbo.fuDaysInMonth() sử dụng người sử dụng dbo, thì bạn gọi hàm này sử dụng cú pháp : dbo.fuDaysInMonth() Ví dụ sau đây trả về ngày trong tháng 4/2011

SELECT dbo.fuDaysInMonth(4,2011)

Sử dụng những hàm định trị bảng nội tuyến(inline table-valued function)Một hàm định trị bảng nội tuyến (inline table-valued function) trả về một đối tượng kiểu bảng, được cư trú - sử dụng một phát biểu SELECT đơn. Không giống một hàm vô hướng (scalar function), một hàm định trị bảng nội

tuyến không chứa đựng một thân của những phát biểu được đặt bên trong những phát biểu BEGIN và END . Thay vào đó, chỉ một phát biểu SELECT đơn được đặt bên trong hàm. Chẳng hạn, ví dụ script "tenluu.sql" nó tạo ra hàm vidu(). hàm này trả về một bảng chứa những hàng từ bảng những sản phẩm với một giá trị cột soton lơn hơn với tham số gởi đến cho hàm. Danh sách 4.3: tenluu.SQL

CREATE FUNCTION vidu(@Bien int) RETURNS table AS RETURN ( SELECT * FROM sanpham WHERE soton> @Bien )

Không giống một hàm vô hướng, bạn không phải thêm owner (tên tài khỏan người dùng) khi sự gọi một hàm "inline table-valued function". Bạn sử dụng một phát biểu SELECT để đọc bảng được trả về bởi hàm như mọi bảng khác. Chẳng hạn, phát biểu SELECT sau đây trình bày tất cả những hàng và những cột được trả về bởi gọi hàm vidu(100):

SELECT * FROM vidu(100);

Tất nhiên bạn cũng có thể trình bày chỉ những cột và những hàng được lựa chọn từ bảng được trả về bởi một hàm "inline table-valued function". Chẳng hạn:

SELECT masp,tensp,soton FROM vidu(50)

WHERE masp<= 5

Hình sau đây cho thấy những kết quả của phát biểu SELECT này.

Sử dụng những hàm định trị bảng đa phát biểu(Multistatement table-valued functions)Những hàm định trị bảng đa phát biểu (Multistatement table-valued functions) trả lại một đối tượng kiểu bảng. Không giống một hàm định trị bảng nội tuyến (inline table-valued function), một hàm định trị bảng đa phát biểu có thể chứa nhiều câu lệnh T- SQL, và cho phép bạn xây dựng những hàm phức tạp.

Chẳng hạn, ví dụ trình bày script "ProductsToBeReordered2.sql" tạo ra hàm ProductsToBeReordered2() . Hàm này trả về một bảng chứa những cột ProductID, ProductName, và UnitsInStock từ bảng những sản phẩm (Products) với một giá trị cột UnitsInStock nhỏ hơn hay bằng với tham số mức "reorder". Ngoài ra, một cột mới tên Reorder được thêm vào bảng, chứa từ YES hay NO, tùy thuộc vào sản phẩm có được đặt mua bổ xung (reorder) hay không.Ví dụ : PRODUCTSTOBEREORDERED2. SQL /*

ProductsToBeReordered2 .sql tạo ra một hàm định trị bảng nội tuyến mà trả về những hàng từ bảng những sản phẩm có cột UnitsInStock nhỏ hơn hay bằng với mức phải đặt mua bổ xung được gởi qua như một tham số tới hàm */

CREATE FUNCTION ProductsToBeReordered2(@ReorderLevel int) RETURNS @MyProducts table ( ProductID int, ProductName nvarchar(40), UnitsInStock smallint, Reorder nvarchar(3) ) AS BEGIN

-- truy xuất những hàng từ bảng Products và -- và chèn chúng vào bảng MyProducts, -- thiết đặt cột Reorder tới 'No' INSERT INTO @MyProducts SELECT ProductID, ProductName, UnitsInStock, 'No' FROM Products; -- cập nhật bảng MyProducts, thiết đặt cột

-- Reorder tới 'Yes' khi cột UnitsInStock -- nhỏ hơn hay bằng @ReorderLevel

UPDATE @MyProducts SET Reorder = 'Yes' WHERE UnitsInStock <= @ReorderLevel RETURN END

như với một hàm định trị bảng nội tuyến, bạn không phải thêm owner (tên tài khoản người dùng) khi gọi một hàm định trị bảng nội tuyến. Bạn sử dụng một phát biểu SELECT để đọc bảng được trả về bởi hàm như mọi bảng cơ sở dữ liệu bình thường khác. Chẳng hạn, phát biểu SELECT sau đây trình bày tất cả những hang và những cột được trả về bởi gọi hàm ProductsToBeReordered2(20):

SELECT * FROM ProductsToBeReordered2(20);

 

2.1 Hàm với giá trị trả về thuộc “ dữ liệu kiểu bảng”: –Table-valuedFunctions

Định Nghĩa :Loại này trả về một table. Nếu đã biết về SQL chắc hẳn bạn đã biết cách tạo

View từ các bảng trong CSDL, Nhưng với View bạn không thể truyền các tham số được, điều này phần nào đó làm giảm tính linh hoạt trong việc sử dụng View. Vậy nên khi bạn cần sử dụng dữ liệu dạng View mà có các tham số thì việc sử dụng hàm là một giải pháp hợp lý nhấtVí dụ 1: Giả sử Mình tạo 1 View như sauCREATE VIEW vProducts as SELECT     Categories.CategoryID, Categories.CategoryName,

 Products.ProductName, Products.QuantityPerUnit, Products.UnitPriceFROM         Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID WHERE Categories.CategoryID=1

Bạn xem ví dụ bạn thấy rằng mình tạo ra 1 View Products có  Categories.CategoryID=1 và bạn muốn truy vấn các trường của bảng Products ừng với CategoryID=1 và bạn chỉ cần câu lệnh Select * from vProducts là bạn đã có kết quả như ý. Nhưng với những CategoryID khác thì View vProducts  không làm được trừ phi bạn. Vậy bạn thử sử dụng hàm sau để làm minh họa nhéVí dụ 5: Tạo một hàm trả về dữ liệu dạng bảng tùy theo giá trị của biến @CategoryID truyền vào:CREATE FUNCTION fuGetProducts( @CategoryID int)RETURNS TABLE AS  RETURN  (   SELECT      Categories.CategoryID,  Categories.CategoryName,  Products.ProductName,  Products.QuantityPerUnit,  Products.UnitPrice FROM          Categories INNER JOIN  Products ON Categories.CategoryID = Products.CategoryID  WHERE Categories.CategoryID=@CategoryID)chạy thử hàm trên(Chú ý là khi hàm trả về dạng bảng bạn cũng coi đó như 1 table hoặc 1 View và bạn có thể truy vấn theo 1 hay nhiều trường của hàm) như sau: 

SELECT CategoryID,CategoryName,ProductName,QuantityPerUnit,UnitPriceFROM  dbo.fuGetProducts(1)

Sẽ tra về dữ liệu chính là Select * from vProducts ở trên. Nếu muốn lầy Theo CategoryID=2 bạn dùng câu lệnh Select * from dbo.fuGetProducts(2)…Trên đây chỉ là một ví dụ nhỏ về hàm trả lại dữ liệu kiểu bảng hy vọng bạn sẽ hiểu phần nào về loại hàm này. Trong thực tế chúng ta sẽ cần nó để thực hiện các yêu cầu phức tạp hơn tùy vào dữ liệu thiết kế, quan hệ dữ liệu và yêu cầu mà bạn viết hàm để sử dụng

II. SET OPERATIONSCó những tình huống khi chúng ta cần phải kết hợp các kết quả từ hai hoặc nhiều câu lệnh SELECT. SQL cho phép chúng tôi xử lý các yêu cầu này bằng cách sử dụng các hoạt động thiết lập. Kết quả của mỗi câu lệnh SELECT có thể được coi là thiết lập một, và SQL thiết lập hoạt động có thể được áp dụng trên những bộ để đi đến một kết quả cuối cùng. Oracle SQL hỗ trợ trong bốn hoạt động sau đây thiết lập:

HỢP TẤT CẢ(UNION ALL) HỢP() TRU(EXCEPT) GIAO(INTERSET)

1.Phép hợp Union trong SQL Server

Phép hợp được sử dụng trong trường hợp ta cần gộp kết quả của hai hay nhiều truy vấn thành một tập kết quả duy nhất. SQL cung cấp toán tử UNION để thực hiện phép hợp. Cú pháp như sauCâu_lệnh_1UNION [ALL] Câu_lệnh_2[UNION [ALL] Câu_lệnh_3]...[UNION [ALL] Câu_lệnh_n][ORDER BY cột_sắp_xếp][COMPUTE danh_sách_hàm_gộp [BY danh_sách_cột]]Trong đóCâu_lệnh_1 có dạngSELECT danh_sách_cột[INTO tên_bảng_mới][FROM danh_sách_bảng|khung_nhìn][WHERE điều_kiện][GROUP BY danh_sách_cột][HAVING điều_kiện]và Câu_lệnh_i (i = 2,..,n) có dạngSELECT danh_sách_cột[FROM danh_sách_bảng|khung_nhìn][WHERE điều_kiện][GROUP BY danh_sách_cột][HAVING điều_kiện]

Query1 UNION Query2

Query1 UNION ALL Query2 sẽ là như sau:

Giả sử ta có hai bảng Table1 và Table2 lần lượt như sauVí dụ Với hai bảng: sales2005 người số tiền Joe 1000 Alex 2000 Phao 5000

sales2006 người số tiền Joe 2000 Alex 2000

Zach 35000

Thực hiện Câu lệnh này: SELECT * FROM sales2005 UNION SELECT * FROM sales2006;sản lượng này tập kết quả, mặc dù thứ tự của các hàng có thể khác nhau vì không có ORDER BY điều khoản đã được cung cấp:

người số tiền

Joe 1000

Alex 2000

Phao 5000

Joe 2000

Zach 35000 Lưu ý rằng có hai hàng cho Joe vì những hàng là khác biệt trên các cột của họ. Chỉ có một hàng cho Alex vì những hàng không riêng biệt cho cả hai cột. UNION ALL cho kết quả khác nhau, bởi vì nó sẽ không loại bỏ trùng lặp. Thực hiện tuyên bố này: SELECT * FROM sales2005 UNION ALL SELECT * FROM sales2006;sẽ cung cấp cho các kết quả này, một lần nữa cho phép không đúng cho việc thiếu một ORDER BY tuyên bố: người số tiền

Joe 1000 Joe 2000

Alex 2000

Alex 2000 Phao 5000 Zach 35000

Mặc định, nếu trong các truy vấn thành phần của phép hợp xuất hiện những dòng dữ liệu giống nhau thì trong kết quả truy vấn chỉ giữ lại một dòng. Nếu muốn giữ lại các dòng này, ta phải sử dụng thêm từ khoá ALL trong truy vấn thành phần.

Khi sử dụng toán tử UNION để thực hiện phép hợp, ta cần chú ý các nguyên tắc sau:• Danh sách cột trong các truy vấn thành phần phải có cùng số lượng.• Các cột tương ứng trong tất cả các bảng, hoặc tập con bất kỳ các cột được sử dụng trong bản thân mỗi truy vấn thành phần phải cùng kiểu dữ liệu.• Các cột tương ứng trong bản thân từng truy vấn thành phần của một câu lệnh UNION phải xuất hiện theo thứ tự như nhau. Nguyên nhân là do phép hợp so sánh các cột từng cột một theo thứ tự được cho trong mỗi truy vấn.• Khi các kiểu dữ liệu khác nhau được kết hợp với nhau trong câu lệnh UNION, chúng sẽ được chuyển sang kiểu dữ liệu cao hơn (nếu có thể được).• Tiêu đề cột trong kết quả của phép hợp sẽ là tiêu đề cột được chỉ định trong truy vấn đầu tiên.Truy vấn thành phần đầu tiên có thể có INTO để tạo mới một bảng từ kết quả của chính phép hợp.• Mệnh đề ORDER BY và COMPUTE dùng để sắp xếp kết quả truy vấn hoặc tính toán các giá trị thống kê chỉ được sử dụng ở cuối câu lệnh UNION. Chúng không được sử dụng ở trong bất kỳ truy vấn thành phần nào.• Mệnh đề GROUP BY và HAVING chỉ có thể được sử dụng trong bản thân từng truy vấn thành phần. Chúng không được phép sử dụng để tác động lên kết quả

chung của phép hợp.• Phép toán UNION có thể được sử dụng bên trong câu lệnh INSERT.• Phép toán UNION không được sử dụng trong câu lệnh CREATE VIEW. 

2. Phép Giao Intersect:

Các intersect operation cho kết quả của hai truy vấn và trả về các hàng chỉ xuất hiện trong bộ kết quả cả hai bảng. intersect Operation phân biệt giữa NULLs . Các intersect Operation loại bỏ các hàng trùng lặp từ các tập hợp kết quả cuối cùng. Các intersect all Operation không loại bỏ trùng lặp hàng từ các tập hợp kết quả cuối cùng.

Ví dụ

Ví dụ sau đây INTERSECT truy vấn trả về tất cả các hàng từ bảng Orders hợp Số lượng là giữa 50 và 100.

SELECT * From DatHang WHERE SoLuong Between 1 and 100 INTERSECT SELECT * From Đặt hàng WHERE SoLuong BetWeen 50 and 200;

3. PhépTrừ (EXCEPT) SQL.Đính nghĩa :

Trả về sự khác biệt giữa hai bộ, loại bỏ trùng lặp các thành viên. Toán tử này có chức năng tương đương với EXCEPT Fuctions. Các EXCEPT ALL (không hỗ trợ