24/05/2018, 17:12

Ngôn ngữ truy vấn cơ sở dữ liệu SQL

Như trong Chương I mục 1.4, bài 1 đã trình bày, một hệ quản trị CSDL phải có ngôn ngữ giao tiếp giữa người sử dụng với CSDL ( hoặc cũng còn gọi là ngôn ngữ truy nhập CSDL ). Ngôn ngữ giao tiếp CSDL gồm các phạm trù: Ngôn ngữ mô tả dữ ...

Như trong Chương I mục 1.4, bài 1 đã trình bày, một hệ quản trị CSDL phải có ngôn ngữ giao tiếp giữa người sử dụng với CSDL (hoặc cũng còn gọi là ngôn ngữ truy nhập CSDL). Ngôn ngữ giao tiếp CSDL gồm các phạm trù:

Ngôn ngữ mô tả dữ liệu (Data Definition Language - DDL) để cho phép khai báo cấu trúc các bảng của CSDL, khai báo các mối liên hệ của dữ liệu (Data RelationShip) và các quy tắc (Rules, Constraint) quản lý áp đặt lên các dữ liệu đó.

Ngôn ngữ thao tác dữ liệu (Data Manipulation Language - DML) cho phép người sử dụng có thể thên (Insert), xóa (Delete), sửa (Update) dữ liệu trong CSDL.

Ngôn ngữ truy vấn dữ liệu, hay ngôn ngữ hỏi đáp có cấu trúc (Structured Query Language - SQL) cho phép những người khai thác CSDL (chuyên nghiệp hoặc không chuyên) sử dụng để truy vấn các thông tin cần thiết trong CSDL.

Ngôn ngữ quản lý dữ liệu (Data Control Language - DCL) cho phép những người quản trị hệ thống thay đổi cấu trúc của các bảng dữ liệu, khai báo bảo mật thông tin và cấp quyền hạn khai thác CSDL cho người sử dụng.

Những năm 1975-1976, IBM lần đầu tiên đưa ra hệ quản trị CSDL kiểu quan hệ mang tên SYSTEM-R với ngôn ngữ giao tiếp CSDL là SEQUEL (Structured English QUEry Language), đó một ngôn ngữ con để thao tác với CSDL.

Năm 1976 ngôn ngữ SEQUEL được cải tiến thành SEQUEL2. Khoảng năm 1978-1979 SEQUEL2 được cải tiến và đổi tên thành Ngôn Ngữ Truy Vấn Có Cấu Trúc (Structured Query Language - SQL) và cuối năm 1979 hệ quản trị CSDL được cải tiến thành SYSTEM-R*.

Năm 1986 Viện Tiêu Chuẩn Quốc Gia Mỹ (American National Standards Institute - ANSI) đã công nhận và chuẩn hóa ngôn ngữ SQL, và sau đó Tổ chức Tiêu chuẩn Thế giới (International Standards Organization - ISO) cũng đã công nhận ngôn ngữ này. Đó là chuẩn SQL-86.

Tới nay SQL đã qua 3 lần chuẩn hóa lại (1989, 1992, 1996) để mở rộng các phép toán và tăng cường khả năng bảo mật và tính toàn vẹn dữ liệu. Tài liệu này trình bày Ngôn ngữ truy vấn CSDL dựa trên chuẩn SQL-92 và có tham khảo với SQL, SQL*PLUS, PL/SQL của Oracle Server Release 7.3 (1996) và MicroSoft SQL Server 7.1 với các phạm trù nêu trên.

Để việc trình bày cú pháp các câu lệnh SQL được gọn gàng và dễ hiểu, tài liệu này có đưa ra một số quy ước ký pháp (Typographic Conventions) như sau:

Các từ khóa (KeyWords), các hàm (Functions), tên bảng (quan hệ - Table Names) của các câu lệnh được viết bằng chữ in hoa (UpperCase).

Các tên thuộc tính (Column Names) của các bảng được viết đậm. Những tên thuộc tính có dấu tiếng Việt hay có khoảng trắng được viết trong dấu ngoặc vuông ( [ ] ) theo ký pháp của SQL-Server.

