Tỡm kiếm nhờ sử dụng IN và BETWEEN

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

Ngoài việc sử dụng cỏc con số, xõu ký tự cụthể thỡ SQL cung cấp một số toỏn

tử giỳp việc diễn giải điều kiện đơn giản và ngắn gọn hơn cho người dựng, ở đõy sử

dụng toỏn tử IN và BETWEEN.

Toỏn tử In và Between cú cỳ phỏp như sau:

Select…..From….Where …. IN (Tập hợp)

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

Vớ dụ 1: Cho bảng Nhanvien (MaNV, TenNV, Ngaysinh, GT, Luong, MaPB)

Tỡm những nhõn viờn nào cú lương từ 2 triệu đến 3 triệu đồng?

SELECT MANV, TENNV FROM NHANVIEN

WHERE Luong> 2.000.000 AND Luong< 3.000.000

SELECT MANV, TENNV FROM NHANVIEN

WHERE Luong BETWEEN 2.000.000 AND 3.000.000

Vớ dụ 2: Tỡm những nhõn viờn nào cú lương một trong 3 mức sau: 2 triệu, 3 triệu, 4 triệu đồng.

SELECT MANV, TENNV FROM NHANVIEN

WHERE Luong= 2.000.000 OR Luong= 3.000.000 OR Luong=4.000.000 

SELECT MANV, TENNV FROM NHANVIEN

WHERE Luong IN ( 2.000.000 , 3.000.000, 4.000.000) Vớ dụ 3:

KHOA CNTT –TRƯỜNG ĐẠI HỌC KINH TẾ KỸ THUẬT CễNG NGHIỆP f. Tỡm kiếm cú sắp xếp

Vấn đề đặt ra khi chỳng ta cần sắp xếp dữ liệu truy vấn theo một cỏch nào đú.

SQL cung cấp mệnh đề ORDER BY giỳp chỳng ta thực hiờn việc này.

Từ khoỏORDER BYđược sử dụng để sắp xếp kết quả trả về. Mệnh đề

ORDER BY được dựng để sắp xếp cỏc dũng.

Cỳ phỏp:

Select …..From….Where…..ORDER BY (Danh_sỏch_cột) [ASC|DESC]

Trong đú:

- ASC: Sắp xếp tăng dần (Mặc định khi khụng cú chỉ thị)

- DESC: Sắp xếp giảm dần Vớ dụ: BảngOrders: Company OrderNumber Sega 3412 ABC Shop 5678 W3Schools 2312 W3Schools 6798

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

 Để lấy danh sỏch cỏc cụng ty theo thứ tự chữ cỏi (tăng dần): SELECT Company, OrderNumber FROM Orders

ORDER BY Company Kết quả trả về: Company OrderNumber ABC Shop 5678 Sega 3412 W3Schools 6798 W3Schools 2312

 Lấy danh sỏch cỏc cụng ty theo thứ tự chữ cỏi (tăng dần) và hoỏ đơn đặt hàng theo thứ tự số tăng dần:

SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber

Kết quả trả về: Company OrderNumber ABC Shop 5678 Sega 3412 W3Schools 2312 W3Schools 6798

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

 Lấy danh sỏch cỏc cụng ty theo thứ tự giảm dần: SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC

Kết quả trả về: Company OrderNumber W3Schools 6798 W3Schools 2312 Sega 3412 g. Tỡm kiếm cú chứa phộp tớnh tập hợp

Trong khi truy vấn dữ liệu, việc truy vấn cú thể thực hiện cỏc phộp tớnh trờn tập hợp bao gồm cả việc tỡm kiếm. SQL cung cấp toỏn tử MINUS nhằm phục vụ truy vấn, tỡm kiếm cú chưa cỏc tập hợp.

Toỏn tử MINUS cú tỏc dụng gần giống như một toỏn tử trừ ‘-‘ hai tập hợp.

Vớ dụ:

Bảng Jobs cú trường Job_ID chứa tất cả cỏc mó cụng việc (Job) của một cụng ty A. Bảng Job_history cú trường Job_ID chứa cỏc mó cụng việc mó nhõn viờn đú đó làm trong thỏng. Để tỡm ra mó cụng việc chưa được làm trong thỏng ta sử dụng cõu lệnh truy vấn SQL như sau:

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

Ngoài ra, cõu lệnh dưới đõy cũng là tương đương

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

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ỏcbả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úma. Tỡm kiếm nhờ mệnh đề GROUP BY 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ẻ trongcộ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ảngSalesnhư 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

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ảngSalesở 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

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

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ọncủ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 trongview 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)

- Đượ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ỏngiỏ 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

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