Chương 6: Cơ bản SQL

Chương 6: Cơ bản SQL

Nội dung bài viết


Ngôn ngữ SQL có thể được coi là một trong những lý do chính cho sự thành công thương mại của cơ sở dữ liệu. Bởi vì nó đã trở thành một tiêu chuẩn cho cơ sở dữ liệu quan hệ, người dùng ít quan tâm hơn đến việc di chuyển các ứng dụng cơ sở dữ liệu của họ từ các loại hệ thống cơ sở dữ liệu khác — ví dụ, từ mô hình mạng hoặc hệ thống phân cấp — sang hệ thống quan hệ. Điều này là do ngay cả khi người dùng không hài lòng với sản phẩm DBMS quan hệ cụ thể mà họ đang sử dụng, việc chuyển đổi sang một sản phẩm DBMS quan hệ khác sẽ không quá tốn kém và mất thời gian vì cả hai hệ thống đều tuân theo các tiêu chuẩn ngôn ngữ giống nhau. Trong thực tế, tất nhiên, có sự khác biệt giữa các gói DBMS quan hệ thương mại khác nhau. Tuy nhiên, nếu người dùng siêng năng chỉ sử dụng những tính năng là một phần của tiêu chuẩn và nếu hai DBMS quan hệ hỗ trợ trung thực tiêu chuẩn, thì việc chuyển đổi giữa hai hệ thống sẽ được đơn giản hóa. Một lợi thế khác của việc có một tiêu chuẩn như vậy là người dùng có thể viết các câu lệnh trong một chương trình ứng dụng cơ sở dữ liệu có thể truy cập dữ liệu được lưu trữ trong hai hoặc nhiều DBMS quan hệ mà không cần phải thay đổi ngôn ngữ con của cơ sở dữ liệu (SQL), miễn là cả hai / tất cả các DBMS quan hệ hỗ trợ SQL tiêu chuẩn

Tên SQL được viết tắt từ Structured Query Language - Ngôn ngữ truy vấn có cấu trúc. Ban đầu, SQL được gọi là SEQUEL (Ngôn ngữ truy vấn có cấu trúc theo tiếng Anh) và được thiết kế và triển khai tại IBM Research làm giao diện cho hệ thống cơ sở dữ liệu quan hệ thử nghiệm được gọi là SYSTEM R. SQL hiện là ngôn ngữ tiêu chuẩn cho các DBMS quan hệ thương mại. Việc tiêu chuẩn hóa SQL là một nỗ lực chung của Viện Tiêu chuẩn Quốc gia Hoa Kỳ (ANSI) và Tổ chức Tiêu chuẩn Quốc tế (ISO), và tiêu chuẩn SQLđầu tiên được gọi là SQL-86 hoặc SQL1. Một tiêu chuẩn được sửa đổi và mở rộng nhiều có tên là SQL-92 (còn được gọi là SQL2) sau đó đã được phát triển. Tiêu chuẩn tiếp theo được công nhận tốt là SQL: 1999, khởi đầu là SQL3. Các bản cập nhật bổ sung cho tiêu chuẩn là SQL : 2003 và SQL: 2006, đã thêm các tính năng XML trong số các bản cập nhật khác cho ngôn ngữ. Một bản cập nhật khác vào năm 2008 đã kết hợp nhiều tính năng cơ sở dữ liệu đối tượng hơn vào SQL và một bản cập nhật khác là SQL: 2011. Chúng tôi sẽ cố gắng giới thiệu phiên bản SQL mới nhất nhiều nhất có thể, nhưng một số tính năng mới hơn sẽ được thảo luận trong các chương sau. Cũng không thể trình bày toàn bộ ngôn ngữ trong bài viết này. Điều quan trọng cần lưu ý là khi các tính năng mới được thêm vào SQL, thường mất vài năm để một số tính năng này được đưa vào các DBMS SQL thương mại.

SQL là một ngôn ngữ cơ sở dữ liệu toàn diện: Nó có các câu lệnh cho các định nghĩa, truy vấn và cập nhật dữ liệu. Do đó, nó vừa là DDL vừa là DML. Ngoài ra, nó có các mối quan hệ dễ dàng để xác định các chế độ xem trên cơ sở dữ liệu, để chỉ định bảo mật và ủy quyền, để xác định các ràng buộc toàn vẹn và để chỉ định các kiểm soát giao dịch. Nó cũng có các quy tắc để nhúng các câu lệnh SQL vào một ngôn ngữ lập trình chung như Java hoặc C / C ++

Các tiêu chuẩn SQL sau này (bắt đầu với SQL: 1999) được chia thành một tiêu chuẩn cụ thể cốt lõi cộng với các phần mở rộng chuyên dụng. Cốt lõi được cho là được triển khai bởi tất cả các nhà cung cấp RDBMS tuân thủ SQL. Các phần mở rộng có thể được triển khai dưới dạng các mô-đun tùy chọn được mua độc lập cho các ứng dụng cơ sở dữ liệu cụ thể như khai thác dữ liệu, dữ liệu không gian, dữ liệu thời gian, kho dữ liệu, xử lý cal phân tích trực tuyến (OLAP), dữ liệu đa phương tiện, v.v.

1. Các câu lệnh định nghĩa dữ liệu và kiểu dữ liệu

SQL sử dụng bảng, hàng và cột tương ứng cho các khái niệm mô hình quan hệ chính thức, tuple và thuộc tính. Chúng tôi sẽ sử dụng các khái niệm tương ứng thay thế cho nhau. Lệnh SQL chính để định nghĩa dữ liệu là câu lệnh CREATE, có thể được sử dụng để tạo lược đồ, bảng (quan hệ), kiểu và miền cũng như các cấu trúc khác như View, xác nhận và trình kích hoạt. Trước khi chúng tôi mô tả các câu lệnh CREATE và các câu lệnh liên quan, chúng tôi thảo luận về các khái niệm lược đồ và danh mục để đưa cuộc thảo luận theo 1 một luồn. Phần sau chúng tôi sẽ mô tả cách tạo bảng và mô tả các kiểu dữ liệu quan trọng nhất có sẵn cho đặc tả thuộc tính. Vì chi tiết SQL rộng lớn khá, chúng tôi đưa ra mô tả về các tính năng quan trọng nhất. Bạn có thể tìm thêm thông tin chi tiết trong các tài liệu tiêu chuẩn SQL khác nhau.

1.1 Các khái niệm lược đồ và danh mục trong SQL

Các phiên bản đầu tiên của SQL không bao gồm khái niệm về một lược đồ cơ sở dữ liệu quan hệ; tất cả các bảng (quan hệ) được coi là một phần của cùng một lược đồ. Khái niệm về một lược đồ SQL được kết hợp bắt đầu với SQL2 để nhóm các bảng và các cấu trúc khác thuộc cùng một ứng dụng cơ sở dữ liệu lại với nhau (trong một số hệ thống, một lược đồ được gọi là cơ sở dữ liệu). Một lược đồ SQL được xác định bằng tên lược đồ và bao gồm một số nhận dạng ủy quyền để chỉ ra người dùng hoặc tài khoản sở hữu lược đồ, cũng như các bộ mô tả cho mỗi phần tử trong lược đồ. Các phần tử của lược đồ bao gồm các bảng, kiểu, ràng buộc, dạng xem, miền và các cấu trúc khác (chẳng hạn như cấp phép) mô tả lược đồ. Một lược đồ được tạo thông qua câu lệnh CREATE SCHEMA, câu lệnh này có thể bao gồm tất cả các định nghĩa của phần tử giản đồ. Ngoài ra, lược đồ có thể được gán tên và mã định danh ủy quyền, và các phần tử có thể được xác định sau đó. Ví dụ: câu lệnh sau tạo một lược đồ có tên là COMPANY do người dùng sở hữu với số nhận dạng ủy quyền là ‘Jsmith’. Lưu ý rằng mỗi câu lệnh trong SQL kết thúc bằng dấu chấm phẩy.

CREATE SCHEMA COMPANY AUTHORIZATION ‘Jsmith’;

Nói chung, không phải tất cả người dùng đều được phép tạo lược đồ và phần tử lược đồ. Đặc quyền tạo lược đồ, bảng và các cấu trúc khác phải được quản trị viên hệ thống hoặc DBA cấp rõ ràng cho các tài khoản người dùng có liên quan.

Ngoài khái niệm lược đồ, SQL sử dụng khái niệm danh mục — một tập hợp các lược đồ được đặt tên. Cài đặt cơ sở dữ liệu thường có môi trường và lược đồ mặc định, vì vậy khi người dùng kết nối và đăng nhập vào cài đặt cơ sở dữ liệu đó, người dùng có thể tham chiếu trực tiếp đến các bảng và các cấu trúc khác trong lược đồ đó mà không cần phải chỉ định một tên lược đồ cụ thể. Một danh mục luôn chứa một lược đồ đặc biệt được gọi là INFORMATION_SCHEMA, lược đồ này cung cấp thông tin về tất cả các lược đồ trong danh mục và tất cả các bộ mô tả phần tử trong các lược đồ này. Các ràng buộc về tính toàn vẹn chẳng hạn như tính toàn vẹn tham chiếu chỉ có thể được xác định giữa các quan hệ nếu chúng tồn tại trong các lược đồ trong cùng một danh mục. Các lược đồ trong cùng một danh mục cũng có thể chia sẻ các yếu tố nhất định, chẳng hạn như định nghĩa kiểu và miền trị

1.2 Câu lệnh CREATE TABLE trong SQL

Lệnh CREATE TABLE được sử dụng để chỉ định một quan hệ mới bằng cách đặt tên cho nó và xác định các thuộc tính và các ràng buộc ban đầu của nó. Các thuộc tính được chỉ định trước và mỗi thuộc tính được đặt một tên, một kiểu dữ liệu để chỉ định miền giá trị của nó và có thể là các ràng buộc thuộc tính, chẳng hạn như NOT NULL. Các ràng buộc toàn vẹn khóa, thực thể và toàn vẹn tham chiếu có thể được chỉ định trong câu lệnh CREATE TABLE sau khi các thuộc tính được khai báo hoặc chúng có thể được thêm vào sau bằng cách sử dụng lệnh ALTER TABLE. Hình 6.1 cho thấy các câu lệnh định nghĩa dữ liệu mẫu trong SQL cho lược đồ cơ sở dữ liệu quan hệ COMPANY được hiển thị trong Hình 3.7

Thông thường, lược đồ SQL trong đó các quan hệ được khai báo được chỉ định ngầm trong môi trường mà các câu lệnh CREATE TABLE được thực thi. Ngoài ra, chúng ta có thể đính kèm rõ ràng tên lược đồ với tên quan hệ, được phân tách bằng dấu chấm. Ví dụ, bằng cách viết

CREATE TABLE COMPANY.EMPLOYEE

hoặc có thể viết như sau

CREATE TABLE EMPLOYEE

như trong Hình 6.1, chúng ta có thể rõ ràng (thay vì ngầm định) làm cho bảng EMPLOYEE là một phần của lược đồ COMPANY.

Các quan hệ được khai báo thông qua câu lệnh CREATE TABLE được gọi là bảng cơ sở (hay quan hệ cơ sở); điều này có nghĩa là bảng và các hàng của nó thực sự được DBMS tạo và lưu trữ dưới dạng tệp. Quan hệ cơ sở được phân biệt với quan hệ ảo, được tạo thông qua câu lệnh CREATE VIEW, có thể có hoặc không tương ứng với một tệp vật lý thực tế. Trong SQL, các thuộc tính trong bảng cơ sở được coi là sắp xếp theo trình tự mà chúng được chỉ định trong câu lệnh CREATE TABLE. Tuy nhiên, các hàng (bộ giá trị) không được coi là có thứ tự trong một bảng (quan hệ)

Điều quan trọng cần lưu ý là trong Hình 6.1, có một số khóa ngoại có thể gây ra lỗi vì chúng được chỉ định thông qua tham chiếu vòng tròn hoặc vì chúng tham chiếu đến một bảng chưa được tạo. Ví dụ, khóa ngoại Super_ssn trong bảng EMPLOYEE là một tham chiếu vòng vì nó tham chiếu đến chính bảng EMPLOYEE. Khóa ngoại Dno trong bảng EMPLOYEE tham chiếu đến bảng DEPARTMENT, chưa được tạo. Để giải quyết loại vấn đề này, các ràng buộc này có thể được loại bỏ khỏi câu lệnh CREATE TABLE ban đầu, và sau đó được thêm vào sau đó bằng cách sử dụng câu lệnh ALTER TABLE. 

1.3 Miền và kiểu dữ liệu thuộc tính trong SQL

Các kiểu dữ liệu cơ bản có sẵn cho các thuộc tính bao gồm số, chuỗi ký tự, bit, boolean, datetime.

  • Các kiểu dữ liệu số bao gồm các số nguyên có kích thước khác nhau (INTEGER hoặc INT và SMALLINT) và các số dấu phẩy động (thực) có độ chính xác khác nhau (FLOAT hoặc REAL và DOUBLE PRECISION). Các số được định dạng có thể được khai báo bằng cách sử dụng DECIMAL (i, j) —hoặc DEC (i, j) hoặc NUMERIC (i, j) —trong đó i, độ chính xác, là tổng số chữ số thập phân và j, tỷ lệ, là số chữ số sau dấu thập phân. Giá trị mặc định cho tỷ lệ là 0 và giá trị mặc định cho độ chính xác được xác định bởi việc triển khai
  • Kiểu dữ liệu chuỗi ký tự có độ dài cố định — CHAR (n) hoặc CHARACTER (n), trong đó n là số ký tự — hoặc độ dài thay đổi— VARCHAR (n) hoặc CHAR VARYING (n) hoặc CHARACTER VARYING (n), với n là số ký tự tối đa. Khi chỉ định một giá trị chuỗi theo nghĩa đen, nó được đặt giữa các dấu ngoặc kép (dấu nháy đơn) và nó là chữ hoa chữ thường (phân biệt giữa chữ hoa và chữ thường) . Đối với các chuỗi có độ dài cố định, một chuỗi ngắn hơn được đệm bằng các ký tự trống rẽ phải. Ví dụ: nếu giá trị ‘Smith’ dành cho một thuộc tính thuộc loại CHAR (10), thì nó sẽ được đệm bằng năm ký tự trống để trở thành ‘Smith’ nếu cần. Các khoảng trống được đệm thường bị bỏ qua khi các chuỗi được so sánh. Đối với mục đích so sánh, các chuỗi được coi là sắp xếp theo thứ tự bảng chữ cái (hoặc từ vựng); nếu một chuỗi str1 xuất hiện trước một chuỗi str2 khác theo thứ tự bảng chữ cái, thì str1 được coi là nhỏ hơn str2. Ngoài ra còn có một toán tử nối được ký hiệu là || (thanh dọc kép) có thể nối hai chuỗi trong SQL. Ví dụ: ‘abc’ || ‘XYZ’ dẫn đến một chuỗi duy nhất ‘abcXYZ’. Một kiểu dữ liệu chuỗi có độ dài thay đổi khác được gọi là CHARACTER LARGE OBJECT hoặc CLOB cũng có sẵn để chỉ định các cột có giá trị văn bản lớn, chẳng hạn như tài liệu. Độ dài tối đa CLOB có thể được chỉ định bằng kilobyte (K), megabyte (M) hoặc gigabyte (G). Ví dụ: CLOB (20M) chỉ định độ dài tối đa là 20 megabyte.
  • Các kiểu dữ liệu chuỗi bit có độ dài cố định n — BIT (n) —hoặc độ dài thay đổi — BIT VARYING (n), trong đó n là số bit tối đa. Giá trị mặc định cho n, độ dài của một chuỗi ký tự hoặc chuỗi bit, là 1. Các chuỗi bit theo nghĩa đen được đặt giữa các dấu nháy đơn nhưng đứng trước dấu B để phân biệt chúng với các chuỗi ký tự; ví dụ: B‘10101’.5 Một kiểu dữ liệu chuỗi bit có độ dài thay đổi khác được gọi là BINARY LARGE OBJECT hoặc BLOB cũng có sẵn để chỉ định các cột có giá trị nhị phân lớn, chẳng hạn như hình ảnh. Đối với CLOB, độ dài tối đa của BLOB có thể được chỉ định bằng kilobit (K), megabit (M) hoặc gigabit (G). Ví dụ: BLOB (30G) chỉ định độ dài tối đa là 30 gigabit
  • Kiểu dữ liệu Boolean có các giá trị truyền thống là TRUE hoặc FALSE. Trong SQL, do sự hiện diện của giá trị NULL, logic ba giá trị được sử dụng, vì vậy giá trị thứ ba có thể có cho kiểu dữ liệu Boolean là UNKNOWN. Chúng tôi thảo luận về sự cần thiết của UNKNOWN và logic ba giá trị trong phần sau
  • • Kiểu dữ liệu DATE có mười vị trí và các thành phần của nó là YEAR, MONTH và DAY ở dạng YYYY-MM-DD. Kiểu dữ liệu TIME có ít nhất tám vị trí, với các thành phần HOUR, MINUTE và SECOND ở dạng HH: MM: SS. Chỉ những ngày và giờ hợp lệ mới được phép triển khai SQL. Điều này ngụ ý rằng các tháng phải từ 1 đến 12 và các ngày phải từ 01 đến 31; hơn nữa, một ngày phải là một ngày hợp lệ cho tháng tương ứng. Phép so sánh <(nhỏ hơn) có thể được sử dụng với ngày hoặc giờ — một ngày sớm hơn được coi là nhỏ hơn một ngày muộn hơn và tương tự với thời gian. Giá trị theo nghĩa đen được biểu thị bằng các chuỗi được trích dẫn đơn trước từ khóa DATE hoặc TIME; ví dụ: DATE ‘2014-09-27’ hoặc TIME ‘09: 12: 47 ’. Ngoài ra, kiểu dữ liệu TIME (i), trong đó i được gọi là độ chính xác giây phân số thời gian, chỉ định i + 1 vị trí bổ sung cho TIME — một vị trí cho một ký tự dấu chấm (.) Bổ sung và vị trí i để chỉ định các phân số thập phân của một thứ hai. Kiểu dữ liệu TIME WITH TIME ZONE bao gồm sáu vị trí bổ sung để chỉ định dịch chuyển từ múi giờ quốc tế tiêu chuẩn, nằm trong khoảng từ +13: 00 đến –12: 59 theo đơn vị GIỜ: PHÚT. Nếu CÙNG TIME ZONE không được bao gồm, mặc định là múi giờ địa phương cho phiên SQL.

Một số kiểu dữ liệu bổ sung được thảo luận bên dưới. Danh sách các loại được thảo luận ở đây là không đầy đủ; các triển khai khác nhau đã thêm nhiều kiểu dữ liệu hơn vào SQL.

  • Dữ liệu thời gian (TIMESTAMP) bao gồm các trường NGÀY và GIỜ, cộng với tối thiểu sáu vị trí cho các phân số thập phân của giây và một bộ định nghĩa CÙNG TIME ZONE tùy chọn. Giá trị theo nghĩa đen được biểu thị bằng dấu nháy đơn. các chuỗi đứng trước từ khóa TIMESTAMP, với một khoảng trống giữa dữ liệu và thời gian; ví dụ: TIMESTAMP ‘2014-09-27 09: 12: 47.648302’.
  • Một kiểu dữ liệu khác liên quan đến DATE, TIME và TIMESTAMP là kiểu dữ liệu INTERVAL. Điều này chỉ định một khoảng thời gian — một giá trị tương đối có thể được sử dụng để tăng hoặc giảm giá trị tuyệt đối của ngày, giờ hoặc dấu thời gian. Khoảng thời gian đủ điều kiện là khoảng NĂM / THÁNG hoặc khoảng NGÀY / GIỜ

Định dạng DATE, TIME và TIMESTAMP có thể được coi là một loại chuỗi đặc biệt. Do đó, chúng thường có thể được sử dụng trong so sánh chuỗi bằng cách ép kiểu (đổi kiểu) thành các chuỗi tương đương

