Bài 4:NGÔN NGỮ SQL

Một phần của tài liệu Giáo trình cơ sở dữ liệu (nghề lập trình máy tính) (Trang 51 - 67)

MÃ BÀI: ITPRG 07.4

Giới thiệu

Báo cáo cũng đựợc xem là một loại biểu mẫu đơn giản. Trong đó bạn có thể trình bày những dữ liệu theo yêu cầu hoặc liên kết các dữ liệu có liên quan vào các nhóm với dòng cộng số liệu ở cuối mỗi nhóm (hay ở mỗitrang) và dòng tổng cộng số liệu ở cuối bảng báo cáo.

Mục tiêu thực hiện:

- Hiểu được ý nghĩa của các câu lệnh SQL

- Biết được ý nghĩa của các thành phần trong câu lệnh SQL, biết được tác dụng của câu lênh SQL cơ bản.

- Biết được ý nghĩa của các thành phần trong câu lệnh SQL, biết được tác dụng của các thành phần trong câu lệnh SQL nâng cao

- Sử dụng được câu lệnh SQL để lấy được những thông tin theo yêu cầu của người xử dụng.

Nội dung:

4.1 Giới thiệu ngôn ngữ SQL

4.2 Câu lệnh SQL đơn giản

4.3 Câu lệnh SQL nâng cao. 4.4 Bài tập truy vấn cơ sở dữ liệu

4.5 Giới thiệu ngôn ngữ SQL

SQL đã trở thành ngôn ngữ cơ sở dữ liệu quan hệ chuẩn. Nó bao gồm các phần:

Ngôn ngữ định nghĩa dữ liệu (DDL – Data Definition Language). Phần này của SQL cung cấp các mệnh đề để

 Định nghĩa các lược đồ quan hệ

 Xóa bỏ các quan hệ

 Tạo ra các chỉ mục

Ngôn ngữ thao tác dữ liệu (DML – Data Manipulation Language). Phàn này của SQL bao gồm một ngôn ngữ truy vấn dựa trên cả đại số quan hệ lẫn tính toán quan hệ bộ. Nó cũng bao gồm các lệnh chèn vào, xóa bỏ, và cập nhật các bộ trong CSDL.

Ngôn ngữ thao tác dữ liệu nhúng (DML nhúng –Embedded DML). Việc nhúng của SQL được thiết kế dành cho việc sử dụng bên trong các ngôn ngữ lập trình đa năng như C, PL/1, Pascal…

Định nghĩa sự nhìn: Các lệnh của DDL SQL dành cho việc định nghĩa sự nhìn.

Quyền sở hữu: Các lệnh của DDL dùng cho việc xác định rõ các quyền truy xuất đến các quan hệ và các sự nhìn

Toàn vẹn: các lệnh SQL DDL dành cho việc đặc tả các ràng buộc toàn vẹn mà dữ liệu được lưu trữ trong CSDL phải thỏa mãn. Những cập nhật làm vi phạm đến những ràng buộc toàn vẹn là không được phép

Kiểm soát giao dịch: Các lệnh SQL dành cho việc xác định lúc bắt đầu và kết thúc của các giao dịch.

4.6 Câu lệnh SQL đơn giản

Cấu trúc căn bản của một biểu thức SQL bao gồm 3 mệnh đề: Select, From, Where.

Mệnh đề select: liệt kê các thuộc tính mong muốncó trong kết quả truy vấn. Nó tương ứng với phép chiếu của đại số quan hệ.

Mệnh đề From:tương ứng với tích Đề - Các. Nó liệt kê các quan hệ được sử dụng.

Mệnh đề Where:tương ứng với khẳng định chọn trong đại số quan hệ. Nó bao gồm một khẳng định liên quan đến các thuộc tính của các quan hệ xuất hiện trong mệnh đề From

Một truy vấn SQL đặc thù có dạng:

SELECT A1,A2,…,An (adsbygoogle = window.adsbygoogle || []).push({});

FROM R1,R2,…,Rn

WHERE P

