Tải bản đầy đủ (.doc) (16 trang)

Truy vấn (query) nâng cao

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (341.19 KB, 16 trang )

Bài 3 Truy vấn (query) nâng cao
Mục tiêu bài học:
Kết thúc bài này bạn có thể –
 Hiểu và thực thi được các subquery
 Nắm được cách sử dụng mệnh đề EXISTS
 Nắm được cách thực hiện các truy vấn với các mênh đề khác nhau
 Sử dụng mệnh đề DISTINCT để lọc bớt kêt quả các truy vấn
 Nắm được cách sử dụng mệnh đề COMPUTE BY
 Chuyển dữ liệu giữa các tables sử dụng mệnh đề SELECT INTO
Giới thiệu
Trong bài trước, chúng ta đã học các khái niệm thiết kế CSDL. Chúng ta cũng đã nói về E-R
diagrams and chuẩn hóa CSDL. Chúng ta cũng đã học về một vài dạng chuẩn và cách áp dụng
trên các bài tập cụ thể.
Trong bài này, chúng ta sẽ làm quen với khái niệm subqueries và cách viết các câu lệnh T-SQL
để thực thi các subqueries. Chúng ta sẽ khảo sát cách sử dụng mệnh đề EXISTS, làm sao để thực
thi queries trên tập kết quả và cách lọc kết quả của các query để trả về các dòng không trùng nhau
bằng cách sử dụng mệnh đề DISTINCT. Chúng ta cũng sẽ thảo luận về cách sử dụng các mệnh đề
COMPUTE BY và SELECT INTO cùng với các câu lệnh T-SQL.
Chúng ta cũng đã học về câu lệnh SELECT cùng với các mệnh đề trên ở các bài trước, trong bài
này có thể chúng ta sẽ nhắc lại một số khái niệm, và nó sẽ giúp chúng ta củng cố lại các kiến thức
trong các bài trước.
3.1 Thực hiện truy vấn trên nhiều bảng
Đôi khi, chúng ta thấy cần thiết phải lấy và kết hợp dữ liệu từ nhiều bảng. Trong bài dưới đây,
chúng ta sẽ nói về cách kết hợp thông tin từ nhiều bảng.
Có ba cách để kết hợp dữ liệu từ nhiều bảng:
 Unions – Kết hợp các dòng của nhiều bảng.
 Subqueries – là các query được gói bên trong các query khác.
 Joins – Kết hợp các cột từ nhiều bảng.
Có khá nhiều mệnh đề có thể được sử dụng với SELECT để trả lại các kết quả khác nhau. Từ
khóa DISTINCT khử các dòng trùng nhau trong kết quả của một câu lệnh SELECT. Nếu
DISTINCT không được chỉ ra, tất cả các dòng thỏa mãn câu lệng SELECT được trả về, bao gồm


cả các dòng trùng nhau. Khi một subquery có từ EXISTS, thì nó có chức năng giống như là kiểm
tra sự tồn tại. Từ khóa EXISTS được sử dụng để kiểm tra sự tồn tại của những dòng được trả về
bởi subquery. Câu lệng subquery đó sẽ trả lại dữ liệu thực sự mà thay vào đó nó trả về giá trị True
hoặc False. Mệng đề COMPUTE and COMPUTE BY có thể được sử dụng để sinh ra các kết
quả tổng hợp cho một tập hợp các dòng. COMPUTE trả về các dòng bình thường và thêm một
dòng chữa thông tin tổng hợp. COMPUTE BY được sử dụng để sinh ra các giá trị tổng hợp dựa
trên từng nhóm con.
Truy vấn năng cao 33
Trong phần này chúng ta sẽ học về sub-queries và unions.
3.2 Sub-Query
Tính năng subquery của SQL cho phép chúng ta sử dụng kết quả của một query như là một phần
của query khác. Một subquery được viết bằng cách đặt một query vào vị trí xác định bên trong
một query khác. C. J. Date chỉ ra khả năng sử dụng một query bên trong một query là đương
nhiên đối với từ “structured” bên trong câu “Structured Query Language”.
Tính năng subquery đóng một vai trò quan trọng trong SQL vì ba điều sau:
1. Một câu lệng SQL sử dụng subquery là cách tự nhiên nhất để diễn tả một query, bởi vì nó
gần như tương đương với cấu trúc truy vấn trong tiêng anh.
2. Subqueries giúp dễ viết câu lệnh SELECT hơn, bởi vì nó cho phép chúng ta “tách một
query thành nhiều phần” và sau đó “kết hợp lại với nhau”.
3. Có nhiều queries không thể diễn đạt đươc trong SQL nếu không sử dụng subquery.
Khi một câu lệng SELECT được sử dụng để trả về các bản ghi nó sẽ được sử dụng bởi câu lệng
SELECT khác, Câu lệnh bao ở ngoài gọi là parent query và câu lệnh ở trong gọi là subquery.
Nói cách khác, trong một Subquery sẽ có một câu lệnh SELECT được lồng bên trong một câu
lệnh SELECT khác. Câu lệnh SELECT bên trong sẽ trả về cột được sử dụng bởi câu lệnh
SELECT bên ngoài. Câu lệnh SELECT bên trong nhất sẽ được thực hiện trước. Đây là cách để
thực hiện được từng bước các thao tác mà trong trường hơp ngược lại khó thực hiện với hai query
riêng biệt.
Có nhiều câu lệng SQL chứa các subquery cũng giống như việc được tạo bởi joins.
Ví dụ dưới đây chỉ ra các thi hành các sub-queries và cũng giới thiệu cách sử dụng nhiều mệnh đề
cùng với sub-queries. Ví dụ dưới đây tìm những tiêu dề mà tác giả của nó kiếm được thù lao tối

thiểu là 100.
Hình 3.1: Ví dụ về một Subquery đơn giản
34 Thiết kế CSDL và thực thi với SQL Server
3.2.1 Những từ khóa sử dụng trong Sub-query
Khi sử dụng subqueries cần ghi nhớ các điểm sau:
 Chúng ta có thể sử dụng một subquery để thay thế cho một giá trị ở trong mệnh đề SELECT,
 Khi sử dụng các toán tử so sánh với sub-query, có một số giới hạn với việc trả lại số lượng
dòng và cột của sub-query. Các giới hạn được tổng kết trong bảng 3.1.
Một cột Nhiều cột
Một dòng Sử dụng =, >, < và các toán
tử so sánh khác
Sử dụng EXISTS
Nhiều dòng Sử dụng ANY, ALL, IN và
EXISTS
Sử dụng EXISTS
Bảng 3.1 : Các từ khóa sử dụng trong Sub-query
Bằng cách sử dụng mệnh đề EXISTS trong sub-query chúng ta có thể điều khiển kiểm tra sự trả
về dòng trong sub-query. Biểu thức EXISTS (subquery) là ‘true’ nếu subquery trả về ít nhất một
dòng, và ‘false’ nếu nố không trả về dòng.
Ví dụ, để hiển thị thông tin về những nhân viên mà có ít nhất một thông tin của nhân viên khác về
họ, chúng ta sẽ viết lệnh như hình 3.2:
Hình 3.2: Sử dụng mệnh đề EXISTS
3.2.2 Các kiểu của Sub-queries
Có hai kiểu của subquery: Nested queries và Correlated queries.
Chúng ta có thể có một subquery mà gọi subquery khác. Khi đó nó được gọi là một nested
subquery.
Ví dụ, chúng ta có thể viết một nested subquery để tìm giá chi tiết của các đơn đặt hàng và bao
gồm các sản phẩm được cung cấp tử thành phố London.
Câu lệnh và kết quả sẽ được hiển thị ở trong hình 3.3.
Truy vấn năng cao 35

Hình 3.3: Nested subqueries
Trong những query có chứa các subquery, các subquery sẽ được thực hiện chỉ một lần để trả lại
kết quả sau đó parent query sẽ sử dụng kết quả này để thực hiện. Bởi vì hầu hết các các subquery
không tham chiếu tới parent query, cho nên giá trị trong chỉ là các hằng số. Dẫu sao, nếu
subquery mà tham chiếu đến parent query, thì subquery cần được thực hiện lại tương ứng với mỗi
lần lặp trong parent query, đấy là vì biểu thức điều kiện trong subquery phụ thuộc vào giá trị của
từng bàn ghi trong parent query. Khi một subquery lấy các tham số từ parent query, nó đựoc hiểu
là Correlated subquery.
Giả sử rằng chúng ta muốn tìm những tên thành phố mà ở đó các sản phẩm được cung cấp trực
tiếp từ các nhà cung cấp. Câu lệnh sẽ liên quan đến hai bảng: Supplier and Product. Câu lệnh và
kêt quả được hiển thị trong hình 3.4.
Hình 3.4: Correlated subquery
36 Thiết kế CSDL và thực thi với SQL Server
3.3 UNION
Unions được sử dụng để kết hợp các dòng từ nhiều bảng.
Toán tử UNION kết hợp kết quả của hai hoặc nhiều câu lệnh SELECT lại thành một tập kết quả.
Mỗi câu lệnh SELECT phải có cùng cấu trúc: kiểu dữ liệu cột tương thích và cùng số lượng cột.
Tên cột có thể khác nhau giữa các câu lệnh SELECT.
Cú pháp:
Select statement
UNION [ALL]
Select statement
Nếu chúng ta gộp cả mệnh đề ALL, thì tất cả các dòng sẽ được đưa vào tập kết quả kể cả những
dòng trùng nhau.
Ví dụ, trong một ứng dụng ngân hàng ta xem xét hai bảng: Saving Account bảng này chứa thông
tin của những khách hàng có tài khoản tiết kiệm và Current Account bảng này chứa thông tin của
những khách hàng có tài khoản hiện thời. Giả sử chúng ta muốn xem Account_No và Name của
tất cả các khách hàng của nhà băng. Để thực hiện, cần phải lấy tất cả các bản ghi của cả hai bảng
trên.
Giả sử những tài khoản tiết kiệm có Account No bắt đầu bởi ‘S’ và các tài khoản hiện thời có

Account No bắt đầu bởi ‘C’. Cả hai bảng và dữ liệu được liệt kê trong bảng 3.2.
Tài khoản tiết kiệm Table Tài khoản hiện thời Table
Account No Name Account No Name
S001 James C001 Michael
S002 Rita C002 Robin
S003 Mary
S004 Valentina
Bảng 3.2
Câu lệng sau sẽ kết hợp thông tin của hai bảng.
SELECT Account_No, Name FROM Saving_Accounts
UNION
SELECT Account_No, Name FROM Current_Accounts
Câu lệnh trên sẽ hiển thị kết quả như sau:
Account_No Name
---------------- --------
S001 James
S002 Rita
S003 Mary
S004 Valentina
C001 Michal
C002 Robin
Truy vấn năng cao 37
Những tên cột trong tập kết quả sẽ giống với tên cột trong câu lệnh SELECT đầu tiên còn tên cột
trong các câu lệnh SELECT khác sẽ bị bỏ qua. Mặc định toán tử UNION sẽ loại bỏ các dòng
trùng nhau trong tập kết quả. Nhưng nếu chúng ta sử dụng kết hợp thêm mệnh đề ALL thì tất cả
các dòng sẽ được trả về trong tập kết quả.
3.4 Những mệnh đề của câu lệnh SELECT
Câu lệnh SELECT có thể được sử dụng cùng với nhiều mệnh đề. Chúng sẽ được diễn tả trong bài
này.
3.4.1 Chọn tất cả các cột

Dấu hoa thị (*) được sử dụng để lầy về tất cả các cột trong bảng.
Cú pháp: SELECT * FROM <Table_name>
Ví dụ, câu lệng SQL sau sẽ trả về tất cả các dòng và các cột từ bảng Authors của CSDL Pubs.
Hình 3.5: Chọn tất cả các cột với SELECT
3.4.2 Chọn một số cột nhất định
Để chọn một vài cột từ một bảng, liệt kê tên chúng sau từ khóa SELECT.
Cú pháp: SELECT <COLUMN1>, <COLUMN2>… From <Table Name>
Ví dụ, để hiển thị tên chi tiết của các tác giả, sử dụng câu lệnh SELECT sau:
SELECT LName,fname FROM authors
Kết quả của query trên được mô tả trong hình 3.6.
38 Thiết kế CSDL và thực thi với SQL Server

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×