Có thể chỉ định kiểu dữ liệu của từng thuộc tính một cách trực tiếp, như trong Hình 6.1; cách khác, một miền có thể được khai báo và tên miền có thể được sử dụng với đặc tả thuộc tính. Điều này giúp dễ dàng thay đổi kiểu dữ liệu cho một miền được sử dụng bởi nhiều thuộc tính trong một lược đồ và cải thiện khả năng đọc của lược đồ. Ví dụ: chúng tôi có thể tạo tên miền SSN_TYPE bằng câu lệnh sau:

CREATE DOMAIN SSN_TYPE AS CHAR(9);

Chúng ta có thể sử dụng SSN_TYPE thay cho CHAR (9) trong Hình 6.1 cho các thuộc tính Ssn và Super_ssn của EMPLOYEE, Mgr_ssn của DEPARTMENT, Essn của WORKS_ON và Essn của DEPENDENT. Miền cũng có thể có thông số kỹ thuật mặc định tùy chọn thông qua mệnh đề DEFAULT, như chúng ta sẽ thảo luận sau về các thuộc tính. Lưu ý rằng các miền có thể không khả dụng trong một số triển khai SQL

Trong SQL, cũng có lệnh CREATE TYPE, lệnh này có thể được sử dụng để tạo các kiểu hoặc UDT do người dùng xác định. Sau đó, chúng có thể được sử dụng làm kiểu dữ liệu cho các thuộc tính hoặc làm cơ sở để tạo bảng. Chúng ta sẽ thảo luận về CREATE TYPE ở phần sau, vì nó thường được sử dụng cùng với việc chỉ định các tính năng cơ sở dữ liệu đối tượng đã được tích hợp vào các phiên bản SQL mới hơn.

2. Chỉ định các ràng buộc trong SQL

Phần này mô tả các ràng buộc cơ bản có thể được chỉ định trong SQL như một phần của quá trình tạo bảng. Chúng bao gồm các ràng buộc toàn vẹn khóa và tham chiếu, các hạn chế đối với các miền thuộc tính và NULL, và các ràng buộc đối với các bộ giá trị riêng lẻ trong một mối quan hệ bằng cách sử dụng mệnh đề CHECK

2.1 Chỉ định các ràng buộc thuộc tính và mặc định thuộc tính

Bởi vì SQL cho phép NULL làm giá trị thuộc tính, một ràng buộc NOT NULL có thể được chỉ định nếu NULL không được phép đối với một thuộc tính cụ thể. Điều này luôn được chỉ định ngầm cho các thuộc tính là một phần của khóa chính của mỗi quan hệ, nhưng nó có thể được chỉ định cho bất kỳ thuộc tính nào khác có giá trị được yêu cầu không phải là NULL, như thể hiện trong Hình 6.1.

Cũng có thể xác định giá trị mặc định cho một thuộc tính bằng cách thêm mệnh đề DEFAULT vào một định nghĩa thuộc tính. Giá trị mặc định được bao gồm trong bất kỳ bộ giá trị mới nào nếu giá trị rõ ràng không được cung cấp cho thuộc tính đó. Hình 6.2 minh họa một ví dụ về việc chỉ định một người quản lý mặc định cho một bộ phận mới và một bộ phận mặc định cho một nhân viên mới. Nếu không có mệnh đề mặc định nào được chỉ định, giá trị mặc định mặc định là NULL cho các thuộc tính không có ràng buộc NOT NULL.

Một loại ràng buộc khác có thể hạn chế các giá trị thuộc tính hoặc miền bằng cách sử dụng mệnh đề CHECK theo sau một định nghĩa thuộc tính hoặc miền. Ví dụ: giả sử rằng số phòng ban bị giới hạn ở các số nguyên từ 1 đến 20; sau đó, chúng ta có thể thay đổi khai báo thuộc tính của Dnumber trong bảng DEPARTMENT (xem Hình 6.1) như sau:

Dnumber INT NOT NULL CHECK (Dnumber > 0 AND Dnumber < 21);

Mệnh đề CHECK cũng có thể được sử dụng cùng với câu lệnh CREATE DOMAIN. Ví dụ, chúng ta có thể viết câu lệnh sau:

CREATE DOMAIN D_NUM AS INTEGER 
CHECK (D_NUM > 0 AND D_NUM < 21);

Sau đó, chúng ta có thể sử dụng miền đã tạo D_NUM làm loại thuộc tính cho tất cả các thuộc tính tham chiếu đến DNumber trong Hình 6.1, chẳng hạn như Dnumber of DEPARTMENT, Dnum of PROJECT, Dno of EMPLOYEE, v.v.

2.2 Chỉ định các ràng buộc toàn vẹn khóa và tham chiếu

Bởi vì các ràng buộc về khóa và tính toàn vẹn tham chiếu là rất quan trọng nên có các mệnh đề đặc biệt trong câu lệnh CREATE TABLE để chỉ định chúng. Một số ví dụ để minh họa đặc điểm kỹ thuật của khóa và tính toàn vẹn tham chiếu được thể hiện trong Hình 6.1.7 Mệnh đề PRIMARY KEY chỉ định một hoặc nhiều thuộc tính tạo nên khóa chính của một quan hệ. Nếu khóa chính có một thuộc tính duy nhất, thì mệnh đề có thể trực tiếp theo sau thuộc tính đó. Ví dụ: khóa chính của DEPARTMENT có thể được chỉ định như sau (thay vì cách được chỉ định trong Hình 6.1)

Dnumber INT PRIMARY KEY

Mệnh đề UNIQUE chỉ định các khóa thay thế (duy nhất), còn được gọi là khóa ứng cử viên như được minh họa trong khai báo bảng DEPARTMENT và PROJECT trong Hình 6.1. Mệnh đề UNIQUE cũng có thể được chỉ định trực tiếp cho một khóa duy nhất nếu đó là một thuộc tính duy nhất, như trong ví dụ sau:

Dname VARCHAR(15) UNIQUE

Tính toàn vẹn tham chiếu được xác định thông qua mệnh đề FOREIGN KEY, như trong Hình 6.1. Như chúng ta đã thảo luận trong trước, ràng buộc toàn vẹn tham chiếu có thể bị vi phạm khi các bộ dữ liệu được chèn hoặc xóa hoặc khi giá trị thuộc tính khóa ngoại hoặc khóa chính được cập nhật. Hành động mặc định mà SQL thực hiện đối với vi phạm tính toàn vẹn là từ chối thao tác cập nhật sẽ gây ra vi phạm, được gọi là tùy chọn RESTRICT. Tuy nhiên, người thiết kế lược đồ có thể chỉ định một hành động thay thế được thực hiện bằng cách đính kèm mệnh đề hành động được kích hoạt tham chiếu vào bất kỳ ràng buộc khóa ngoại nào. Các tùy chọn bao gồm SET NULL, CASCADE và SET DEFAULT. Một tùy chọn phải đủ điều kiện với ON DELETE hoặc ON UPDATE. Chúng tôi minh họa điều này với các ví dụ trong Hình 6.2. Ở đây, người thiết kế cơ sở dữ liệu chọn ON DELETE SET NULL và ON UPDATE CASCADE cho khóa ngoại Super_ssn của EMPLOYEE. Điều này có nghĩa là nếu bộ dữ liệu dành cho nhân viên giám sát bị xóa, giá trị của Super_ssn sẽ tự động được đặt thành NULL cho tất cả bộ dữ liệu nhân viên đang tham chiếu đến bộ dữ liệu nhân viên đã xóa. Mặt khác, nếu giá trị Ssn cho nhân viên giám sát được cập nhật (giả sử vì giá trị này được nhập không chính xác), thì giá trị mới được xếp tầng thành Super_ssn cho tất cả các bộ dữ liệu nhân viên tham chiếu bộ dữ liệu nhân viên đã cập nhật.

Nói chung, hành động do DBMS thực hiện đối với SET NULL hoặc SET DEFAULT là giống nhau đối với cả ON DELETE và ON UPDATE: Giá trị của các thuộc tính tham chiếu bị ảnh hưởng được thay đổi thành NULL cho SET NULL và thành giá trị mặc định đã chỉ định của thuộc tính tham chiếu cho SET DEFAULT. Hành động đối với CASCADE ON DELETE là xóa tất cả các bộ tham chiếu, trong khi hành động đối với CASCADE ON UPDATE là thay đổi giá trị của (các) thuộc tính khóa ngoài tham chiếu thành giá trị khóa chính (mới) được cập nhật cho tất cả các bộ tham chiếu. Người thiết kế cơ sở dữ liệu có trách nhiệm chọn hành động thích hợp và chỉ định nó trong lược đồ cơ sở dữ liệu. Theo nguyên tắc chung, tùy chọn CASCADE phù hợp với các quan hệ chẳng hạn như WORKS_ON; đối với các mối quan hệ đại diện cho các thuộc tính đa giá trị, chẳng hạn như DEPT_LOCATIONS; và đối với các mối quan hệ đại diện cho các loại thực thể yếu, chẳng hạn như DEPENDENT, vấn đề này sẽ được bàn trong bài viết cụ thể hơn

2.3 Đặt tên các ràng buộc

Hình 6.2 cũng minh họa cách một ràng buộc có thể được đặt tên theo sau từ khóa CONSTRAINT. Tên của tất cả các ràng buộc trong một lược đồ cụ thể phải là duy nhất. Tên ràng buộc được sử dụng để xác định một biến dạng ràng buộc cụ thể trong trường hợp ràng buộc này phải được loại bỏ sau đó và thay thế bằng một biến dạng ràng buộc khác, chúng ta sẽ thảo luận ở bài viết cụ thể hơn. Việc đặt tên cho các ràng buộc là tùy chọn. Cũng có thể tạm thời trì hoãn một ràng buộc cho đến khi kết thúc giao dịch, như chúng ta sẽ thảo luận khi trình bày các khái niệm giao dịch.

2.4 Chỉ định các ràng buộc với CHECK