Trong đó mỗi Ai biểu diễn một thuộc tính, mỗi Ri là một quan hệ, và P là một khẳng định. Truy vấn tương đương với biểu thức đại số quan hệ:

 Nếu mệnh đề Where bỏ qua thì khẳng định P là true

 Danh sách thuộc tính có thể đượcthay thế bởi một dấu * để chọn tất cả

SQL định dạng tích Descartes của các quan hệ được nêu tên trong mệnh đề From, sau đó thực hiện một phép chọn đại số quan hệ dùng khẳng định trong mệnh đề Where, cuối cùng chiếu kết quản lên các thuộc tính được nêu trong mệnh đề Select.

4.6.1 Mệnh đề Select

Kết quả của một truy vấn SQL là một quan hệ. Coi ví dụ đơn giản “Tìm tên của các chi nhánh ngân hàng trong quan hệ Tài khoản vay”:

Select têncn

From tài khoản vay

Kết quả là một quan hệ gồm thuộc tính mang tên têncn. Chú ý không giống như trong đại số quan hệ, kết quả truy vấn SQL có thể chứa nhiều bản trùng nhau ta có thể dùng từ khóa distinct sau select

Select distinct têncn From tài khoản vay

SQL cho phép dùng từ khóa all để chỉ ra một cách rõ ràng các bộ trùng nhau không cần phải gỡ bỏ

Select all têncn From tài khoản vay

Tuy nhiên, việc giữ lại các bộ trùng nhau là mặc nhiên nên không cần dùng all

trong các ví dụ của chúng ta.

Mệnh đề Select có thể dùng các biểu thức số học với các phép toán +, -, *, / và tính toán với các hằng hoặc các giá trị thuộc tính của các bộ. Chẳng hạn:

Selecttêncn, số kv, stvay*100

Fromtài khoản vay

4.6.2 Mệnh đề Where

Coi truy vấn “tìm kiếm tất cả các số tài khoản vay của các tài khoản vay thực hiện tại chi nhánh Phong Lan mà có số tiền vay lớn hơn 1200$”. Viết truy vấn này bằng SQL:

From tài khoản vay

Wheretêncn = “Phong Lan” and stvay > 1200

Khẳng định trong mệnh đề Where có thể dùng các phép nối logicand, or và not. Các toán hạng của phép nối logic có thể là các biểu thức có dùng các phép toán so sánh: <, <=, >, >=, = và <>.

SQL có toán tử so sánh between … and … để chỉ 1 giá trị nhỏ hơn hoặc bằng một giá trị khác và lớn hơn hoặc bằng một giá trị khác nữa. Ví dụ tìm số tài khoản vay của tất cả các tài khoản vay có số tiền vay ở giữa 90000$ và 100000$ ta có thể viết:

Select sốtkv

From tài khoản vay

Wherestkvay between 90000 and 100000

Thay vì viết:

Select sốtkv (adsbygoogle = window.adsbygoogle || []).push({});

From tài khoản vay

Wherestkvay >= 90000 and stkvay <=100000

4.6.3 Mệnh đề From:

Mệnh đề From định nghĩa một tích Descartes các quan hệ. Vì phép nối tự nhiên được diễn tả theo tích Descartes, phép chọn và phép chiếu nên ta có thể viết biểu thức SQL cho phép nối tự nhiên.

Đối với biểu thức đại số quan hệ:

tênkh, sốtkvay(vay tài khoản vay) Chúng ta có thể viết trong SQL như sau:

Select distinct tênkh, sốtkv

From vay, tài khoản vay

Wherevay.sốtkv = tài khoản vay.sốtkv

Mở rộng truy vấn trên, tìm tên và số tài khoản vay của tất cả các khách hàng có tài khoản vay tại chi nhánh Phong Lan

Select distinct tênkh, sốtkv

From vay, tài khoản vay

Wherevay.sốtkv = tài khoản vay.sốtkv and têncn = “Phong Lan”

4.6.4 Phép đặt lại tên:

SQL cho phép đặt lại tên cả quan hệ lẫn thuộc tính. Nó dùng mệnh đề As có dạng tên cũas tên mới. Mệnh đề As có thể xuất hiện trong mệnh đề select và From.

Coi lại truy vấn đã dùng trước đây:

Select distinct tênkh, sốtkv

From vay, tài khoản vay

Wherevay.sốtkv = tài khoản vay.sốtkv and têncn = “Phong Lan”

Kết quả truy vấn này là quan hệ với các thuộc tính: tên khách hàng, số tài khoản vay

Tên thuộc tính trong kết quả được suy ra từ tên thuộc tính trong các quan hệ trong mệnh đề From. Tuy nhiên có thể chúng ta không muốn suy ra các tên thuộc tính trong quan hệ kết quả theo kiểu này. Bởi vì:

 Các qua nhệ có thể có các thuộc tính trùng tên. Rồi quan hệ kết quả lại có thuộc tính trùng tên nữa.

 Nếu dùng các biểu thức số học trong mệnh đề Select thì thuộc tính kết quả không có tên.

 Có thể cần đổi tên thucộ tính để tiện dụng trong một số trường hợp. Ví dụ về đổi tên trong truy vấn trên

Select distinct tênkh, sốtkv as mã tkvay From vay, tài khoản vay

Wherevay.sốtkv = tài khoản vay.sốtkv and têncn = “Phong Lan”

4.6.5 Biến cố

Các biến cố có thể được dùng trong SQL, và chúng được định nghĩa trong mệnh đề From thông qua mệnh đề As. Viết lại truyvấn “Với mọi khách hàng có tài khoản vay tại ngân hàng, tìm tên và số tài khoản vay của họ”

Select distinct tênkh, T.sốtkv

From vayasT, tài khoản vay as S (adsbygoogle = window.adsbygoogle || []).push({});

Where T.Sốtkv = S.Sốtkv

Biến cố được định nghĩa trong mệnh đề From bằng cách đặt nó sau tên của quan hệ mà nó được kết hợp, với từ khóa Asở giữa (từ khóa Aslà tự chọn)

Những biến cố này có thể được dùng trong biểu thức. Có thể nghĩ cách dùng các biến cố giống như các phép toánđặt lại tên vậy. Chúng đặt biệt có ích trong các trường hợp cùng phài so sánh hai bộ trong cùng một quan hệ. Giả sử chúng ta cần truy vấn “ Tìm tên tất cả các chi nhánh có tài sản lớn hơn ít nhất tài sản của một chi nhánh tọa lạc tại Đà Lạt” Chúng ta có thể viết biểu thức SQL như sau:

Select distinct T.têncn

From chi nhánh as T, chi nhánh as S

Where T.tsản > S.tsản and S.tpcn = “Đà Lạt”

4.6.6 Các phép toán chuỗi

SQL dùng phép toán like dùng cho việc khớp mẫu chuỗi. Có hai ký tự đặc biệt dùng để mô tả chuỗi:

Ký tự % khớp với bất kỳ chuỗi con Ký tự _ khớp với bất kỳ ký tự

Ngoài ra, các ký tự chữ in không khớp với các ký tự chữ thường. Một số ví dụ sau minh họa việc hkớp mẫu chuỗi:

 “Phong%” khớp với bất kỳ chuỗi nào bắt đầu bởi “Phong”

 “%ng%” khớp với bất kỳ chuỗi nào có chữa “ng” như là chuỗi con

 “_ _ _” khớp với chuỗi nào có chứa đúng 3 ký tự

 “_ _ _%” khớp với chuỗi nào có chứa ít nhất 3 ký tự

Coi truy vấn “Tim tất cả các khách hàng mà đường phố họ ở có chứa chuỗi con “Phan”. Truy vấn này có thể viết:

Select tênkh From khách hàng

Đối với các mẫu chuỗi có chứa các ký tự đặc biệt (chẳng hạn như % và _), SQL cho phép dùng ký tự thoát. Ký tự thoát được đặt ngay trước ký tự đặt biệt để tìm ra rằng ký tự đặt biệt được đối xử giống như một ký tự bình thường. Chúng ta dùng từ khóa

