1
Chương 5
Ngôn ngữ SQL
2
Nội dung
Giới thiệu chung Nhóm lệnh DDL Nhóm lệnh DML Câu lệnh SELECT Lệnh Insert Lệnh Delete Lệnh Update
3
Giới thiệu chung ngôn ngữ SQL
Là ngôn ngữ chuẩn cho các CSDL quan hệ
Đặc điểm của ngôn ngữ SQL:
Ngôn ngữ tựa tiếng Anh
Ngôn ngữ phi thủ tục
4
Giới thiệu chung ngôn ngữ SQL
Gồm 3 nhóm lệnh:
DDL (Data Definition Language)
DML (Data Manipulation Language)
DCL (Data Control Language)
5
DDL
Là ngôn ngữ định nghĩa dữ liệu gồm các lệnh
CREATE/ALTER/DROP DATABASE
CREATE/ALTER/DROP TABLE
6
DML
Là ngôn ngữ thao tác dữ liệu
Gồm các lệnh:
SELECT
INSERT
UPDATE
DELETE
7
DCL
Là ngôn ngữ điều khiển dữ liệu Gồm các lệnh
GRANT/REVOKE/DENY
COMMIT/ROLLBACK
8
Tạo CSDL CREATE DATABASE
CREATE DATABASE database_name
[ ON
[ < filespec > [ ,...n ] ] [ , < filegroup > [ ,...n ] ]
] [ LOG ON { < filespec > [ ,...n ] } ]
9
CREATE DATABASE - Filespec/filegroup < filespec > ::=
( NAME = logical_name,
FILENAME = 'path\filename', SIZE = size_in_MB, MAXSIZE = size_in_MB | UNLIMITED, FILEGROWTH = %_or_MB )
] }
10
CREATE DATABASE Sales ON PRIMARY ( NAME = SPri1_dat,
Ví dụ lệnh tạo CSDL
FILENAME = 'c:\program files\data\SPri1dat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 15% ),
( NAME = SPri2_dat,
continued
FILENAME = 'c:\program files\data\SPri2dt.ndf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 15% ), FILEGROUP SalesGroup1 ( NAME = SGrp1Fi1_dat,
FILENAME = 'c:\program files\data\SG1Fi1dt.ndf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 )
( NAME = SGrp1Fi2_dat,
11
Ví dụ lệnh tạo CSDL
FILENAME = 'c:\program files\data\SG1Fi2dt.ndf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ), LOG ON ( NAME = 'Sales_log',
FILENAME = 'c:\program files\data\salelog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB )
GO
12
Thay đổi cấu trúc CSDL ALTER DATABASE
Thêm files hay filegroups vào CSDL Thêm log files vào CSDL Xoá files hay filegroups từ 1 CSDL Cài đặt các tuỳ chọn của CSDL
13
ALTER DATABASE
ALTER DATABASE database_name
ADD FILE filespec [TO FILEGROUP filegroup_name]
| ADD LOG FILE filespec
| REMOVE FILE logical_filename
| ADD FILEGROUP filegroup_name
| REMOVE FILEGROUP filegroup_name
| MODIFY FILE filespec
| MODIFY FILEGROUP filegroup_name filegroup_property
14
Xoá CSDL Dropping a database
Khi 1 CSDL bị xóa thì tất cả các file vật lý của nó cũng sẽ
Cú pháp:
bị xóa
DROP DATABASE database_name
15
Tạo bảng - CREATE TABLE
CREATE TABLE [ database_name.[ owner .]] table_name
({ < column_definition >
|column_name AS computed_column_expression | < table_constraint > } [ ,...n ]
) [ ON { filegroup | DEFAULT } ]
16
Định nghĩa cột - Column definition
< column_definition > ::=
{ column_name data_type } [ [ DEFAULT constant_expression ] | [ IDENTITY [ ( seed , increment ) ] ] ] [ < column_constraint > ] [ ...n ]
Ví dụ 1
CREATE TABLE cthoadon
( sohd int NOT NULL,
MaHang char(4) NOT NULL,
SoLuong int NOT NULL,
DonGia money,
ThanhTien AS SoLuong*DonGia
17
)
IDENTITY [ ( seed , increment )]
Tạo giá trị gia tăng duy nhất cho 1 cột, và cột này thường được dùng làm khoá chính cho bảng. Chỉ dùng các kiểu dữ liệu sau: tinyint, smallint, int, bigint, decimal(p,0).
Trong mỗi bảng chỉ cho phép 1 cột là identity mà thôi.
Seed: là giá trị đầu tiên được tạo.
Increment: là bước tăng để tạo ra giá trị kế tiếp.
Giá trị mặc định thường là (1,1).
18
Ví dụ 2
CREATE TABLE jobs
job_id smallint IDENTITY(1,1) ,
(
)
19
job_desc varchar(50) NOT NULL
20
Cách khai báo ràng buộc cột
[ CONSTRAINT constraint_name ]
{ { PRIMARY KEY | UNIQUE }
| [ FOREIGN KEY ] REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET
DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET
DEFAULT } ]
| CHECK ( logical_expression ) }
Ví dụ 1
CREATE TABLE jobs
job_id smallint PRIMARY KEY NOT NULL,
(
DEFAULT 'New Position - title not formalized yet'
job_desc varchar(50) NOT NULL
21
)
Ví dụ 2
CREATE TABLE Employee
LastName varchar(20) NOT NULL,
( EmpID int primary key NOT NULL,
job_id smallint NOT NULL DEFAULT 1 REFERENCES jobs(job_id)
)
22
FirstName varchar(10) NOT NULL,
23
Ví dụ các ràng buộc Check
CHECK (cContractCode LIKE '[0-9][0-9][0-9][0-9]')
CHECK (mTotalPaid BETWEEN 0 AND 50000)
CHECK(cCity IN ('Berkeley', 'Boston', 'Chicago', ' Dallas‘))
24
Các mức ràng buộc
Có hai mức ràng buộc : Mức cột (Column level)
Mức bảng (Table level)
Ràng buộc mức bảng: tương tự như ràng buộc mức cột nhưng điều kiện ràng buộc có thể liên quan đến nhiều cột
25
Ví dụ về ràng buộc mức bảng
CREATE TABLE cthoadon
( sohd int NOT NULL,
MaHang char(4) NOT NULL,
SoLuong int NOT NULL,
DonGia money,
CONSTRAINT pk_ctHoadon primary key(sohd, MaHang)
)
26
Lệnh ALTER TABLE ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ]
table_name
{ ALTER COLUMN column_name { [ type_schema_name. ] type_name
| [ WITH { CHECK | NOCHECK } ]
| ADD { | |
| } [ ,...n ]
| DROP { [ CONSTRAINT ] constraint_name | COLUMN column_name } [
,...n ]
| { CHECK | NOCHECK } CONSTRAINT { ALL | constraint_name [ ,...n ] } | { ENABLE | DISABLE } TRIGGER { ALL | trigger_name [ ,...n ] }
27
Cú pháp lệnh SELECT
SELECT [ ALL | DISTINCT ]
[TOP ( expression ) [PERCENT] [ WITH TIES ] ]
[ FROM {
[ WHERE search_condition ]
[ GROUP BY group_by_expression [ HAVING search_condition ] ]
[ ORDER BY order_expression [ ASC | DESC ] ]
28
Mệnh đề SELECT
TOP n [PERCENT]: chỉ xuất n hàng đầu tiên hay n% của
WITH TIES: cho phép 1 số hàng được thêm vào bảng kết quả gốc nếu các hàng này có cùng giá trị trong cột ORDER BY với hàng cuối cùng của n hàng đầu tiên được xác định.
các hàng của bảng kết quả.
29
Ví dụ
Liệt kê 3 hoá đơn có cước phí cao nhất
SELECT top 3 with ties OrderID, Freight
FROM Orders
ORDER BY Freight DESC
Nếu hàng thứ tư có cùng cước phí (freight) với hàng thứ ba
trong bảng kết quả thì sao???
Không WITH TIES
Có WITH TIES
30
Tham số
| {
{ * | { table_name | view_name | table_alias }.*
[ { table_name | view_name | table_alias }. ]
| expression [ [ AS ] column_alias ] } | column_alias = expression
} [ ,...n ]
{ column_name}
31
Ví dụ
SELECT ShopperName = vFirstName +’ ‘+ vLastName,
FROM Shoppers
year(getdate()) – year(dBirthDate) AS Tuoi
32
Các hàm tập hợp (Aggregate function)
Tên hàm
Ý nghĩa
SUM MIN
Tính tổng các số Trả về giá trị nhỏ nhất
MAX
Trả về giá trị lớn nhất
AVG
Tính giá trị trung bình
COUNT
Đếm số phần tử
33
Ví dụ các hàm gộp trong lệnh select
SELECT sum(Freight) from dbo.Orders
SELECT count(OrderID) from dbo.Orders
Tính tổng cước phí chuyên chở của tất cả hoá đơn
SELECT SUM(UnitPrice*Quantity*(1-Discount)) FROM
Đếm số hoá đơn
dbo.[Order Details]
Tính doanh số bán hàng
34
Mệnh đề FROM/JOIN
[ FROM {
{
table_or_view_name [ [ AS ] table_alias ]
| rowset_function [ [ AS ] table_alias ]
| user_defined_function [ [ AS ] table_alias ]
|
}
35
Mệnh đề FROM/JOIN
::=
{
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } }
JOIN
36
Ví dụ 1
SELECT DISTINCT o. cToyID, cToyName FROM orders o JOIN orderDetails d
ON o.cOrderNo = d.cOrderNo JOIN Toys t ON d.cToyId = t.cToyId
WHERE datediff(mm, dOrderDate,getdate())
37
Ví dụ 2
SELECT OrderID,p.ProductID, ProductName, CategoryName , Quantity FROM [Order Details] o JOIN Products p ON o.ProductID = p.ProductID JOIN Categories c ON p.CategoryID =
c.CategoryID
38
Ví dụ 3
SELECT p.pub_name, p.state, a.au_lname,
a.au_fname, a.state
FROM publishers p INNER JOIN authors a
ON a.state > p.state
WHERE p.pub_name = 'New Moon Books'
ORDER BY au_lname ASC, au_fname ASC
39
Kết nối trái - LEFT OUTER JOIN
FROM authors a LEFT OUTER JOIN publishers p ON a.city
SELECT a.au_fname, a.au_lname, p.pub_name
ORDER BY p.pub_name ASC, a.au_lname ASC, a.
= p.city
au_fname ASC
40
Mệnh đề WHERE
Dùng để lọc (filter) đầu ra của mệnh đề FROM, hạn chế
Điều kiện trong mệnh đề WHERE có thể chứa:
Dữ liệu trong các bảng
Các toán tử so sánh, toán tử Boolean
Biểu thức
Các hàm có sẵn hay các hàm của người dùng.
các hàng dữ liệu được trả về trong bảng kết quả.
41
Mệnh đề WHERE
Các toán tử hay dùng trong biểu thức điều kiện:
BETWEEN ..AND
IN
LIKE
EXISTS
42
Ví dụ
SELECT * FROM Toys
SELECT Contactname
FROM dbo.CUSTOMERS
WHERE siToyQOH BETWEEN 10 and 19
WHERE CITY IN ('LONDON', 'BERLIN', 'MADRID')
43
Mệnh đề ORDER BY
Xác định thứ tự của bảng kết quả
Cú pháp
[ ORDER BY { order_by_expression [ ASC | DESC ] } [ ,...n] ]
DESC (descending): xếp theo thứ tự giảm
ASC (ascending) : xếp theo thứ tự tăng
44
Mệnh đề GROUP BY
Mệnh đề GROUP BY dùng để nhóm dữ liệu ALL: bảng kết quả sẽ chứa tất cả các nhóm kể cả những nhóm không thỏa mãn điều kiện lọc trong trong mệnh đề WHERE, những nhóm không thoả điều kiện sẽ có giá trị null.
group_by_expression: biểu thức dùng để xác định cột
[ GROUP BY [ ALL ] group_by_expression [ ,...n ]
được nhóm
45
Ví dụ 1
SELECT Type, Advance = SUM (Advance) FROM Titles WHERE Type IN ('business', 'mod_cook', 'trad_cook') GROUP BY Type
46
GROUP BY và HAVING
Có thể hạn chế các nhóm trong bảng kết quả bằng
Chỉ sau khi dữ liệu đã được nhóm và tổng hợp , điều
mệnh đề HAVING.
Không thể dùng các cột mà nó không tham gia vào hàm gộp của mệnh đề SELECT hay của mệnh đề GROUP BY.
kiện trong mệnh đề HAVING mới được áp dụng.
SELECT pub_id, AVG(price) FROM titles GROUP BY pub_id HAVING (AVG(price) > 10)
47
Ví dụ
SELECT titles.pub_id, AVG(titles.price)
ON titles.pub_id = publishers.pub_id
FROM titles INNER JOIN publishers
GROUP BY titles.pub_id HAVING AVG(price) > 10
WHERE publishers.state = 'CA'
48
Truy vấn con - Subqueries
Subquery là lệnh SELECT được đặt lồng vào bên
trong các lệnh SELECT, INSERT, UPDATE, hay DELETE, hay bên trong truy vấn con khác.
Subquery có thể được dùng bất kỳ nơi nào mà
biểu thức được phép dùng
49
Ví dụ Subqueries
SELECT Ord.OrderID, Ord.OrderDate,
(SELECT MAX(OrdDet.UnitPrice)
FROM Northwind.dbo.[Order Details] AS
OrdDet WHERE Ord.OrderID =OrdDet.OrderID)
AS MaxUnitPrice
FROM Northwind.dbo.Orders AS Ord
50
Subqueries
Subquery có thể được dùng theo 1 trong các
dạng sau: WHERE expression [NOT] IN (subquery) WHERE expression comparison_operator [ANY |
ALL] (subquery)
WHERE [NOT] EXISTS (subquery)
51
Subquery với các toán tử so sánh
52
Nhập dữ liệu
53
Lệnh INSERT/ Values
Lệnh dùng để thêm các hàng vào 1 bảng hay
view.
54
Ví dụ 1
CREATE TABLE dbo.Departments
(DeptID tinyint NOT NULL PRIMARY KEY,
DeptName nvarchar(30), Manager nvarchar(50));
GO
INSERT INTO dbo.Departments
VALUES (1, 'Human Resources', 'Margheim'),
(2, 'Sales', 'Byham'), (3, 'Finance', 'Gill'),
(4, 'Purchasing', 'Barber'),
(5, 'Manufacturing', 'Brewer');
55
Chèn dữ liệu Giá trị có thể được phát tự động cho các cột sau:
Cột IDENTITY Cột có kiểu dữ liệu timestamp Cột có giá trị default Cột có thể có giá trị null
Khi dùng giá trị DEFAULT :
Những cột có giá trị default sẽ được thêm vào với giá trị
default của nó
Những cột IDENTITY sẽ nhận được giá trị identity kế tiếp Những cột timestamp sẽ nhận các giá trị thích hợp kế tiếp Tất cả cột khác sẽ nhận giá trị NULL
56
Ví dụ 2
CREATE TABLE dbo.T1 ( column_1 int IDENTITY,
column_2 varchar(30) DEFAULT ('my column default'), column_3 timestamp, column_4 varchar(40) NULL );
GO
INSERT INTO dbo.T1 (column_4) VALUES ('Explicit value');
INSERT INTO dbo.T1 (column_2, column_4) VALUES ('Explicit value', 'Explicit
value');
INSERT INTO dbo.T1 (column_2) VALUES ('Explicit value');
INSERT INTO T1 DEFAULT VALUES;
57
Ví dụ 3
CREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 VARCHAR(30)); GO INSERT T1 VALUES ('Row #1'); INSERT T1 (column_2) VALUES ('Row #2'); GO SET IDENTITY_INSERT T1 ON; GO INSERT INTO T1 (column_1,column_2) VALUES (-99, 'Explicit identity value'); GO
58
INSERT/SELECT
Truy vấn con SELECT trong lệnh INSERT được dùng để tạo 1 bộ kết quả (result set) từ 1 hay nhiều bảng chèn vào 1 bảng khác
Một hay nhiều hàng được thêm vào cùng 1 lúc.
59
INSERT/SELECT
INSERT dbo.EmployeeSales SELECT 'SELECT', e.EmployeeID, c.LastName, sp.SalesYTD
FROM Employee AS e INNER JOIN SalesPerson AS sp ON e.EmployeeID = sp.SalesPersonID INNER JOIN Contact AS c ON e.ContactID = c.ContactID WHERE e.EmployeeID LIKE '2%' ORDER BY e.EmployeeID, c.LastName;
60
Lệnh UPDATE
Lệnh update dùng để thay đổi giá trị hiện có trong 1 bảng. Cú pháp:
61
Ví dụ 1 lệnh UPDATE
update dbo.Products
set UnitPrice= UnitPrice*1.1
Ý nghĩa lệnh??
where ProductID= 14
Tăng sản phẩm có mã 14 lên 10%
62
Mệnh đề FROM
UPDATE dbo.Contact SET IsCustomer = 1 WHERE ContactID
IN (SELECT ContactID
Mệnh đề FROM cho phép kết nối bảng đang được cập
FROM
nhật với các nguồn dữ liệu khác.
dbo.[Order])
UPDATE dbo.Contact SET IsCustomer = 1 FROM dbo.Contact AS C JOIN dbo.[Order] AS O ON C.ContactID = O.ContactID
Ý nghĩa?? Cách khác?? Cập nhật trường IsCustomer đánh dấu khách hàng nào
đã thực sự mua hàng
63
Lệnh DELETE Lệnh DELETE dùng để xoá các hàng trong 1 bảng. Cú pháp:
Caution: SQL Server has no inherent ‘‘undo’’
command.
64
Ví dụ 1- lệnh Delete
USE OBXKites; DELETE FROM dbo.Product WHERE ProductID = ‘DB8D8D60-76F4-46C3-90E6’ Ý nghĩa lệnh?
65
Ví dụ 2 - lệnh DELETE
DELETE dbo.Product
FROM dbo.Product JOIN dbo.ProductCategory ON Product.ProductCategoryID
= ProductCategory.ProductCategoryID
WHERE ProductCategory.ProductCategoryName =
‘Video’;
Ý Nghĩa??