Ngoài các ràng buộc toàn vẹn khóa và tham chiếu, được chỉ định bởi các từ khóa đặc biệt, các ràng buộc bảng khác có thể được chỉ định thông qua các mệnh đề CHECK bổ sung ở cuối câu lệnh CREATE TABLE. Chúng có thể được gọi là các ràng buộc dựa trên hàng vì chúng áp dụng cho từng hàng riêng lẻ và được kiểm tra bất cứ khi nào một hàng được chèn hoặc sửa đổi. Ví dụ, giả sử rằng bảng DEPARTMENT trong Hình 6.1 có một thuộc tính bổ sung Dept_create_date, thuộc tính này lưu trữ ngày khi phòng ban được tạo. Sau đó, chúng ta có thể thêm mệnh đề CHECK sau vào cuối câu lệnh CREATE TABLE cho bảng DEPARTMENT để đảm bảo rằng ngày bắt đầu của người quản lý muộn hơn ngày tạo phòng ban.

CHECK (Dept_create_date <= Mgr_start_date);

Mệnh đề CHECK cũng có thể được sử dụng để chỉ định các ràng buộc tổng quát hơn bằng cách sử dụng câu lệnh CREATE ASSERTION của SQL. Chúng ta thảo luận vấn đề này trong bài tiếp theo khi đã tìm hiểu về các câu lệnh query

3. Các câu lệnh truy vấn cơ bản

SQL có một câu lệnh cơ bản để truy xuất thông tin từ cơ sở dữ liệu: câu lệnh SELECT. Câu lệnh SELECT không giống như phép toán SELECT của đại số quan hệ mà chúng ta sẽ thảo luận về đại số quan hệ trong bài viết cụ thể sau. Có nhiều tùy chọn đối với câu lệnh SELECT trong SQL, vì vậy chúng tôi sẽ giới thiệu dần dần các tính năng của nó. Chúng tôi sẽ sử dụng các truy vấn ví dụ được chỉ định trong lược đồ của ở chương 5 và sẽ tham khảo trạng thái cơ sở dữ liệu mẫu được hiển thị trong các ví dụ ở chương 5 để hiển thị kết quả của một số truy vấn này. Trong phần này, chúng tôi trình bày các tính năng của SQL cho các truy vấn truy xuất đơn giản. Các tính năng của SQL để chỉ định các truy vấn truy xuất phức tạp hơn được trình bày ở bài sau

Trước khi tiếp tục, chúng ta phải chỉ ra một điểm khác biệt quan trọng giữa mô hình SQL thực tế và mô hình quan hệ chính thức được thảo luận trong chương 5: SQL cho phép một bảng (quan hệ) có hai hoặc nhiều bộ giống hệt nhau về tất cả các giá trị thuộc tính của chúng. Do đó, nói chung, một bảng SQL không phải là một tập hợp các bộ, bởi vì một tập hợp không cho phép hai phần tử giống hệt nhau; đúng hơn, nó là một tập hợp nhiều bộ (đôi khi được gọi là một bag). Một số quan hệ SQL bị ràng buộc phải được thiết lập vì ràng buộc khóa đã được khai báo hoặc do tùy chọn DISTINCT đã được sử dụng với câu lệnh SELECT (được mô tả sau trong phần này). Chúng ta có thể thấy được sự khác biệt này khi chúng ta thảo luận về các ví dụ

3.1 Cấu trúc câu lệnh SELECT-FROM-WHERE

Truy vấn trong SQL có thể rất phức tạp. Chúng tôi sẽ bắt đầu với các truy vấn đơn giản, sau đó tiến tới các truy vấn phức tạp hơn theo cách từng bước. Dạng cơ bản của câu lệnh SELECT, đôi khi được gọi là ánh xạ hoặc khối select-from-where, được hình thành từ ba mệnh đề SELECT, FROM và WHERE và có dạng sau:

SELECT <attribute list>
FROM <table list>
WHERE <condition>;

Trong đó:

  • <attribute list> là danh sách các tên thuộc tính có giá trị được truy xuất bởi câu truy vấn.
  • <table list > là danh sách các tên quan hệ cần thiết để xử lý truy vấn
  • <condition> là một biểu thức có điều kiện (Boolean) xác định các bộ dữ liệu được truy xuất bởi truy vấn

Trong SQL, các toán tử so sánh logic cơ bản để so sánh các giá trị thuộc tính với nhau và với các hằng số là =, <=, >, >= và <>. Chúng tương ứng với các toán tử đại số quan hệ =, , ≥ và ≠ tương ứng, và tương ứng với các toán tử ngôn ngữ lập trình C/C++ =, <=, >, >= và !=. Sự khác biệt chính về cú pháp là toán tử không bằng. SQL có thêm các toán tử so sánh mà chúng tôi sẽ trình bày dần dần.

Chúng tôi minh họa câu lệnh CHỌN cơ bản trong SQL bằng một số truy vấn mẫu.

Truy vấn 0: Truy xuất ngày sinh và địa chỉ của (những) nhân viên có tên là 'John B. Smith'

Q0: 	SELECT Bdate, Address 
        FROM EMPLOYEE 
        WHERE Fname = ‘John’ AND Minit = ‘B’ AND Lname = ‘Smith’;

Truy vấn này chỉ liên quan đến quan hệ EMPLOYEE được liệt kê trong mệnh đề FROM. Truy vấn chọn các bộ dữ liệu EMPLOYEE riêng lẻ thỏa mãn điều kiện của mệnh đề WHERE, sau đó chiếu kết quả lên các thuộc tính Bdate và Address được liệt kê trong mệnh đề SELECT

Mệnh đề SELECT của SQL chỉ định các thuộc tính có giá trị được truy xuất, được gọi là thuộc tính phép chiếu trong đại số quan hệ và mệnh đề WHERE chỉ định điều kiện Boolean phải đúng cho bất kỳ bộ dữ liệu nào được truy xuất, được gọi là điều kiện chọn trong đại số quan hệ. Hình 6.3(a) hiển thị kết quả của truy vấn Q0 trên cơ sở dữ liệu

Chúng ta có thể nghĩ về một biến hoặc bộ lặp ẩn trong truy vấn SQL, hoặc lặp qua từng bộ riêng lẻ trong bảng EMPLOYEE và đánh giá điều kiện trong mệnh đề WHERE. Chỉ những bộ dữ liệu thỏa mãn điều kiện—nghĩa là những bộ dữ liệu mà điều kiện đánh giá là TRUE sau khi thay thế các giá trị thuộc tính tương ứng của chúng—mới được chọn

Truy vấn 1: Truy xuất tên và địa chỉ của tất cả nhân viên làm việc cho bộ phận 'Research’.

Q1: 	SELECT Fname, Lname, Address 
        FROM EMPLOYEE, DEPARTMENT 
        WHERE Dname = ‘Research’ AND Dnumber = Dno;

Trong mệnh đề WHERE của Q1, điều kiện Dname = ‘Research’ là một điều kiện lựa chọn để chọn bộ quan tâm cụ thể trong bảng DEPARTMENT, bởi vì Dname là một thuộc tính của DEPARTMENT. Điều kiện Dnumber = Dno được gọi là điều kiện nối, bởi vì nó kết hợp hai bộ: một từ DEPARTMENT và một từ EMPLOYEE, bất cứ khi nào giá trị của Dnumber trong DEPARTMENT bằng với giá trị của Dno trong EMPLOYEE. Kết quả của truy vấn Q1 được hiển thị trong Hình 6.3(b). Nói chung, bất kỳ số lượng điều kiện lựa chọn và tham gia nào cũng có thể được chỉ định trong một truy vấn SQL.

Một truy vấn chỉ liên quan đến các điều kiện chọn và điều kiện join với các thuộc tính phép chiếu được gọi là truy vấn select-project-join. Ví dụ tiếp theo là truy vấn select-project-join  với hai điều kiện tham gia.

Truy vấn 2: Đối với mọi dự án nằm trong 'Stafford', hãy liệt kê số dự án, số bộ phận kiểm soát và tên, địa chỉ và ngày sinh của người quản lý bộ phận.

Q2: 	SELECT Pnumber, Dnum, Lname, Address, Bdate 
FROM PROJECT, DEPARTMENT, EMPLOYEE 
WHERE Dnum = Dnumber AND Mgr_ssn = Ssn AND Plocation = ‘Stafford’

Điều kiện nối Dnum = Dnumber liên kết bộ dự án với bộ bộ phận kiểm soát của nó, trong khi điều kiện nối Mgr_ssn = Ssn liên kết bộ bộ phận kiểm soát với bộ nhân viên quản lý bộ phận đó. Mỗi bộ trong kết quả sẽ là sự kết hợp của một dự án, một bộ phận (kiểm soát dự án) và một nhân viên (quản lý bộ phận). Các thuộc tính phép chiếu được sử dụng để chọn các thuộc tính sẽ được hiển thị từ mỗi bộ kết hợp. Kết quả của truy vấn Q2 được hiển thị trong Hình 6.3(c).

3.2 Vấn đề trùng tên thuộc tính, đặt lại tên thuộc tính

Trong SQL, có thể sử dụng cùng một tên cho hai (hoặc nhiều) thuộc tính miễn là các thuộc tính đó nằm trong các bảng khác nhau. Nếu trường hợp này xảy ra và một truy vấn nhiều bảng đề cập đến hai hoặc nhiều thuộc tính có cùng tên, thì chúng ta phải xác định tên thuộc tính bằng tên quan hệ để tránh sự mơ hồ. Điều này được thực hiện bằng cách thêm tiền tố tên quan hệ vào tên thuộc tính và ngăn cách hai tên này bằng một dấu chấm. Để minh họa điều này, giả sử rằng trong Hình 5.5 và 5.6, các thuộc tính Dno và Lname của quan hệ EMPLOYEE được gọi là Dnumber và Name, và thuộc tính Dname của DEPARTMENT cũng được gọi là Name; sau đó, để tránh sự mơ hồ, truy vấn Q1 sẽ được diễn đạt lại như trong Q1A. Chúng ta phải thêm tiền tố vào các thuộc tính Name và Dnumber trong Q1A để chỉ định những thuộc tính mà chúng ta đang đề cập đến, bởi vì các tên thuộc tính giống nhau được sử dụng trong cả hai quan hệ:

