Truy vấn lồng nhau

Một phần của tài liệu Tài liệu học tập Cơ sở dữ liệu (Trang 75)

g. Tỡm kiếm cú chứa phộp tớnh tập hợp

2.2.6.3 Truy vấn lồng nhau

Trong phần này trỡnh bày việc tỡm kiếm với nhiều bảng qua việc sử dụng ỏnh xạ lồng nhau hoặc qua phộp kết nối.

Phộp kết nối

Trong phộp kết nối, cỏc cột tham gia kết nối phải cú miền giỏ trị cú thể so sỏnh được với nhau. Tờn cột của cỏc bảng khỏc nhau cú thể được viết tường minh qua tờn bảng hoặc bớ danh.

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

Cỳ phỏp: Select ….

From Table1, Table2

Where Table1.ColName=Table2.ColName

Vớ dụ 1: Cho cơ sở dữ liệu quản lý thụng tin bỏn hàng của cỏc đại lý gồm cỏc quan hệ sau:

 S(S#, Sname, City, Status)

 P(P#, Pname, Color, Weight, Price)  SP(S#, P#, Sdate, QTY) Tỡm tờn cỏc đại lý đó cung cấp ớt nhất một mặt hàng? Select S.SName From S, SP Where S.S# = SP.S# Vớ dụ 2:

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

Ánh xạ lồng

Ngoài cỏch sử dụng phộp nối ta cú thể sử dụng ỏnh xạ lồng để thực hiện cụng việc tương tự. Phộp lồng nhau cú thể được lồng nhiều mức hoặc sử dụng ỏnh xạ lồng với sự dẫn trỏ giữa cỏc khối tới cỏc bảng khỏc nhau.

Về mặt cỳ phỏp cũng tương tự như khi sử dụng phộp nối, tuy nhiờn thay vỡ sử dụng nhiều bảng trong mỗi mệnh đề select- from- where thỡ ỏnh xạ chỉ dựng một bảng.

Vớ dụ 1: Cho cơ sở dữ liệu quản lý thụng tin bỏn hàng của cỏc đại lý gồm cỏc quan hệ sau:

 S(S#, Sname, City, Status)

 P(P#, Pname, Color, Weight, Price)

 SP(S#, P#, Sdate, QTY)

Tỡm tờn cỏc đại lý đó cung cấp ớt nhất một mặt hàng? Select SName

From S

Where S# IN (Select S# from SP)

Vớ dụ 2: Cho cơ sở dữ liệu gồm cỏc bảng: Job (Job_id, Job_title, Min_Salary, Max_Salary)

Employees (Employee_id, First_name, Last_name, email, phone_number, hire_date, Job_id, salary)

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP 2.2.6.4 Truy vấn sử dụng hàm tớnh toỏn và gom nhúm

a. Tỡm kiếm nhờ mệnh đề GROUP BY

Khi truy vấn mẩu tin trờn một hay nhiều bảng dữ liệu, thụng thường cú những bản ghi nào đú cựng giỏ trị.

Mệnh đề GROUP BY…được thờm vào SQL bởi vỡ cỏc hàm tập hợp (như SUM) trả về một tập hợp của cỏc giỏ trị trong cột mỗi khi chỳng được gọi, và nếu khụng cú GROUP BY ta khụng thể nào tớnh được tổng của cỏc giỏ trị theo từng nhúm riờng lẻ trong cột.

Cỳ phỏp của GROUP BY như sau:

SELECT tờn_cột, SUM (tờn_cột) FROM tờn_bảng GROUP BY tờn_cột

Vớ dụ 1:

Giả sử ta cú bảng Sales như sau:

Company Amount

W3Schools 5500

IBM 4500

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

Cõu lệnh SQL sau:

SELECT Company, SUM (Amount) FROM Sales

sẽ trả về kết quả:

Company SUM(Amount)

W3Schools 17100

IBM 17100

W3Schools 17100

Kết quả trả về ở trờn đụi khi khụng phải là cỏi mà ta mong đợi. Ta thờm mệnh đề GROUP BY vào trong cõu lệnh SQL:

SELECT Company, SUM (Amount) FROM Sales GROUP BY Company và kết quả trả về lần này sẽ là:

Company SUM(Amount)

W3Schools 12600

IBM 4500

Kết quả này đỳng là cỏi mà ta mong muốn.

Vớ dụ 2: Cho cơ sở dữ liệu quản lý thụng tin bỏn hàng của cỏc đại lý gồm cỏc quan hệ sau:

 S(S#, Sname, City, Status)

 P(P#, Pname, Color, Weight, Price)  SP(S#, P#, Sdate, QTY)

Tỡm số lượng cung cấp lớn nhất của từng mặt hàng? Select P#, max (QTY)

From SP Group by P#

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

Khi sử dụng Group by ta thường sử dụng mệnh đề HAVING đi kốm. Having được thờm vào SQL vỡ mệnh đề WHERE khụng ỏp dụng được đối với cỏc hàm tập hợp (như SUM). Nếu khụng cú HAVING, ta khụng thể nào kiểm tra được điều kiện với cỏc hàm tập hợp.

Cỳ phỏp của HAVING như sau:

SELECT tờn_cột, SUM (tờn_cột) FROM tờn_bảng

GROUP BY tờn_cột

HAVING SUM (tờn_cột) điều_kiện giỏ_trị

Ta sử dụng lại bảng Sales ở trờn. Cõu lệnh SQL sau:

SELECT Company, SUM (Amount) FROM Sales GROUP BY Company

HAVING SUM (Amount) > 10000 sẽ trả về kết quả:

Bảng SP

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

Chỳ ý:

 Mệnh đề GROUP BY

 Cỏc thuộc tớnh trong mệnh đề GROUP BY phải được xuất hiện trong

mệnh đề SELECT.

 Mệnh đề HAVING:

 Chỉ kiểm tra điều kiện trờn nhúm, mệnh đề Having khụng lọc trờn từng

bản ghi. (Điều kiện trong mệnh đề Having tỏc động trờn cỏc bản ghi của một nhúm)

 Điều kiện trờn nhúm (ở mệnh đề HAVING) được thực hiện sau khi gom

nhúm.

 Điều kiện trong mệnh đề Where tỏc động trờn toàn bộ cỏc bản ghi của bảng

b. Cỏc hàm thư viện

o Hàm Count()

Hàm Count() trả về số lượng mẩu tin trong cõu truy vấn trờn bảng. Cỳ phỏp:

Select Count(tờn_cột) From tờn_bảng…. Vớ dụ :

Company SUM(Amount)

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

Lưu ý:

- Khi sử dụng Count(*) sẽ trả về số bản ghi của bảng

- Cần phõn biệt Cout( tờn_cột) với Count(*) : Về cơ bản chỳng giống nhau tuy nhiờn hàm Count(*) đếm cả những bản ghi cú giỏ trị NULL, Count(tờn_cột) thỡ khụng.

Vớ dụ:

Trong bảng Employees cú 107 bản ghi, thuộc tớnh Commission_PCT cú vị trớ chứa giỏ trị NULL.

Khi sử dụng hàm Count(*) và hàm Count(Commisson_pct) ta cú :

Để trỏnh đếm những giỏ trị trựng lặp ta cú thể dựng thờm từ khúa DISTINCT.

Vớ dụ:

o Hàm Sum()

Hàm trả về tổng cỏc giỏ trị của trường, cột trong cõu truy vấn Vớ dụ:

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

o Hàm Min, Max

Hàm min, max trả về giỏ trị nhở nhất, giỏ trị lớn nhất của cột hay trường trong cõu truy vấn.

Cỳ phỏp : Select Min [Max] (tờn_cột) From tờn_bảng [Where điều_kiện] Vớ dụ:

o Hàm tớnh trung bỡnh cộng

Trả về giỏ trị bỡnh quõn của cột hay trường trong cõu truy vấn. Cỳ phỏp : Select AVG (tờn_cột) From tờn_bảng [Where điều_kiện] Vớ dụ:

2.2.6.5. Khung nhỡn (View)

Trong SQL, View là một bảng ảo được tạo ra dựa trờn kết quả của một cõu lệnh truy vấn SQL. Một view chứa cỏc dũng và cỏc cột, nú chỉ giống như một bảng, mỗi trường của view là một thuộc tớnh từ một hoặc nhiều bảng thực ( real table) trong cơ sở

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

dữ liệu. Với view cú thể sử dụng cỏc hàm truy vấn SQL, mệnh đề Where và cỏc cõu lệnh Join để xem và hiển thỡ dữ liệu giống như truy vấn từ một bảng đơn bỡnh thường.

Cỳ phỏp:

CREATE VIEW tờn_view (danh_sỏch_tờn_cột) AS mệnh_đề_select

Khi tạo View cần chỳ ý một số điểm sau:

• Tờn view phải tuõn theo quy tắc về định danh và phải duy nhất đối với người sử dụng.

• Khụng thể ràng buộc cỏc mặc định, cỏc quy tắc cho view.

• Trong cõu lệnh Create view khụng nhất thiết phải chỉ định tờn cột. Tờn của cỏc cột cũng như kiểu dữ liệu của chỳng sẽ tương ứng với cỏc cột trong danh sỏch chọn của cõu lệnh Select.

• Bạn phải xỏc định tờn cột trong cõu lệnh Create view trong cỏc trường hợp sau:  Mỗi cột của view được phỏt sinh từ một biểu thức số học, một hàm cài sẵn

hay một hằng.

 Hay nhiều cột của view cú trựng tờn.

 Bạn muốn thay đổi tờn cột trong view khỏc với tờn cột của bảng cơ sở.

Vớ dụ 1:Cho database Quanlysinhvien

Y/c: Tạo view Thongtin_sv (masv, hoten, tuoi, tenlop)

Create view thongtin_sv (masv, hoten, tuoi, tenlop) As

Select masv, hoten, datediff(year, ngaysinh, getdate()), tenlop From sinhvien, lop

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

Vớ dụ 2:

2.2.7 Giới thiệu về ngụn ngữ lập trỡnh T-SQL trong SQL Server 2.2.7.1 Biến cục bộ (Local variable) 2.2.7.1 Biến cục bộ (Local variable)

- Được khai bỏo trong phần thõn của một bú lệnh hoặc một thủ tục.

- Phạm vi hoạt động của biến bắt đầu từ điểm mà nú được khai bỏo cho đến khi kết thỳc một lụ (batch) hoặc stored procedure hoặc Function mà nú được khai bỏo. - Tờn của biến bắt đầu @

Khai bỏo:

DECLARE @var_name var_type trong đú:

@var_name: Tờn của biến được đặt theo qui tắc định danh.

var_type: Kiểu dữ liệu của biến.

string_expr: Một biểu thức trả về giỏ trị chuỗi.

Vớ dụ:

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

DECLARE @mNHD DATETIME

Gỏn giỏ trị cho biến:

Nếu biến vừa khai bỏo xong thỡ biến mặc nhiờn được gỏn giỏ trị là NULL. Để gỏn biến ta dựng lệnh SET hoặc dựng cõu lệnh SELECT

SET @var_name = expression

SELECT { @var_name = expression } [,...n ]

Vớ dụ: gỏn giỏ trị là ngày 25/03/2014 vào biến mNHD DECLARE @mNHD DATETIME

SET @mNHD='2014-03-25'

In giỏ trị của biến cục bộ:

PRINT msg_str | @local_variable | string_expr

Trong đú:

msg_str: Hằng chuỗi;

@local_variable: Biến cục bộ;

Vớ dụ : Tỡm số lượng bỏn được lớn nhất của sản phẩm mó S1 DECLARE @mSL INT

SELECT @mSL=MAX(SL) FROM CTHD

WHERE MaSP='S1' PRINT @mSL

Chỳ ý: Khi cú kết hợp với chuỗi, phải đổi kiểu dữ liệu sang kiểu chuỗi bằng hàm CAST hay CONVERT

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

CONVERT(kiểu_DL,Tờn_biến)

Vớ dụ : Tỡm số lượng bỏn được lớn nhất của sản phẩm mó S1 declare @msl int

select @msl=max(sl) from cthd

where masp='s1'

print 'max s1 = '+cast(@msl as char(10)) Hoặc

declare @msl int select @msl=max(sl) from cthd

where masp='s1'

print 'max s1 = '+convert(char(10), @msl)

2.2.7.2 Biến hệ thống.

Global variable trong SQL Server gọi là System Function: Từ SQL Server 7.0 biến Global được định nghĩa như là hàm hệ thống. Mỗi kết nối sẽ tạo ra một session, SQL Server tạo ra sẳn một số biến cú sẳn rất tiện ớch trong việc lập trỡnh và quản trị hệ thống. Cỏc biến này khụng cú kiểu, tờn bắt đầu @@.

Cỏc biến í nghĩa

@@VERSION Phiờn bản của SQL Server và hệ điều hành @@TRANCOUNT Xem coi cú bao nhiờu transaction đang mơ

@@ROWCOUNT Trả về số dũng bị ảnh hưởng đối với lệnh thực thi gần nhất

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

@@ERROR Trả về lỗi số (STT lỗi) của lệnh sau cựng mà SQL thực thi, là 0 cú nghĩa là cõu lệnh thực thi hoàn thành.

@@FETCH_STATUS Trả về trạng thỏi của lệnh Fetch của biến con trỏ cú thành cụng hay khụng (0: Thành cụng, -1: bị lỗi hoặc vượt quỏ phạm vi; -2: Thất bại)

@@LANGUAGE Tờn của ngụn ngữ đang được sử dụng @@MAX_CONNECTIONS Số kết nối tối đó cú thể

@@SERVERNAME Tờn của mỏy chủ

@@SERVICENAME Tờn của dịch vụ SQL trờn mỏy chủ

@@TIMETICKS Số milliseconds trong một tick trờn mỏy chủ

2.2.7.3 Cỏc toỏn tử.

Toỏn tử số học :

Toỏn tử số học được phộp sử dụng trong việc tớnh toỏn cỏc phộp tớnh : cộng, trừ, nhõn, chia và chia lấy phần dư. Cỏc biểu thức, giỏ trị tớnh toỏn phải cú kiểu dữ liệu là số khi thực hiện cỏc toỏn tử này. Thứ tự ưu tiờn của cỏc toỏn tử số học là : nhõn, chia và chia lấy phần dư trước sau đú đến cộng và trừ. Tuy nhiờn bạn nờn chỉ định tường minh thứ tự thực hiện cỏc toỏn tử số học bằng cỏch đưa vào cỏc dấu ngoặc đơn trong một biểu thức tớnh toỏn.

Vớ dụ :

Hai cõu lệnh bờn dưới sẽ trả về kết quả như nhau : SELECT 10 +15*70/100

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

Tuy nhiờn với cõu lệnh thứ hai, bạn thấy rừ ràng hơn bởi vỡ phộp nhõn bờn trong cựng của dấu ngoặc đơn sẽ thực hiện trước sau đú là tới phộp chia và cuối cựng mới là phộp cộng.

Toỏn tử số học được phộp sử dụng cho cỏc kiểu dữ liệu số như : int, bigint, smallint, tinyint, numeric, decimal, float, real, money và smallmoney. Tuy nhiờn đối với phộp tớnh chia lấy phần dư chỉ được sử dụng cho cỏc kiểu dữ liệu số nguyờn như : int, bigint, smallint và tinyint.

Vớ dụ :

Thể hiện phộp chia lấy phần dư của hai số nguyờn 15 và 6. Bạn sử dụng cõu lệnh như sau :

SELECT 15%6 Kết quả trả về là 3.

Toỏn tử nối chuỗi :

Toỏn tử nối chuỗi được phộp sử dụng trong việc kết nối cỏc chuỗi rời rạc thành một chuỗi liờn tục. Cỏc biểu thức, giỏ trị khi nối chuỗi phải cú kiểu dữ liệu là chuỗi hoặc

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

phải được chuyển đổi thành kiểu dữ liệu chuỗi trước khi thực hiện toỏn tử này. Ký hiệu của toỏn tử nối cỏc chuỗi lại với nhau là dấu cộng (+).

Vớ dụ :

Để nối hai chuỗi "Hello" và "The World !" lại thành chuỗi "Hello The World !", bạn sử dụng cõu lệnh sau :

SELECT “Hello”+ “ ” + “The World”

Vớ dụ :

Cho biết ngày đặt hàng của đơn đặt hàng số D007 là bao nhiờu, bạn sử dụng cõu lệnh sau :

SELECT “Ngày đặt hàng D007 là: “ +CASE(NGAYDH AS CHAR(11)) FROM DONDH

WHERE SODH = “D007”

Trong vớ dụ trờn bắt buộc phải chuyển đổi giỏ trị dữ liệu của cột ngày đặt hàng trong bảng DONDH từ kiểu dữ liệu ngày sang kiểu dữ liệu chuỗi trước khi thực hiện toỏn tử nối chuỗi.

Toỏn tử so sỏnh :

Toỏn tử so sỏnh được phộp sử dụng để thực hiện cỏc phộp so sỏnh như : bằng, khỏc, lớn hơn, nhỏ hơn, … cho cỏc biểu thức cần được so sỏnh. Giỏ trị trả về của việc so sỏnh sẽ là đỳng hoặc sai tựy thuộc vào biểu thức điều kiện mà bạn đưa ra để so sỏnh.

Cỏc toỏn tử so sỏnh cú thể được sử dụng trờn nhiều kiểu dữ liệu khỏc nhau như : kiểu số, kiểu chuỗi hoặc kiểu ngày. Thụng thường cỏc biểu thức so sỏnh sẽ được lồng vào cỏc mệnh đề WHERE hoặc HAVING của cỏc cõu lệnh truy vấn.

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

Vớ dụ :

Sử dụng toỏn tử so sỏnh bằng để lọc ra cỏc vật tư hiện đang cú trong bảng VATTU với đơn vị tớnh là "Bộ", bạn sử dụng cõu lệnh sau :

SELECT * FROM VATTU

WHERE DVTINH = “Bộ”

Trong vớ dụ trờn, toỏn tử so sỏnh bằng được thực hiện trờn kiểu dữ liệu chuỗi và kết hợp trong mệnh đề WHERE.

Vớ dụ :

Sử dụng toỏn tử so sỏnh lớn hơn để lọc ra cỏc phiếu xuất hàng cú tổng trị giỏ lớn hơn 3,000,000 vnđ. Bạn sử dụng cõu lệnh sau :

SELECT SOPX, SUM(SLXUAT*DONGIA) AS TONGTG FROM CTXUAT

GROUP BY SOPX

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

Trong vớ dụ trờn, toỏn tử so sỏnh lớn hơn được thực hiện trờn kiểu dữ liệu số và kết hợp trong mệnh đề HAVING.

Toỏn tử luận lý :

Toỏn tử luận lý được phộp sử dụng để thực hiện việc kết hợp nhiều biểu thức so sỏnh đơn lẻ thành một biểu thức so sỏnh chung. Cú ba toỏn tử luận lý rất quan trọng thường dựng : AND, OR và NOT. Khi sử dụng toỏn tử luận lý bạn nờn thờm vào cỏc dấu ngoặc đơn cần thiết để giỳp cho người đọc dễ hiểu bởi vỡ nú làm cho cõu lệnh rừ ràng hơn.

Vớ dụ :

Hiển thị danh sỏch cỏc vật tư trong bảng VATTU thỏa điều kiện như sau : - Đơn vị tớnh là "Bộ" và phần trăm lớn hơn 10.

- Hoặc đơn vị tớnh là "Cỏi" và phần trăm lớn hơn 20.

Bạn sử dụng cõu lệnh như sau: SELECT * FROM VATTU

WHERE (DVTINH=”Bộ” AND PHANTRAM>10)

OR (DVTINH=”Cỏi” AND PHANTRAM>20)

Trong vớ dụ trờn, cả hai toỏn tử AND và OR được sử dụng kết hợp trong cỏc biểu thức so sỏnh.

2.2.8.Cỏc lệnh cơ bản của T-SQL a. Cỏc lệnh truy vấn

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

FROM danh_sỏch_tờn_bảng| tờn_cỏc_view

[WHERE biểu_thức_điều_kiện]

[GROUP BY danh_sỏch_tờn_cột] [HAVING biểu_thức_điều_kiện]

[ORDER BY danh_sỏch_cụt [ASC|DESC]]

b. Cỏc lệnh điều khiển

Cũng giống như một số ngụn ngữ lập trỡnh khỏc, T-SQL cung cấp một số cấu trỳc điều khiển cơ bản cho phộp thực thi một khối lệnh dựa trờn kết quả của một phộp so sỏnh.

BEGIN … END

BEGIN .. END được dựng để nhúm cỏc lệnh đơn thành một khối lệnh. BEGIN .. END được sử dụng trong bất kỳ một cấu trỳc điều khiển nào khi cần thực thi một khối lệnh hoặc nhiều hơn hai lệnh SQL.

Cỳ phỏp: BEGIN { sql_statement | statement_block } END PRINT

Dựng để in thụng tin ra màn hỡnh kết quả của cõu lệnh SQL. Cỳ phỏp:

PRINT 'any ASCII text' | @local_variable | @@FUNCTION | string_expr

Vớ dụ:

KHOA CNTT – TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP

PRINT N'Chào bạn'

PRINT @@VERSION

IF … ELSE

Là một cấu trỳc điều khiển cho phộp thực thi một hoặc nhiều phỏt biểu tựy thuộc vào một điều kiện nào đú.

Cỳ phỏp: IF condition {statements} [ ELSE [Condition 1] {statements}] Trong đú:

Một phần của tài liệu Tài liệu học tập Cơ sở dữ liệu (Trang 75)

Tải bản đầy đủ (PDF)

(200 trang)