Biểu diến yêu cầu bằng SQL

6 1.5K 23
Biểu diến yêu cầu bằng SQL

Đang tải... (xem toàn văn)

Thông tin tài liệu

H-íng dÉn «n tËp CSDL quan hÖ Tµi liÖu tham kh¶o Trang 14 DẠNG 3: BIỂU DIỄN YÊU CẦU BẰNG SQL Bài toán: Cho một hoặc nhiều lược đồ quan hệ và một số yêu cầu dữ liệu. Hãy biểu diễn các yêu cầu dữ liệu đó bằng câu truy vấn SQL sao cho kết quả của câu SQL đó thoả mãn yêu cầu đặt ra. Phương pháp: Tài liệu này chỉ tập trung vào câu Select. Các dạng khác sinh viên tự tham khảo trong các tài liệu khác. Ta tạm phân chia các câu truy vấn Select thành 5 loại: [1]. Chiếu, chọn trên một bảng. [2]. Chiếu chọn trên nhiều bảng. [3]. Sử dụng các hàm, các vị từ. [4]. Select lồng nhau. [5]. Tạo nhóm sử dụng Group by. Tuy nhiên, một câu Select thông thường sẽ là câu select tổng hợp. Việc tách chúng thành 5 loại chỉ nhằm mục đích dễ tiếp thu kiến thức cơ bản. Sau đây là các lưu ý khi viết câu Select của từng dạng: [1]. Sử dụng phương pháp 3 bước trong dạng bài tập 2 (biểu diễn yêu cầu bằng biểu thức đại số quan hệ). Biểu thức điều kiện chọn trong SQL có điểm khác: - Các toán tử: và (And), hoặc (Or), so sánh (>, <, >=, <=, =, <>), số học (+, -, *, /, mod ) - Các toán hạng: Các trường hoặc các hằng giá trị. Hằng xâu và hằng ngày tháng đặt giữa hai dấu nháy đơn ' '. Hằng số thì không. Cú pháp câu Select đơn giản: Select <Tên trường> From <Tên bảng> Where <Điều kiện> Cho biết tên hàng màu đỏ, có trọng lượng nhỏ hơn 15? SELECT PName FROM P WHERE Color = 'Đỏ' And Weight < 15 [2]. Vẫn sử dụng phương pháp 3 bước trên nhưng có 3 chú ý: - Các tên trường xuất hiện trong ít nhất 2 bảng liên quan thì được viết dưới dạng <Tên bảng> . <Tên trường>. - Tên các bảng đặt ngay sau FROM phải cách nhau bởi dấu phảy. - Luôn có điều kiện kết nối đặt ngay sau WHERE. Điều kiện kết nối có dạng <Tên bảng 1. A> = <Tên bảng 2. A> với A là thuộc tính chung của hai quan hệ. Cho biết tên hàng đã cung cấp với số lượng 30 cái mỗi lượt. SELECT P. PName FROM P, SP WHERE P.P# = SP.P# and SP. QTY =30. Các câu sau đều sai vì không chú ý tới 3 vấn đề đã nêu (theo đúng thứ tự): Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. H-íng dÉn «n tËp CSDL quan hÖ Tµi liÖu tham kh¶o Trang 15 SELECT P. PName FROM P and SP WHERE P.P# = SP.P# and SP. QTY =30. SELECT PName FROM P, SP WHERE P# = P# and QTY =30. SELECT P. PName FROM P, SP WHERE SP. QTY =30. [3] Có 6 hàm hay dùng: SUM, MAX, MIN, AVG, COUNT(*), COUNT(<Cột>). - Các hàm được sử dụng ngay sau SELECT SELECT <Tên trường> / <Hàm> … FROM … - Có 3 Vị từ chính: IN, BETWEEN, LIKE. Trong đó, IN và BETWEEN không bắt buộc phải dùng. - Khi dùng LIKE cần chú ý: + LIKE chỉ dùng cho dữ liệu kiểu xâu. + Hai ký tự đại diện trong xâu tìm kiếm sau LIKE: “%” đại diện cho 1 xâu ký tự bất kỳ. “_” đại diện cho 1 ký tự bất kỳ. Cho biết tên các nhà cung cấp ở Hà Tây: SELECT SName FROM S WHERE City Like '%Hà Tây%' Cho biết tên các nhà cung cấp có City là Hà Tây: SELECT SName FROM S WHERE City = 'Hà Tây' Cho biết tổng số nhà cung cấp có trong CSDL? SELECT Count (*) FROM S Khi sử dụng hàm cần lưu ý 2 nguyên tắc sau: - Hàm không được sử dụng trực tiếp trong biểu thức điều kiện chọn của mệnh đề where. - Không được viết hàm lồng vào hàm: ví dụ SELECT Max(Count(…)) … [4]. Câu SELECT con cần phải được đặt giữa hai ngoặc đơn (). Câu Select lồng nhau có 4 dạng chính như sau: (1). Lồng nhau do sử dụng hàm trong biểu thức điều kiện chọn: Biểu thức điều kiện chọn sau where không thể sử dụng hàm một cách trực tiếp. Nhưng nó có thể sử dụng các kết quả của một câu lệnh Select nào đó. Do vậy, người ta thường sử dụng Select lồng nhau trong trường hợp này. Cho biết Tên hàng có trọng lượng lớn nhất? Câu SELECT sau là sai trong khi đa số sinh viên mắc phải: Select PName From P Where Weight = Max(Weight) Câu SELECT sau cho biết trọng lượng lớn nhất là bao nhiêu: SELECT Max(Weight) FROM P Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. H-íng dÉn «n tËp CSDL quan hÖ Tµi liÖu tham kh¶o Trang 16 Tuy nhiên câu hỏi không yêu cầu cho biết trọng lượng lớn nhất này mà cần cho biết tên của mặt hàng có trọng lượng lớn nhất. SELECT PName From P Where Weight = (SELECT Max(Weight) FROM P) (2). Thay bằng việc kết nối bảng ta có thể sử dụng SELECT lồng nhau: Cho biết Tên các mặt hàng do S2 cung ứng? Cách 1: sử dụng kết nối, câu SELECT có dạng [2]: SELECT P.PName FROM P, SP WHERE P.P# = SP.P# And SP.S# = 'S2' Cách 2: Sử dụng Select lồng nhau, câu Select lại ở dạng [4] này: Ta hiểu câu hỏi này là: Cho biết tên hàng mà mã của nó nằm trong những mã hàng do S2 cung ứng. SELECT PName FROM P WHERE P# IN (SELECT P# FROM SP WHERE S#='S2'). Cho biết tên hàng mà S2 chưa cung ứng lần nào? SELECT PName FROM P WHERE P# NOT IN (SELECT P# FROM SP WHERE S#='S2') (3). Lồng nhau do thể hiện phép giao và phép trừ: Việc sử dụng các mệnh đề Intersect (phép giao) và Minus (phép trừ) là thực sự không cần thiết và không được cài đặt trong một số môi trường SQL nhúng. Tuy vậy, ta vẫn dễ dàng thể hiện được hai phép toán tập hợp này trong SQL nhờ câu lệnh Select lồng nhau. Ví dụ: Cho biết tên hàng được cả nhà cung cấp S01 và S02 cung ứng ! Câu sau đây cho ta tập các mã hàng do nhà cung cấp S01 cung ứng: SELECT P# From SP WHERE S#= ‘S01’ Và tương tự, câu select sau cho ta tập các mã hàng được nhà cung cấp S02 cung ứng: SELECT P# From SP WHERE S#= ‘S02’ Vì vậy dễ dàng tìm được tên hàng được cả hai nhà cung cấp cung ứng bằng phép giao: SELECT Pname FROM P WHERE P# IN (SELECT P# From SP WHERE S#= ‘S01’) AND P# IN (SELECT P# From SP WHERE S#= ‘S02’) Như vậy, sử dụng vị từ IN – IN ta có thể biểu diễn được phép giao. Khi sử dụng IN, trong trường hợp này, cần nhớ: câu select luôn có dạng: X IN (SELECT X …) mà không được phép viết X IN (SELECT Y ….) với Y khác X. Tương tự ta có thể biểu diễn được phép trừ một cách dễ dàng: Cho biết tên hàng được nhà cung cấp S01 cung ứng mà không được nhà cung cấp S02 cung ứng: SELECT Pname FROM P WHERE P# IN (SELECT P# From SP WHERE S#= ‘S01’) AND P# NOT IN (SELECT P# From SP WHERE S#= ‘S02’) Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. H-íng dÉn «n tËp CSDL quan hÖ Tµi liÖu tham kh¶o Trang 17 Các vị từ IN – NOT IN cho phép ta thể hiện phép trừ một cách dễ dàng. (4). Lồng nhau do SELECT từ một query (tức select từ 1 câu select) Thông thường, sau FROM là tên các bảng quan hệ (tables). Tuy nhiên, đôi khi ta có thể thay tên bảng quan hệ bằng một query tức là 1 câu truy vấn Select. Sở dĩ như vậy là vì kết quả của câu Select cũng cho ta một bảng quan hệ (hay nói đúng hơn là 1 tập hợp các bản ghi có dạng 1 quan hệ). Ví dụ: Cho biết Tổng số lượng hàng lớn nhất mà một nhà cung cấp đã cung ứng! Ta hiểu rằng mỗi nhà cung cấp có thể cung ứng nhiều mặt hàng khác nhau. Mỗi mặt hàng lại cung cấp làm nhiều đợt với số lượng mỗi đợt khác nhau. Tuy nhiên, mỗi nhà cung cấp đều xác định một tổng số lượng hàng hóa đã cung cấp của mình. Muốn xác định tổng số lượng hàng cung ứng cho từng nhà cung cấp, ta chỉ việc cộng dồn tất cả các số lượng của tất cả các mặt hàng, các lần cung ứng của từng nhà sản xuất. Do vậy, ta cần nhóm theo từng nhà sản xuất (nhóm – Group by – xin xem mục sau). Ví dụ ta xét bảng SP như sau: S# P# QTY Tổng SL S01 P01 30 S01 P02 50 S01 P03 20 100 S02 P01 10 S02 P05 60 70 S03 P02 40 40 Theo câu hỏi trên, ta cần đưa ra tổng lớn nhất là 100. Hãy xét câu Select sau: SELECT S#, SUM(QTY) as Tong FROM SP GROUP BY S# Kết quả ta thu được một quan hệ (tạm gọi là quan hệ Q1) có dạng: S# Tong S01 100 S02 70 S03 40 Nhưng câu hỏi chỉ yêu cầu đưa ra tổng số lượng lớn nhất, do vậy ta cần viết : SELECT Max(Tong) FROM Q1 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. H-íng dÉn «n tËp CSDL quan hÖ Tµi liÖu tham kh¶o Trang 18 Nhưng Q1 chính là kết quả của câu Select trên, do đó ta viết: SELECT Max(Tong) FROM (SELECT S#, SUM(QTY) as Tong FROM SP GROUP BY S#) [5]. Cú pháp GROUP BY: GROUP BY <Tên cột> [HAVING <Điều kiện>] Chức năng: Tất cả các bản ghi có giá trị trùng nhau trên cột đã chỉ ra sau GROUP BY sẽ được nhóm vào một nhóm. Nếu có [HAVING <Điều kiện>] thì chỉ những nhóm thoả mãn điều kiện sau HAVING mới được lấy ra. Đặc biệt: Nếu có GROUP BY thì các hàm sẽ thực hiện trên từng nhóm thay vì trên toàn bảng. Cho biếtmã hàng và tổng số lượng của từng mặt hàng đã cung ứng? Câu Select sau là sai do nó đưa ra tổng số lượng của mọi mặt hàng: SELECTP#, SUM(QTY) FROM SP Nhưng nếu có GROUP BY theo Mã hàng (P#) thì tất cả các bản ghi của cùng một mã hàng sẽ được nhóm thành 1 nhóm (nói khác đi, mỗi mặt hàng thuộc một nhóm) và hàm SUM() sẽ tính SUM trên từng nhóm và câu SQL sau là chính xác: SELECT P#, SUM(QTY) FROM SP GROUP BY P# Cho biết Mã nhà cung cấp đã cung cấp tổng số lượng hàng lớn hơn 300? Câu SELECT sau sẽ đưa ra các tất cả các mã nhà cung cấp có trong SP (tức đã cung cấp hàng) nhưng mỗi nhà cung cấp là một nhóm: SELECT S# FROM SP GROUP BY S# Nhưng câu sau chỉ đưa ra mã nhà cung cấp thuộc nhóm có tổng số lượng lớn hơn 300: SELECT S# FROM SP GROUP BY S# HAVING SUM(QTY) >300 Khi dùng GROUP BY, cũng có những chú ý mà ta không thể bỏ qua: (1). Select trường nào, Group by theo trường đó: Sau SELECT, có thể là các trường hoặc các hàm. Ví dụ: SELECT S#, SUM(SL)… thì S# là tên trường còn SUM(SL) là hàm. Nguyên tắc trên chỉ cho ta thấy: ta luôn phải Group by theo tên các trường (không phải hàm) mà ta đã liệt kê sau Select ở trên. Có bao nhiêu trường trong câu Select thì phải Group by theo bấy nhiêu trường. (2). Mệnh đề Having [Điều kiện] chỉ có khi ta sử dụng Group by. Và điều đặc biệt là biểu thức [Điều kiện] sau Having lại có thể sử dụng hàm. Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. H-íng dÉn «n tËp CSDL quan hÖ Tµi liÖu tham kh¶o Trang 19 Sau khi đã xem xét 5 loại câu Select, chúng ta cần áp dụng nó một cách linh hoạt để viết các câu Select tổng hợp. Cú pháp sau cần được xem xét kỹ: SELECT <Tên trường> / <Hàm> / <Biểu thức> / <Hằng> [AS <Bí danh>] FROM <Tên bảng> / <Câu SELECT> [ AS <Bí danh>] [WHERE <Biểu thức điều kiện>] [GROUP BY <Tên trường> [HAVING <Biểu thức điều kiện>]] [ORDER BY <Tên trường> [DESC] [, …] ] Hãy kiểm tra câu lệnh Select sau bằng MS-Access: Select (Max(SL) + Min(SL)) AS A, 1 AS B FROM SP ta sẽ biết cách sử dụng <Biểu thức> và <Hằng> trong câu Select. Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. . DẠNG 3: BIỂU DIỄN YÊU CẦU BẰNG SQL Bài toán: Cho một hoặc nhiều lược đồ quan hệ và một số yêu cầu dữ liệu. Hãy biểu diễn các yêu cầu dữ liệu đó bằng câu. phương pháp 3 bước trong dạng bài tập 2 (biểu diễn yêu cầu bằng biểu thức đại số quan hệ). Biểu thức điều kiện chọn trong SQL có điểm khác: - Các toán tử: và

Ngày đăng: 29/09/2013, 04:20

Hình ảnh liên quan

Thông thường, sau FROM là tên các bảng quan hệ (tables). Tuy nhiên, đôi khi ta có thể thay tên bảng quan hệ bằng một query tức là 1 câu truy vấn Select - Biểu diến yêu cầu bằng SQL

h.

ông thường, sau FROM là tên các bảng quan hệ (tables). Tuy nhiên, đôi khi ta có thể thay tên bảng quan hệ bằng một query tức là 1 câu truy vấn Select Xem tại trang 4 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan