CHƯƠNG 1: TỔNG QUAN VỀ NGÔN NGỮ SQL 1. Nghiên cứu ngôn ngữ SQL và một số dạng câu vấn tin SQL cơ bản 1. Giới thiệu ngôn ngữ SQL Ngôn ngữ SQL (Structured Query Language) là ngôn ngữ truy vấn mang tính cấu trúc, được sử dụng trong hầu hết các hệ quản trị cơ sở dữ liệu để truy vấn và sửa đổi cơ sở dữ liệu. Ngôn ngữ SQL hỗ trợ các truy vấn dựa trên các phép toán đại số quan hệ, đồng thời cũng chứa các lệnh sửa đổi cơ sở dữ liệu và mô tả lược đồ cơ sở dữ liệu.
SQL trước kia được gọi là SEQUEL, là một ngôn ngữ phi thủ tục được IBM phát triển ở San Jose, mục đích để sử dụng rộng rãi trong hệ thống cơ sở dữ liệu thử nghiệm là System R. Ngày nay, nó được sử dụng trong rất nhiều hệ thống CSDL thương mại, và trong một số trường hợp, toàn bộ hệ thống cơ sở dữ liệu được thương mại hoá với tên SQL. Tương tự các ngôn ngữ bậc cao khác, SQL được xây dựng dựa trên các chữ cái, các chữ số, các ký tự (ký hiệu phép toán, và các ký tự đặc biệt) và một tập các từ khóa. Ngôn ngữ SQL có thể sử dụng theo hai kiểu: kiểu trực tiếp và lập trình.
SQL trực tiếp cho phép thực hiện một truy vấn và nhận được kết quả ngay tức khắc. SQL lập trình cho phép sử dụng SQL trong một chương trình viết bằng ngôn ngữ lập trình bậc cao khác (như C#, Java,.), hoặc viết các chương trình con. Ngôn ngữ SQL được chia thành ba nhóm: Ngôn ngữ định nghĩa dữ liệu dùng để mô tả cấu trúc của cơ sở dữ liệu (các bảng, các khung nhìn, các thuộc tính, các chỉ mục, .) Ngôn ngữ thao tác dữ liệu cho phép thực hiện các thao tác trên cơ sở dữ liệu như: cập nhật cơ sở dữ liệu và truy vấn, lấy ra các thông tin từ cơ sở dữ liệu. 4 Ngôn ngữ kiểm soát dữ liệu bao gồm các lệnh dùng để quản lý các thao tác, các quyền truy cập dữ liệu, kết nối với server.
Câu vấn tin SQL (Structured Query Language) Đây là một loại ngôn ngữ con dữ liệu quan hệ được xác nhận là rất mạnh. Phép toán cơ bản trong SQL là phép ánh xạ, được mô tả về cú pháp như là khối SELECT - FROM - WHERE. Mệnh đề SELECT nghĩa là chọn các thuộc tính ra, hay còn gọi là thuộc tính kết quả, nếu không chỉ ra thuộc tính thì dùng dấu * có nghĩa là tất cả các thuộc tính của quan hệ đang được chỉ ra sau mệnh đề FROM. Mệnh đề FROM để chỉ ra quan hệ cần cho việc xử lý.
Sau mệnh đề WHERE là một biểu thức điều kiện lọc dữ liệu (hay còn gọi là biểu thức logic). Chú ý: Từ đây về sau chúng ta đồng nhất; quan hệ với bảng, thuộc tính với cột (columns) hay trường (field), bộ (tupe) với bản ghi (record) hay hàng (Rows) 1. Thao tác với bảng. Tạo bảng Create Table TênBảng (TênCột1 LoạiDữLiệu[(ĐộRộng)] [Not null], TênCột2,.) Với Not null là ngầm định Ví dụ Create Table S ( S# Integer Not null, Sname VarChar(8) Not Null, Status Integer Not Null, City VarChar (30) Not Null) Create Table P ( P# Integer Not null, 5 Pname VarChar(10) Not Null, Weight Integer Not Null, Color VarChar ( 10) Not Null ) Create Table SP ( S# Integer Not null, P# Integer Not null, Qty Integer, Sdate Date Not Null, Price Decimal (8,2) ) Xóa bảng Cú pháp Drop Table TênBảng Nhập dữ liệu Insert Into S(S#, Sname, Status, City) Values (1011, ‘Việt Tiên’, 40, ‘TP.
Hà Nội’) Nêu vị trí các cột là cố định thì viết: Insert Into S Values (1011, ‘Việt Tiến’, 40, ‘TP. Hà Nội’) Nếu quên vị trí các cột là cố định thì viết tên cột và các giá trị theo vị trí tương ứng Chẳng hạn: Insert Into S (Status, s#, City, Sname ) Values (40, 1011, ‘TP. Hà Nội’, ‘Việt Tiến’, 40) Chú ý: Đây là lệnh thêm dữ liệu nhưng cũng được dùng để nhập dữ liệu. Khối lệnh Select Cú pháp như một khối select - from - where select: Xác định nội dung của các cột cần đưa ra kết quả.
6 from: Xác định các bảng cần lấy thông tin ra where: Lọc các bản ghi thoả yêu cầu để đưa ra kết quả. Ngoài ra, để mở rộng khả năng của ngôn ngữ, khối select - from - where còn được bổ sung thêm các mệnh đề groupe by, having, order by. Các hàm mẫu và một số phần mềm còn thêm cả mệnh đề contpute, for browse. Dạng tổng quát của khối select đuợc biểu diễn như sau: SELECT [* | DISTINCT] danh-sách-chiếu FROM danh_sách_tên_bảng | tên_các_View [WHERE biểu_thức_điều_kiện] [GROUPE BY danh_sách_tên_cột ] [ HAVING biểu_thức_điều_kiện] [ ORDER BY {tên_cột | số thứ_tự_cột | biểu_thức} [ ASC | DESC ]] Trong đó mệnh đề where dược biểu diễn dạng: WHERE [NOT] BiểuThức PhépSoSánh BiểuThức WHERE [NOT] tên_cột [ NOT] LIKE xâu_ký_tự WHERE [NOT] biểu_thức [NOT] BETWEEN biểu_thức AND biểu_thức WHERE [NOT] BiểuThức [NOT] IN ({danhSách | CâuHỏiCon}) WHERE EXISTS (CâuHỏiCon) WHERE [NOT] BiểuThức PhépSoSánh { ANY | ALL (CâuHỏiCon)} WHERE [NOT] TênCột phépKếtNối TênCột WHERE [NOT] biểu_thức_logic WHERE [NOT] biểu_thức { AND | OR } [NOT] biểu_thức 1.
Tìm kiếm theo câu hỏi đơn giản Không điều kiện và câu hỏi chỉ liên quan tới 1 bảng. 7 Trong mệnh đề select có danh sách chiếu. Danh sách này xác định tên các cột cần có trong bảng kết quả. Nếu xuất hiện là chọn hết các cột của bảng.
Cho biết danh sách các nhà cung cấp. SELECT * FROM S Các cách kết sau đây là hoàn toàn phù hợp trong SQL SELECT P#, (7 + 3 ) * QTY Để bảng kết quả đúng là một quan hệ (không có bộ trùng nhau ), trong mệnh đề select cần thêm từ khoá distinct Cho biết các mặt hàng khác nhau đã được cung cấp SELECT DISTINCT PName FROM SP Tìm kiếm với điều kiện đơn giản Tìm mã số những nhà cung cấp đã cung cấp mật hàng P2. SELECT S# FROM SP WHERE P# = 'P2 ' Trong SQL- các phép so sánh được sử dụng bao gồm >, <, >= , <=, = và <>. Các phép tính trên dùng cho mọi loại dữ liệu.
Tìm kiếm có xử lý xâu ký tự Trong trường hợp người sử dụng, không nhớ rõ tên người hoặc địa danh. ví dụ là Hoa hay Hoan khi đó có thể viết: SELECT * FROM S WHERE SNAME LIKE 'HOA%' Trong đó ký hiệu ' % ' là thay thế cho một xâu con, dấu phân cách để thay thế cho một ký tự. A%B: xâu ký tự bất kỳ bắt đầu bằng chữ A và kết thúc bảng chữ B %A 8 : xâu ký tự bất kỳ có ký tự kết thúc là A A_B : xâu gồm ba ký tự có ký tự thứ hai là bất kỳ A_: xâu gồm hai ký tự có ký đầu là A. Xử lý ngày tháng Ngoài các phép tính thông thường SQL còn có thể xử lý dữ liệu dạng ngày tháng.
Ví dụ: Tìm những mã mặt hàng bán trước ngày 04-04-11 là 10 ngày. SELECT P# FROM SP WHERE ‘04-04-11' - sdate = 10 Tìm kiếm sử dụng IN và BETWEEN Tìm mã nhưng mặt hàng đã cung cấp có giá từ 1000 đến 2000 SELECT P# FROM SP WHERE PRICE BETWEEN 1000 AND 2000 Tìm mã số các nhà cung cấp dã cung cấp ít nhất một trong các mặt hàng có mã P1, P2, P3. SELECT S# FROM SP WHERE P# IN (‘P1’ , ‘P2’, ‘P3’) 1. Các hàm thư viện Trong SQL có các hàm mẫu gồm count, max, min, sum, avg.
Riêng hàm count khi có đối số là “*” là chỉ đếm số bản ghi thỏa yêu cầu tìm kiếm mà không cần quan tâm tới bất kỳ cột nào Cho biết số lần mặt hàng P2 đã được cung cấp. SELECT COUNT ( * ) FROM SP 9 WHERE P# = ‘P2’ Tìm hiệu số mặt hàng P1 bán một lần nhiều nhất và một lần ít nhất của hãng S1. SELECT MAX(QTY ) - MIN(QTY) FROMSP WHERE S# = 'Sl' AND P# = 'P1’ Cho biết danh sách mã số mặt hàng đã được cung cấp. SELECT COUNT ( DISTINCT p# ) FROM SP Chú ý rằng đối số của các hàm có thể là một biểu thức sổ học bất kỳ 1.
Tìm nhờ mệnh đề GROUP BY Tìm mà sổ các mặt hàng mà mỗi nhà cung cấp đã cung cấp cho khách hàng. SELECT S#,P# FROM SP GROUP BY S# Sau mệnh đề này bảng SP được ấy ra sau đó phân thành nhóm theo mã số S#, có nghĩa là các hộ có cùng giá trị S# được sắp xếp liên tiếp nhau, hết nhóm này đến nhóm khác. Tìm kiếm sử dụng mệnh đề HAVING. HAVING thường được sử dụng cùng group by.
Sau HAVING là biểu thức điều kiện. Biểu thức điều kiện này không tác động vào toàn bảng được chỉ ra sau from mà chỉ tác động lần lượt từng nhóm các bản ghi đã chỉ ra tại mệnh đề group by. Ví dụ: Tìm mã số những nhà cung cấp đã cung cấp ít nhất hơn hai mặt hàng. 10 SELECT S# FROM SP GROUPE BY S# HAVING COUNT(DISTINCT P#) > 2 Tìm kiếm có sắp xếp Tìm tên các mặt hàng mầu đỏ và sắp xếp theo thứ tự giảm dần của mã số mặt hàng.
SELECT PNAME, P# FROM P WHERE COLOUR = ' ĐỎ ’ ORDER BY P# ASC Sau order by là tên cột rồi đến chiều sắp xếp tăng hoặc giảm ( ASC hoặc DESC ). Có thế sắp xếp nhiều cột và nếu không chỉ ra chiều sắp xếp thi hệ thống ngầm định là ASC. Mệnh đề order By nếu đứng sau group by thì miền tác động của sắp xếp là trong từng nhóm của cột được chỉ ra trong group by. Nếu cột sắp xếp có ở mệnh đề select thì trong mệnh đề order by có thể chỉ cần chỉ ra số thứ tự của cột đó trong danh sách chiếu là đủ.
Ví dụ trên có thể viết: SELECT PNAME, P# FROM P WHERE COLOUR = 'ĐỎ' ORDER BY 2 ASC 1. Tìm kiếm và câu hỏi phức tạp Tìm kiếm với nhiều bảng qua việc sử dụng ánh xạ lồng nhau hoặc qua phép kết nối. Tìm những nhà cung cấp đã cung cấp ít nhất một mặt hàng nào đó. 11 SELECT * FROM S WHERE EXISTS (SELECT * FROM SP WHERE SP.S# ) hoặc: SELECT * FROM S WHERE 0 < (SELECT COUNT (*) FROM SP WHERE SP.S# ) Tìm kiếm có sử dụng lượng từ ANY và ALL Tìm tên những mặt hàng có mã số là mặt hàng mà hãng có mã sổ S1 đã bán.
SELECT PNAME FROM P WHERE P# = ANY (SELECT P# FROM SP WHERE S# = 'S1 ’) Tìm tên những hãng cung cấp ít nhất một mặt hàng màu đỏ. SELECT SNAME FROM S * WHERE S# = ANY SELECT S# FROM SP, S WHERE S.