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, Loc và Exp_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
- 1 Khái niêm, vai trò và nội dung các nhân tố ảnh hưởng đến xuất khẩu
- 2 Giới thiệu về công ty Unilever Việt Nam
- 3 Phi đối xứng thông tin
- 4 Thuế giá trị gia tăng
- 5 Bài tập nâng cao 4
- 6 Tính tất yếu khách quan của quan hệ phân phối ở nước ta hiện nay
- 7 Hoạch định chiến lược Marketing
- 8 Các thành phần quan trọng trong SQL Server 2000
- 9 Những vấn đề cơ bản về thiết kế HTTN
- 10 Biểu thức và khoảng trắng