2.3.2.1. Ngôn ngữ định nghĩa dữ liệu
Phần này đề cập đến lệnh tạo (thay thế), xóa bảng và khung nhìn, có thể tham khảo lệnh /dbschema.
2.3.2.1.1. Creating Tables
Create [or Replace] Table TableName (Column1 Type1
[ColumnConstraint1], ..., ColumnN TypeN [ColumnConstraintN] [, TableConstraints])
Bao gồm các ràng buộc:
- Not Null: Giá trị không rỗng
- Primary Key (Column, …, Column): Khóa chính gồm một hay nhiều trường.
- Unique (Column, …, Column): Tính duy nhất cho một hay nhiều trường, có thể dùng cú pháp: Candidate Key (Column, …, Column). - Foreign Key (Column1, …, ColumnN) References TableName [(Col-
umn1, …, ColumnN)]: Khóa ngoại gồm một hay nhiều trường. - Determined By Column: chức năng phụ thuộc giữa các trường. - Check (CheckConstraint): ràng buộc check bao gồm:
o Condition: mệnh đề Where
o (ColumnR1,..., ColumnRN) Determined By (ColumnL1,...,
ColumnLN). Functional dependency: ColumnL1,...,ColumnLN → ColumnR1,...,ColumnRN
Bao gồm các kiểu dữ liệu cơ bản:
- Char (n): Kiểu chuỗi với độ dài cố định - Varchar (n): Kiểu chuỗi với độ dài chính xác - Integer (or Int): Số nguyên
Ví dụ 2.7
Create Table t (a int primary key, b string)
Create or Replace Table s (a int, b int Referrence t(a), Primary key (a,b))
DES> create or replace table t(a int, b int, c int, d int, primary key (a,c)) DES> insert into t values (1,2,3,4)
Info: 1 tuple inserted.
DES> /assert t(X,Y,Z,U) :- X=1, Y=2, Z=3, U=4 DES> /listing t(1,2,3,4) t(X,Y,Z,U) :- X=1, Y=2, Z=3, U=4. 2.3.2.1.2. Creating Views
Create [or Replace] View ViewName (Column1, … ,ColumnN) As SQLStatement
Cú pháp định nghĩa khung nhìn tương tự như định nghĩa bảng. Nếu mệnh đề [or Replace] được sử dụng, khung nhìn bị xóa nếu tồn tại. Các bộ dữ liệu hoặc các quy tắc xác định (với lệnh /assert) sẽ không bị xóa. Khung nhìn được tạo ra với các câu lệnh SQL sqlStatement như đã định nghĩa.
2.3.2.1.3. Dropping Tables
Ví dụ 2.8
Drop Table t;
2.3.2.1.4. Dropping Views Drop View ViewName
Ví dụ 2.9
Drop View v;
2.3.2.1.5. Renaming Tables/Views
Rename Table/View TableName/ViewName To NewTableName/NewViewName
2.3.2.1.6. Dropping Databases Drop Database
Câu lệnh xóa dữ liệu hiện tại, xóa tất cả các bảng, khung nhìn và các quy tắc. Kết quả chính xác như lệnh /abolish.
Ví dụ 2.10
Drop Database;
2.3.2.2. Ngôn ngữ thao tác dữ liệu
2.3.2.2.1. Lệnh Insert
Insert into TableName [(Col1,..,ColN)] Values (Cte1,…,CteN) [,…,(Cte1,…,CteN)]
Ví dụ 2.11
Create Table t(a int, b int) Insert into t Values (1,1)
Dạng lệnh Insert có lồng vào câu lệnh SQL:
Insert into TableName [Col1, …, ColN)] SQLStatement
Ví dụ 2.12
Insert into t Select * from t 2.3.2.2.2. Lệnh Delete
Ví dụ 2.13
Delete from t where a>0
Dùng bí danh alias và lồng truy vấn con: Delete from Contracts C
Where not Exists (Select *
From Contains
Where Reference = C.Reference); 2.3.2.2.3. Lệnh Update
Update TableName [[As] Indentifier] Set Att1=Expr1, …, AttN=ExprN [Where Condition]
Ví dụ 2.14
Update Employees Set Salary=Salary*1.1
Where id In (Select id From Promoted Where Year=’2014’);
2.3.2.3. Ngôn ngữ truy vấn dữ liệu
Câu lệnh Select được sử dụng để truy xuất dữ liệu từ các dòng và các cột của một hay nhiều bảng, khung nhìn (view). Câu lệnh này có thể dùng thể thực hiện phép chọn (tức là truy xuất một tập con trong một hay nhiều bảng), phép chiếu (tức là truy xuất một tập con các cột trong một hay nhiều bảng) và phép nối (tức là liên kết các dòng trong hai hay nhiều bảng để truy xuất dữ liệu). Ngoài ra, câu lệnh này còn cung cấp khả năng thực hiện các thao tác truy vấn và thống kê dữ liệu phức tạp khác.
Select [Distinct|All] ProjectionList [From Relations
[Where Condition]
Trong đó:
- ProjectionList: Danh sách chọn trong câu lệnh SELECT được sử dụng để chỉ định các trường, các biểu thức cần hiển thị trong các cột của kết quả truy vấn. Các trường, các biểu thức được chỉ định ngay sau từ khoá SELECT và phân cách nhau bởi dấu phẩy. Nếu chọn tất cả các trường thì dùng dấu *.
- Distinct: Loại bỏ các dòng dữ liệu giống nhau. - All: Liệt kê tất cả các dòng dữ liệu.
- Relation: Trong câu lệnh SELECT được sử dụng nhằm chỉ định các bảng và khung nhìn cần truy xuất dữ liệu. Sau FROM là danh sách tên của các bảng và khung nhìn tham gia vào truy vấn, tên của các bảng và khung nhìn được phân cách nhau bởi dấu phẩy.
- Condition: Trong câu lệnh SELECT được sử dụng nhằm xác định các điều kiện đối với việc truy xuất dữ liệu. Sau mệnh đề WHERE là một biểu thức logic và chỉ những dòng dữ liệu nào thoả mãn điều kiện được chỉ định mới được hiển thị trong kết quả truy vấn.
Các toán tử thường dùng trong mệnh đề WHERE:
Toán tử so sánh: =, < >, <, >, >= và <=;
Toán tử kết hợp điều kiện: AND, OR và NOT;
Hằng số logic: TRUE, FALSE;
Kiểm tra giới hạn dữ liệu: BETWEEN, NOT BETWEEN;
Toán tử làm việc trên tập hợp: IN, NOT IN;
Toán tử kiểm tra tồn tại: EXITSTS;
Toán tử LIKE, NOT LIKE và các ký tự đại diện:
o %: Chuỗi ký tự có chiều dài bất kỳ;
o - : Một ký tự bất kỳ;
o [ ]: Một ký tự nằm trong giới hạn được chỉ định;
- OrdExpressions: Sau ORDER BY là danh sách các cột cần sắp xếp (tối đa là 16 cột). Dữ liệu được sắp xếp có thể theo chiều tăng dần (ASC hoặc AS- CENDING) hoặc giảm dần (DESC hoặc DESCENDING), mặc định là sắp xếp theo chiều tăng. Nếu sau ORDER BY có nhiều cột thì việc sắp xếp dữ liệu sẽ được ưu tiên theo thứ tự từ trái qua phải.
Ví dụ 2.15
Tạo các bảng dữ liệu:
Create Table s(a int, b int); Create Table t(a int, b int); Create Table v(a int, b int); Đưa ra các truy vấn:
Select distinct a From t
Select t.*, s.b From t,s,v
Where t.a=s.a and v.b=t.b
Select t.a, s.b, t.a+s.b From t,s
Where t.a=s.a
Select *
From (Select * from t) as r1, (Select * from s) as r2 Where r1.a=r2.b;
Select * From s
Select * From s Where Exists Select a From t Where t.a=s.a; Select * From s
Where s.a > (Select a From t);
Select 1, a1+a2, a+1 AS a1, a+2 AS a2 From t;
Select 1;
Ghi chú:
Trong kết quả truy vấn, tiêu đề của các cột mặc định sẽ là tên của các trường tương ứng trong bảng. Tuy nhiên, để các tiêu đề trở nên thân thiện hơn, ta có thể đổi tên các tiêu đề của các cột. Để đặt tiêu đề cho một cột nào đó, ta sử dụng cách viết:
[tiêu_đề_cột] = tên_trường hoặc
tên_trường AS [tiêu_đề_cột]
Các phép nối (mối quan hệ) tham gia trong truy vấn:
Khi cần thực hiện một yêu cầu truy vấn dữ liệu từ hai hay nhiều bảng, ta phải sử dụng đến phép nối. Một câu lệnh nối kết hợp các dòng dữ liệu trong các bảng khác nhau lại theo một hoặc nhiều điều kiện nào đó và hiển thị chúng trong kết quả truy vấn.
Phép nối trong
Phép nối trong hiển thị kết quả truy vấn những dòng dữ liệu thỏa mãn điều kiện nối. Điều kiện nối trong được chỉ định trong mệnh đề FROM theo cú pháp như sau:
From tên_bảng_a [INNER] JOIN tên_bảng_b ON điều_kiện_nối
Ví dụ 2.16 Hiển thị danh sách các khách hàng có mua hàng trong kỳ.
Select *
From DanhMucKH-NCC inner join PhieuXuatKho
on DanhMucKH-NCC.MaKH = PhieuXuatKho.MaKH
Phép nối ngoài
o Phép nối trái (LEFT OUTER JOIN)
o Phép nối phải (RIGHT OUTER JOIN)
o Phép nối tự nhiên (FULL OUTER JOIN)
Cũng tương tự như phép nối trong, điều kiện của phép nối ngoài cũng được chỉ định ngay trong mệnh đề FROM theo cú pháp:
From tên_bảng_a LEFT|RIGHT|FULL [OUTER] JOIN
tên_bảng_b ON điều_kiện_nối
Phép nối trái (Left Outer Join) hiển thị trong kết quả truy vấn cả những dòng dữ liệu không thoả điều kiện nối của bảng bên trái trong phép nối.
Phép nối phải (Right Outer Join) hiển thị trong kết quả truy vấn cả những dòng dữ liệu không thoả điều kiện nối của bảng bên phải trong phép nối.
Hình 2.4. Phép nối phải (R-O-J)
Phép nối tự nhiên(Full Outer Join) hiển thị trong kết quả truy vấn cả những dòng dữ liệu không thoả điều kiện nối của cả hai bảng tham gia vào phép nối.
Hình 2.5. Phép nối tự nhiên (Ful Outer Join)
Ví dụ 2.17
Tạo các bảng dữ liệu:
Create Table s(a int, b int); Create Table t(a int, b int); Create Table v(a int, b int); Đưa ra các truy vấn:
Select *
From t INNER JOIN s ON t.a=s.a AND t.b=s.b; Select *
From t NATURAL INNER JOIN s; Select *
From t INNER JOIN s USING (a,b);
Select *
From t INNER JOIN s USING (b); Select *
From (t INNER JOIN s ON t.a=s.a) AS s, v Where s.a=v.a;
Select *
From (t LEFT JOIN s ON t.a=s.a) RIGHT JOIN v ON t.a=v.a; Select * FROM t FULL JOIN s ON t.a=s.a;