Ví dụ: SELECT Deptno, Deptname FROM DEPARTMENT;

Các biến cú pháp (Syntax Variables), tức là các thành phần ngôn ngữ mà người sử dụng phải điền cụ thể vào khi viết lệnh, sẽ được viết bằng chữ thường (LowerCase), trong cặp dấu ( < > ) và nghiêng.

Ví dụ:CREATE TABLE <tên bảng> (<tên cột> <kiểu>, <tên cột> <kiểu>, ...);

Các thành phần tùy chọn (Optional), tức là có thể có hoặc không được viết trong cặp dấu ngoặc vuông đậm nét ([ ]).

                    Ví dụ: UPDATE <tên quan hệ>

SET <tên cột> = <biểu thức>, <tên cột> = <biểu thức>, ...

                        [ WHERE <điều kiện> ];

Việc lựa chọn một trong các khả năng được thể hiện bởi dấu xổ đứng đậm (½ ).

Thành phần bắt buộc phải chọn trong danh sách được viết trong cặp dấu móc đậm nét ( { } ).

Giá trị mặc định (Default Value) được viết với dấu gạch chân (Underline).

Ví dụ: SELECT { * ½ <biểu thức 1>, <biểu thức 2>, ... }

FROM <các bảng>

[ORDER BY <tên cột>½ <biểu thức>[ASC ½ DESC ], ...]

        Lệnh SQL có thể được viết trên nhiều dòng và kết thúc lệnh bởi dấu chấm phảy ( ; ), tuy nhiên từ khóa, tên hàm, tên thuộc tính, tên bảng, tên đối tượng (Objects) thì không được phép viết tách xuống hàng. Trong vận dụng thực tế, từ khóa, tên thuộc tính, tên bảng, tên đối tượng được viết in hoa hoặc chữ thường là như nhau.

        Cho đến bây giờ chúng ta đã có các CSDL với đầy đủ dữ liệu về quản lý học viên - được trình bày trong Chương III, bài 4 (gồm các quan hệ: KHOA, GIẢNG-VIÊN, LỚP-HỌC, MÔN-HỌC, HỌC-VIÊN, KQUẢ-THI), quản lý nhân sự của một công ty EMPLOYMENT – được trình bày trong Chương V, mục 5.3, bài 7 (gồm các quan hệ: DEPARTMENT, EMPLOYEE, JOBS, EMPLHIST) và CSDL quản lý cán bộ - công chức CCVC – được trình bày trong Chương V, mục 5.4, bài 8 (gồm các bảng: ĐƠN-VỊ, LOẠI-ĐVỊ, NGẠCH-CBVC, NGẠCH-BẬC-LƯƠNG và CBVC). Các CSDL này sẽ được sử dụng làm các mẫu cho việc trình bày các câu lệnh SQL trong toàn bộ chương này.

Các lệnh hỏi - tìm kiếm dữ liệu: (Data Retrieval SQL)

Câu lệnh SELECT - SQL tìm kiếm dữ liệu là một trong số các câu lệnh SQL cài đặt đầy đủ các phép toán quan hệ dựa trên các từ khóa cơ bản SELECT, FROM, WHERE, GROUP BY, ORDER BY, HAVING. Đây là câu lệnh được sử dụng phổ biến nhất với mục đích tìm kiếm thông tin trong CSDL quan hệ. Cú pháp tổng quát của câu lệnh như sau:

SELECT [DISTINCT]<biểu thức 1>, <biếu thức 2>, ...

FROM <tên bảng 1>, <tên bảng 2>, ...

[WHERE <điều kiện chọn> ]

[GROUP BY <tên cột 1>, <tên cột 2>, ...]

[ORDER BY <tên cột 1> | <biểu thức số 1>[ASC | | DESC ], ...]

[HAVING <điều kiện in kết quả>];

Chúng ta sẽ lần lượt làm rõ từng phần của cú pháp ngôn ngữ. Cơ sở dữ liệu được sử dụng để minh họa các ví dụ trong chương này là hệ quản lý nhân sự của một công ty EMPLOYMENT với các bảng – quan hệ: DEPARTMENT, EMPLOYEE, JOBS, EMPLHIST đã nói trên.

Tìm thông tin từ các cột của bảng.

 

SELECT [DISTINCT]{ * | <biểu thức 1>[AS <Tên mới 1>],

<biếu thức 2>[AS <Tên mới 2>], ... }

FROM <tên bảng>;

Câu hỏi 6.1.1: Cho danh sách các phòng ban (bao gồm tất cả các thông tin về Mã số (

Câu hỏi 6.1.1: Cho danh sách các phòng ban (bao gồm tất cả các thông tin về Mã số (DeptNo), Tên (DeptName), Địa điểm (Loc), Mã số người lãnh đạo (Mgr), Kinh phí hoạt động (Exp_Budg) và Doanh thu (Rev_Budg) của các phòng ban) trong Công ty:

SELECT Deptno, Deptname, Loc, Mgr, Exp_budg, Rev_budg

FROM DEPARTMENT;

Khi cần lấy thông tin về tất cả các cột của bảng chúng ta có thể sử dụng dấu sao ( * ) thay cho việc liệt kê các tên cột của bảng. Câu lệnh trên tương đương với câu lệnh:

SELECT * FROM DEPARTMENT;

Kết quả của câu lệnh là một bảng (nằm trong bộ nhớ trong):

DepTno DeptName Loc Mgr Exp_Budg Rev_Budg
10 Accounting Dallas 200 10.000  
30 Research San Fransisco 105 125.000  
40 Sales Boston 109 280.000 800.000
50 Manufacturing Houston 210 130.000  
60 Shipping Houston 215 90.000  

Câu hỏi 6.1.2: Cho Mã số, Tên, Địa điểm, Kinh phí hoạt động của từng phòng ban trong Công ty:

SELECT DeptNo, DeptName, Loc, Exp_Budg

FROM DEPARTMENT;

Câu lệnh này là cài đặt của phép chiếu trên 4 thuộc tính DeptNo, DeptName, LocExp_Budg của bảng DEPARTMENT. Kết quả của câu lệnh là một bảng (nằm trong bộ nhớ trong):

DepTno DeptName Loc Exp_Budg
10 Accounting Dallas 10.000
30 Research San Fransisco 125.000
40 Sales Boston 280.000
50 Manufacturing Houston 130.000
60 Shipping Houston 90.000

Chúng ta giả thiết rằng cần đặt tên khác (gọi là bí danh - Alias) cho các cột của bảng kết quả bằng tiếng Việt thay vì dùng tên của thuộc tính của bảng dữ liệu nguồn. Việc này được thực hiện bằng cách thêm từ khóa AS theo sau là một tên mới. Nếu tên có chứa các ký tự đặc biệt và/hoặc khoảng trắng thì viết tên đó trong cặp dấu ngoặc vuông ( [ ] ). Ví dụ trên được sửa thành:

SELECT DeptNo AS [Mã số], DeptName AS [Tên phòng], Loc AS [Địa diểm], Exp_Budg as [Kinh phí]

FROM DEPARTMENT;

Kết quả của câu lệnh là như sau:

Mã số Tên phòng Địa điểm Kinh phí
10 Accounting Dallas 10.000
30 Research San Fransisco 125.000
40 Sales Boston 280.000
50 Manufacturing Houston 130.000
60 Shipping Houston 90.000

Câu lệnh SELECT không chỉ thực hiện việc trích thông tin từ các cột đơn lẻ của bảng mà có thể thực hiện tính toán theo công thức hay biểu thức bất kỳ dựa trên giá trị của các cột trên từng bản ghi của bảng. Trong đó:

Biểu thức (expression) là một dãy các toán hạng (Operand) nối với nhau bởi các phép toán (Operator). Ở đây:

Toán hạng có thể là:

-Trực hằng (Literals): bao gồm hằng số (Number - Ví dụ. 1234.56 1234.56), hằng văn bản (Text) trong cặp dấu nháy đơn (Ví dụ. ‘Nguyễn Hồng Anh’ ) , hằng ngày tháng (Date/Time) đặt trong cặp dấu hàng rào ( # - Ví dụ.#19/05/1890# ), và hằng lôgic (True hay False) hoặc tên gọi của trực hằng.

-Tên thuộc tính (có thể kèm theo tên bảng và dấu chấm đứng trước). Ví dụ. DEPARTMENT.DeptNo.

- Tên hàm (function). Ví dụ. SUM (...), COUNT(...), SIN (...), COS(...)

- Tên biến (Variable).

Các phép toán có thể là:

- Các phép toán số học: ^ (lũy thừa); * (nhân), / (chia), % (chia nguyên), Mod (phần dư); + (cộng), - (trừ). Thứ tự ưu tiên cao nhất theo 3 cụm từ trái qua phải. Các phép toán số học thường cho kết quả là một số.

- Các phép toán so sánh: <, <=, >, >=, =, <>. Kết quả phép so sánh là giá trị lôgíc (True hoặc False).

- Các phép toán phạm vi: IN (<danh sách giá trị>), BETWEEN <Min> AND <Max>, LIKE <Mẫu v.bản>.

- Các phép toán lôgic: NOT (phủ định), AND (nối liền - conjunction), OR (nối rời - disjunction). Kết quả các phép toán lôgíc là một giá trị lôgíc.

Câu hỏi 6.1.3: Cho biết Mã số, Tên và lương cả năm của các nhân viên trong công ty:

SELECT EmpNo AS [Mã số], Name AS [Tên], Salary * 12 AS [Lương năm]

FROM EMPLOYEE;

    Kết quả là bảng:

Mã số Tên Lương năm
100 Wilson 20.400
101 Smith 30.000
103 Reed 42.000
105 Watson 54.000
109 Allen 45.600
110 Turner 21.600
200 Chen 34.800
210 Ramirez 43.200
213 McDonnel 19.500
214 Simpson 9.900
215 Di Salvo 32.400
220 Schwartz 50.400

Khi thực hiện phép chiếu tên một quan hệ, các bộ giá trị giống nhau có thể được chọn. Từ khóa DISTINCT được sử dụng nếu muốn chỉ giữ lại 1 bộ trong các bộ giá trị giống nhau tìm được.

Câu hỏi 6.1.4: Cho biết các nhân viên của công ty đang đảm nhận các công việc gì? Đây chính là phép chiếu trên thuộc tính Job của quan hệ EMPLOYEE.

SELECT DISTINCT Job FROM EMPLOYEE;

    Kết quả là bảng với 6 dòng và 1 cột như sau:

Job
Clrk
Anlt
Mngr
Drvr
Spvr
Slsm

Chọn các dòng của bảng - Mệnh đề WHERE

 

    Trong nhiều trường hợp chúng ta chỉ cần chọn ra những bộ giá trị của bảng thỏa mãn điều kiện nào đó. Mệnh đề WHERE (WHERE Clause) với cú pháp ) với cú pháp WHERE <điều kiện> cho phép thực hiện điều đó. Ở đây <điều kiện> là một biểu thức mà kết quả là một giá trị lôgic hoặc đúng (True) hoặc sai (False). Đây là sự cài đặt của phép chọn (Selection) trong đại số quan hệ.

Câu hỏi 6.1.5: Cho danh sách nhân viên của phòng số 40?.

SELECT * FROM EMPLOYEE WHERE Deptno = 40;

    Kết quả là bảng có 3 dòng (trên tổng số 12 dòng của bảng nguồn):

EmpNo Name Job Salary Comm DeptNo Sex
101 Smith Slsm 2.500 1.300 40 F
109 Allen Mngr 3.800 8.000 40 F
220 Schwartz Slsm 4.200 5.300 40 F

Câu hỏi 6.1.6: Cho danh sách nhân viên của phòng số 10, 30 và 50.

SELECT * FROM EMPLOYEE

WHERE (DeptNo = 10) OR (DeptNo = 30) OR (DeptNo = 50);

    Hoặc viết cách

0