ascape để định nghĩa ký tự thoát trong phép toán so sánh like. Chẳng hạn dùng ký tự \ để làm ký tự thoát:

Like “ab\%cd%” escape “\” khớp mọi chuỗi bắt đầu bằng”ab%cd”

SQL cũng cho phép dùng phép so sánh not like để tìm những mẫu chuỗi không khớp. Nó cũng cho phép dùng một số hàm chuỗi như nối chuỗi, trích chuỗi con, tìm chiều dài chuỗi, chuyển đổi ký tự thường thành ký tự in và ngược lại…

4.6.7 Thứ tự hiển thị bộ

SQL cho phép người sử dụng kiểm soát thứ tự trong đó các bộ được hiển thị.

Order bylàm cho các bộ xuất hiện trong một thứ tự đượcsắp xếp.

Desc chỉ thứ tự giảm

Ascchỉ thứ tự tăng

Việt sắp xếp có thể là đắt giá, và chỉ nên được thực hiện khi cần thiết. Chẳng hạn ta có thể liệt kê theo thứ tự chữ cái tất cả các khách hàng có khả năng vay tại chi nhánh ngân hàng Phong Lan.

Select distinct tênkh From vay, khách hàng vay

Wherevay.sốtkv = tài khoản vay.sốtkvandtêncn = “Phong Lan”order bytênkh

Mặc nhiên, mệnh đề Order by liệt kê theo tứ tự tăng dần. Giả sử chúng ta muốn liệt kê toàn bộ quan hệ tài khoản vaytheo thứ tự giảm dần stvay.Nếu có nhiều tài khoản vay có cùng số tiền thì sắp xếp chúng theo thứ tự tăng dần của số tài khoản vay.

Select * (adsbygoogle = window.adsbygoogle || []).push({});

From tài khoản vay

Order by stvay desc, sốtkv asc

4.6.8Tạo một CSDL

CREATE DATABASE tên_CSDL

CREATE TABLE tên_bảng ( tên_cột_1 kiểu_dữ_liệu, tên_cột_2 kiểu_dữ_liệu, ... )

4.7 Câu lệnh SQL nâng cao.

4.7.1 Các phép toán tập hợp

SQL có các phép toán tập hợp Union, insersect và except. Một số ví dụ:

 Tìm tất cả các khách hàng có tài khoản vay, tài khoàn giử hoặc cả hai tại ngân hàng (Select tênkh From gởi) union (Select tênkh From vay)

Phép Union tự động loại các bộ trùng nhau, không giống như mệnh đề Select. Nếu giữ các bộ trùng nhau ta dùng Union all.

(Selecttênkh

From gởi)

Union all (Select tênkh From vay)

 Tìm các khách hàng có tài khoản vay và tài khoản gởi tại ngân hàng (Selectdistinct tênkh

From gởi)

(Select distinct tênkh From vay)

Phép intersect tự động loại các bộ trùng nhau. Nếu muốn giữ lại các bộ trùng nhau ta dùng intersect all

(Selectdistrict tênkh From gởi)

Intersect all

(Select distinct tênkh From vay)

 Tìm các khách hàng có tài khoản gởi nhưng không có tài khoản vay tại ngân hàng

(Selectdistrict tênkh From gởi)

except

(Select distinct tênkh From vay)

Phép except tự động loại bỏ các bộ trùng nhau. Nếu muốn giữ lại các bộ trùng nhau ta dùng except all

(Selectdistrict tênkh From gởi)

except all

(Select distinct tênkh From vay)

4.7.2 Các hàm gộp

Các hàm gộp là những hàm lấy một tập hợp các giá trị là nhập liệu và trả về một giá trị đơnnhư là xuất liệu. SQL đưa ra các hàm gộp: (adsbygoogle = window.adsbygoogle || []).push({});

Giá trị trung bình – avg Giá trị nhỏ nhất – min Giá trị lớn nhất – max Giá trị tổng cộng – sum Dếm số trong nhóm – count