Q1A: 	SELECT Fname, EMPLOYEE.Name, Address 
FROM EMPLOYEE, DEPARTMENT 
WHERE DEPARTMENT.Name = ‘Research’ AND DEPARTMENT.Dnumber = EMPLOYEE.Dnumber;

Tên thuộc tính đủ điều kiện có thể được sử dụng cho rõ ràng ngay cả khi không có sự mơ hồ trong tên thuộc tính. Q1 có thể được viết lại thành Q1′ bên dưới với các tên thuộc tính đủ điều kiện. Chúng ta cũng có thể đổi tên các tên bảng thành các tên ngắn hơn bằng cách đặt lại tên cho mỗi tên bảng để tránh phải gõ lại các tên bảng dài

Q1′: 	SELECT EMPLOYEE.Fname, EMPLOYEE.LName, EMPLOYEE.Address 
FROM EMPLOYEE, DEPARTMENT
 WHERE DEPARTMENT.DName = ‘Research’ AND DEPARTMENT.Dnumber = EMPLOYEE.Dno;

Sự mơ hồ của các tên thuộc tính cũng phát sinh trong trường hợp các truy vấn tham chiếu đến cùng một quan hệ hai lần, như trong ví dụ sau

Truy vấn 8: Đối với mỗi nhân viên, hãy truy xuất họ và tên của nhân viên cũng như họ và tên của người giám sát trực tiếp của họ.

Q8: 	SELECT E.Fname, E.Lname, S.Fname, S.Lname 
FROM EMPLOYEE AS E, EMPLOYEE AS S 
WHERE E.Super_ssn = S.Ssn;

Trong trường hợp này, chúng ta được yêu cầu khai báo các tên quan hệ thay thế E và S, đây được coi là cách đặt tên “bí danh” hoặc được gọi là biến tuple, cho quan hệ EMPLOYEE. Một bí danh có thể theo sau từ khóa AS, như được hiển thị trong Q8 hoặc nó có thể trực tiếp theo sau tên quan hệ—ví dụ: bằng cách viết EMPLOYEE E, EMPLOYEE S trong mệnh đề FROM của Q8. Cũng có thể đổi tên các thuộc tính quan hệ trong truy vấn trong SQL bằng cách đặt bí danh cho chúng. Ví dụ, nếu chúng ta viết

EMPLOYEE AS E(Fn, Mi, Ln, Ssn, Bd, Addr, Sex, Sal, Sssn, Dno)

trong mệnh đề FROM, Fn trở thành “bí danh” cho Fname, Mi cho Minit, Ln cho Lname, v.v.

Trong Q8, chúng ta có thể coi E và S là hai bản sao khác nhau của quan hệ EMPLOYEE; đầu tiên, E, đại diện cho nhân viên trong vai trò giám sát hoặc cấp dưới; thứ hai, S, đại diện cho nhân viên trong vai trò giám sát viên. Bây giờ chúng ta có thể tham gia hai bản sao. Tất nhiên, trong thực tế chỉ có một quan hệ EMPLOYEE, và điều kiện nối có nghĩa là nối quan hệ với chính nó bằng cách so khớp các bộ thỏa mãn điều kiện nối E.Super_ssn = S.Ssn. Lưu ý rằng đây là một ví dụ về truy vấn đệ quy một cấp, như chúng ta sẽ thảo luận trong phần sau. Trong các phiên bản trước của SQL, không thể chỉ định một truy vấn đệ quy chung, với số lượng cấp độ không xác định, trong một câu lệnh SQL. Một cấu trúc để xác định các truy vấn đệ quy đã được tích hợp vào SQL:1999

Kết quả của truy vấn Q8 được hiển thị trong Hình 6.3(d). Bất cứ khi nào một hoặc nhiều bí danh được đặt cho một quan hệ, chúng ta có thể sử dụng những tên này để biểu diễn các tham chiếu khác nhau đến cùng quan hệ đó. Điều này cho phép nhiều tham chiếu đến cùng một mối quan hệ trong một truy vấn.

Chúng ta có thể sử dụng cơ chế đặt tên hoặc đổi tên bí danh này trong bất kỳ truy vấn SQL nào để chỉ định cho mọi bảng trong mệnh đề WHERE, cho dù cùng một quan hệ có cần được tham chiếu nhiều lần hay không. Trên thực tế, phương pháp này được khuyến nghị vì nó dẫn đến các truy vấn dễ hiểu hơn. Ví dụ: chúng tôi có thể chỉ định truy vấn Q1 như trong Q1B:

Q1B: 	SELECT E.Fname, E.LName, E.Address 
FROM EMPLOYEE AS E, DEPARTMENT AS D 
WHERE D.DName = ‘Research’ AND D.Dnumber = E.Dno;

3.3 Mệnh đề WHERE không xác định và việc sử dụng dấu *

Chúng tôi thảo luận thêm hai tính năng của SQL ở đây. Mệnh đề WHERE bị thiếu cho biết không có điều kiện nào đối với việc lựa chọn bộ dữ liệu; do đó, tất cả các bộ của quan hệ được chỉ định trong mệnh đề FROM đủ điều kiện và được chọn cho kết quả truy vấn. Nếu có nhiều hơn một quan hệ được chỉ định trong mệnh đề FROM và không có mệnh đề WHERE, thì CROSS PRODUCT—tất cả các kết hợp bộ có thể có—của các quan hệ này được chọn. Ví dụ: Truy vấn 9 chọn tất cả Ssns NHÂN VIÊN (Hình 6.3(e)) và Truy vấn 10 chọn tất cả các kết hợp Ssn NHÂN VIÊN và Dname DEPARTMENT, bất kể nhân viên đó có làm việc cho bộ phận đó hay không (Hình 6.3(f)) .

Truy vấn 9 và 10: Chọn tất cả Ssns EMPLOYEE (Q9) và tất cả sự kết hợp của Ssn EMPLOYEE và DEPARTMENT Dname (Q10) trong cơ sở dữ liệu

Q9: 	SELECT Ssn 
FROM EMPLOYEE;
Q10: 	SELECT Ssn, Dname 
FROM EMPLOYEE, DEPARTMENT;

Điều cực kỳ quan trọng là chỉ định mọi điều kiện lựa chọn và điều kiện join trong mệnh đề WHERE; nếu bất kỳ điều kiện nào như vậy bị bỏ qua, các mối quan hệ không chính xác và rất lớn có thể xảy ra. Lưu ý rằng Q10 tương tự như phép toán CROSS PRODUCT  theo sau là phép toán PROJECT trong đại số quan hệ. Nếu chúng ta chỉ định tất cả các thuộc tính của NHÂN VIÊN và BỘ PHẬN trong Q10, chúng ta sẽ nhận được CROSS PRODUCT thực tế (ngoại trừ việc loại bỏ trùng lặp, nếu có).

Để truy xuất tất cả các giá trị thuộc tính của các bộ đã chọn, chúng ta không cần phải liệt kê các tên thuộc tính một cách rõ ràng trong SQL; chúng ta chỉ chỉ định dấu hoa thị (*), viết tắt của tất cả các thuộc tính. * cũng có thể được đặt trước bởi tên quan hệ hoặc bí danh; ví dụ, EMPLOYEE.* đề cập đến tất cả các thuộc tính của bảng EMPLOYEE.

Truy vấn Q1C truy xuất tất cả các giá trị thuộc tính của bất kỳ EMPLOYEE nào làm việc trong DEPARTMENT với Dno =  5 (Hình 6.3(g)), truy vấn Q1D truy xuất tất cả các thuộc tính của EMPLOYEE và các thuộc tính của DEPARTMENT mà người đó làm việc cho mọi nhân viên của Bộ phận ‘Research' và Q10A chỉ định CROSS PRODUCT của mối quan hệ EMPLOYEE và DEPARTMENT

Q1C: 	SELECT * 
FROM EMPLOYEE 
WHERE Dno = 5; 
Q1D: 	SELECT * 
FROM EMPLOYEE, DEPARTMENT 
WHERE Dname = ‘Research’ AND Dno = Dnumber; 
Q10A: 	SELECT *
FROM EMPLOYEE, DEPARTMENT;

3.4 Bảng dưới dạng bộ trong SQL

Như chúng ta đã đề cập trước đó, SQL thường coi một bảng không phải là một tập hợp mà là nhiều tập hợp; các bộ dữ liệu trùng lặp có thể xuất hiện nhiều lần trong một bảng và trong kết quả của một truy vấn. SQL không tự động loại bỏ các bộ dữ liệu trùng lặp trong kết quả truy vấn vì những lý do sau:

  • Loại bỏ trùng lặp là một hoạt động tốn kém. Một cách để thực hiện nó là sắp xếp các bộ dữ liệu trước rồi loại bỏ các bản sao.
  • Người dùng có thể muốn xem các bộ dữ liệu trùng lặp trong kết quả của một truy vấn.
  • Khi một hàm tổng hợp được áp dụng cho các bộ dữ liệu, trong hầu hết các trường hợp, người dùng không muốn loại bỏ các bản sao

Một bảng SQL có khóa bị hạn chế là một tập hợp, vì giá trị khóa phải khác biệt trong mỗi bộ. Nếu chúng ta muốn loại bỏ các bộ dữ liệu trùng lặp khỏi kết quả của một truy vấn SQL, chúng ta sử dụng từ khóa DISTINCT trong mệnh đề SELECT, nghĩa là chỉ các bộ dữ liệu riêng biệt mới được giữ lại trong kết quả. Nói chung, truy vấn với SELECT DISTINCT loại bỏ trùng lặp, trong khi truy vấn với SELECT ALL thì không. Chỉ định SELECT không có ALL hay DISTINCT—như trong các ví dụ trước của chúng tôi—tương đương với SELECT ALL. Ví dụ, Q11 truy xuất tiền lương của mọi nhân viên; nếu nhiều nhân viên có cùng mức lương, giá trị mức lương đó sẽ xuất hiện nhiều lần trong kết quả của truy vấn, như trong Hình 6.4(a). Nếu chúng tôi chỉ quan tâm đến các giá trị tiền lương riêng biệt, chúng tôi muốn mỗi giá trị chỉ xuất hiện một lần, bất kể có bao nhiêu nhân viên kiếm được mức lương đó. Bằng cách sử dụng từ khóa DISTINCT như trong Q11A, chúng tôi thực hiện điều này, như trong Hình 6.4(b)

