Truy vấn đơn giản

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

a. Khối lệnh SELECT

Cấutrỳc đơn giản nhất trong SQL là khối SELECT, được miờu tả về cỳ phỏp

nhưlà một khối select – from- where.

Một cỏch tổng quỏt khối select gồm ba mệnh đề chớnh:

- Select : Xỏc định nội dung cỏc cột cần đưa ra kết quả - From : Xỏc định cỏc bảng ( quan hệ) cần lấy thụng tin ra - Where : Xỏc định điều kiện cỏc bản ghi được chọn để đưa ra.

Ngoài ra, để mở rộng khả năng của ngụn ngữ, khối select- from- where cũn

được bổ sung thờm cỏc mệnh đề group by, order by, having, cỏc hàm mẫu và một số phần mềm cũn cú thờm cả mệnh đề compute, for browse. Trong cỏc phần sau sẽ trỡnh bày chi tiết từng mệnh đề.

Dạng tổng quỏt của khối select được biểu diễn như sau :

SELECT [*| DISTINCT] danh_sỏch_chiếu

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]] Vớ dụ:

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

b. Tỡm kiếm khụng điều kiện

Trước hết làm quen với cỏc cõu hỏi chỉ liờn quan đến một bảng. Trong mệnh đề select cú danh sỏch chiếu. Danh sỏch này xỏc định tờn cỏc cột cần cú trong bảng kết

quả. Nếu xuất hiện giỏ trị ’*‘ (Select * from….) cú nghĩa là chọn toàn bộ cỏc cột của

bảng.

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

* Lưu ý:Sau khi thực hiện cõu lệnh SQL, để bảng đỳng là một quan hệ (cú nghĩa là khụng cú bộ giỏ trị nào trựng nhau) thỡ trong mệnh đề select ta dựng từ khúa

DISTINCT.

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

Hiển thị bảng lương của nhõn viờn trong cụng ty? SELECT LUONG

FROM NHANVIEN

c. Tỡm kiếm với điều kiện đơn giản

Thụng thường, việc tỡm kiếm đoan giản chỉ cần thờm điều kiện vào sau từ khúa

where.

Trong SQL, cỏc phộp so sỏnh được sử dụng bao gồm >, < , >=, <=,<>.

Cỏc phộp toỏn logic: AND, OR, và NOT Cỏc từ khúa: BETWEEN … AND, IN,… Vớ dụ :

Tỡm kiếm trong bảng Employees những người cú lương (salary) lơn hơn 10000.

SELECT DISTINCT LUONG

FROM NHANVIEN LUONG 3.000.000 4.000.000 2.500.000 Kết quả:

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

d. Tỡm kiếm cú xử lý xõu ký tự

Xử lý xõu ký tự gần đỳng cũn được gọi là phộp tớnh ‘thụng minh’. Trong trường hợp người sử dụng khụng nhớ rừ tờn người hoặc địa danh… thỡ việc tỡm kiếm gần đỳng này mang lại rất nhiều lợi ớch.

Để thực hiện việc tỡm kiếm dần đỳng xõu ký tự, SQL sử dụng toỏn tử LIKE.

Cỳ phỏp:

Select …..From….Where …..LIKE ‘[ _ ][%]Xõu_ký_tự[%][ _ ]’

Khi sử dụng ký hiệu phần trăm (%) vớ dụ như: ‘Alex%’ thỡ điều này cú nghĩa là

chỳng ta đang thực hiện việc tỡm kiếm với điều kiện xõu ký tự bao gồm {Alex[xõu ký

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

theo sau nú là bất kỳ ký tự nào. Tương tự như % , khi sử dụng ký hiệu dấu gạch dưới

( _ ) thỡ mỗi dấu gạch này thể hiện cho mộtký tự.

Vớ dụ 1:

Vớ dụ 2:

SELECT MANV, TENNV FROM NHANVIEN

WHERE TenNV LIKE ‘Nguyen _ _ _ _’ Vớ dụ 3:

SELECT MANV, TENNV FROM NHANVIEN

WHERE TenNV LIKE ‘Nguyen %’

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

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

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