Ví dụ tìm giá trị trung bình của cân đối tài khoản gỏi tại chi nhánh ngân hàng Phong Lan

Select avg(cđối)

From tài khoản gởi

Wheretêncn = “Phong Lan”

SQL không dùng distinct với count. Tuy nhiên dùng distinctvới max, min thì hợp lệ mặc dù kết quả không thay đổi. Chúng ta có thể dùng all trong chỗ của distinct

để chỉ việc giữ lại các bộ trùng nhau, nhưng vì all là mặc nhiên nên không cần làm như vậy.

Trong SQL chúng ta có thể tính các hàm gộp dựa trên nhóm tập các bộ bằng cách dùng mệnh đề group by. Các thuộc tính được cho trong mệnh đề group by được dùng để hình thành các nhóm. Các bộ có trị giống nhau trên tất cả các thuộc tính trong mệnh đề group by được đặt vào trong một nhóm.

Ví dụ tính trung bình cân đối tài khoản gởi tại mỗi chi nhánh

Select têncn, avg(cđối)

From tài khoản gởi

Group bytêncn

Ta có thể phát biểu các điều kiệm áp dụng cho các nhóm thay vì cho các bộ, bằng cách sử dụng mệnh đề having. Các khẳng định trong mệnh đề having được áp dụng sau khi hình thành nhóm.

Ví dụ: Tìm các chi nhánh ngân hàng và các giá trị trung bình cân đối tài khoản gởi của nó với điều kiệm giá trị trung bình cân đối tài khoản gởi của nó với điều kiện giá trị trung bình cân đối phải lớn hơn 1200$

Select têncn, avg(cđối)

Group bytêncn

Having avg(cđối)>1200

Nếu mệnh đề Wherehavingcùng xuất hiện trong một truy vấn thì:

 Khẳng định mệnh đề Where được áp dụng trước

 Các bộ thỏa mãn mệnh đề Where được đặt vào trong các nhóm chỉ định bởi mệnh đề Group by

 Mệnh đề having nếu có sẽ được áp dụng cho mỗi nhóm. Các nhóm không thỏa khẳng định của havingđược loại bỏ.

 Các nhóm thỏa mệnh đề của having được dùng bởi mệnh đề select để tạo ra các bộ kết quả

4.7.3 Các giá trị rỗng

Như đã đề cập trước, SQL cho phép dùng các giá trị rỗng để chỉ ra sự vắng mặt của thông tin về giá trị của một thuộc tính.

Chúng ta có thể dùng từ khóa null trong một khẳng địnhđể kiểm tra giá trị rỗng.

Select sốtkv

From tài khoản vay

Where stvay is null

Khẳng định is not nulldùng để kiểm tra sự vắng mặt của giá trị rỗng

4.7.4 Truy vấn con lồng nhau: (adsbygoogle = window.adsbygoogle || []).push({});

SQL cung cấp một cơ chế cho việc lồng truy vấn con. Một truy vấn con là một biểu thức select – from –where mà nó được lồng bên trong một truy vấn khác.

4.7.4.1 Quan hệ phần tử của tập hợp:

Chúng ta dùng các phép innot in đối với quan hệ phần tử của tập hợp. Ta viết lại truy vấn “Tìm tất cả các khách hàng có tài khoản vay lẫn tài khoản gởi tại ngân hàng” bằng cách dùng phép in

Selectdistinct tênkh From vay

Wheretênkhin (select tênkhfromgởi)

4.7.4.2 So sánh tập hợp:

Coi truy vấn “Tìm tên tất cả các chi nhánh có tài sản lớn hơn ít nhất một tài sản của chi nhánh tọa lạc tại Dalat” . Chúng ta viết truy vấn như sau:

Select distinct T.têncn

From chi nhánh as T.chi nhánhas S Where T.tsản > S.tsảnandS.tpcn = “Dalat”

Một phần của tài liệu Giáo trình cơ sở dữ liệu (nghề lập trình máy tính) (Trang 51 - 67)