Truy vấn 11: Truy xuất tiền lương của mọi nhân viên (Q11) và tất cả các giá trị tiền lương riêng biệt

Q11: 	SELECT ALL Salary 
FROM EMPLOYEE;
Q11A: 	SELECT DISTINCT Salary 
FROM EMPLOYEE;

SQL đã kết hợp trực tiếp một số phép toán tập hợp từ lý thuyết tập hợp toán học, lý thuyết này cũng là một phần của đại số quan hệ. Có các phép toán tập hợp (UNION), hiệu (EXCEPT) và tập hợp giao (INTERSECT). Các quan hệ do các phép toán tập hợp này tạo ra là các tập hợp các bộ; nghĩa là, các bộ dữ liệu trùng lặp được loại bỏ khỏi kết quả. Các thao tác thiết lập này chỉ áp dụng cho các quan hệ tương thích kiểu, vì vậy chúng ta phải đảm bảo rằng hai quan hệ mà chúng ta áp dụng thao tác có cùng thuộc tính và các thuộc tính xuất hiện theo cùng một thứ tự trong cả hai quan hệ. Ví dụ tiếp theo minh họa việc sử dụng UNION.

Truy vấn 4: Lập danh sách tất cả các số dự án cho các dự án liên quan đến nhân viên có họ là 'Smith', với tư cách là công nhân hoặc quản lý của bộ phận kiểm soát dự án.

Q4A: 	( SELECT DISTINCT Pnumber 
FROM PROJECT, DEPARTMENT, EMPLOYEE 
WHERE Dnum = Dnumber AND Mgr_ssn = Ssn AND Lname = ‘Smith’ )
 UNION 
( SELECT DISTINCT Pnumber 
FROM PROJECT, WORKS_ON, EMPLOYEE 
WHERE Pnumber = Pno AND Essn = Ssn AND Lname = ‘Smith’ );

Truy vấn SELECT đầu tiên truy xuất các dự án liên quan đến 'Smith' với tư cách là người quản lý bộ phận kiểm soát dự án và truy vấn thứ hai truy xuất các dự án liên quan đến 'Smith' với tư cách là công nhân trong dự án. Lưu ý rằng nếu một số nhân viên có họ là 'Smith', tên dự án liên quan đến bất kỳ ai trong số họ sẽ được truy xuất. Áp dụng thao tác UNION cho hai truy vấn SELECT sẽ cho kết quả mong muốn.

SQL cũng có các hoạt động nhiều bộ tương ứng, được theo sau bởi từ khóa ALL (UNION ALL, EXCEPT ALL, INTERSECT ALL). Kết quả của họ là nhiều bộ (không loại bỏ các bản sao). Hành vi của các thao tác này được minh họa bằng các ví dụ trong Hình 6.5. Về cơ bản, mỗi bộ—dù là bản sao hay không—được coi là một bộ khác khi áp dụng các thao tác này.

3.5 Các câu lệnh xử lý chuỗi và phép toán số học

Trong phần này, chúng tôi thảo luận về một số tính năng khác của SQL. Tính năng đầu tiên cho phép các điều kiện so sánh chỉ trên các phần của chuỗi ký tự, sử dụng toán tử so sánh LIKE. Điều này có thể được sử dụng để so khớp mẫu chuỗi. Các chuỗi một phần được chỉ định bằng cách sử dụng hai ký tự dành riêng: % thay thế một số tùy ý gồm 0 hoặc nhiều ký tự và dấu gạch dưới (_) thay thế một ký tự đơn. Ví dụ: xem xét truy vấn sau

Truy vấn 12: Truy xuất tất cả nhân viên có địa chỉ ở Houston, Texas.

Q12: 	SELECT Fname, Lname
 FROM EMPLOYEE 
WHERE Address LIKE ‘%Houston,TX%’;

Để truy xuất tất cả nhân viên sinh trong những năm 1970, chúng ta có thể sử dụng Truy vấn Q12A. Ở đây, '7' phải là ký tự thứ ba của chuỗi (theo định dạng của chúng ta cho ngày), vì vậy chúng tôi sử dụng giá trị '_ _ 5 _ _ _ _ _ _ _', với mỗi dấu gạch dưới đóng vai trò là trình giữ chỗ cho các ký tự

Truy vấn 12A: Tìm tất cả nhân viên được sinh trong những năm 1950

Q12A: 	SELECT Fname, Lname 
FROM EMPLOYEE 
WHERE Bdate LIKE ‘_ _ 7 _ _ _ _ _ _ _’;

Nếu cần có dấu gạch dưới hoặc % làm ký tự chữ trong chuỗi, ký tự đó phải được đặt trước ký tự thoát, ký tự này được chỉ định sau chuỗi bằng cách sử dụng từ khóa ESCAPE. Ví dụ: 'AB\_CD\%EF' ESCAPE '\' đại diện cho chuỗi chữ 'AB_CD%EF' vì \ được chỉ định làm ký tự thoát. Bất kỳ ký tự nào không được sử dụng trong chuỗi đều có thể được chọn làm ký tự thoát. Ngoài ra, chúng tôi cần quy tắc để chỉ định dấu nháy đơn hoặc dấu nháy đơn (‘ ’) nếu chúng được đưa vào một chuỗi vì chúng được sử dụng để bắt đầu và kết thúc chuỗi. Nếu cần dấu nháy đơn (’), thì nó được biểu diễn dưới dạng hai dấu nháy đơn liên tiếp (”) để không bị hiểu là kết thúc chuỗi. Lưu ý rằng phép so sánh chuỗi con ngụ ý rằng các giá trị thuộc tính không phải là các giá trị nguyên tử (không thể chia được), như chúng ta đã giả định trong mô hình quan hệ chính thức

Một tính năng khác cho phép sử dụng số học trong truy vấn. Các toán tử số học tiêu chuẩn cho phép cộng (+), phép trừ (-), phép nhân (*) và phép chia (/) có thể được áp dụng cho các giá trị số hoặc thuộc tính có miền số. Ví dụ: giả sử rằng chúng tôi muốn thấy hiệu quả của việc tăng lương 10% cho tất cả nhân viên làm việc trong dự án 'ProductX'; chúng ta có thể đưa ra Truy vấn 13 để xem mức lương của họ sẽ như thế nào. Ví dụ này cũng cho thấy cách chúng ta có thể đổi tên một thuộc tính trong kết quả truy vấn bằng cách sử dụng AS trong mệnh đề SELECT

Truy vấn 13: Hiển thị mức lương kết quả nếu mỗi nhân viên làm việc trong dự án 'ProductX' được tăng 10%

Q13: 	SELECT E.Fname, E.Lname, 1.1 * E.Salary AS Increased_sal 
FROM EMPLOYEE AS E, WORKS_ON AS W, PROJECT AS P 
WHERE E.Ssn = W.Essn AND W.Pno = P.Pnumber AND P.Pname = ‘ProductX’;

Đối với kiểu dữ liệu chuỗi, toán tử nối || có thể được sử dụng trong một truy vấn để nối hai giá trị chuỗi. Đối với các kiểu dữ liệu ngày, giờ, dấu thời gian và khoảng thời gian, các toán tử bao gồm tăng (+) hoặc giảm (-) ngày, giờ hoặc dấu thời gian theo một khoảng thời gian. Ngoài ra, một giá trị khoảng thời gian là kết quả của sự khác biệt giữa hai giá trị ngày, giờ hoặc dấu thời gian. Một toán tử so sánh khác, có thể được sử dụng để thuận tiện, là BETWEEN, được minh họa trong Truy vấn 14.

Truy vấn 14. Truy xuất tất cả nhân viên trong bộ phận 5 có mức lương từ $30.000 đến $40.000.

Q14: 	SELECT * 
FROM EMPLOYEE 
WHERE (Salary BETWEEN 30000 AND 40000) AND Dno = 5;

Điều kiện (Salary BETWEEN 30000 AND 40000) trong Q14 tương đương với điều kiện ((Mức lương >= 30000) VÀ (Mức lương <= 40000))

3.6 Sắp xếp các kết quả truy vấn

SQL cho phép người dùng sắp xếp thứ tự các bộ trong kết quả truy vấn theo giá trị của một hoặc nhiều thuộc tính xuất hiện trong kết quả truy vấn, bằng cách sử dụng mệnh đề ORDER BY. Điều này được minh họa bởi Truy vấn 15.

Truy vấn 15. Truy xuất danh sách các nhân viên và các dự án họ đang thực hiện, được sắp xếp theo bộ phận, trong mỗi bộ phận, được sắp xếp theo thứ tự bảng chữ cái theo họ, sau đó là tên

Q15: 	SELECT D.Dname, E.Lname, E.Fname, P.Pname
FROM DEPARTMENT AS D, EMPLOYEE AS E, WORKS_ON AS W, PROJECT AS P 
WHERE D.Dnumber = E.Dno AND E.Ssn = W.Essn AND W.Pno = P.Pnumber 
ORDER BY D.Dname, E.Lname, E.Fname;

Thứ tự mặc định là theo thứ tự giá trị tăng dần. Chúng tôi có thể chỉ định từ khóa DESC nếu chúng tôi muốn xem kết quả theo thứ tự giá trị giảm dần. Từ khóa ASC có thể được sử dụng để xác định thứ tự tăng dần một cách tường minh. Ví dụ: nếu chúng ta muốn thứ tự bảng chữ cái giảm dần trên Dname và thứ tự tăng dần trên Lname, Fname, mệnh đề ORDER BY của Q15 có thể được viết là

ORDER BY D.Dname DESC, E.Lname ASC, E.Fname ASC

3.7 Tóm tắt truy vấn cơ bản

Một truy vấn truy xuất đơn giản trong SQL có thể bao gồm tối đa bốn mệnh đề, nhưng chỉ hai mệnh đề đầu tiên—SELECT và FROM—là bắt buộc. Các mệnh đề được chỉ định theo thứ tự sau, với các mệnh đề nằm giữa dấu ngoặc vuông [ … ] là tùy chọn:

SELECT 	<attribute list>
FROM  <table list>
[WHERE	<condition>]
[ORDER BY <attribute list>]

Mệnh đề SELECT liệt kê các thuộc tính cần truy xuất và mệnh đề FROM chỉ định tất cả các quan hệ (bảng) cần thiết trong truy vấn đơn giản. Mệnh đề WHERE xác định các điều kiện để chọn các bộ từ các quan hệ này, bao gồm các điều kiện nối nếu cần. ORDER BY chỉ định thứ tự hiển thị kết quả của truy vấn. Hai mệnh đề bổ sung GROUP BY và HAVING sẽ được mô tả trong bài sau

4. Các câu lệnh insert, update và delete trong SQL

Trong SQL, ba lệnh có thể được sử dụng để sửa đổi cơ sở dữ liệu: INSERT, DELETE và UPDATE. Chúng ta lần lượt thảo luận về từng câu lệnh này

4.1 Câu lệnh insert

Ở dạng đơn giản nhất, INSERT được sử dụng để thêm một bộ (hàng) vào một quan hệ (bảng). Chúng ta phải chỉ định tên quan hệ và danh sách các giá trị cho bộ. Các giá trị phải được liệt kê theo cùng thứ tự mà các thuộc tính tương ứng đã được chỉ định trong lệnh CREATE TABLE. Ví dụ, để thêm một bộ mới vào quan hệ EMPLOYEE như trong Hình 5.5 và được chỉ định trong lệnh CREATE TABLE EMPLOYEE… trong Hình 6.1, chúng ta có thể sử dụng U1:

U1: 	INSERT INTO EMPLOYEE 
VALUES ( ‘Richard’, ‘K’, ‘Marini’, ‘653298653’, ‘1962-12-30’, ‘98 Oak Forest, Katy, TX’, ‘M’, 37000, ‘653298653’, 4 );

Dạng thứ hai của câu lệnh INSERT cho phép người dùng chỉ định các tên thuộc tính rõ ràng tương ứng với các giá trị được cung cấp trong lệnh INSERT. Điều này hữu ích nếu một quan hệ có nhiều thuộc tính nhưng chỉ một vài trong số các thuộc tính đó được gán giá trị trong bộ mới. Tuy nhiên, các giá trị phải bao gồm tất cả các thuộc tính có thông số NOT NULL và không có giá trị mặc định. Các thuộc tính có giá trị NULL cho phép hoặc DEFAULT là những thuộc tính có thể bỏ qua. Ví dụ: để nhập một bộ cho EMPLOYEE mới mà chúng ta chỉ biết các thuộc tính Fname, Lname, Dno và Ssn, chúng ta có thể sử dụng U1A:

U1A: 	INSERT INTO EMPLOYEE (Fname, Lname, Dno, Ssn) 
VALUES (‘Richard’, ‘Marini’, 4, ‘653298653’);

Các thuộc tính không được chỉ định trong U1A được đặt thành DEFAULT hoặc NULL và các giá trị được liệt kê theo thứ tự giống như các thuộc tính được liệt kê trong chính lệnh INSERT. Cũng có thể chèn vào một quan hệ nhiều bộ dữ liệu được phân tách bằng dấu phẩy trong một lệnh INSERT. Các giá trị thuộc tính tạo thành mỗi bộ được đặt trong dấu ngoặc đơn

Một DBMS triển khai đầy đủ SQL sẽ hỗ trợ và thực thi tất cả các ràng buộc về tính toàn vẹn có thể được chỉ định trong DDL. Ví dụ: nếu chúng ta đưa ra lệnh trong U2 trên cơ sở dữ liệu được hiển thị trong Hình 5.6, DBMS sẽ từ chối thao tác vì không có bộ DEPARTMENT nào tồn tại trong cơ sở dữ liệu với Dnumber = 2. Tương tự, U2A sẽ bị từ chối vì không có giá trị Ssn nào được cung cấp và nó là khóa chính, không thể là NULL.

U2: 	INSERT INTO EMPLOYEE (Fname, Lname, Ssn, Dno) 
VALUES (‘Robert’, ‘Hatcher’, ‘980760540’, 2);
U2A: 	INSERT INTO EMPLOYEE (Fname, Lname, Dno) 
VALUES (‘Robert’, ‘Hatcher’, 5); 

Một biến thể của lệnh INSERT chèn nhiều bộ dữ liệu vào một quan hệ kết hợp với việc tạo quan hệ và ghi dữ liệu bằng kết quả của một truy vấn. Ví dụ: để tạo một bảng tạm thời có họ của nhân viên, tên dự án và số giờ mỗi tuần cho mỗi nhân viên làm việc trong một dự án, chúng ta có thể viết các câu lệnh như U3A và U3B:

U3A: 	CREATE TABLE WORKS_ON_INFO ( 
Emp_name VARCHAR(15), 
Proj_name VARCHAR(15), 
Hours_per_week DECIMAL(3,1) ); 
U3B: 	INSERT INTO WORKS_ON_INFO ( Emp_name, Proj_name, Hours_per_week ) 
SELECT E.Lname, P.Pname, W.Hours 
FROM PROJECT P, WORKS_ON W, EMPLOYEE E
 WHERE P.Pnumber = W.Pno AND W.Essn = E.Ssn

Một bảng WORKS_ON_INFO được tạo bởi U3A và được tải với thông tin đã tham gia được truy vấn lấy từ cơ sở dữ liệu trong U3B. Bây giờ chúng ta có thể truy vấn WORKS_ON_INFO giống như bất kỳ mối quan hệ nào khác; khi chúng ta không cần nó nữa, chúng ta có thể loại bỏ nó bằng cách sử dụng lệnh DROP TABLE (trình bày ở bài sau). Lưu ý rằng bảng WORKS_ON_INFO có thể không được cập nhật; nghĩa là, nếu chúng tôi cập nhật bất kỳ mối quan hệ PROJECT,WORKS_ON hoặc EMPLOYEE nào sau khi phát hành U3B, thì thông tin trong WORKS_ON_INFO có thể trở nên lỗi thời. Chúng ta phải tạo một View (trình bày ở chương sau) để giữ cho một bảng như vậy được cập nhật

Hầu hết các DBMS đều có các công cụ hỗ trợ thao tác hàng loạt cho phép người dùng tải dữ liệu được định dạng từ một tệp vào một bảng mà không cần phải viết một số lượng lớn các lệnh INSERT. Người dùng cũng có thể viết chương trình để đọc từng bản ghi trong tệp, định dạng nó thành một hàng trong bảng và chèn nó bằng cấu trúc vòng lặp của ngôn ngữ lập trình

Một biến thể khác để tải dữ liệu là tạo một bảng mới TNEW có cùng các thuộc tính như một bảng T hiện có và tải một số dữ liệu hiện có trong T vào TNEW. Cú pháp để làm điều này sử dụng mệnh đề LIKE. Ví dụ: nếu chúng ta muốn tạo một bảng D5EMPS có cấu trúc tương tự như bảng NHÂN VIÊN và tải nó với các hàng nhân viên làm việc trong bộ phận 5, chúng ta có thể viết SQL sau:

CREATE TABLE D5EMPS LIKE EMPLOYEE (
SELECT E.* 
FROM EMPLOYEE AS E 
WHERE E.Dno = 5) WITH DATA;

Mệnh đề WITH DATA chỉ định rằng bảng sẽ được tạo và tải với dữ liệu được chỉ định trong truy vấn, mặc dù trong một số triển khai, nó có thể bị loại bỏ

4.2 Câu lệnh delete

Lệnh DELETE loại bỏ các bộ khỏi một quan hệ. Nó bao gồm mệnh đề WHERE, tương tự như mệnh đề được sử dụng trong truy vấn SQL, để chọn các bộ cần xóa. Các bộ dữ liệu được xóa rõ ràng khỏi chỉ một bảng tại một thời điểm. Tuy nhiên, việc xóa có thể ảnh hưởng đến các bộ trong các quan hệ khác nếu các hành động liên quan đến các thuộc tính tham chiếu được chỉ định trong các ràng buộc toàn vẹn tham chiếu của DDL đã trình bày trong phần trước. Tùy thuộc vào số lượng bộ được chọn bởi điều kiện trong mệnh đề WHERE, không, một hoặc một số bộ dữ liệu có thể bị xóa bằng một lệnh DELETE. Mệnh đề WHERE bị thiếu xác định rằng tất cả các bộ trong quan hệ sẽ bị xóa; tuy nhiên, bảng vẫn còn trong cơ sở dữ liệu dưới dạng bảng trống. Chúng ta phải sử dụng lệnh DROP TABLE để loại bỏ định nghĩa bảng (trình bày ở phần sau). Các lệnh DELETE trong U4A đến U4D, nếu được áp dụng độc lập với trạng thái cơ sở dữ liệu được hiển thị trong Hình 5.6, sẽ xóa các bộ giá trị 0, 1, 4 và tất cả tương ứng khỏi quan hệ EMPLOYEE:

U4A: 	DELETE FROM EMPLOYEE 
WHERE Lname = ‘Brown’; 
U4B: 	DELETE FROM EMPLOYEE 
WHERE Ssn = ‘123456789’; 
U4C: 	DELETE FROM EMPLOYEE 
WHERE Dno = 5; 
U4D: 	DELETE FROM EMPLOYEE;

4.3 Câu lệnh update

Lệnh UPDATE được sử dụng để sửa đổi các giá trị thuộc tính của một hoặc nhiều bộ được chọn. Như trong lệnh DELETE, mệnh đề WHERE trong lệnh UPDATE chọn các bộ cần sửa đổi từ một quan hệ duy nhất. Tuy nhiên, việc cập nhật một giá trị khóa chính có thể ảnh hưởng tới các giá trị khóa ngoại của các bộ trong các quan hệ khác được chỉ định trong các ràng buộc toàn vẹn tham chiếu bằng các câu lệnh DDL. Một mệnh đề SET bổ sung trong lệnh UPDATE chỉ định các thuộc tính sẽ được sửa đổi và các giá trị mới của chúng. Ví dụ: để thay đổi vị trí và số bộ phận kiểm soát của dự án số 10 thành 'Bellaire' và 5, tương ứng, chúng tôi sử dụng U5:

U5:	 UPDATE PROJECT 
SET Plocation = ‘Bellaire’, Dnum = 5 
WHERE Pnumber = 10;

Một số bộ dữ liệu có thể được sửa đổi bằng một lệnh UPDATE. Một ví dụ là tăng lương 10% cho tất cả nhân viên trong bộ phận 'Research’, như thể hiện trong U6. Trong yêu cầu này, giá trị Mức lương được sửa đổi phụ thuộc vào giá trị Mức lương ban đầu trong mỗi bộ, vì vậy cần có hai tham chiếu đến thuộc tính Mức lương. Trong mệnh đề SET, tham chiếu đến thuộc tính Lương ở bên phải đề cập đến giá trị Lương cũ trước khi sửa đổi và giá trị ở bên trái đề cập đến giá trị Lương mới sau khi sửa đổi:

U6: 	UPDATE EMPLOYEE 
SET Salary = Salary * 1.1 
WHERE Dno = 5;

Cũng có thể chỉ định NULL hoặc DEFAULT làm giá trị thuộc tính mới. Lưu ý rằng mỗi lệnh UPDATE chỉ đề cập rõ ràng đến một mối quan hệ duy nhất. Để sửa đổi nhiều quan hệ, chúng ta phải đưa ra một số lệnh UPDATE.

5. Những tính năng khác trong SQL

SQL có một số tính năng bổ sung mà chúng tôi chưa mô tả trong chương này nhưng chúng ta sẽ thảo luận ở phần khác của cuốn sách. Đây là như sau:

  • Trong bài tiếp theo, là phần tiếp theo của chương này, chúng tôi sẽ trình bày các tính năng sau của SQL: các kỹ thuật khác nhau để chỉ định các truy vấn truy xuất phức tạp, bao gồm truy vấn lồng nhau, hàm tổng hợp, nhóm, phép kết, câu lệnh CASE WHEN và truy vấn đệ quy, View, SQL, trigger; và các lệnh để sửa đổi lược đồ
  • SQL có nhiều kỹ thuật khác nhau để viết chương trình bằng nhiều ngôn ngữ lập trình khác nhau bao gồm các câu lệnh SQL để truy cập một hoặc nhiều cơ sở dữ liệu. Chúng có thể là các câu lệnh SQL nhúng trên ngôn ngữ lập trình như C#, Java và các câu lệnh SQL động, SQL/CLI (Call Level Interface) và ODBC tiền thân của nó (Kết nối cơ sở dữ liệu mở) và SQL/PSM (Persistent Stored Modules). Chúng tôi thảo luận về các kỹ thuật này trongbài cụ thể hơn. Chúng tôi cũng mô tả cách truy cập cơ sở dữ liệu SQL thông qua ngôn ngữ lập trình Java bằng cách sử dụng JDBC và SQLJ
  • Mỗi RDBMS thương mại ngoài các lệnh SQL, một tập hợp các lệnh để chỉ định các tham số thiết kế cơ sở dữ liệu vật lý, cấu trúc tệp cho các quan hệ và các đường dẫn truy cập như chỉ mục. Chúng tôi đã gọi các lệnh này là ngôn ngữ định nghĩa lưu trữ (SDL) trong Chương 2. Các phiên bản trước của SQL có các lệnh để tạo chỉ mục, nhưng các lệnh này đã bị xóa khỏi ngôn ngữ vì chúng không ở mức lược đồ khái niệm. Nhiều hệ thống vẫn có lệnh CREATE INDEX; nhưng nó đòi hỏi quyền truy cập của người dùng.
  • SQL có các lệnh xử lý  giao dịch. Chúng được sử dụng để chỉ định các đơn vị xử lý cơ sở dữ liệu cho các mục đích phục hồi và kiểm soát tính đồng thời. Chúng ta sẽ thảo luận các lệnh này trong bài khác sau khi thảo luận chi tiết hơn về khái niệm giao dịch (transaction).
  • SQL có các cấu trúc ngôn ngữ để chỉ định việc cấp và thu hồi các đặc quyền cho người dùng. Các đặc quyền thường tương ứng với quyền sử dụng các lệnh SQL nhất định để truy cập các quan hệ nhất định. Mỗi mối quan hệ được chỉ định một chủ sở hữu và chủ sở hữu hoặc nhân viên DBA có thể cấp cho những người dùng được chọn đặc quyền sử dụng câu lệnh SQL — chẳng hạn như SELECT, INSERT, DELETE, hoặc UPDATE—để truy cập vào mối quan hệ. Ngoài ra, nhân viên DBA có thể cấp các đặc quyền để tạo các lược đồ, bảng hoặc dạng xem cho một số người dùng nhất định. Các lệnh SQL này—được gọi là GRANT và REVOKE—được thảo luận trong Chương 20, nơi chúng tôi thảo luận về bảo mật và ủy quyền cơ sở dữ liệu.
  • SQL hỗ trợ trigger. Chúng thường được gọi là các kỹ thuật cơ sở dữ liệu tích cực, vì chúng chỉ định các hành động được kích hoạt tự động bởi các sự kiện chẳng hạn như cập nhật cơ sở dữ liệu. Chúng ta sẽ thảo luận vấn đề này sau
  • SQL đã kết hợp nhiều tính năng từ các mô hình hướng đối tượng để có nhiều khả năng mạnh mẽ hơn, dẫn đến các hệ thống quan hệ nâng cao được gọi là quan hệ đối tượng. Các khả năng như tạo các thuộc tính có cấu trúc phức tạp, chỉ định các loại dữ liệu trừu tượng (được gọi là UDT – user-defined types kiểu dữ liệu do người dùng tự định nghĩa) cho các thuộc tính và bảng, tạo các định danh đối tượng để tham chiếu các bộ dữ liệu và chỉ định các thao tác trên các loại sẽ được thảo luận trong Chương 12.
  • SQL cơ sở dữ liệu quan hệ có thể tương tác với các công nghệ mới như XML và OLAP/data warehouses

6. Tóm tắt

  • Trong bài viết này chúng ta đã tìm hiểu sơ lược về SQL - Structured Query Languge (Ngôn ngữ truy vấn có cấu trúc). Về mặt cơ bản SQL có các ngôn ngữ con gồm: 
    • DDL (Data Definition Language): CREATE, DROP, ALTER
    • DML (Data Manipulation Language): INSERT, DELETE, UPDATE, SELECT
    • DCL (Data Control Language): GRANT, REVOKE, DENY
  • Chúng ta đã tìm hiểu về các lệnh CREATE để tạo mới lược đồ, bảng và các lệnh INSERT, UPDATE, DELETE. Chúng ta cũng tìm hiểu về các ràng buộc dữ liệu cơ bản (NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK)

Bài viết thuộc các danh mục

Bài viết được gắn thẻ



BÌNH LUẬN (0)

Hãy là người đầu tiên để lại bình luận cho bài viết !!

Hãy đăng nhập để tham gia bình luận. Nếu bạn chưa có tài khoản hãy đăng ký để tham gia bình luận với mình


Bài viết liên quan

Chương 1: Hệ quản trị cơ sở dữ liệu và người dùng

Cơ sở dữ liệu và hệ quản trị cơ sở dữ liệu là một thành phần thiết yếu của cuộc sống trong xã hội hiện đại: hầu hết chúng ta đều gặp các hoạt động liên quan đến hoạt động với cơ sở dữ liệu trong cuộc sống hằng ngày. Trong bài viết này chúng ta sẽ tìm hiểu khái niệm đầu tiên về hệ quản trị cơ sở dữ liệu và nhóm người dùng

Chương 2: Khái niệm và kiến trúc hệ thống cơ sở dữ liệu

Kiến trúc của các gói DBMS đã phát triển từ các hệ thống nguyên khối ban đầu, trong đó toàn bộ gói phần mềm DBMS là một hệ thống tích hợp chặt chẽ, đến các gói DBMS hiện đại được thiết kế theo dạng mô-đun, với kiến trúc client / server trong bài hôm nay mình cùng tìm hiểu về khái niệm và kiến trúc hệ quản trị cơ sở dữ liệu

Chương 3: Mô hình hóa bằng mô hình thực thể - mối quan hệ (ER)

Mô hình hóa khái niệm là một giai đoạn rất quan trọng trong việc thiết kế một ứng dụng cơ sở dữ liệu thành công. Thông thường, thuật ngữ ứng dụng cơ sở dữ liệu đề cập đến một cơ sở dữ liệu cụ thể và các chương trình liên quan thực hiện các truy vấn và cập nhật cơ sở dữ liệu. Trong bài này chúng ta sẽ tìm hiểu mô hình hóa dữ liệu với sơ đồ ER

Chương 4: Mô hình thực thể mối quan hệ mở rộng (EER)

Các khái niệm mô hình ER được thảo luận trong Chương 3 là đủ để biểu diễn nhiều lược đồ cơ sở dữ liệu cho các ứng dụng cơ sở dữ liệu truyền thống, bao gồm nhiều ứng dụng xử lý dữ liệu trong kinh doanh và công nghiệp. Tuy nhiên, kể từ cuối những năm 1970, các nhà thiết kế ứng dụng cơ sở dữ liệu đã cố gắng thiết kế các lược đồ cơ sở dữ liệu chính xác hơn phản ánh các thuộc tính và ràng buộc dữ liệu một cách chính xác hơn từ đó chúng ta có mô hình thực thể mối quan hệ mở rộng - EER

Chương 5: Mô hình dữ liệu quan hệ và cơ sở dữ liệu quan hệ

Mô hình dữ liệu quan hệ lần đầu tiên được giới thiệu bởi Ted Codd của IBM Research vào năm 1970 trong một bài báo kinh điển (Codd, 1970), và nó đã thu hút sự chú ý ngay lập tức do tính đơn giản và nền tảng toán học của nó. Mô hình sử dụng khái niệm quan hệ toán học - trông giống như một bảng giá trị - làm khối xây dựng cơ bản của nó và có cơ sở lý thuyết trong lý thuyết tập hợp và logic vị từ bậc nhất.

Copyright © 2022. Bảo lưu tất cả quyền