I. Tổng quan Ctt102 chương 5 Khám phá ngôn ngữ SQL
Ngôn ngữ truy vấn cấu trúc, hay SQL (Structured Query Language), là một công cụ không thể thiếu trong lĩnh vực quản trị cơ sở dữ liệu. Được phát triển ban đầu bởi IBM vào những năm 1970 với tên gọi SEQUEL, SQL đã nhanh chóng trở thành tiêu chuẩn được Viện Tiêu chuẩn Quốc gia Hoa Kỳ (ANSI) công nhận và phát triển qua nhiều phiên bản như SQL-86, SQL-92, và SQL-99. Không giống như Đại số quan hệ yêu cầu người dùng chỉ định cách thức truy vấn, SQL là một ngôn ngữ cấp cao, cho phép người dùng chỉ cần mô tả nội dung cần lấy. Điều này giúp đơn giản hóa đáng kể quá trình tương tác với dữ liệu. Nội dung môn học Ctt102 chương 5 SQL 2 tập trung vào việc cung cấp kiến thức nền tảng và kỹ năng thực hành vững chắc về SQL. Ngôn ngữ này bao gồm ba thành phần chính. Thứ nhất là Ngôn ngữ Định nghĩa Dữ liệu (DDL), được sử dụng để tạo và quản lý cấu trúc của các đối tượng cơ sở dữ liệu như bảng, chỉ mục. Thứ hai là Ngôn ngữ Thao tác Dữ liệu (DML), cho phép người dùng truy vấn, chèn, cập nhật và xóa dữ liệu. Cuối cùng là các thành phần khác như định nghĩa khung nhìn, quản lý ràng buộc toàn vẹn, phân quyền bảo mật và điều khiển giao tác. Trong thực tế, các hệ quản trị cơ sở dữ liệu thương mại như SQL Server có thể sử dụng thuật ngữ riêng, ví dụ: 'Bảng' thay cho 'quan hệ', 'Cột' thay cho 'thuộc tính', và 'Dòng' thay cho 'bộ'. Việc nắm vững SQL là yêu cầu cơ bản để xây dựng và vận hành các hệ thống thông tin hiệu quả, từ các ứng dụng web đơn giản đến các hệ thống doanh nghiệp phức tạp. Kiến thức trong chương này là chìa khóa để làm chủ việc quản lý dữ liệu một cách chuyên nghiệp.
1.1. Lịch sử và vai trò của SQL trong quản lý dữ liệu
SQL ra đời như một giải pháp để đơn giản hóa việc tương tác với cơ sở dữ liệu quan hệ, vốn trước đây phụ thuộc vào các ngôn ngữ phức tạp hơn như Đại số quan hệ. Được IBM tiên phong phát triển, nó nhanh chóng được chuẩn hóa và trở thành ngôn ngữ toàn cầu cho việc quản lý dữ liệu. Vai trò của SQL không chỉ dừng lại ở việc truy vấn. Nó là một hệ thống toàn diện, cho phép định nghĩa cấu trúc dữ liệu, thao tác trên dữ liệu, và kiểm soát quyền truy cập. Tài liệu gốc ghi nhận, SQL là 'ngôn ngữ cấp cao' giúp người dùng 'chỉ cần đưa ra nội dung cần truy vấn', giảm bớt gánh nặng kỹ thuật và tập trung vào mục tiêu nghiệp vụ. Đây chính là yếu tố then chốt giúp SQL được áp dụng rộng rãi trong mọi ngành công nghiệp.
1.2. Phân biệt Ngôn ngữ DDL DML và các thành phần khác
Chương trình học Ctt102 phân chia SQL thành các nhóm lệnh chức năng rõ ràng. Ngôn ngữ Định nghĩa Dữ liệu (DDL) bao gồm các lệnh như CREATE, ALTER, DROP, có nhiệm vụ xây dựng và thay đổi 'bộ xương' của cơ sở dữ liệu, tức là các bảng và mối quan hệ giữa chúng. Ngược lại, Ngôn ngữ Thao tác Dữ liệu (DML) tập trung vào 'dòng máu' của cơ sở dữ liệu, bao gồm các lệnh SELECT, INSERT, UPDATE, DELETE để làm việc trực tiếp với các dòng dữ liệu. Ngoài ra, SQL còn các thành phần quan trọng khác như định nghĩa khung nhìn (view) để tạo các bảng ảo, và chỉ mục (index) để tăng tốc độ truy vấn, cùng với các cơ chế phân quyền và bảo mật để đảm bảo an toàn dữ liệu.
II. Cách định nghĩa dữ liệu hiệu quả bằng các lệnh DDL
Việc định nghĩa cấu trúc dữ liệu là bước đầu tiên và quan trọng nhất trong việc xây dựng một cơ sở dữ liệu. Ngôn ngữ Định nghĩa Dữ liệu (DDL) trong SQL cung cấp một bộ công cụ mạnh mẽ để thực hiện nhiệm vụ này. Các lệnh DDL cho phép mô tả chi tiết lược đồ của mỗi quan hệ, xác định miền giá trị cho từng thuộc tính, áp đặt các ràng buộc toàn vẹn và tạo chỉ mục. Ba lệnh DDL cơ bản và phổ biến nhất là CREATE TABLE để tạo một bảng mới, ALTER TABLE để sửa đổi cấu trúc của một bảng đã tồn tại, và DROP TABLE để xóa hoàn toàn một bảng. Việc sử dụng thành thạo các lệnh này đòi hỏi sự hiểu biết về các kiểu dữ liệu chuẩn trong SQL. Việc lựa chọn kiểu dữ liệu phù hợp, ví dụ như INTEGER cho số nguyên, VARCHAR(n) cho chuỗi ký tự có độ dài thay đổi, hay DATETIME cho ngày giờ, không chỉ đảm bảo tính đúng đắn của dữ liệu mà còn tối ưu hóa không gian lưu trữ và hiệu suất truy vấn. Thêm vào đó, việc thiết lập các ràng buộc toàn vẹn (RBTV) như PRIMARY KEY (khóa chính), FOREIGN KEY (khóa ngoại), NOT NULL, và CHECK là cực kỳ quan trọng để duy trì sự nhất quán và chính xác của dữ liệu trong toàn bộ hệ thống. Nắm vững DDL là nền tảng để thiết kế một cơ sở dữ liệu có cấu trúc tốt, dễ bảo trì và mở rộng.
2.1. Lựa chọn kiểu dữ liệu SQL phù hợp cho từng thuộc tính
Việc chọn đúng kiểu dữ liệu là một quyết định thiết kế quan trọng. Tài liệu Ctt102 giới thiệu ba nhóm chính: số, chuỗi ký tự, và ngày giờ. Với kiểu số, lập trình viên có các lựa chọn như INTEGER, SMALLINT cho số nguyên, hoặc NUMERIC(p,s), DECIMAL(p,s) cho các số thập phân cần độ chính xác cao. Với chuỗi ký tự, CHAR(n) phù hợp cho các chuỗi có độ dài cố định, trong khi VARCHAR(n) linh hoạt hơn cho các chuỗi có độ dài thay đổi. Kiểu dữ liệu ngày giờ bao gồm DATE (chỉ lưu ngày, tháng, năm), TIME (lưu giờ, phút, giây), và TIMESTAMP hoặc DATETIME (lưu cả ngày và giờ). Lựa chọn sai kiểu dữ liệu có thể dẫn đến lãng phí dung lượng lưu trữ hoặc gây ra lỗi khi xử lý dữ liệu.
2.2. Thiết lập ràng buộc toàn vẹn RBTV để bảo vệ dữ liệu
Ràng buộc toàn vẹn (RBTV) là các quy tắc được áp đặt lên các cột của bảng để đảm bảo tính chính xác và tin cậy của dữ liệu. NOT NULL đảm bảo một cột không thể có giá trị rỗng. UNIQUE yêu cầu tất cả các giá trị trong một cột phải là duy nhất. PRIMARY KEY là sự kết hợp của NOT NULL và UNIQUE, dùng để xác định duy nhất mỗi dòng trong bảng. FOREIGN KEY tạo ra một liên kết giữa hai bảng, đảm bảo rằng giá trị trong cột của bảng con phải tồn tại trong cột khóa chính của bảng cha. Ràng buộc CHECK cho phép định nghĩa một điều kiện mà giá trị của cột phải thỏa mãn (ví dụ: CHECK (PHAI IN ('Nam', 'Nu'))). Cuối cùng, DEFAULT cung cấp một giá trị mặc định cho cột khi không có giá trị nào được chỉ định lúc chèn dữ liệu.
III. Hướng dẫn tạo và sửa đổi cấu trúc bảng trong SQL
Quản lý vòng đời của các bảng dữ liệu là một nhiệm vụ cốt lõi của người quản trị cơ sở dữ liệu. SQL cung cấp các lệnh DDL trực quan để thực hiện việc này. Lệnh CREATE TABLE là công cụ chính để định nghĩa một bảng mới. Cú pháp của nó yêu cầu tên bảng, theo sau là danh sách các cột. Mỗi cột được định nghĩa bởi tên, kiểu dữ liệu và các ràng buộc toàn vẹn tùy chọn. Ví dụ, việc tạo bảng GIAOVIEN đòi hỏi phải xác định các cột như MaGV, HoTen, Luong cùng với các ràng buộc như PRIMARY KEY cho MaGV và NOT NULL cho HoTen. Tuy nhiên, cấu trúc của một cơ sở dữ liệu không phải lúc nào cũng cố định. Khi yêu cầu thay đổi, lệnh ALTER TABLE trở nên hữu ích. Nó cho phép thêm một cột mới (ADD), xóa một cột hiện có (DROP COLUMN), hoặc thay đổi kiểu dữ liệu của một cột (ALTER COLUMN). Ngoài ra, ALTER TABLE cũng có thể được sử dụng để thêm hoặc xóa các ràng buộc toàn vẹn sau khi bảng đã được tạo. Cuối cùng, khi một bảng không còn cần thiết, lệnh DROP TABLE sẽ xóa hoàn toàn cả cấu trúc và dữ liệu của nó. Đây là một hành động không thể hoàn tác, đòi hỏi sự cẩn trọng tuyệt đối.
3.1. Cú pháp và ví dụ chi tiết lệnh CREATE TABLE
Cú pháp cơ bản của lệnh tạo bảng là: CREATE TABLE <Tên_bảng> (<Tên_cột> <Kiểu_dữ_liệu> [<RBTV>], ...);. Trong tài liệu gốc, ví dụ tạo bảng GIAOVIEN minh họa rõ ràng cách áp dụng: CREATE TABLE GIAOVIEN (MAGV CHAR(9) PRIMARY KEY, HOTEN NVARCHAR(50) NOT NULL, LUONG INT DEFAULT (1000), PHAI CHAR(3) CHECK (PHAI IN('Nam', 'Nu')), ...);. Ở đây, MAGV được định nghĩa là khóa chính. HOTEN không được phép để trống. LUONG có giá trị mặc định là 1000. PHAI chỉ được chấp nhận giá trị 'Nam' hoặc 'Nu'. Việc đặt tên cho ràng buộc bằng từ khóa CONSTRAINT (ví dụ: CONSTRAINT PK_GV PRIMARY KEY) cũng là một thực hành tốt để dễ dàng quản lý và tham chiếu sau này.
3.2. Phương pháp thay đổi cấu trúc bảng với ALTER TABLE
Lệnh ALTER TABLE cung cấp sự linh hoạt để điều chỉnh cấu trúc bảng mà không cần phải xóa và tạo lại. Để thêm một cột mới, sử dụng cú pháp: ALTER TABLE <Tên_bảng> ADD <Tên_cột> <Kiểu_dữ_liệu>;. Để xóa một cột, cú pháp là: ALTER TABLE <Tên_bảng> DROP COLUMN <Tên_cột>;. Việc thay đổi kiểu dữ liệu của một cột hiện có được thực hiện qua: ALTER TABLE <Tên_bảng> ALTER COLUMN <Tên_cột> <Kiểu_dữ_liệu_mới>;. Ví dụ trong bài giảng cho thấy việc thêm ràng buộc khóa chính vào bảng BOMON sau khi đã tạo: ALTER TABLE BOMON ADD CONSTRAINT PK_BOMON PRIMARY KEY (MABM);. Điều này rất hữu ích khi thiết kế cơ sở dữ liệu theo từng giai đoạn.
IV. Bí quyết truy vấn dữ liệu SQL với mệnh đề SELECT
Sau khi cấu trúc cơ sở dữ liệu được định hình bằng DDL, bước tiếp theo là khai thác dữ liệu bằng Ngôn ngữ Thao tác Dữ liệu (DML). Lệnh SELECT là lệnh DML phổ biến và mạnh mẽ nhất, được sử dụng để rút trích dữ liệu từ một hoặc nhiều bảng. Một câu truy vấn SQL cơ bản bao gồm ba mệnh đề chính: SELECT, FROM, và WHERE. Mệnh đề SELECT xác định danh sách các cột sẽ được hiển thị trong kết quả. Có thể sử dụng dấu * để chọn tất cả các cột hoặc liệt kê tên từng cột cụ thể. Mệnh đề FROM chỉ định (các) bảng nguồn chứa dữ liệu cần truy vấn. Khi truy vấn từ nhiều bảng, một phép tích Đề-các (Cartesian product) sẽ được thực hiện ngầm định. Mệnh đề WHERE đóng vai trò bộ lọc, chứa một biểu thức logic để xác định những dòng nào thỏa mãn điều kiện và sẽ được trả về. Mối tương quan giữa SQL và Đại số quan hệ được thể hiện rõ: SELECT tương đương phép chiếu (π), WHERE tương đương phép chọn (σ), và FROM tương đương phép tích (×). Việc hiểu và kết hợp nhuần nhuyễn ba mệnh đề này là kỹ năng nền tảng để thực hiện hầu hết các tác vụ truy vấn dữ liệu, từ đơn giản đến phức tạp.
4.1. Khai thác mệnh đề SELECT và FROM để trích xuất dữ liệu
Mệnh đề SELECT cho phép tùy chỉnh kết quả trả về. Ngoài việc chọn cột, người dùng có thể sử dụng bí danh (alias) với từ khóa AS để đổi tên cột trong kết quả cho dễ đọc, ví dụ: SELECT MAKHOA AS 'Mã khoa', TENKHOA AS 'Tên khoa'. Cũng có thể thực hiện các phép toán hoặc nối chuỗi trực tiếp trong mệnh đề này, ví dụ: SELECT MAGV, LUONG*1.1 AS 'LUONG10%'. Từ khóa DISTINCT được dùng để loại bỏ các dòng kết quả trùng lặp. Mệnh đề FROM liệt kê các bảng cần thiết. Khi có nhiều bảng, việc sử dụng bí danh cho bảng (ví dụ: FROM GIAOVIEN G, BOMON B) là rất quan trọng để tránh sự nhập nhằng (ambiguous) khi các bảng có cột trùng tên, và làm cho câu lệnh ngắn gọn hơn.
4.2. Tối ưu điều kiện lọc với mệnh đề WHERE và các toán tử
Mệnh đề WHERE là nơi định nghĩa logic lọc dữ liệu. Nó sử dụng các toán tử so sánh (=, >, <, <>) và các toán tử logic (AND, OR, NOT) để kết hợp các điều kiện. SQL cung cấp các toán tử tiện lợi như BETWEEN để kiểm tra một giá trị có nằm trong một khoảng hay không (ví dụ: WHERE LUONG BETWEEN 20000 AND 30000). Toán tử LIKE được dùng để so khớp chuỗi theo mẫu, với _ đại diện cho một ký tự bất kỳ và % đại diện cho một chuỗi ký tự bất kỳ. Việc xử lý giá trị NULL cũng rất đặc biệt, phải sử dụng IS NULL hoặc IS NOT NULL thay vì các toán tử so sánh thông thường. Hiểu rõ cách sử dụng các toán tử này giúp xây dựng các điều kiện lọc chính xác và hiệu quả.
V. Ứng dụng SQL truy vấn dữ liệu từ nhiều bảng phức tạp
Sức mạnh thực sự của SQL và cơ sở dữ liệu quan hệ nằm ở khả năng kết hợp thông tin từ nhiều bảng khác nhau. Các ví dụ trong Ctt102 chương 5 SQL 2 cho thấy cách xây dựng các câu truy vấn phức tạp để trả lời những câu hỏi nghiệp vụ thực tế. Kỹ thuật cơ bản nhất để kết hợp các bảng là thông qua điều kiện kết (join condition) trong mệnh đề WHERE. Điều kiện này thường so sánh cột khóa ngoại của một bảng với cột khóa chính của bảng khác (ví dụ: WHERE GIAOVIEN.MABM = BOMON.MABM). Thao tác này tương đương với phép kết trong Đại số quan hệ, giúp lọc ra những cặp dòng có liên quan từ tích Đề-các của các bảng. Khi làm việc với nhiều bảng, việc sử dụng bí danh cho bảng trở nên cực kỳ cần thiết để giữ cho câu truy vấn rõ ràng và tránh lỗi nhập nhằng tên cột. Chẳng hạn, để tìm tên trưởng bộ môn của các bộ môn thuộc khoa 'CNTT', cần kết nối bảng BOMON và GIAOVIEN thông qua mã trưởng bộ môn. Câu truy vấn sẽ phải tham chiếu đến cả hai bảng và lọc theo mã khoa. Việc phân tích yêu cầu, xác định các bảng liên quan, tìm ra các cột chung để tạo điều kiện kết, và xây dựng các điều kiện lọc bổ sung là quy trình chuẩn để giải quyết các bài toán truy vấn phức tạp.
5.1. Kỹ thuật kết hợp nhiều bảng thông qua điều kiện kết
Để lấy thông tin từ nhiều bảng, trước tiên cần xác định mối quan hệ giữa chúng, thường được thể hiện qua cặp khóa chính – khóa ngoại. Điều kiện kết được viết trong mệnh đề WHERE để liên kết các dòng tương ứng. Ví dụ, để tìm giáo viên làm việc ở bộ môn 'Hệ thống thông tin', ta cần kết hai bảng GIAOVIEN và BOMON. Câu lệnh sẽ có dạng: SELECT G.MAGV, G.HOTEN FROM GIAOVIEN G, BOMON B WHERE G.MABM = B.MABM AND B.TENBM = N'Hệ thống thông tin'. Ở đây, G.MABM = B.MABM chính là điều kiện kết, đảm bảo rằng mỗi giáo viên được ghép đúng với thông tin bộ môn của họ.
5.2. Phân tích ví dụ truy vấn SQL từ bài toán thực tế
Hãy xem xét ví dụ: 'Tìm họ tên giáo viên thuộc bộ môn “HTTT” có tham gia đề tài “Mobile Database”'. Bài toán này yêu cầu thông tin từ ba bảng: GIAOVIEN (họ tên, mã bộ môn), DETAI (tên đề tài), và THAMGIADT (bảng trung gian kết nối giáo viên và đề tài). Do đó, câu truy vấn cần hai điều kiện kết: một giữa GIAOVIEN và THAMGIADT qua MAGV, và một giữa THAMGIADT và DETAI qua MADT. Ngoài ra, cần thêm các điều kiện lọc trên MABM của giáo viên và TENDT của đề tài. Việc phân tích bài toán thành các thực thể, mối quan hệ và điều kiện lọc là kỹ năng quan trọng để viết các câu lệnh SQL phức tạp một cách chính xác.
VI. Tổng kết và định hướng học SQL nâng cao sau CTT102
Nội dung Ctt102 chương 5 SQL 2 đã cung cấp một nền tảng vững chắc về hai khía cạnh quan trọng nhất của SQL: Ngôn ngữ Định nghĩa Dữ liệu (DDL) và các truy vấn cơ bản sử dụng Ngôn ngữ Thao tác Dữ liệu (DML). Người học đã được trang bị kiến thức để tạo, sửa đổi và xóa cấu trúc bảng bằng các lệnh CREATE, ALTER, DROP. Đồng thời, kỹ năng truy vấn dữ liệu đã được hình thành thông qua việc sử dụng thành thạo bộ ba mệnh đề SELECT, FROM, và WHERE, bao gồm cả việc kết hợp dữ liệu từ nhiều bảng. Tuy nhiên, thế giới của SQL còn rất rộng lớn. Đây chỉ là những bước khởi đầu. Để trở thành một chuyên gia về cơ sở dữ liệu, việc tiếp tục tìm hiểu các khái niệm nâng cao là vô cùng cần thiết. Các chủ đề như hàm kết hợp, gom nhóm dữ liệu, truy vấn con, và các đối tượng cơ sở dữ liệu như khung nhìn và chỉ mục sẽ mở ra những khả năng xử lý dữ liệu mạnh mẽ hơn rất nhiều. Việc nắm vững các khái niệm này không chỉ giúp giải quyết các bài toán phức tạp hơn mà còn là chìa khóa để tối ưu hóa hiệu suất của toàn bộ hệ thống cơ sở dữ liệu. Kiến thức từ chương này là tiền đề quan trọng để tiếp tục khám phá và chinh phục những chủ đề SQL nâng cao.
6.1. Tóm tắt các lệnh SQL cơ bản đã học trong chương 5
Chương 5 đã giới thiệu các lệnh SQL nền tảng. Về DDL, các lệnh CREATE TABLE, ALTER TABLE, và DROP TABLE cho phép quản lý hoàn toàn vòng đời của một bảng. Người học đã biết cách định nghĩa cột, chọn kiểu dữ liệu, và áp đặt các ràng buộc toàn vẹn để đảm bảo chất lượng dữ liệu. Về DML, cấu trúc truy vấn SELECT ... FROM ... WHERE ... đã được phân tích chi tiết. Đây là cấu trúc phổ biến nhất, cho phép lấy dữ liệu từ một hoặc nhiều bảng và lọc kết quả dựa trên các điều kiện cụ thể. Những kiến thức này là đủ để thực hiện phần lớn các tác vụ cơ bản trong quản lý và khai thác cơ sở dữ liệu.
6.2. Các chủ đề nâng cao Hàm gom nhóm View và Index
Để tiến xa hơn, người học cần khám phá các chủ đề nâng cao được liệt kê trong đề cương. Các hàm kết hợp như COUNT(), SUM(), AVG(), MIN(), MAX() cho phép tính toán trên một tập hợp các dòng. Chúng thường đi kèm với mệnh đề GROUP BY để gom nhóm dữ liệu và thực hiện tính toán trên từng nhóm. Khung nhìn (View) là các câu lệnh SELECT được lưu trữ, hoạt động như một bảng ảo giúp đơn giản hóa các truy vấn phức tạp hoặc hạn chế quyền truy cập dữ liệu. Chỉ mục (Index) là một cấu trúc dữ liệu đặc biệt giúp tăng tốc độ truy vấn một cách đáng kể. Nắm vững những công cụ này sẽ nâng cao đáng kể năng lực làm việc với SQL.