ph nh server - wordpress.com · sql server có nhiều phiên bản (versions) khác nhau và...
TRANSCRIPT
2
© 2018 ngocminhtran.com
Phần I
Nhập môn SQL
Server
3
© 2018 ngocminhtran.com
Trong phần này, chúng ta sẽ tìm hiểu về:
Giới thiệu và cài đặt SQL Server
Công cụ SQL Server Management Studio
Làm việc với cơ sở dữ liệu
Giới thiệu về SQL Server
Là hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) được phát triển bởi Microsoft và có thể sử
dụng trong hai chế độ là dòng lệnh (command line) và giao diện đồ họa (GUI). SQL
Server cũng hỗ trợ ngôn ngữ SQL hỗ trợ việc truy vấn cơ sở dữ liệu.
Với SQL Server, chúng ta có thể tạo và quản lý cơ sở dữ liệu, phân tích dữ liệu với dịch
vụ SQL Server Analysis Services (SSAS), phát sinh các báo cáo nhờ dịch vụ SQL Server
Reporting Services (SSRS), v.v.
SQL Server có nhiều phiên bản (versions) khác nhau và hiện tại là SQL Server 2017. Có
thể tham khảo các phiên bản khác nhau của SQL Server từ trước đến nay tại
https://en.wikipedia.org/wiki/History_of_Microsoft_SQL_Server
Mỗi lần chúng ta cài đặt thành công SQL Sever là chúng ta đã tạo một thể hiện của SQL
Server (instance of SQL Server). Mỗi thể hiện (instance) là một bản sao của phần mềm
SQL Server chúng ta dùng để cài đặt. Nếu chúng ta cài SQL Server n lần sẽ có n thể hiện
của SQL Server và điều này cho phép chúng ta cài đặt nhiều phiên bản SQL Server khác
nhau trên cùng một máy.
Microsoft cung cấp nhiều ấn phẩm (editions) SQL Server khác nhau để phục vụ cho
những đối tượng khác nhau. Ví dụ các sinh viên có thể sử dụng các ấn phẩm miễn phí
như Express hay Compact để phục vụ học tập, các doanh nghiệp có thể dùng các ấn phẩm
như Enterprise hay Standard để phục vụ cho việc quản lý cơ sở dữ liệu tại doanh nghiệp
của mình. Tham khảo các ấn phẩm SQL Server của Microsoft tại
https://www.tutorialspoint.com/ms_sql_server/ms_sql_server_editions.htm. Tài liệu này
sử dụng bản SQL Server Express 2012.
Cài đặt SQL Server
Tham khảo tại
https://www.tutorialspoint.com/ms_sql_server/ms_sql_server_installation.htm
Trong quá trình cài đặt có thể gặp một số vấn đề. Có thể tham khảo thêm bài viết
https://ngocminhtran.com/2016/12/20/nhat-ky-khac-phuc-loi-dang-nhap-trong-sql-server/
4
© 2018 ngocminhtran.com
SQL Server Management Studio
Như đã đề cập ở trên, SQL Server là phần mềm cho phép chúng ta thao tác trong hai chế
độ là dòng lệnh và đồ họa và SQL Server Management Studio là công cụ cho phép chúng
ta thao tác với giao diện đồ họa. Để mở SQL Server Management Studio chúng ta thực
hiện Start > All Programs > MS SQL Server 2012 > SQL Server Management
Studio và kết quả trông như sau:
Nhấn Connect để truy cập vào SQL Server Management Studio.
Đăng nhập đến cơ sở dữ liệu
Chúng ta có thể đăng nhập đến cơ sở dữ liệu trong SQL Server Management Studio theo
4 cách:
Windows Authentication
SQL Server Authentication
Mapped to certificate
Mapped to asymmetric key
Trong tài liệu này chỉ đề cập Windows Authentication và SQL Server Authentication.
Windows Authentication cho phép chúng ta đăng nhập dựa trên tài khoản Windows và
thường là mặc định khi chúng ta mở SQL Server Management Studio
5
© 2018 ngocminhtran.com
Server name gồm hai phần tên của máy tính đang dùng (DESKTOP-O6BPUKE) và thể
hiện của SQL Server Express (SQLEXPRESS).
Để đăng nhập với SQL Server Authentication chúng ta cần có một tài khoản riêng (ví
dụ NgocMinhTran). Để tạo tài khoản này chúng ta thực hiện như sau:
Đăng nhập vào SQL Server dùng Windows Authentication (lúc này chúng ta chưa
có tài khoản để dùng SQL Server Authentication).
Tìm đến thư mục Security trong cửa sổ Object Explorer, mở thư mục này và tìm
đến thư mục Logins:
Nhấp chuột phải lên thư mục Logins chọn New Login và một cửa sổ sẽ xuất hiện:
6
© 2018 ngocminhtran.com
Điền thông tin vào Login name (ví dụ NgocMinhTran), chọn SQL Server
authentication và nhập Password (ví dụ 1984) và Confirm password (1984):
7
© 2018 ngocminhtran.com
Trong khung Select a page, chọn Server Roles và chọn sysadmin
8
© 2018 ngocminhtran.com
Tiếp tục chọn User Mapping trong Select a page, chọn master và db_owner:
9
© 2018 ngocminhtran.com
Tại Status phải đảm bảo các tùy chọn như sau:
10
© 2018 ngocminhtran.com
Nhấn OK để đóng cửa sổ Login – New.
Nhấn chuột phải vào Server name (mục cao nhất) trong cửa sổ Object Explorer và
chọn Properties
11
© 2018 ngocminhtran.com
Đến mục Security và chọn SQL Server và Windows Authentication mode và nhấn
OK.
12
© 2018 ngocminhtran.com
Nhấn chuột phải vào Server name (mục cao nhất) trong cửa sổ Object Explorer và
chọn Restart để khởi động lại SQL Server, một thông báo xuất hiện
Nhấn Yes.
Đóng và mở lại SQL Server Management Studio. Đăng nhập vào SQL Server với
chế độ SQL Server Authentication:
13
© 2018 ngocminhtran.com
Làm việc với cơ sở dữ liệu
Tạo cơ sở dữ liệu
Cơ sở dữ liệu (database) trong SQL Server là một tập hợp các đối tượng như tables,
views, stored procedure, function, trigger, v.v. Có hai kiểu cơ sở dữ liệu trong SQL
Server là: cơ sở dữ liệu hệ thống (system database) và cơ sở dữ liệu người dùng (user
database). Cơ sở dữ liệu hệ thống được tạo một cách tự động khi SQL Server được tạo
gồm master, model, msdb, tempdb:
14
© 2018 ngocminhtran.com
Cơ sở dữ liệu người dùng do người dùng tạo ra bằng cách nhấp chuột phải vào thư mục
Databases trong cửa sổ Object Explorer và chọn New Database. Cửa sổ New Database
xuất hiện:
15
© 2018 ngocminhtran.com
Nhập tên cơ sở dữ liệu vào mục Database name (ví dụ testDB) và nhấn OK. Cơ sở dữ
liệu mới (testDB) sẽ được tạo:
16
© 2018 ngocminhtran.com
Xóa một cơ sở dữ liệu
Vào thư mục Databases trong cửa sổ Object Explorer và tìm đến cơ sở dữ liệu cần xóa.
Nhấn chuột phải vào cơ sở dữ liệu này và chọn Delete
17
© 2018 ngocminhtran.com
Một hộp thoại sẽ xuất hiện:
Nhấn OK để xóa cơ sở dữ liệu.
Tạo backup cơ sở dữ liệu
Backup là một bản sao của cơ sở dữ liệu. Tạo các backup cho cơ sở dữ liệu là phương
pháp hiệu quả nhất để bảo vệ dữ liệu.
Để backup cơ sở dữ liệu (ví dụ testDB) trong SQL Server Management Studio chúng ta
vào thư mục Databases trong cửa sổ Object Explorer, tìm đến cơ sở dữ liệu cần backup
(testDB) và kích chuột phải vào cơ sở dữ liệu này chọn Tasks > Back Up…
18
© 2018 ngocminhtran.com
Cửa sổ Back Up Database sẽ xuất hiện
19
© 2018 ngocminhtran.com
Có hai kiểu Backup (trong Backup type) là Full (mặc định) và Differential và giả sử
chúng ta chọn kiểu Full cho cơ sở dữ liệu testDB. Chọn vị trí lưu backup trong
Destination. Chấp nhận đường dẫn mặc định hoặc xóa đường dẫn này bằng cách chọn và
nhấn nút Remove sau đó nhấn nút Add để thêm đường dẫn đến vị trí mới
20
© 2018 ngocminhtran.com
Lưu ý khi lưu tập tin backup phải có phần mở rộng .bak. Nhấn OK
21
© 2018 ngocminhtran.com
Chọn mục Options trong cửa sổ Select a page và nhấn OK để backup testDB:
22
© 2018 ngocminhtran.com
Kiểm tra ổ đĩa D: chúng ta sẽ tìm thấy tập tin testDB.bak.
Phục hồi cơ sở dữ liệu
Nếu cơ sở dữ liệu bị mất hay lỗi chúng ta có thể phục hồi lại bằng cách dùng các backup
chúng ta đã tạo. Bây giờ giả sử chúng ta cần phục hồi testDB (nếu testDB vẫn còn trong
thư mục Databases thì hãy xóa nó) bằng cách nhấp chuột phải vào thư mục Databases và
chọn Restore Database
23
© 2018 ngocminhtran.com
Một cửa sổ sẽ xuất hiện
24
© 2018 ngocminhtran.com
Chọn Device trong mục Source và nhấn vào nút (…) bên phải để chọn tập tin backup
Trong cửa sổ select backup devices nhấn nút Add để tìm tập tin backup (testDB.bak):
25
© 2018 ngocminhtran.com
Nhấn OK
26
© 2018 ngocminhtran.com
Tiếp tục nhấn OK
27
© 2018 ngocminhtran.com
Nhấn OK để phục hồi cơ sở dữ liệu testDB. Nếu thành công thì kết quả như sau:
28
© 2018 ngocminhtran.com
Nhấn OK để đóng cửa sổ Restore Database. Kiểm tra lại trong thư mục Databases:
29
© 2018 ngocminhtran.com
Tạo người dùng (users) và cấp phát quyền truy cập
Chúng ta có thể tạo người dùng đăng nhập đến tài khoản cơ sở dữ liệu trong MS SQL
Server Management Studio như sau:
Đăng nhập đến SQL Server và tìm đến cơ sở dữ liệu testDB. Mở rộng testDB và
tìm đến thư mục Security. Trong Security tìm thư mục Users
Nhấp chuột phải vào thư mục Users chọn New User
Hộp thoại Database User – New xuất hiện, nhập tên user (testUser) trong User
name. Tại Login name nhấp chuột vào nút (…) bên phải
30
© 2018 ngocminhtran.com
Trong hộp thoại Select Login gõ tên tài khoản đăng nhập của chúng ta trong Enter
the object names to select ( ví dụ tài khoản [NgocMinhTran] đã tạo ở trên):
31
© 2018 ngocminhtran.com
Nhấn OK để đóng Select Login. Nhấn tiếp OK để đóng Database User – New. Lúc
này trong thư mục Users sẽ xuất hiện người dùng testUser:
Để cấp phát quyền truy cập đến database cho người dùng testUser chúng ta thực hiện như
sau:
Nhấn chuột phải vào testUser chọn Properties. Hộp thoại Database User – testUser
xuất hiện:
32
© 2018 ngocminhtran.com
Nhấp chuột vào nút Search và chọn Specific objects trong cửa sổ Add Objects:
Nhấn OK. Trong hộp Select Objects nhấn nút Object Types và chọn Database (có thể
chọn các đối tượng khác như Stored procedures, Tables,…) t rong Select Object Types:
33
© 2018 ngocminhtran.com
Nhấn OK để trở lại Select Objects. Trong Select Objects nhấn Browse để tìm đối tượng
testDB
Nhấn OK, hộp thoại Select Objects lúc này:
34
© 2018 ngocminhtran.com
Nhấn OK để đóng Select Objects và trở lại hộp Database User – testUser
Tại Permission for testDB chọn cột Grant và chọn Select (tức là chúng ta cấp quyền
Select cho người dùng testUser đối với testDB):
35
© 2018 ngocminhtran.com
Nhấn OK để đóng Database User – testUser.
36
© 2018 ngocminhtran.com
Phần II
Thiết kế
cơ sở dữ liệu
37
© 2018 ngocminhtran.com
Trong phần này, chúng ta sẽ làm việc với cơ sở dữ liệu qua 3 giai đoạn:
Giai đoạn thiết kế
Giai đoạn nhập dữ liệu
Giai đoạn truy vấn dữ liệu
Giai đoạn Thiết kế
Tạo bảng (table)
Thành phần cơ bản nhất của một cơ sở dữ liệu là các bảng (tables). Mỗi bảng được tạo
thành bởi các cột (hay thuộc tính), trong đó có một (hay nhiều) cột đóng vai trò là khóa
chính (primary key - PK). Các bảng trong cùng một cơ sở dữ liệu phải có quan hệ với
nhau.
Ví dụ một cơ sở dữ liệu Album có chứa 2 bảng như sau:
Hình trên gồm 2 bảng tên Genre và Review. Id (đóng vai trò là khóa chính - PK), Name,
SortOrder là các cột (hay thuộc tính) của bảng Genre; Id (đóng vai trò là khóa chính -
PK), Title, Summary,…là các cột (hay thuộc tính) của bảng Review. Hai bảng Genre và
Review có mối quan hệ một - nhiều (thông qua cặp khóa Id (PK của Genre) – GenreId
(FK của Review)).
Tên bảng hay cột tuân theo một số quy tắc chung:
Không dùng khoảng trắng giữa các từ, ví dụ Employee Department là không hợp
lệ vì có khoảng trắng giữa Employee và Department.
Viết hoa chữ cái đầu tiên của mỗi từ, ví dụ EmployeeDepartment, Genre, Review
38
© 2018 ngocminhtran.com
Không dùng các từ khóa để đặt tên như: int, nvarchar, …
Tên bảng phải là duy nhất trong cơ sở dữ liệu (hay lược đồ) và tên cột phải là duy
nhất trong mỗi bảng.
Tên phải phản ánh được nội dung của bảng hay cột
Lược đồ cơ sở dữ liệu (schema)
Lược đồ của một cơ sở dữ liệu phản ánh mức tổ chức của các đối tượng (như các bảng)
trong cơ sở dữ liệu đó. Ví dụ lược đồ của cơ sở dữ liệu Album thể hiện mối quan hệ giữa
hai bảng Genre và Review:
Mặc định, một lược đồ của một cơ sở dữ liệu sẽ được phát sinh một cách tự động (dbo).
Kiểu dữ liệu (data types) trong SQL Server
Trong quá trình thiết kế các bảng, các cột (hay các đối tượng khác) của mỗi bảng sẽ được
gán đến một kiểu dữ liệu như kiểu số (numeric), kiểu chuỗi (string), kiểu thời gian (date,
time),…Kiểu dữ liệu sẽ quyết định kiểu của giá trị được đặt vào trong các cột (hay các
đối tượng khác). Ví dụ cột Id của bảng Genre có kiểu dữ liệu là kiểu số thì các giá trị của
cột Id phải là kiểu số.
Kiểu số (numeric)
SQL Server cung cấp các kiểu dữ liệu kiểu số sau:
39
© 2018 ngocminhtran.com
Cột Data Type là các kiểu dữ liệu kiểu số; cột Range quy định phạm vi giá trị của mỗi
kiểu, ví dụ kiểu tinyint có giá trị từ 0 đến 255; cột Storage là hình thức lưu trữ của mỗi
kiểu trong bộ nhớ máy tính (đơn vị byte), ví dụ một giá trị có kiểu int sẽ chiếm một ô nhớ
kích cỡ 4 bytes.
Kiểu chuỗi (string)
Đối với các giá trị dạng văn bản (ví dụ cột Name hay Summary) chúng ta dùng các kiểu
dữ liệu kiểu chuỗi. Có 3 dạng kiều chuỗi: kiểu dữ liệu không phải Unicode (non
Unicode), kiều dữ liệu Unicode (có thể bao hàm cả các giá trị có kiểu non Unicode) và
kiểu nhị phân (binary).
Kiểu dữ liệu không phải Unicode gồm:
char(n): n là chiều dài chuỗi, 1 <= n <= 8000
varchar(n): n tùy ý, giá trị có thể chiếm đến 2GB bộ nhớ.
text: có thể bị xóa trong tương lai và nên sử dụng kiểu vachar thay thế
Kiểu dữ liệu Unicode gồm:
nchar(n): n là chiều dài chuỗi, 1 <= n <= 4000
nvarchar(n): n tùy ý, giá trị có thể chiếm đến 2GB bộ nhớ.
ntext: có thể bị xóa trong tương lai và nên sử dụng kiểu nvachar thay thế
Kiểu dữ liệu nhị phân gồm:
binary(n): n là chiều dài chuỗi, 1 <= n <= 8000
varbinary(n): n tùy ý, giá trị có thể chiếm đến 2GB bộ nhớ.
image: có thể bị xóa trong tương lai và nên sử dụng kiểu varbinary thay thế
Kiểu thời gian (date, time)
SQL Server cung cấp các kiểu dữ liệu cho các giá trị thời gian như giờ, phút, giây hay
ngày, tháng, năm. Các kiểu thời gian gồm:
40
© 2018 ngocminhtran.com
time(n): lưu trữ thời gian 24 giờ của ngày. n là một số nguyên từ 0 đến 7 phản ánh
độ chính xác phần thập phân của giá trị thời gian. Ví dụ time(2) giá trị có thể là
11:51:04:24, nếu time(3) thì giá trị có thể 11:51:04:245
date: lưu trữ giá trị tháng-ngày-năm có phạm vi từ 01-01-01 đến 12-31-9999
smalldatetime: lưu trữ giá trị thời gian kết hợp date và time, trong đó date có
phạm vi từ 1/1/1900 đến 6/6/2079, time chính xác đến giây. Ví dụ giá trị kiểu
smalldatetime là 4/1/2012 11:15:04
datetime: tương tự smalldatetime nhưng có giá trị lớn hơn với date trong phạm vi
từ 01-01-01 đến 12-31-9999, time chính xác đến phần lẻ. Ví dụ: 4/1/2012
11:15:04:888
datetime2(n) : tương tự datetime nhưng chúng ta có thể kiểm soát độ chính xác
của phần time thông qua n (giống kiểu time(n))
datetimeoffset: tương tự datetime2 nhưng có phản ánh độ lệch giữa các múi giờ
(time-zone). Ví dụ phản ánh múi giờ chênh lệch nhau 6 tiếng: 4/1/2012 03:10:24 -
06:00
Các kiểu dữ liệu khác
Bên cạnh các kiểu dữ liệu cơ bản trên, SQL Server cung cấp nhiều kiểu dữ liệu khác cho
những mục đích đa dạng như cursor, filestream, xml, v.v.
Xem thêm tại https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-types-transact-
sql?view=sql-server-2017
Cột (columns) trong bảng
Mỗi bảng được hình thành từ các cột, ví dụ bảng Genre được tạo từ các cột Id, Name,
SortOrder. Mỗi cột sẽ được gán với một kiểu dữ liệu cụ thể và hầu hết các cột đều Allow
Nulls nghĩa là cột đó có thể rỗng hay không chứa giá trị nào. Đối với các cột có kiểu dữ
liệu số thì có thể chọn thuộc tính Is Identity cho phép phát sinh tự động một giá trị khi
một hàng được thêm vào bảng. Chúng ta sẽ hiểu hơn về các thuộc tính của cột qua phần
sau của tài liệu này.
Tạo các bảng trong SQL Server Management Studio
Bây giờ chúng ta sẽ thực hành tạo các bảng Genre và Review trong cơ sở dữ liệu Album
bằng công cụ SQL Server Management Studio.
Tạo bảng
Đầu tiên chúng ta cần tạo cơ sở dữ liệu Album trong thư mục Databases (xem lại phần I
– Làm việc với cơ sở dữ liệu). Các bảng Genre và Review có thiết kế như sau:
Bảng Genre
41
© 2018 ngocminhtran.com
Bảng Review
Trong thư mục cơ sở dữ liệu Album, tìm đến và mở rộng thư mục Security. Nhấp chuột
phải vào thư mục Schemas chọn New Schema:
42
© 2018 ngocminhtran.com
Trong hộp thoại Schema – New gõ GenreReview trong mục Schema Name và gõ dbo
trong Schema owner:
Nhấp OK.
Mở rộng thư mục cơ sở dữ liệu Album, tìm đến và nhấp chuột phải vào thư mục Tables
chọn New Table:
43
© 2018 ngocminhtran.com
Trong vùng thiết kế bảng sẽ xuất hiện ngay sau đó nhập tên các cột trong Column Name,
chọn kiểu dữ liệu tương ứng trong Data Type, không chọn Allow Nulls cho các cột:
Trong cửa sổ Properties (thường xuất hiện mặc định khi chúng ta tạo bảng mới, nếu chưa
xuất hiện thì chọn View > Properties), tìm đến mục Schema và chọn GenreReview trong
danh sách sổ xuống:
44
© 2018 ngocminhtran.com
Nhấp chuột phải vào tab tạo bảng mới và chọn Save Table_1:
Trong hộp thoại Choose Name gõ Genre trong mục Enter a name for the table:
Nhấn OK. Bảng Genre đã được thêm vào cơ sở dữ liệu Album:
45
© 2018 ngocminhtran.com
Một cách tương tự chúng ta sẽ thiết kế bảng Review:
Giá trị cột Id có thể chọn thuộc tính Is Identity trong Column Properties:
Lúc này cơ sở dữ liệu Album sẽ có hai bảng Genre và Review như sau:
46
© 2018 ngocminhtran.com
Tạo các ràng buộc cho bảng
Một số ràng buộc có thể có gồm:
Ràng buộc khóa chính (primary key constraints): mỗi bảng sẽ có một cột (hay một
nhóm cột) được chọn là khóa chính của bảng
Ràng buộc mặc định (default constraints): chúng ta quy ước mặc định giá trị cho
một cột nào đó. Ví dụ kiểu bit chỉ có thể nhận giá trị 1 hay 0, true hay false, v.v.
nên chúng ta cần quy định trước giá trị.
Ràng buộc duy nhất (unique constraints): thường bị lầm với ràng buộc khóa chính.
Đảm bảo không có sự lặp lại các giá trị trong một cột, ví cột mã sinh viên sẽ chứa
các giá trị duy nhất vì không cho phép hai sinh viên có cùng mã sinh viên.
Ràng buộc kiểm tra (check constraints):kiểm tra giá trị tại một cột có thỏa mãn
điều kiện cho trước nào đó hay không.
Thêm ràng buộc khóa chính đến các bảng trong cơ sở dữ liệu Album
1. Chọn bảng Genre trong cơ sở dữ liệu Album và nhấp chuột phải vào bảng này chọn
Design
2. Nhấp chuột phải vào cột Id và chọn Set Primary Key
47
© 2018 ngocminhtran.com
Kết quả sẽ xuất hiện một biểu tượng khóa ngay trước cột Id:
Tương tự thiết lập khóa chính cho cột Id của bảng Review.
Thêm ràng buộc mặc định đến các bảng trong cơ sở dữ liệu Album
1. Chọn bảng Review trong cơ sở dữ liệu Album và nhấp chuột phải vào bảng này chọn
Design
2. Chọn cột Authoried cần thiết lập ràng buộc mặc định và trong cửa sổ Column
Properties chọn Default Value or Binding và nhập giá trị mặc định 1:
48
© 2018 ngocminhtran.com
Thêm ràng buộc duy nhất đến các bảng trong cơ sở dữ liệu Album
1. Chọn bảng Genre (hay Review) trong cơ sở dữ liệu Album và nhấp chuột phải vào
bảng này chọn Design
2. Chọn cột (ví dụ cột Name) cần thiết lập ràng buộc duy nhất, nhấp chuột phải chọn
Indexes/Keys
3. Trong hộp thoại Indexes/Keys nhấn nút Add, tại Type chọn Unique Key, tại Is Unique
chọn Yes, tại Name gõ Unique_Name. Kết quả:
49
© 2018 ngocminhtran.com
Thêm ràng buộc kiểm tra đến các bảng trong cơ sở dữ liệu Album
1. Chọn bảng Genre (hay Review) trong cơ sở dữ liệu Album và nhấp chuột phải vào
bảng này chọn Design
2. Chọn và nhấp chuột phải vào cột cần thiết lập ràng buộc kiểm tra và chọn Check
Constraints
Trong hộp Check Constraints nhấn nút Add và nhập tên của ràng buộc tại mục Name. Tại
mục Expression nhập biểu thức điều kiện bằng cách nhấn nút (…) bên phải:
50
© 2018 ngocminhtran.com
Nhập biểu thức điều kiện trong hộp Check Constraint Expression:
Ràng buộc khóa ngoại (Foreign key constraints)
Khóa ngoại đóng vai trò rất quan trọng, đảm bảo tính ràng buộc toàn vẹn dữ liệu trong cơ
sở dữ liệu. Ví dụ trong bảng Review có chứa cột GenreId để đảm bảo chỉ có những genre
(thể loại) nào tồn tại trong bảng Genre thì mới có nội dung trong bảng Review. Điều này
thể hiện mối quan hệ chặt chẽ, toàn vẹn giữa hai bảng Genre và Review. Cột Id trong
bảng Genre và cột GenreId trong bảng Review phải có dữ liệu giống nhau. Cột Id trong
51
© 2018 ngocminhtran.com
bảng Genre đóng vai trò khóa chính, cột GenreId trong bảng Review đóng vai trò khóa
ngoại.
Tạo quan hệ khóa ngoại cho các bảng của cơ sở dữ liệu Album
1. Chọn và mở rộng bảng GenreReview.Review trong cơ sở dữ liệu Album, chọn và nhấp
chuột phải vào thư mục Keys chọn New Foreign Key:
2. Trong hộp Foreign Key Relationships, nhấn Delete để xóa ràng buộc mặc định
(FK_Genre_Review). Tìm đến thuộc tính Name và gõ tên ràng buộc là
FK_Genre_To_Review_On_GenreId và nhấn nút Add:
52
© 2018 ngocminhtran.com
3. Tại mục Tables and Columns Specifications nhấn vào nút (…) bên phải:
Trong Tables and Columns chọn Genre (GenreReview) trong Primary key table và chọn
cột Id ngay bên dưới. Tương ứng bên Foreign key table là Review (GenreReview) và cột
GenreId:
53
© 2018 ngocminhtran.com
4. Đóng các cửa sổ và lưu kết quả.
Trực quan hóa các bảng trong cơ sở dữ liệu
1. Mở rộng cơ sở dữ liệu Album, chọn và nhấn chuột phải vào thư mục Database
Diagrams, chọn New Database Diagram:
Hiện ra thông báo
Chọn Yes. Trong bảng Add Table chọn hai bảng Genre và Review (chọn và giữ phím
Ctrl)
54
© 2018 ngocminhtran.com
Nhấn nút Add và nhấn Close. Kết quả:
Lưu lại diagram bằng cách nhấn chuột phải trên tab (giống lưu bảng)
55
© 2018 ngocminhtran.com
Giai đoạn Nhập dữ liệu
Sau khi hoàn tất quá trình thiết kế các bảng, giai đoạn kế tiếp là nhập dữ liệu cho bảng.
Để nhập dữ liệu cho một bảng, chúng ta chọn và nhấp chuột phải vào bảng đó chọn Edit
Top 200 rows
Nhập dữ liệu cho bảng Genre:
56
© 2018 ngocminhtran.com
Bảng Review
Giai đoạn truy vấn dữ liệu với T-SQL
Khi dữ liệu đã được nhập, việc kế tiếp là sử dụng các dữ liệu với những mục đích khác
nhau thông qua các truy vấn (queries).
Tạo truy vấn trong Microsoft SQL Server Management Studio
Để tạo một truy vấn trong SQL Server Management Studio chúng ta vào mục New Query
Một khung soạn thảo xuất hiện cho phép chúng ta soạn thảo các lệnh T-SQL để truy vấn
dữ liệu theo một mục đích cụ thể:
57
© 2018 ngocminhtran.com
Ngôn ngữ SQL
Để truy vấn dữ liệu từ cơ sở dữ liệu chúng ta dùng ngôn ngữ SQL. Học ngôn ngữ SQL tại
https://www.w3schools.com/sql/default.asp. Sau đây là một số lệnh SQL cơ bản với dữ
liệu minh họa bên cạnh các bảng Genre và Review của cơ sở dữ liệu Album đã tạo ở trên,
chúng ta sẽ dùng các bảng từ cơ sở dữ liệu Northwind của https://www.w3schools.com
bao gồm:
Bảng Customers:
https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
Bảng Categories:
https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
Bảng Employees:
https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
Bảng Orders:
https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
Bảng OrderDetails:
https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
Bảng Products:
https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
Bảng Shippers:
https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
Bảng Suppliers:
https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
Một số hình ảnh minh họa cũng được mượn từ https://www.w3schools.com.
1. Lệnh SELECT…FROM
Dùng để chọn các cột cần hiển thị trong một hay nhiều bảng từ cơ sở dữ liệu. Cú pháp:
SELECT cột_1, cột_2, ...
FROM tên_bảng;
Có thể hiển thị tất cả các cột trong một bảng với lệnh SELECT *. Ví dụ muốn hiển thị chỉ
cột Name của bảng Genre chúng ta viết:
SELECT Name
FROM Genre;
Hiển thị tất cả dữ liệu từ bảng Genre có thể viết:
SELECT *
58
© 2018 ngocminhtran.com
FROM Genre;
Kết quả sẽ hiển thị tất cả các cột từ bảng Genre gồm ID, Name, SortOrder.
2. Lệnh DISTINCT
Dữ liệu trong các bảng khi hiển thị bằng lệnh SELECT có thể trùng nhau, ví dụ hiển thị
cột Country của bảng Customers bằng lệnh sau:
SELECT Country
FROM Customers;
Kết quả có thể như sau:
Chúng ta có thể dùng lệnh DISTINCT để hiển thị các dữ liệu không trùng nhau theo cú
pháp sau:
SELECT DISTINCT cột_1, cột_2, ...
FROM tên_bảng;
Ví dụ hiển thị lại Country từ bảng Customers:
SELECT DISTINCT Country
FROM Customers;
Kết quả:
59
© 2018 ngocminhtran.com
3. Lệnh WHERE
Chúng ta có thể hiển thị dữ liệu từ một hay nhiều bảng theo các điều kiệu nào đó bằng
lệnh WHERE. Cú pháp:
SELECT cột_1, cột_2, ...
FROM tên_bảng
WHERE điều_kiện;
Ví dụ hiển thị thông tin CustomerID, CustomerName và Country của các khách hàng
(customers) đến từ quốc gia (Country) Mexico, lệnh SQL như sau:
SELECT CustomerID, CustomerName, Country
FROM Customers
WHERE Country='Mexico';
Kết quả:
4. Lệnh AND, OR, NOT
Khi dùng WHERE chúng ta có thể dùng các lệnh AND, OR, hay NOT để kết nối các điều
kiện khác nhau (AND, OR) hay phủ định giá trị một biểu thức điều kiện (NOT). Cú pháp
AND:
SELECT cột_1, cột_2, ...
FROM tên_bảng
60
© 2018 ngocminhtran.com
WHERE btdk_1 AND btdk_2 AND btdk_3 AND …;
Hiển thị kết quả khi tất cả các điều kiện btdk_1, btdk_2, btdk_3,…thỏa mãn đồng thời. Ví
dụ:
SELECT *
FROM Customers
WHERE Country='Germany' AND City='Berlin';
Lệnh SQL trên hiển thị các khách hàng thỏa mãn đồng thời hai điều kiện là đến từ
Germany (Country) và thành phố Berlin (City). Kết quả:
Nếu muốn hiển thị thông tin chỉ cần thỏa mãn một hay một vài điều kiện nào đó chúng ta
có thể dùng OR theo cú pháp:
SELECT cột_1, cột_2, ...
FROM tên_bảng
WHERE btdk_1 OR btdk_2 OR btdk_3 OR …;
Ví dụ:
SELECT *
FROM Customers
WHERE Country='Germany' OR City='Berlin';
Lệnh SQL trên hiển thị các khách hàng thỏa mãn hoặc đến từ Germany (Country) hoặc
thành phố Berlin (City) hoặc cả hai. Kết quả:
Trong trường hợp muốn hiển thị thông tin theo một ngoại lệ nào đó, ví dụ hiển thị thông
tin khách hàng đến từ tất cả các quốc gia ngoại trừ Germany, chúng ta có thể dùng lệnh
NOT theo cú pháp:
SELECT cột_1, cột_2, ...
FROM tên_bảng
WHERE NOT biểu_thức_điều_kiện;
61
© 2018 ngocminhtran.com
Ví dụ lệnh SQL
SELECT *
FROM Customers
WHERE NOT Country='Germany';
Sẽ hiển thị thông tin khách hàng đến từ tất cả các quốc gia ngoại trừ Germany.
5. Lệnh IN, BETWEEN, LIKE
Bên cạnh AND, OR, NOT, các lệnh IN, BETWEEN, và LIKE cũng thường được dùng
trong biểu thức điều kiện của WHERE.
Lệnh BETWEEN dùng để chọn giá trị trong một khoảng nào đó. Cú pháp:
SELECT Tên_cột_hiển_thị
FROM Tên_bảng
WHERE Tên_cột BETWEEN giá_trị_1 AND giá_trị_2;
Ví dụ lệnh SQL:
SELECT *
FROM Products
WHERE Price BETWEEN 10 AND 20;
Hiển thị thông tin các sản phẩm (Products) có giá (Price) từ 10 đến 20 (10 <= Price <=
20).
Lệnh IN là một hình thức khác của lệnh OR. Cú pháp:
SELECT Tên_cột_hiển_thị
FROM Tên_bảng
WHERE Tên_cột IN (giá_trị_1, giá_trị_2,…);
Lệnh này tương đương với lệnh OR như sau:
SELECT Tên_cột_hiển_thị
FROM Tên_bảng
WHERE Tên_cột = giá_trị_1 OR tên_cột = giá_trị_2 OR…;
Ví dụ:
SELECT *
62
© 2018 ngocminhtran.com
FROM Customers
WHERE Country IN ('Germany', 'France', 'UK');
Tương đương:
SELECT *
FROM Customers
WHERE Country = 'Germany' OR Country = 'France' OR Country = 'UK';
Ngoài việc dùng IN, BETWEEN, chúng ta có thể dùng LIKE để xác định dữ liệu trong
những điều kiện phức tạp hơn như tìm kiếm các khách hàng có tên bắt đầu bằng chữ a
hay tên có chữ cái thứ hai là r, v.v. Cú pháp LIKE:
SELECT Tên_cột_hiển_thị
FROM Tên_bảng
WHERE Tên_cột LIKE mẫu_điều_kiện;
mẫu_điều_kiện là biểu thức kết hợp các ký hiệu đặc biệt (wildcard) và hai kí hiệu đặc biệt
thường dùng là:
%: đại diện cho không, một, hay nhiều ký tự
_: đại diện cho một ký tự
Ví dụ lệnh SQL:
SELECT *
FROM Customers
WHERE CustomerName LIKE 'a%';
Lệnh SQL trên hiển thị thông tin các khách hàng có tên bắt đầu bằng chữ a (hay A). Kết
quả
Một lệnh SQL khác:
SELECT *
63
© 2018 ngocminhtran.com
FROM Customers
WHERE CustomerName LIKE 'a_%_%';
Lệnh SQL trên hiển thị thông tin các khách hàng có tên bắt đầu bằng chữ a (hay A) và
tên chứa ít nhất 3 ký tự.
Tham khảo thêm về cách dùng các wildcards tại
https://www.w3schools.com/sql/sql_wildcards.asp
6. Lệnh ORDER BY
Lệnh ORDER BY dùng để sắp xếp kết quả theo thứ tự tăng (ASC) hay giảm (DESC) dần
theo các cột. Cú pháp:
SELECT cột_1, cột_2, ...
FROM tên_bảng
[ WHERE biểu_thức_điều_kiện ]
ORDER BY cột_1, cột_2, ...ASC | DESC;
Lệnh WHERE đặt trong dấu [] vì có thể có hoặc không khi dùng ORDER BY. Mặc định
khi dủng ORDER BY, các giá trị được xếp tăng dần; nếu muốn xếp giảm dần có thể thêm
từ khóa DESC. Ví dụ sắp xếp thông tin khách hàng tăng dần theo Country
SELECT CustomerID, CustomerName, Country
FROM Customers
ORDER BY Country;
Kết quả:
Có thể sắp xếp giảm dần theo Country:
SELECT CustomerID, CustomerName, Country
64
© 2018 ngocminhtran.com
FROM Customers
ORDER BY Country DESC;
Kết quả:
7. Lệnh INSERT INTO…VALUES
Chúng ta có thể thêm thông tin đến bảng với lệnh INSERT INTO theo cú pháp sau:
INSERT INTO tên_bảng (cột_1, cột_2, cột_3, ...)
VALUES (giá_trị_1, giá_trị_2, giá_trị_3, ...);
Thêm các giá trị giá_trị_1, giá_trị_2, giá_trị_3, ...tương ứng đến các cột cột_1, cột_2,
cột_3, ... của bảng. Nếu chúng ta thêm các giá trị đến tất cả các cột của bảng thì dùng cú
pháp:
INSERT INTO tên_bảng
VALUES (giá_trị_1, giá_trị_2, giá_trị_3, ...);
Ví dụ:
INSERT INTO Customers (CustomerName, ContactName, Address, City,
PostalCode, Country)
VALUES ('Cardinal', 'Tom B. Erichsen', 'Skagen 21', 'Stavanger',
'4006', 'Norway');
Các thông tin về khách hàng tên Cardinal sẽ được thêm vào cuối bảng Customers và
CustomerID sẽ tự động tăng một đơn vị.
8. Lệnh UPDATE
Dùng lệnh UPDATE để chỉnh sửa, thay đổi các thông tin có sẵn từ các bảng của cơ sở dữ
liệu. Cú pháp:
UPDATE tên_bảng
65
© 2018 ngocminhtran.com
SET cột_1 = giá_trị_1, cột_2 = giá_trị_2, ...
WHERE điều_kiện;
Cập nhật giá trị các cột cột_1, cột_2,…tương ứng với giá_trị_1, giá_trị_2,…Cần chú ý
sử dụng WHERE để cập nhật tại một vài hàng dữ liệu nào đó, nếu không dùng WHERE
thì tất cả các hàng trong bảng sẽ được cập nhật.
Ví dụ lệnh SQL:
UPDATE Customers
SET ContactName = 'Alfred Schmidt', City= 'Frankfurt'
WHERE CustomerID = 1;
Cập nhận thông tin về ContactName và City với khách hàng có CustomerID là 1.
9. Lệnh DELETE
Dùng lệnh DELETE để xóa các dữ liệu tồn tại sẵn trong cơ sở dữ liệu. Cú pháp:
DELETE FROM tên_bảng
WHERE điều_kiện;
Sử dụng WHERE để xác định các hàng cần xóa trong bảng. Nếu bỏ qua lệnh WHERE,
tất cả các hàng của bảng sẽ bị xóa.
Ví dụ lệnh SQL sau:
DELETE FROM Customers
WHERE CustomerName='Alfreds Futterkiste';
Xóa tất cả thông tin các khách hàng có tên là Alfreds Futterkiste từ bảng Customers.
10. Lệnh INNER JOIN, LEFT JOIN, RIGHT JOIN, OUTER JOIN
Trong trường hợp muốn hiển thị dữ liệu được lấy từ nhiều bảng có quan hệ với nhau,
chúng ta có thể dùng các lệnh JOIN.
Lệnh INNER JOIN hiển thị dữ liệu thuộc về cả hai bảng. Hình ảnh trực quan INNER
JOIN với hai bảng table1 và table2 như sau:
66
© 2018 ngocminhtran.com
Cú pháp:
SELECT Các_cột_hiển_thị
FROM Tên_bảng_thứ_nhất
INNER JOIN Tên_bảng_thứ_hai
ON Tên_bảng_thứ_nhất.Tên_cột = Tên_bảng_thứ_hai.Tên_cột;
Các cột trên lệnh ON là các cột thể hiện mối quan hệ giữa hai bảng và các cột này có thể
khác tên nhưng có cùng giá trị. Ví dụ bảng Products và bảng Suppliers có quan hệ với
nhau dựa trên cột SupplierID (khóa chính bảng Suppliers) và cột SupplierID (trong bảng
Products – khóa ngoại).
Ví dụ lệnh SQL sau:
SELECT Products.ProductID, Products.ProductName,Suppliers.SupplierName
FROM Products
INNER JOIN Suppliers
ON Products.SupplierID = Suppliers.SupplierID;
Kết quả
67
© 2018 ngocminhtran.com
Lệnh LEFT JOIN hiển thị dữ liệu thuộc về bảng bên trái và dữ liệu thuộc về cả hai bảng.
Hình ảnh trực quan LEFT JOIN với hai bảng table1 và table2 như sau:
Cú pháp:
SELECT Các_cột_hiển_thị
FROM Tên_bảng_thứ_nhất
LEFT JOIN Tên_bảng_thứ_hai
ON Tên_bảng_thứ_nhất.Tên_cột = Tên_bảng_thứ_hai.Tên_cột;
Ví dụ lệnh SQL sau:
USE Album; select GenreReview.Genre.Id, GenreReview.Genre.Name, GenreReview.Review.Title from GenreReview.Genre left join GenreReview.Review on GenreReview.Genre.Id = GenreReview.Review.GenreId; Kết quả:
Lệnh SQL trên sẽ hiển thị toàn bộ dữ liệu từ bảng bên trái (Genre) và các dữ liệu chung
của hai bảng. Nội dung Title của Jazz là NULL vì bảng Review không chứa Id của Jazz
(Genreid = 3).
Lệnh RIGHT JOIN hiển thị dữ liệu thuộc về bảng bên phải và dữ liệu thuộc về cả hai
bảng. Hình ảnh trực quan RIGHT JOIN với hai bảng table1 và table2 như sau:
68
© 2018 ngocminhtran.com
Cú pháp:
SELECT Các_cột_hiển_thị
FROM Tên_bảng_thứ_nhất
RIGHT JOIN Tên_bảng_thứ_hai
ON Tên_bảng_thứ_nhất.Tên_cột = Tên_bảng_thứ_hai.Tên_cột;
Ví dụ lệnh SQL sau:
USE Album; select GenreReview.Genre.Id, GenreReview.Genre.Name, GenreReview.Review.Title from GenreReview.Genre right join GenreReview.Review on GenreReview.Genre.Id = GenreReview.Review.GenreId; Kết quả:
Lệnh SQL trên sẽ hiển thị toàn bộ dữ liệu từ bảng bên phải (Review) và các dữ liệu
chung của hai bảng. Nội dung của Jazz không xuất hiện vì bảng Review không chứa Id
của Jazz (Genreid = 3).
Lệnh FULL OUTER JOIN hiển thị tất cả dữ liệu thuộc về cả hai bảng. Hình ảnh trực
quan FULL OUTER JOIN với hai bảng table1 và table2 như sau:
69
© 2018 ngocminhtran.com
Cú pháp:
SELECT Các_cột_hiển_thị
FROM Tên_bảng_thứ_nhất
FULL OUTER JOIN Tên_bảng_thứ_hai
ON Tên_bảng_thứ_nhất.Tên_cột = Tên_bảng_thứ_hai.Tên_cột;
Ví dụ lệnh SQL sau:
USE Album; select GenreReview.Genre.Id, GenreReview.Genre.Name, GenreReview.Review.Title from GenreReview.Genre full outer join GenreReview.Review on GenreReview.Genre.Id = GenreReview.Review.GenreId; Kết quả:
Lệnh SQL trên sẽ hiển thị toàn bộ dữ liệu từ hai bảng. Nội dung Title của Jazz là NULL
vì bảng Review không chứa Id của Jazz (Genreid = 3).
11. Các hàm thống kê
T-SQL hỗ trợ một số hàm phục vụ cho việc thống kê số liệu trong các bảng. Chúng ta sẽ
cùng tìm hiểu một số hàm thống kê cơ bản.
Hàm MAX và MIN
Hàm MAX và MIN lần lượt trả về giá trị lớn nhất và nhỏ nhất của cột được chọn. Cú
pháp hàm MIN:
70
© 2018 ngocminhtran.com
SELECT MIN(Tên_cột_được_chọn)
FROM Tên_bảng
[WHERE điều_kiện];
Điều kiện WHERE có thể có hoặc không. Ví dụ lệnh SQL sau sẽ trả về giá trị nhỏ nhất
trong cột Price của bảng Products:
SELECT MIN(Price)
FROM Products;
Kết quả:
Chú ý: Cột có tiêu đề là MIN (Price) là cột phát sinh trong quá trình truy vấn. Nếu muốn
tên cột phù hợp hơn, ví dụ thay vì là MIN (Price) theo mặc định chúng ta sẽ thay đổi
thành SmallestPrice, chúng ta sẽ dùng từ khóa AS như sau:
SELECT MIN(Price) AS SmallestPrice
FROM Products;
Kết quả:
Đối lập với hàm MIN là hàm MAX với cú pháp:
SELECT MAX(Tên_cột_được_chọn)
FROM Tên_bảng
[WHERE điều_kiện];
Điều kiện WHERE có thể có hoặc không. Ví dụ lệnh SQL sau sẽ trả về giá trị lớn nhất
trong cột Price của bảng Products:
SELECT MAX(Price) AS LargestPrice
FROM Products;
Kết quả:
71
© 2018 ngocminhtran.com
Hàm SUM
Hàm SUM dùng để tính tổng các giá trị của cột được chọn. Cú pháp:
SELECT SUM(Tên_cột_được_chọn)
FROM Tên_bảng
[WHERE điều_kiện];
Điều kiện WHERE có thể có hoặc không. Ví dụ lệnh SQL sau tính tổng các giá trị từ cột
Quantity của bảng OrderDetails:
SELECT SUM(Quantity) AS Total_Quantity
FROM OrderDetails;
Kết quả:
Hàm AVG
Hàm AVG dùng để tính giá trị trung bình các giá trị của cột được chọn. Cú pháp:
SELECT AVG(Tên_cột_được_chọn)
FROM Tên_bảng
[WHERE điều_kiện];
Điều kiện WHERE có thể có hoặc không. Ví dụ lệnh SQL sau tính giá trị trung bình các
giá trị từ cột Price của bảng Products:
SELECT AVG(Price) AS Average_Price
FROM Products;
Kết quả:
Hàm COUNT
72
© 2018 ngocminhtran.com
Hàm COUNT dùng để đếm các giá trị của cột được chọn. Cú pháp:
SELECT COUNT(Tên_cột_được_chọn)
FROM Tên_bảng
[WHERE điều_kiện];
Điều kiện WHERE có thể có hoặc không. Ví dụ lệnh SQL sau đếm các sản phẩm dựa vào
cột ProductID của bảng Products:
SELECT COUNT(ProductID) AS NumOfProducts
FROM Products;
Kết quả:
12. Lệnh GROUP BY
Lệnh GROUP BY thường kết hợp với các hàm thống kê dùng để nhóm dữ liệu theo một
hay nhiều cột. Cú pháp tồng quát:
SELECT Tên_các_cột_hiển_thị
FROM Tên_bảng
[WHERE điều_kiện]
GROUP BY Tên_các_cột_dùng_để_nhóm_dữ_liệu
[ORDER BY Tên_các_cột_dùng_để_sắp_xếp];
Các lệnh WHERE và ORDER BY có thể có hoặc không. Lệnh SQL sau dùng để đếm
khách hàng trong bảng Customers dựa trên theo Country như sau:
SELECT COUNT(CustomerID) AS NumOfCustomers, Country
FROM Customers
GROUP BY Country;
Kết quả:
73
© 2018 ngocminhtran.com
Có thể kết hợp với lệnh GROUP BY để sắp xếp giá trị giảm dần theo số lượng thống kê:
SELECT COUNT(CustomerID) AS NumOfCustomers, Country
FROM Customers
GROUP BY Country
ORDER BY COUNT(CustomerID) DESC;
Kết quả:
12. Lệnh HAVING
Giống như WHERE, lệnh HAVING dùng để xác định điều kiện để lọc dữ liệu nhưng
khác với WHERE, HAVING dùng kết hợp với các hàm thống kê và GROUP BY. Cú
pháp tồng quát:
SELECT Tên_các_cột_hiển_thị
FROM Tên_bảng
[WHERE điều_kiện]
[GROUP BY Tên_các_cột_dùng_để_nhóm_dữ_liệu]
HAVING điều_kiện
[ORDER BY Tên_các_cột_dùng_để_sắp_xếp];
74
© 2018 ngocminhtran.com
Các lệnh WHERE, ORDER BY có thể có hoặc không. Ví dụ lệnh SQL sau dùng để đếm
khách hàng trong bảng Customers dựa trên theo Country và chỉ hiển thị những quốc gia
(Country) nào có từ 6 khách hàng trở lên:
SELECT COUNT(CustomerID) AS NumOfCustomers, Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;
Kết quả:
Tài liệu này chỉ nêu một số lệnh SQL cơ bản và thường sử dụng nhất. Chi tiết về ngôn
ngữ SQL có thể tìm hiểu tại https://www.w3schools.com/sql/default.asp.
Viết lệnh T-SQL trong các truy vấn
Giả sử chúng ta cần xem thông tin về Name và SortOrder của bảng Genre từ cơ sở dữ
liệu Album, chúng ta viết các lệnh T-SQL như sau:
use Album; select Name, SortOrder from GenreReview.Genre;
Có hai vấn đề cần chú ý từ lệnh T-SQL trên:
Dùng lệnh use để tham chiếu đến cơ sở dữ liệu cần truy vấn;
Kết thúc mỗi lệnh là dấu chấm phẩy.
Sau khi gõ lệnh T-SQL chúng ta sẽ lưu lại truy vấn bằng cách nhấn chuột phải vào tab
truy vấn
75
© 2018 ngocminhtran.com
Gõ tên (ví dụ giữ tên mặc định là SQLQuery1) và chọn vị trí lưu truy vấn.
Thực thi các truy vấn
Để thực thi các truy vấn chúng ta thực hiện các bước sau:
Mở truy vấn cần thực thi, ví dụ SQLQuery1 chúng ta vừa tạo bằng cách vào File
> Open > File
Nhấn vào nút !Execute trên thanh công cụ
Xem kết quả
76
© 2018 ngocminhtran.com
77
© 2018 ngocminhtran.com
Phần III
Một số vấn đề nâng
cao
78
© 2018 ngocminhtran.com
Trong phần này, chúng ta sẽ tìm hiểu một số kỹ thuật và đối tượng nâng cao trong SQL
Server gồm:
Các đối tượng views
Các đối tượng tạm (temporary objects)
Lập trình cơ bản trong SQL Server
Tạo chỉ mục (indexes)
Triggers
Các đối tượng views
View là một đối tượng chứa kết quả được thừa kế từ các truy vấn. Một view giống một
table, tức là cũng được tạo bởi các cột và các hàng.
Tạo một đối tượng view trong SQL Server Management Studio
Để tạo một đối tượng view chúng ta thực hiện các bước sau:
Tìm đến và mở rộng thư mục cơ sở dữ liệu cần tạo view (ví dụ Album), tìm đến
và nhấn chuột phải vào thư mục Views chọn New View
Bảng Add Table xuất hiện
79
© 2018 ngocminhtran.com
Chọn các bảng (ví dụ Genre và Review) và nhấn nút Add để thêm các bảng đến
môi trường thiết kế view:
80
© 2018 ngocminhtran.com
Trong bảng Genre chọn các cột Name và SortOrder, trong bảng Review chọn các
cột Title và GenreId
81
© 2018 ngocminhtran.com
Lưu view vừa tạo bằng cách nhấn chuột phải vào tab chọn Save…
Nhập tên view trong hộp Choose Name và nhấn OK
Đóng tab view.
82
© 2018 ngocminhtran.com
Trở lại thư mục Views trong cơ sở dữ liệu Album và mở rộng thư mục này để xem
view vừa tạo
Để xem kết quả từ AlbumView chúng ta tạo một truy vấn tên QueryAlbumView với các
lệnh T-SQL như sau:
use Album; select * from dbo.AlbumView;
Thực thi truy vấn
Thay đổi một đối tượng view trong SQL Server Management Studio
Chúng ta có thể thay đổi một đối tượng view có sẵn (ví dụ AlbumView) theo các bước
sau:
83
© 2018 ngocminhtran.com
Tìm đến view cần thay đổi, ví dụ AlbumView, và nhấn chuột phải chọn Design
Thêm cột Summary của bảng Review vào khung cửa sổ thứ hai bằng cách chọn
một ô trống tại cột Column và gõ Review.Summary:
84
© 2018 ngocminhtran.com
Kết quả
Lưu thay đổi (nhấn chuột phải vào tab view và chọn Save…) và đóng cửa sổ
Design.
Mở lại truy vấn QueryAlbumView đã tạo ở trên và thực thi
85
© 2018 ngocminhtran.com
Xóa một đối tượng view trong SQL Server Management Studio
Để xóa một đối tượng view, ví dụ AlbumView, chúng ta thực hiện như sau:
Tìm đến đối tượng view cần xóa, ví dụ AlbumView, và nhấn chuột phải chọn
Delete
Hộp thoại Delete Object xuất hiện, nhấn OK
86
© 2018 ngocminhtran.com
Các đối tượng tạm trong SQL Server (temporary
objects)
Khi truy vấn dữ liệu trong SQL Server, thỉnh thoảng chúng ta cần lưu trữ dữ liệu tạm thời
trong một đối tượng tạm nào đó để sử dụng cho những lần sau. Các đối tượng tạm phổ
biến trong SQL Server gồm:
Biểu thức bảng chung (Common table expressions - CTE)
Biến bảng (table variables)
Bảng tạm (temporary tables)
Biểu thức bảng chung (CTE)
87
© 2018 ngocminhtran.com
CTE là tập kết quả được định nghĩa khi thực thi các lệnh như SELET, INSERT,
UPDATE, DELETE, hay CREATE VIEW. CTE chỉ hợp lệ trong thời gian truy vấn và
không được lưu trữ giống như các đối tượng tạm khác. CTE được dùng để thay thế các
views, gộp dữ liệu, thực thi đệ quy, và tạo nhiều tham chiếu đến một bảng. Cú pháp CTE:
WITH <Tên_biểu_thức_CTE> [Danh_sách_các_cột]
AS (Truy_vấn)
Ví dụ tạo một truy vấn tên CTE_Query như sau:
use Album; with tempGenre As ( select Name from GenreReview.Genre ) select * from tempGenre;
Trong ví dụ trên chúng ta đã tạo một CTE tên tempGenre lưu trữ kết quả từ truy vấn:
select Name from GenreReview.Genre
tempGenre có thể được xem như một bảng tạm và chúng ta có thể xem nội dung từ bảng
này như các bảng thông thường:
select * from tempGenre;
Lưu ý rằng, bảng tempGenre chỉ được tạo khi chúng ta thực thi truy vấn CTE_Query và
sẽ bị hủy ngay khi CTE_Query hoàn thành.
Biến bảng
Khái niệm biến bảng tương tự biến cục bộ trong các ngôn ngữ lập trình được dùng để lưu
trữ số lượng dữ liệu nhỏ (dưới 500 hàng) và chỉ được dùng trong các hàm (functions), thủ
tục lưu trú (stored procedures), hay các lô dữ liệu (batch). Cú pháp biến bảng:
DECLARE @Tên_biến_bảng [AS] table
88
© 2018 ngocminhtran.com
(
[Danh_sách_các_cột_của_bảng]
)
Trước tên biến bảng luôn đi kèm biểu tượng @. Ví dụ tạo một biến bảng varTable
DECLARE @varTable AS table ( ID int, Name text ) insert into @varTable (ID,Name) values (1,'Minh') select * from @varTable;
Ví dụ trên khai báo một biến tên varTable gồm hai cột ID và Name. Sau khi bảng được
khai báo, chúng ta có thể chèn dữ liệu vào varTable và xem nội dung bảng như các bảng
thông thường.
Các bảng tạm
Các bảng tạm có hai phạm vi là toàn cục và cục bộ. Bảng tạm phạm vi cục bộ chỉ tồn tại
trong một phiên (session) giao dịch và sẽ bị hủy khi phiên kết thúc; bảng tạm phạm vi
toàn cục tồn tại trong các phiên và kết thúc khi phiên tạo bảng và các tham chiếu đến các
phiên khác bị đóng.
Bảng tạm cục bộ khai báo với ký hiệu # trước tên bảng, bảng tạm toàn cục khai báo với
ký hiệu ## trước tên bảng.
Các bảng tạm được khai báo với lệnh CREATE TABLE như tạo bảng thông thường. Ví
dụ khai báo bảng cục bộ tempTable:
CREATE TABLE #tempTable ( ID int, Name text ) insert into #tempTable (ID,Name) values (1,'Minh')
89
© 2018 ngocminhtran.com
select * from #tempTable;
Nhập môn lập trình trong SQL SERVER
T-SQL trong SQL Server cung cấp một tập các từ khóa cho phép chúng ta nhóm và thực
thi các lệnh như trong một ngôn ngữ lập trình.
Chú thích
Chúng ta có thể chú thích theo từng hàng bằng kí hiệu hai dấu gạch liên tiếp (--), ví dụ:
CREATE PROCEDURE displayGenres -- đây là hàng chú thích thứ nhất -- đây là hàng chú thích thứ hai AS BEGIN SELECT * FROM GenreReview.Genre END GO Và có thể chú thích nhiều hàng với cặp /*…*/, ví dụ:
CREATE PROCEDURE displayGenres /* đây là hàng chú thích thứ nhất đây là hàng chú thích thứ hai */ AS BEGIN SELECT * FROM GenreReview.Genre END GO
Các lệnh
Các lệnh T-SQL có thể được viết trong cặp từ khóa BEGIN…END. Cú pháp:
BEGIN
Lệnh T-SQL thứ nhất
Lệnh T-SQL thứ hai
…
90
© 2018 ngocminhtran.com
Lệnh T-SQL thứ n
END
Ví dụ:
use Album; BEGIN DECLARE @varTable AS table ( ID int, Name text ) insert into @varTable (ID,Name) values (1,'Minh') select * from @varTable; END
Khai báo biến
Như phần trên, từ khóa DECLARE dùng để khai báo biến bảng – là một biến kiểu table.
Từ khóa này cũng có thể dùng để khai báo một biến kiểu bất kỳ như kiểu int, text, v.v…
(xem lại các kiểu dữ liệu cơ bản trong SQL Server ở phần II ). Lưu ý tên biến bắt đầu
bằng ký hiệu @. Cú pháp:
DECLARE @tên_biến AS kiểu_dữ_liệu
Ví dụ khai báo biến x kiểu int
BEGIN DECLARE @x as int END
Biến có thể được gán giá trị khời tạo trong khi khai báo, ví dụ:
BEGIN DECLARE @x as int = 5 END
Hay sau khi khai báo dùng từ khóa SET, ví dụ:
91
© 2018 ngocminhtran.com
declare @x as int set @x = 5 set @x = @x + 5
In ra màn hình
Dùng từ khóa Print để in ra màn hình giá trị nào đó. Cú pháp:
PRINT giá_trị
Ví dụ:
BEGIN DECLARE @x as int = 1 PRINT @x END
Kết quả:
Cấu trúc điều kiện IF…ELSE
IF…ELSE thực thi một hay một nhóm lệnh T-SQL theo một điều kiện nào đó. Cú pháp:
IF điều_kiện
BEGIN
Nhóm lệnh T_SQL thứ nhất
END
ELSE
BEGIN
Nhóm lệnh T_SQL thứ hai
END
Thực thi nhóm lệnh T-SQL thứ nhất nếu thỏa điều kiện, ngược lại, thực thi nhóm lệnh T-
SQL thứ hai. Ví dụ:
BEGIN DECLARE @x as int = 1
92
© 2018 ngocminhtran.com
if (@x > 0) begin print 'x > 0' end else begin print 'x <= 0' end END
Kết quả:
Cấu trúc lặp WHILE
Thực hiện lặp theo một điều kiện nào đó. Cú pháp:
WHILE điều_kiện
BEGIN
Các lệnh T-SQL
END
Ví dụ:
begin declare @x as int = 1 while (@x < 5) begin print @x + ' ' set @x = @x + 1 end end
Kết quả:
93
© 2018 ngocminhtran.com
Trong WHILE có thể dùng kết hợp các từ khóa CONTINUE và BREAK. CONTINUE
bỏ qua một lần lặp theo điều kiện và di chuyển đến lần lặp kế tiếp. BREAK sẽ thoát khỏi
lệnh lặp theo điều kiện. Ví dụ dùng BREAK:
begin declare @x as int = 1 while (@x < 10) begin if (@x > 5) break else begin print @x end set @x = @x + 1 end end
Kết quả:
Ví dụ về CONTINUE
begin declare @x as int = 1 while (@x < 10) begin if (@x % 2 = 0) begin set @x = @x + 1 continue end else print @x set @x = @x + 1 end
94
© 2018 ngocminhtran.com
end
Kết quả:
Hàm do người dùng định nghĩa (user-defined functions)
Hàm là một nhóm lệnh thực thi một chức năng nào đó và có thể được sử dụng nhiều lần
bởi ứng dụng hay các hàm khác. Hàm luôn có giá trị trả về và giá trị trả về có thể là:
một giá trị đơn bất kỳ kiểu int, text, v.v. Những hàm này gọi là hàm vô hướng
(scalar functions)
một giá trị kiểu bảng (table-valued functions).
Hàm vô hướng
Định nghĩa
Hàm vô hướng trả về một giá trị đơn bất kỳ kiểu int, text, v.v. Cú pháp:
CREATE FUNCTION Tên_hàm (Danh sách tham số) RETURNS Kiểu_dữ_liệu_trả_về AS
BEGIN RETURN Biểu thức có giá trị là Kiểu_dữ_liệu_trả_về
END
Tạo hàm vô hướng
Để tạo hàm vô hướng chúng ta mở rộng thư mục cơ sở dữ liệu, ví dụ Album, tìm đến và
mở rộng thư mục Programmability tìm đến thư mục Functions. Nhấn chuột phải vào
Functions chọn New > Scalar-valued Function:
95
© 2018 ngocminhtran.com
Xóa tất cả nội dung trong trình soạn thảo hàm và nhập đoạn mã sau:
create function sumFunc (@x int, @y int) returns int as begin return @x + @y end GO
Đoạn mã trên tạo hàm tên sumFunc với hai tham số kiểu int là @x và @y. Hàm trả về
giá trị kiểu int là tổng @x và @y.
Thực thi truy vấn tạo hàm bằng cách nhấn Execute. Lưu hàm trên và đóng cửa sổ soạn
thảo hàm. Tìm trong thư mục Functions > Scalar-valued Function:
96
© 2018 ngocminhtran.com
Chỉnh sửa hàm
Chúng ta có thể chỉnh sửa nội dung hàm đã định nghĩa bằng cách nhấn chuột phải vào
hàm đó và chọn Modify. Ví dụ hàm sumFunc:
Xóa hàm
Có thể xóa một hàm đã định nghĩa bằng cách nhấn chuột phải vào hàm đó chọn Delete, ví
dụ:
97
© 2018 ngocminhtran.com
Sử dụng hàm
Hàm sau khi được tạo có thể được sử dụng trong ứng dụng. Ví dụ tạo một truy vấn mới
sử dụng hàm sumFunc như sau:
begin declare @a as int = 1 declare @b as int = 2 print dbo.sumFunc(3, 5) declare @c as int set @c = dbo.sumFunc(@a,@b) print @c end
Kết quả:
98
© 2018 ngocminhtran.com
Hàm trả về giá trị kiểu bảng
Hàm Inline Table-valued Function
Hàm trả về tập dữ liệu từ một lệnh SELECT và hàm này còn được gọi là hàm Inline
Table-valued. Cú pháp:
CREATE FUNCTION Tên_hàm ( Danh sách tham số ) RETURNS TABLE AS RETURN ( SELECT... ) GO
Ví dụ tạo hàm getID như sau:
- Nhấn chuột phải tại thư mục Functions và chọn Inline Table-valued Function
- Xóa tất cả nội dung trong cửa sổ tạo hàm và thay bằng đoạn mã sau:
CREATE FUNCTION getID ( @id INT ) RETURNS TABLE AS RETURN ( SELECT * FROM GenreReview.Genre WHERE Genre.Id = @id ) GO
99
© 2018 ngocminhtran.com
- Nhấn nút Execute để thực thi truy vấn tạo hàm getID. Lưu và đóng truy vấn vừa tạo.
Trong thư mục Functions mở thư mục Table-value Functions
- Sử dụng hàm getID bằng cách tạo một truy vấn mới với nội dung sau:
select * from dbo.getID(2);
Kết quả:
Hàm Multi-statement Table-valued Function
Nếu hàm kiểu Inline Table-valued Function chỉ đơn giản là trả về một bảng từ một lệnh
SELECT, hàm Multi-statement Table-valued Function cũng trả về một bảng nhưng có
chứa một hay nhiều lệnh T-SQL thực hiện một điều kiện nào đó. Cú pháp:
CREATE FUNCTION Tên_hàm ( Danh sách các tham số ) RETURNS Tên_biến_bảng TABLE ( Danh sách các cột của bảng ) AS BEGIN Các lệnh thực thi RETURN END
Ví dụ tạo hàm getID_Muti như sau:
- Nhấn chuột phải vào thư mục Functions chọn New > Muti-statement Table-valued
Function
100
© 2018 ngocminhtran.com
- Xóa tất cả nội dung trong cửa sổ tạo hàm và thay bằng đoạn mã sau:
CREATE FUNCTION getID_Multi ( @id INT ) RETURNS @DataTable TABLE ( Id INT, Name NCHAR(100), SortOrder INT ) AS BEGIN WITH tempTable (id, name, sortorder) AS ( SELECT * FROM GenreReview.Genre WHERE Genre.Id = @id ) INSERT INTO @DataTable SELECT * FROM tempTable RETURN END GO
- Nhấn nút Execute để thực thi truy vấn tạo hàm getID_Multi. Lưu và đóng truy vấn vừa
tạo. Trong thư mục Functions mở thư mục Table-value Functions
101
© 2018 ngocminhtran.com
- Sử dụng hàm getID bằng cách tạo một truy vấn mới với nội dung sau:
select * from dbo.getID_Multi(2);
Kết quả:
Xóa và chỉnh sửa các hàm trả về giá trị bảng giống với các hàm vô hướng.
Thủ tục thường trú (stored procedures)
Định nghĩa
Thủ tục thường trú, giống như hàm, là một nhóm lệnh thực thi một chức năng nào đó và
có thể được sử dụng nhiều lần bởi ứng dụng. Điểm khác biệt giữa thủ tục thường trú và
hàm là thủ tục thường trú không trả về một giá trị (do đó không có từ khóa RETURN
giống hàm). Cú pháp định nghĩa một thủ tục thường trú:
CREATE PROCEDURE Tên_thủ_tục Danh sách các tham số AS BEGIN Các lệnh thực thi END GO Chú ý các tham số không phải đặt trong cặp ngoặc đơn giống hàm.
Tạo thủ tục
Để tạo một thủ tục thường trú chúng ta thực hiện như sau:
102
© 2018 ngocminhtran.com
- Trong thư mục Programmability tìm đến thư mục Stored Procedures và nhấn chuột
phải vào thư mục này chọn New Stored Procedure:
- Trong cửa sổ soạn thảo nội dung chúng ta xóa hết nội dung mặc định và thay bằng nội
dung sau:
CREATE PROCEDURE sumProc @x int, @y int AS BEGIN print @x+@y END GO
- Thực thi truy vấn tạo thủ tục sumProc bằng cách nhấn nút Execute. Lưu và đóng truy
vấn vừa tạo. Xem thủ tục vừa tạo trong thư mục Stored Procedures:
Sử dụng thủ tục
Chúng ta có thể sử dụng thủ tục thường trú bằng lệnh EXEC. Ví dụ tạo một truy vấn sử
dụng thủ tục sumProc có nội dung như sau:
begin declare @a int = 1
103
© 2018 ngocminhtran.com
declare @b int = 2 exec dbo.sumProc 2,3 exec dbo.sumProc @a, @b end
Chú ý các tham số không phải đặt trong cặp ngoặc đơn giống hàm. Kết quả:
Ví dụ về thủ tục thường trú không chứa tham số:
CREATE PROCEDURE displayGenres --không chứa tham số AS BEGIN SELECT * FROM GenreReview.Genre END GO
Tạo một truy vấn dùng thủ tục này:
exec dbo.displayGenres;
Xóa hay chỉnh sửa các thủ tục thường trú bằng cách nhấn chuột phải vào thủ tục thường
trú và chọn Delete hay Modify.
104
© 2018 ngocminhtran.com
Triggers
Định nghĩa và cú pháp
Trigger là một tập các lệnh SQL dùng để thực hiện một chức năng nào đó. Trigger được
xem là một kiểu thủ tục thường trú đặc biệt, nhưng khác thủ tục hay hàm, trigger thực thi
chỉ khi một người dùng hay ứng dụng cố gắng chỉnh sửa dữ liệu bằng ngôn ngữ DML
(Data Manipulation Language) gồm các thao tác như INSERT, UPDATE, hay DELETE
trên các bảng hay views.
Trigger bao gồm các kiểu:
AFTER: thực thi sau khi xuất hiện một sự kiện DML.
INSTEAD OF: nếu một thao tác INSERT xuất hiện, trigger INSTEAD OF sẽ thực
thi tại nơi dữ liệu được chèn.
CLR: Vì SQL Server tích hợp với .NET Framework CLR nên chúng ta có thể tạo
CLR triggers bằng các ngôn ngữ .NET.
Cú pháp tạo một trigger AFTER như sau:
CREATE TRIGGER Lược_đồ_cơ_sở_dữ_liệu.Tên_trigger ON Lược_đồ_cơ_sở_dữ_liệu.Tên_bảng AFTER [INSERT| DELETE | UPDATE] AS BEGIN END GO
Trigger trên sẽ thực thi sau khi thao tác INSERT, DELETE hay UPDATE xảy ra. Ví dụ
định nghĩa một trigger như sau:
CREATE TRIGGER GenreReview.Insert_Check ON GenreReview.Genre AFTER INSERT AS BEGIN PRINT 'CHÈN THÀNH CÔNG' END GO
Trigger Insert_Check sẽ thực thi sau khi một hàng dữ liệu được chèn vào bảng Genre.
105
© 2018 ngocminhtran.com
Tạo trigger
Chúng ta có thể tạo trigger (kiểu AFTER) trong SQL Server Management Studio bằng
cách chọn và mở rộng một bảng bất kỳ, ví dụ bảng Genre, tìm đến thư mục Triggers.
Nhấn chuột phải vào thư mục Triggers chọn New Trigger:
Xóa tất cả nội dung mặc định trong cửa sổ soạn thảo trigger và thay bằng nội dung sau:
CREATE TRIGGER GenreReview.Insert_Check ON GenreReview.Genre AFTER INSERT AS BEGIN PRINT 'CHÈN THÀNH CÔNG' END GO
Thực thi truy vấn tạo trigger bằng cách nhấn nút Execute!. Lưu và đóng cửa sổ truy vấn
tạo trigger. Có thể kiểm tra lại trigger trong thư mục Triggers của bảng Genre:
106
© 2018 ngocminhtran.com
Tạo một truy vấn mới thêm vào bảng Genre một hàng mới như sau:
USE Album; INSERT INTO GenreReview.Genre (Id,Name,SortOrder) VALUES (6, 'Zumba', 20);
Thực thi truy vấn, kết quả:
Chúng ta thấy rằng trigger Insert_Check đã thực thi sau khi chèn thành công.
Có thể xóa hay chỉnh sửa các triggers bằng cách nhấn chuột phải vào triggers và chọn
Delete hay Modify:
Quản lý theo chỉ mục (indexes)
Định nghĩa và cú pháp
Chỉ mục (index) có thể được dùng trong các bảng giúp cho việc tìm kiếm hay truy vấn dữ
liệu được nhanh hơn. Cú pháp tạo một chỉ mục:
107
© 2018 ngocminhtran.com
CREATE INDEX Tên_chỉ_mục
ON Tên_bảng (Danh_sách_các_cột);
Nếu muốn tạo một chỉ mục duy nhất, có thể dùng cú pháp:
CREATE UNIQUE INDEX Tên_chỉ_mục
ON Tên_bảng (Danh_sách_các_cột);
Ví dụ tạo một chỉ mục trên cột Name của bảng Genre như sau:
use Album; create index idx_name on GenreReview.Genre (Name);
Dùng chỉ mục giúp việc truy vấn và tìm kiếm nhanh nhưng sẽ làm thao tác cập nhật dữ
liệu chậm hơn so với khi không có chỉ mục. Do đó, chỉ sử dụng chỉ mục cho những cột
thường xuyên dùng để truy vấn hay tìm kiếm.
Xóa chỉ mục
Dùng lệnh DROP để xóa chỉ mục theo cú pháp:
DROP INDEX Tên_bảng.Tên_chỉ_mục;
Ví dụ:
use Album; drop index GenreReview.Genre.idx_name