Hướng dẫn SQL & XQuery cho IBM DB2, Phần 2: Các truy vấn cơ sở

Cơ bản về truy vấn SQL

Thông qua một loạt các ví dụ đơn giản, hướng dẫn này minh họa làm thế nào để lấy ra từ một cơ sở dữ liệu IBM® DB2® bằng các lệnh SELECT của SQL chuẩn. Hướng dẫn này mô tả cách lấy ra các hàng từ một bảng cơ sở dữ liệu quan hệ, lấy ra những cột cụ thể, lấy ra những hàng cụ thể, thực hiện các phép toán lôgic trên dữ liệu đã lấy ra và sử dụng các ký tự đại diện trong các điều kiện tìm kiếm. Hướng dẫn này là Phần 2 của loạt bài hướng dẫn SQL & XQuery cho loạt bài IBM DB2 .

Jessica Cao, Chuyên viên phát triển các công cụ đào tạo, IBM

Jessica Cao là một sinh viên ngành Nghệ thuật - Khoa học và ngành Khoa học máy tính tại Trường đại học McMaster. Chị sẽ tốt nghiệp văn bằng kép hạng danh dự vào tháng Tư 2009. Jessica đang làm việc trong chương trình hỗ trợ và lập kế hoạch kênh kỹ năng quản lý thông tin DB2 của phòng thí nghiệm IBM Toronto, nhằm chuyên chú sâu hơn vào lập trình, biên tập và kỹ năng viết



Pat Moffatt, Giám đốc Chương trình quản lý thông tin, Sáng kiến học đường, IBM

Pat Moffatt là giám đốc Chương trình quản lý thông tin thuộc Sáng kiến học đường IBM. Thông qua chương trình sáng kiến học đường này, bà muốn làm ra sẵn những nguồn tài nguyên thích hợp phục vụ giảng dạy về quản lý thông tin để giúp các giảng viên đại học tích hợp chủ đề phần mềm quản lý thông tin vào trong chương trình đào tạo của họ



Bruce Creighton, Chuyên viên lập kế hoạch các phần kỹ năng, IBM

Bruce Creighton là chuyên viên lập kế hoạch các phần kỹ năng trong khoa Phát triển và Lập kế hoạch đào tạo Quản lý thông tin. Với vai trò này, ông lập kế hoạch đầu tư về nội dung đào tạo và cân bằng đầu tư giữa các lĩnh vực mà IBM có thu lợi nhuận với các lĩnh vực mà tại đó yêu cầu về phát triển các kỹ năng là quan trọng, cần cung cấp đào tạo miễn phí



20 05 2009

Trước khi bạn bắt đầu

Về loạt bài này

Loạt bài hướng dẫn này dạy các chủ đề SQL từ cơ bản đến nâng cao và các chủ đề XQuery cơ bản. Nó cũng chỉ ra cách diễn đạt các câu hỏi nghiệp vụ thường gặp bằng các truy vấn cơ sở dữ liệu sử dụng các câu truy vấn SQL hay các câu truy vấn XQuery. Những người phát triển ứng dụng và những người quản trị cơ sở dữ liệu có thể sử dụng hướng dẫn này để nâng cao các kỹ năng truy vấn cơ sở dữ liệu của mình. Các thành viên tham gia sáng kiến học đường IBM có thể sử dụng loạt hướng dẫn này như một phần trong chương trình giảng dạy cơ sở dữ liệu của họ.

Tất cả các ví dụ trong bài này là dựa trên Aroma, một cơ sở dữ liệu mẫu chứa các dữ liệu doanh thu về các sản phẩm cà phê và chè đã bán trong các cửa hàng trên khắp nước Mỹ. Mỗi ví dụ gồm có ba phần:

  • Một câu hỏi kinh doanh dưới dạng ngôn ngữ thường ngày
  • Một hoặc nhiều Ví dụ truy vấn, được biểu diễn bằng SQL hay Xquery
  • Một bảng các kết quả trả về từ cơ sở dữ liệu

Hướng dẫn này được thiết kế để cho phép các học viên học tập ngôn ngữ SQL và XQuery. Cũng như học bất cứ cái gì khác, việc bổ sung thêm các bài tập thực hành là rất quan trọng. Dữ liệu và các định nghĩa bảng sẽ tạo điều kiện thuận lợi cho các bài tập thực hành này.

Đối với các sinh viên sử dụng tài liệu này như một phần của khoá học, hãy nhận từ thầy hướng dẫn của mình các chỉ dẫn để kết nối tới cơ sở dữ liệu Aroma và tìm hiểu mọi sự khác biệt giữa hướng dẫn và cài đặt tại máy cục bộ của mình.

Hướng dẫn này được viết cho DB2 9 Express-C trên nền UNIX®, Linux® và Windows® (trước đây gọi là Viper).

Về hướng dẫn này

Sử dụng một loạt các ví dụ đơn giản, hướng dẫn này minh họa cách lấy ra dữ liệu từ một cơ sở dữ liệu DB2 IBM bằng các lệnh SELECT của SQL tiêu chuẩn.

Hướng dẫn này mô tả cách để:

  • Lấy ra các hàng từ một bảng cơ sở dữ liệu quan hệ
  • Lấy ra các cột cụ thể từ một bảng cơ sở dữ liệu quan hệ
  • Lấy ra các hàng cụ thể từ một bảng cơ sở dữ liệu quan hệ
  • Thực hiện các phép toán lôgic trên dữ liệu được lấy ra
  • Sử dụng các ký tự đại diện trong các điều kiện tìm kiếm

Kết nối tới một cơ sở dữ liệu

Bạn cần kết nối tới một cơ sở dữ liệu trước khi có thể sử dụng các câu lệnh SQL để truy vấnhay xử lý dữ liệu. Lệnh CONNECT kết hợp một kết nối cơ sở dữ liệu với một tên người sử dụng.

Thông qua người hướng dẫn tìm ra tên cơ sở dữ liệu bạn cần nối tới. Đối với loạt bài này, tên cơ sở dữ liệu là aromadb.

Để kết nối tới cơ sở dữ liệu aromadb, gõ lệnh sau đây vào trong bộ xử lý dòng lệnh DB2:

				CONNECT TO aromadb USER userid USING password

Thay thế "userid" và "password" bằng số ID và mật khẩu của người sử dụng mà bạn đã nhận được từ thầy hướng dẫn. Nếu máy không hỏi userid và password thì chỉ cần gõ vào lệnh sau đây:

				CONNECT TO aromadb

Thông điệp sau báo cho bạn biết rằng đã tạo kết nối thành công:

		Database Connection Information
		Database server     = DB2/NT 9.0.0
		SQL authorization ID = USERID
		Local database alias = AROMADB

Khi đã kết nối được, bạn có thể bắt đầu sử dụng cơ sở dữ liệu.


Sáu mệnh đề của lệnh SELECT

Có sáu mệnh đề có thể được sử dụng trong một câu lệnh SQL. Sáu mệnh đề này là SELECT, FROM, WHERE, GROUP BY, HAVING, và ORDER BY. Phải viết mã lệnh các mệnh đề trên theo một tuần tự cụ thể. Ở đây ta sẽ chỉ nói tóm tắt về từng mệnh đề. Bạn sẽ học về chúng kỹ hơn mỗi khi bắt gặp chúng sau này.

1. SELECT>(các) tên cột *
2. FROMbảng hoặc các khung cảnh
3. WHEREcác điều kiện hoặc thuộc tính được đáp ứng
4. GROUP BYcác tập con các hàng
5. HAVINGmột điều kiện chung như một nhóm
6. ORDER BYmột phương pháp xếp loại

Chú ý: (Các) tên cột đúng hơn nên được gọi là các phần tử, bởi vì lệnh SELECT hiển thị cả các cột có trong bảng lẫn các cột có thể do SQL tạo ra như một kết quả thực hiện truy vấn.

Ví dụ truy vấn

		SELECT perkey, sum(dollars)
		FROM aroma.sales
		WHERE perkey < 50
		GROUP BY perkey
		HAVING sum(dollars) > 8000
		ORDER BY perkey;

Về truy vấn

Mệnh đề SELECT là nơi liệt kê các cột mà bạn quan tâm. SELECT hiển thị những gì bạn đưa vào đây. Có thể đặt vào mệnh đề SELECT một số các mục khác sẽ được giải thích sau. Trong ví dụ này, cột perkey và tổng của cột dollar được chọn.

Mệnh đề FROM chỉ rõ bảng nơi bạn lấy thông tin từ đó. Có thể liệt kê nhiều hơn một bảng. Số lượng các bảng mà bạn có thể liệt kê tùy thuộc riêng từng hệ điều hành. Trong ví dụ này, cả hai cột được chọn ra từ bảng Sales.

Hai mệnh đề SELECT và FROM là bắt buộc phải có; các mệnh đề còn lại là tuỳ chọn và dùng để lọc hay hạn chế, gộp nhóm hay kết hợp các mục dữ liệu và điều khiển việc sắp xếp kết quả.

Mệnh đề WHERE là nơi chỉ rõ một điều kiện để lọc dữ liệu. Nó giúp bạn lọc dữ liệu không mong muốn ra khỏi kết quả cuối cùng. WHERE đưa ra một tập con các hàng trong bảng. Trong ví dụ này, chỉ các hàng có giá trị perkey thấp hơn 50 được chọn .

GROUP BY cho phép nhóm dữ liệu để đạt được các kết quả có ý nghĩa hơn. Thay vì nhận được một số là tổng doanh thu tính bằng đôla của tất cả các hàng được chọn, bạn có thể phân chia thành từng nhóm theo perkey tđể nhận được các tổng doanh thu từng ngày. Trong ví dụ trên, việc này được thực hiện bằng chỉ thị GROUP BY perkey.

HAVING đặt một điều kiện đối với các nhóm. Trong ví dụ này, truy vấn sẽ chỉ trả về những ngày có tổng doanh thu lớn hơn 8.000.

ORDER BY sắp xếp thứ tự các hàng kết quả. Bạn có thể chọn sắp xếp các hàng kết quả bằng chỉ thị ASC (sắp theo thứ tự tăng dần) hay DESC (sắp theo thứ tự giảm dần). Giá trị mặc định là ASC.

Lệnh SELECT là lệnh thường được dùng nhất của ngôn ngữ xử lý dữ liệu (DML). Các lệnh xử lý dữ liệu khác (UPDATE, INSERT, và DELETE) và hai thành phần nữa của SQL (ngôn ngữ định nghĩa dữ liệu và ngôn ngữ điều khiển dữ liệu) sẽ được bàn đến trong phần 6 của loạt bài này.


Sử dụng lệnh SELECT để lấy ra dữ liệu

Câu hỏi

Những vùng nào, những hạt nào, những thị trường nào được định nghĩa trong cơ sở dữ liệu Aroma?

Giải đáp

Bước đầu tiên là xác định bảng có chứa các hàng và các cột có thể trả lời câu hỏi này. Trong phần 1, có một sơ đồ của các bảng trong AROMADB. Nhìn vào phần dưới, bên trái của sơ đồ, có một bảng gọi là Market. Bảng này có chứa các cột mktkey, hq_city, hq_state, district và region. Việc liệt kê nội dung của bảng này sẽ trả lời câu hỏi của chúng ta và có thể được thực hiện bằng lệnh SELECT của SQL.

Ví dụ truy vấn

		SELECT * FROM aroma.market;
Kết quả
MktkeyHq_cityHq_stateDistrictRegion
1AtlantaGAAtlantaSouth
2MiamiFLAtlantaSouth
3New OrleansLANew OrleansSouth
4HoustonTXNew OrleansSouth
5New YorkNYNew YorkNorth
6PhiladelphiaPANew YorkNorth
7BostonMABostonNorth
8HartfordCTBostonNorth
9ChicagoILChicagoCentral
10DetroitMIChicagoCentral
11MinneapolisMNMinneapolisCentral
12MilwaukeeWIMinneapolisCentral
14San JoseCASan FranciscoWest
15San FranciscoCASan FranciscoWest
16OaklandCASan FranciscoWest
17Los AngelesCALos AngelesWest
19PhoenixAZLos AngelesWest

Lấy ra dữ liệu: Lệnh SELECT

Bạn sử dụng lệnh SELECT để lấy ra các cột và các hàng dữ liệu từ các bảng cơ sở dữ liệu; để thực hiện các phép toán số học đối với dữ liệu; để nhóm, để xếp thứ tự hay để đồng thời nhóm và xếp thứ tự dữ liệu. Trong đa số các trường hợp, lệnh SELECT gồm có một biểu thức truy vấn đơn giản bắt đầu bằng từ khóa SELECT và tiếp theo là một hoặc nhiều mệnh đề hay các mệnh đề con.

Lệnh SELECT cơ bản nhất gồm có hai từ khóa, SELECT và FROM:

		SELECT column name(s)
		FROM table name(s)
column name(s)
Các tên cột hoặc biểu thức SQL được phân tách bằng các dấu phẩy. Một dấu sao (*) có thể được dùng để liệt kê tất cả các tên cột xuất hiện trong danh sách (các) tên bảng
table name(s)
Các tên bảng có thể là danh sách các bảng hay là một lệnh SELECT. Các tên bảng được phân tách bằng các dấu phẩy. (Các) bảng được tham chiếu phải chứa (các) tên cột xuất hiện sau từ khóa SELECT. Trong ví dụ này, lệnh FROM tham chiếu đến AROMA.MARKET. Sau này trong phần 3 sẽ thảo luận chi tiết hơn về quy ước đặt tên, Table Names and Schemas (Các tên bảng và lược đồ). Trong trường hợp này, mệnh đề FROM tham chiếu đến tên bảng đầy đủ. Phần đầu tiên là tên lược đồ và phần thứ hai là tên bảng. Các lược đồ rất có ích khi nhóm các bảng tương tự và các đối tượng DB2 khác. Trong cơ sở dữ liệu AROMADB, tất cả các bảng được thiết lập với lược đồ chung là AROMA .

Dạng khác của lệnh SELECT

		SELECT mktkey, hq_city, hq_state, district, region FROM aroma.market

Truy vấn trên sinh ra cùng một kết quả giống như SELECT * FROM aroma.market; tuy nhiên, thay cho việc sử dụng dấu sao (*) để liệt kê tất cả các cột, ở đây các tên cột đều được nêu ra.

arrow Chú ý: SELECT và FROM (và tất cả các từ khác viết bằng chữ hoa) là các từ khóa dành riêng của SQL. Các từ này phải được sử dụng chính xác đúng như đã định nghĩa trong SQL chuẩn. Chúng ta dùng định dạng chữ hoa trong bài này để làm cho các từ khóa dễ thấy hơn; SQL không phân biệt chữ hoa chữ thường, vì vậy các từ khóa có thể viết theo chữ hoa hay chữ thường đều được.

Các lưu ý về cách dùng

Dấu chấm phẩy (;) ở cuối của mỗi ví dụ trong hướng dẫn này không phải là một phần bắt buộc của cú pháp SQL. Theo quy ước, ngôn ngữ SQL bỏ qua các khoảng trống thừa, các dấu tab và các dấu hết dòng. Thế thì, vì dấu chấm phẩy là một dấu kết thúc câu lệnh, do đó không cần phải có nếu bạn chỉ thực hiện một lệnh đơn. Trong trường hợp bạn tạo ra một loạt các câu lệnh SQL thành kịch bản, dấu chấm phẩy sẽ là dấu kết thúc rõ ràng cho mỗi lệnh. Tuỳ thuộc vào công cụ SQL tương tác mà bạn sử dụng để nhập vào các truy vấn, có thể cần hay không cần một dấu kết thúc lệnh như thế. Khi sử dụng Bộ xử lý dòng lệnh để thực hiện nhiều lệnh SQL, dấu chấm phẩy là bắt buộc phải có để báo hiệu kết thúc của từng lệnh.


Sử dụng danh sách SELECT để lấy ra các cột cụ thể

Câu hỏi

Những hạt nào và những vùng nào được định nghĩa trong cơ sở dữ liệu Aroma?

Ví dụ truy vấn

		SELECT district, region
		FROM aroma.market;

Kết quả

DistrictRegion
AtlantaSouth
AtlantaSouth
New OrleansSouth
New OrleansSouth
New YorkNorth
New YorkNorth
BostonNorth
BostonNorth
ChicagoCentral
ChicagoCentral
MinneapolisCentral
MinneapolisCentral
San FranciscoWest
San FranciscoWest
San FranciscoWest
Los AngelesWest
Los AngelesWest

Lấy ra các cột cụ thể

Bằng cách đặt tên cho các cột trong danh sách SELECT của lệnh SELECT, bạn có thể lấy ra một nhóm cột cụ thể từ bất kỳ bảng nào. Các cột được trả về theo thứ tự mà bạn liệt kê trong danh sách SELECT.

Về truy vấn

Ví dụ truy vấn yêu cầu một danh sách các hạt và các vùng tương ứng của chúng lấy từ bảng Market .

Các lưu ý về cách dùng

Mặc dù các tên cột trong danh sách SELECT phải được định nghĩa trong các bảng được tham chiếu trong mệnh đề FROM, các biểu thức khác cũng có thể xuất hiện trong danh sách SELECT. Một vài ví dụ về các biểu thức như vậy sẽ được thảo luận sau trong loạt bài này.

Khi danh sách SELECT không bao gồm tất cả các cột trong một bảng, một truy vấn có thể trả về các hàng trùng nhau, giống như trong Ví dụ truy vấn trước đây. Bạn có thể loại trừ các hàng trùng nhau bằng cách sử dụng từ khóa DISTINCT. Ví dụ, truy vấn sau đây chỉ trả về các tên hạt và các tên vùng phân biệt trong bảng Market:

		SELECT DISTINCT district, region
		FROM aroma.market;
DistrictRegion
ChicagoCentral
MinneapolisCentral
BostonNorth
New YorkNorth
AtlantaSouth
New OrleansSouth
Los AngelesWest
San FranciscoWest

Sử dụng mệnh đề WHERE để lấy ra các hàng cụ thể

Câu hỏi

Các sản phẩm nào được bán mà không cần đóng gói?

Ví dụ truy vấn

		SELECT prod_name, pkg_type
		FROM aroma.product
		WHERE pkg_type = 'No pkg';

Kết quả

Prod_NamePkg_Type
VeracruzanoNo pkg
Xalapa LapaNo pkg
ColombianoNo pkg
Expresso XONo pkg
La AntiguaNo pkg
Lotta LatteNo pkg
Cafe Au LaitNo pkg
NA LiteNo pkg
Aroma RomaNo pkg
Demitasse MsNo pkg
Darjeeling Number 1No pkg
Darjeeling SpecialNo pkg
Assam Grade ANo pkg
Assam Gold BlendNo pkg
Earl GreyNo pkg
English BreakfastNo pkg
Irish BreakfastNo pkg
Special TipsNo pkg
Gold TipsNo pkg
Breakfast BlendNo pkg
Ruby's AllspiceNo pkg
Coffee MugNo pkg
Travel MugNo pkg
Aroma t-shirtNo pkg
Aroma baseball capNo pkg

Lấy ra các hàng cụ thể: Mệnh đề WHERE

Bằng cách thêm vào một tập hợp các điều kiện lôgíc trong truy vấn, bạn có thể lấy ra một nhóm các hàng cụ thể từ một bảng. Các điều kiện lôgíc được khai báo trong mệnh đề WHERE. Nếu một hàng thỏa mãn các điều kiện này, truy vấn sẽ trả về hàng đó; nếu không thỏa mãn, hàng sẽ bị loại bỏ. Các điều kiện lôgíc cũng được gọi là các điều kiện tìm kiếm, các thuộc tính, các ràng buộc, hay các hạn chế.

Mệnh đề WHERE

SELECT column name(s) FROM table name(s) [WHERE search_condition];

search_condition
Điều kiện này sẽ được tính ra là đúng hay là sai.

Các dấu móc vuông ([ ]) nói rằng mệnh đề WHERE là tuỳ chọn.

Về truy vấn

Ví dụ truy vấn lấy ra và hiển thị tên của các sản phẩm không đóng gói sẵn. DB2 9 IBM đánh giá điều kiện sau đây cho mỗi hàng của bảng Product trả về những hàng nào thoả mãn điều kiện:

		pkg_type = 'No pkg'

Các lưu ý về cách dùng

Một chữ là một chuỗi ký tự được bao trong cặp dấu nháy đơn. Vì thế, để thể hiện một dấu nháy đơn nằm trong chữ, phải sử dụng hai dấu nháy đơn (''). Ví dụ:     'Scarlet O''Hara'

Các chữ phải được biểu diễn chính xác như đã được lưu trong cơ sở dữ liệu, là chữ hoa hay chữ thường. Ví dụ, điều kiện sau đây:

		class_type = 'Bulk_beans'

là sai khi cột được tham chiếu chứa chuỗi sau đây:

		'BULK_beans'

Các hàm tập hợp không được phép dùng trong mệnh đề WHERE. Để biết chi tiết hơn về các hàm tập hợp, tham khảo Phần 3, Using the ORDER BY clause (Cách dùng mệnh đề ORDER BY).


Sử dụng các từ nối AND, NOT, và OR để tạo ra các điều kiện phức hợp

Câu hỏi

Những thành phố nào và những hạt nào nằm trong các vùng phía Nam hoặc phía Tây?

Ví dụ truy vấn

               SELECT hq_city, district, region
               FROM aroma.market
               WHERE region = 'South' OR region = 'West';

Kết quả

Hq_cityDistrictRegion
AtlantaAtlantaSouth
MiamiAtlantaSouth
New OrleansNew OrleansSouth
HoustonNew OrleansSouth
San JoseSan FranciscoWest
San FranciscoSan FranciscoWest
OaklandSan FranciscoWest
Los AngelesLos AngelesWest
PhoenixLos AngelesWest

Xác lập các điều kiện hỗn hợp: AND, OR, NOT và các dấu ngoặc

Để lựa chọn các hàng một cách tinh tế hơn, có thể nối các điều kiện tìm kiếm với nhau và quy định một trình tự đánh giá chúng (bằng các cặp dấu ngoặc thích hợp). Một điều kiện tìm kiếm xác lập một điều kiện là “đúng", "sai", hay "không rõ" đối với một hàng đã cho. Ta tính ra kết quả của một điều kiện tìm kiếm phức hợp bằng cách áp dụng các toán tử lôgic (AND, OR, NOT) đã định lên các kết quả của các thuộc tính đã xác lập. Nếu các toán tử lôgic không có mặt, kết quả của điều kiện tìm kiếm là kết quả của thuộc tính đã xác lập. AND và OR được định nghĩa trong bảng sau đây, với P và Q là các thuộc tính bất kỳ:

Các bảng chân lý cho AND và OR

PQP AND QP OR Q
TrueTrueTrueTrue
TrueFalseFalseTrue
TrueUnknownUnknownTrue
FalseTrueFalseTrue
FalseFalseFalseFalse
FalseUnknownFalseUnknown
UnknownTrueUnknownTrue
UnknownFalseFalseUnknown
UnknownUnknownUnknownUnknown

Phủ định (đúng) là sai, Phủ định (sai) là đúng và Phủ định (không rõ) vẫn là không rõ.

Các điều kiện tìm kiếm bên trong cặp dấu ngoặc đơn được đánh giá đầu tiên. Nếu trình tự đánh giá không được xác lập bằng các dấu ngoặc thì NOT được áp dụng trước AND, AND được áp dụng trước OR. Nếu các phép toán lôgic có cùng mức ưu tiên thì trình tự đánh giá là không xác định. Điều này cho phép tối ưu hóa các điều kiện tìm kiếm.


Sử dụng AND, OR và các dấu ngoặc trong một mệnh đề WHERE

Câu hỏi

Những cửa hàng lớn hay nhỏ nào của công ty Cà phê và Chè Aroma được đặt tại Los Angeles hoặc San Jose?

Ví dụ truy vấn

Nhấp vào để xem mã nguồn

		SELECT store_type, store_name, city
		FROM aroma.store
		WHERE (store_type = 'Large' OR store_type = 'Small')AND (city = 'Los Angeles' OR city = 'San Jose');

Kết quả

Store_TypeStore_NameCity
LargeSan Jose Roasting CompanySan Jose
LargeBeaches BrewLos Angeles
SmallInstant CoffeeSan Jose

Xác lập các điều kiện tìm kiếm phức tạp

Các điều kiện tìm kiếm, đặc biệt là các điều kiện được lập ra để phân tích hỗ trợ ra quyết định, có thể trở nên phức tạp. Tuy được xây dựng từ các điều kiện đơn giản và sử dụng các từ nối AND, OR và NOT, các điều kiện phức tạp có thể thành khó hiểu. May thay, SQL là tự do về định dạng, vì thế cấu trúc lôgíc của các điều kiện này có thể được làm rõ ra bằng cách sử dụng các ký tự tab, các khoảng trống và các ký tự xuống dòng để định nghĩa quan hệ lôgíc.

Về truy vấn

Ví dụ truy vấn lấy ra và hiển thị tên các cửa hàng của Công ty Cà phê và Chè Aroma cả lớn và nhỏ đặt tại Los Angeles hay San Jose.

Dấu ngoặc trong truy vấn này là thiết yếu vì từ nối AND có mức ưu tiên cao hơn hơn so với từ nối OR. Nếu loại bỏ dấu ngoặc, truy vấn trả về một bảng kết quả khác.

Ví dụ truy vấn (không có dấu ngoặc đơn)

Nhấp vào để xem mã nguồn

		SELECT store_type, store_name, city
		FROM aroma.store
		WHERE store_type = 'Large' OR store_type = 'Small'AND city = 'Los Angeles' OR city = 'San Jose';

Kết quả

Store_TypeStore_NameCity
LargeSan Jose Roasting CompanySan Jose
LargeBeaches BrewLos Angeles
SmallInstant CoffeeSan Jose
LargeMiami EspressoMiami
LargeOlympic Coffee CompanyAtlanta

Các lưu ý về cách dùng

Một truy vấn lấy ra và hiển thị bất kỳ dữ liệu nào mà không rõ ràng bị loại bỏ bởi điều kiện tìm kiếm của nó. Một truy vấn chỉ có vài điều kiện chung chung có thể trả về một số lượng khổng lồ các hàng.

Bất cứ khi nào mà bạn còn hồ nghi về cách thức máy chủ đánh giá một điều kiện hỗn hợp, hãy dùng các dấu ngoặc để nhóm các điều kiện một cách rõ ràng nhằm áp đặt một trình tự đánh giá mong muốn.


Sử dụng các toán tử lớn hơn (>) và nhỏ hơn hoặc bằng nhau (<=) operators

Câu hỏi

Những thành phố và những hạt nào có mã định danh Mktkey lớn hơn 4 và nhỏ hơn hay bằng 12?

Ví dụ truy vấn

		SELECT mktkey, hq_city, hq_state, district
		FROM aroma.market
		WHERE mktkey > 4
			AND mktkey <= 12;

Kết quả

MktkeyHq_CityHq_StateDistrict
5New YorkNYNew York
6PhiladelphiaPANew York
7BostonMABoston
8HartfordCTBoston
9ChicagoILChicago
10DetroitMIChicago
11MinneapolisMNMinneapolis
12MilwaukeeWIMinneapolis

Sử dụng các toán tử so sánh

Các điều kiện đánh giá đúng hay sai và có thể được biểu diễn bằng các toán tử so sánh hay các thuộc tính so sánh. SQL gồm có các toán tử so sánh sau đây:

Toán tửTên
=Bằng
<Nhỏ hơn
>Lớn hơn
<>Không bằng
>=Lớn hơn hoặc bằng
<=Nhỏ hơn hoặc bằng

Về truy vấn

Ví dụ truy vấn lấy ra và hiển thị tất cả các thành phố và các hạt có Mktkey tương ứng lớn hơn 4 nhưng nhỏ hơn hoặc bằng 12.

Cột Mktkey chứa các giá trị số nguyên có thể so sánh được với các giá trị số khác. Tuy nhiên, nếu bạn so sánh một số nguyên với một ký tự thì máy chủ sẽ gửi về một thông báo lỗi:

Nhấp vào để xem mã nguồn

        SELECT mktkey, hq_city, hq_state, district
        FROM aroma.market
        WHERE mktkey > '4';
        
        [IBM][CLI Driver][DB2/LINUX] SQL0401N  Kiểu dữ liệu của các toán hạng trong phép toán  ">" là không tương thích.  SQLSTATE=42818

Bạn có thể nhận được trợ giúp trong diễn giải các thông báo lỗi và xác định hành động sửa lỗi cần thực hiện bằng cách sử dụng Trung tâm thông tin DB2. Trung tâm này được giới thiệu trong phần 1 của loạt bài này.

Các lưu ý về cách dùng

Các biểu thức điều kiện phải so sánh các giá trị của các kiểu dữ liệu có thể so sánh được. Nếu bạn cố so sánh các loại dữ liệu không giống nhau, máy chủ sẽ trả về hoặc một thông báo lỗi hoặc một kết quả sai. Có thể dùng các toán tử so sánh để so sánh một chuỗi ký tự với chuỗi khác như minh họa trong biểu thức điều kiện hợp lệ sau đây:

(city > 'L')

Để có thêm nhiều thông tin hơn về các kiểu dữ liệu có thể so sánh được, hãy tham khảo SQL Reference Guide.


Sử dụng thuộc tính so sánh IN

Câu hỏi

Các thành phố nào nằm trong các hạt Chicago, New York, và New Orleans?

Ví dụ truy vấn

		SELECT hq_city, hq_state, district
		FROM aroma.market
		WHERE district IN('Chicago', 'New York', 'New Orleans');

Kết quả

Hq_CityHq_StateDistrict
New OrleansLANew Orleans
HoustonTXNew Orleans
New YorkNYNew York
PhiladelphiaPANew York
ChicagoILChicago
DetroitMIChicago

Sử dụng các thuộc tính so sánh

Một điều kiện đơn giản có thể được biểu diễn bằng các thuộc tính so sánh SQL sau đây:

Thuộc tính
BETWEEN expression1 AND expression2
LIKE pattern
IN (list)
IS NULL
IS NOT NULL
ALL
SOME or ANY
EXISTS

Các ví dụ về các thuộc tính ALL, SOME hay ANY và EXISTS được trình bày trong phần 5 của loại bài này.

Để biết các mô tả cú pháp và các ví dụ về tất cả các thuộc tính này cũng như các định nghĩa chi tiết về các biểu thức đơn giản và phức tạp, hãy tham khảo SQL Reference Guide.

Về truy vấn

Ví dụ truy vấn liệt kê tất cả các thành phố trong các hạt Chicago, New York và New Orleans. Nó có thể cũng được viết với toán tử so sánh bằng (=) và một tập hợp của các điều kiện OR.

        WHERE district = 'Chicago'
			OR district = 'New York'
			OR district = 'New Orleans'

Các lưu ý về cách dùng

Hãy cố gắng viết các tập hợp lôgíc của các điều kiện một cách đơn giản, dễ hiểu và dễ bảo trì. Luôn làm rõ cấu trúc lôgíc của các điều kiện hỗn hợp bằng các khoảng trống lớn, định nghĩa các khối lôgic bằng cách thụt dòng và áp đặt trình tự ưu tiên trong đánh giá biểu thức bằng các cặp dấu ngoặc.


Sử dụng ký tự đại diện dấu phần trăm (%)

Câu hỏi

Những thành phố nào nằm trong các hạt bắt đầu với các chữ cái Min?

Ví dụ truy vấn

		SELECT district, hq_city
		FROM aroma.market
		WHERE district LIKE 'Min%';

Kết quả

DistrictHq_City
MinneapolisMinneapolis
MinneapolisMilwaukee

Sử dụng các ký tự đại diện

Các truy vấntrước đây đã biểu diễn các điều kiện yêu cầu so khớp các chuỗi ký tự đầy đủ. Với thuộc tính LIKE và hai ký tự đại diện là dấu phần trăm (%) và dấu gạch chân (_), bạn cũng có thể biểu diễn các điều kiện yêu cầu so khớp chỉ với một phần của một chuỗi ký tự (một chuỗi con).

Ký tự đại diện phần trăm (%) khớp với bất kỳ chuỗi ký tự nào. Ví dụ:

  • like 'TOT%' là đúng với bất kỳ chuỗi nào bắt đầu với 'TOT'.
  • like '%ZERO%' là đúng với bất kỳ chuỗi nào có chứa 'ZERO'.
  • like '%FRESH' FRESH' là đúng bất kỳ chuỗi nào kết thúc với 'FRESH' và không chứa các chỗ trống nối đuôi. Các chỗ trống nối đuôi trong dữ liệu ký tự mất ý nghĩa khi các ràng buộc LIKE được áp dụng.

Dấu phần trăm (%) cũng có thể được sử dụng để tìm kiếm một chuỗi ký tự rỗng -- chuỗi có các ký tự không (0).

Ký tự đại diện gạch chân (_) khớp với bất kỳ một ký tự nào ở một vị trí cố định. Ví dụ:

  • like '_EE_' là đúng với bất kỳ chuỗi bốn chữ cái nào có hai ký tự ở giữa chúng là 'EE'.
  • like '%LE_N%' là đúng với bất kỳ chuỗi nào chứa mẫu 'LE_N’. Tất cả các chuỗi 'CLEAN', 'KLEEN', và 'VERY KLEEN' khớp với mẫu này.

Về truy vấn

Ví dụ truy vấn lấy ra các tên của tất cả các hạt bắt đầu với các ký tự ‘Min’ và liệt kê các thành phố trong các lấy ra này. Ký tự đại diện phần trăm (%) cho phép mọi tổ hợp ký tự (bao gồm cả các khoảng trống) xuất hiện sau 'n' trong' Min', nhưng các ký tự phía trước 'n' phải khớp chính xác với mẫu ký tự được lưu giữ.

Các lưu ý về cách dùng

Điều kiện LIKE là đúng khi mẫu của nó khớp với một chuỗi con trong một cột. Nếu mẫu không chứa ký tự đại diện nào thì mẫu phải được so khớp chính xác với mục dữ liệu trong cột.

Ví dụ, điều kiện sau đây chỉ là đúng chỉ khi mục dữ liệu trong cột chứa chuỗi ký tự APRIL và không có gì khác nữa

    month LIKE 'APRIL'

Nói cách khác, điều kiện này tương đương với:

    month = 'APRIL'

Thuộc tính LIKE chỉ có thể được sử dụng trên các cột có chứa các chuỗi ký tự.


Đặt tên cột bằng cách sử dụng mệnh đề AS

Câu hỏi

Những thành phố nào trong các hạt bắt đầu với các chữ cái Min? Hãy đặt tên cho cột hq_city sao cho có ý nghĩa hơn.

Ví dụ truy vấn

		SELECT district, hq_city AS City
		FROM aroma.market
		WHERE district LIKE 'Min%';

Kết quả

DistrictCity
MinneapolisMinneapolis
MinneapolisMilwaukee

Đặt tên cho biểu thức: AS

Mệnh đề tuỳ chọn AS cho phép bạn gán một tên có ý nghĩa cho một biểu thức để làm cho việc tham khảo lại biểu thức dễ dàng hơn. Khi sử dụng mệnh đề AS, có các quy tắc về các tên được phép dùng. Nói chung, các tên hợp lệ phải bắt đầu bằng một chữ cái, không dài hơn 128 ký tự, không có khoảng trống nào và không được là một từ khóa SQL. Từ khóa SQL là các từ SELECT, FROM, WHERE và vân vân. Để biết thêm chi tiết về các từ khóa SQL, hãy tham khảo SQL Reference Guide.

Ví dụ, mệnh đề AS sau gán bí danh hq_citycho cột City:

    hq_city AS City

Bạn có thể gán bí danh mà không sử dụng từ khóa AS, nhưng điều này sẽ làm cho câu truy vấn không rõ ràng khi xem lại nó:

    hq_city City

Bạn sẽ nhận thấy rằng các tiêu đề cột được hiển thị tất cả bằng chữ hoa bất chấp trong biểu thức viết hoa hay viết thường.

Về truy vấn

Ví dụ truy vấn trả về cùng một tập hợp kết quả giống như truy vấn trước đây trong chương này. Tuy nhiên, ở đây các bí danh đã gán cho cột tạo ra các tiêu đề cho các kết quả gộp.

arrow Chú ý: Nếu giá trị chứa trong cột được tham chiếu qua bí danh là kết quả của một hàm tập hợp thì nó không thể xuất hiện trong mệnh đề WHERE; tuy nhiên, nó có thể xuất hiện trong mệnh đề HAVING. Để biết chi tiết hơn về mệnh đề HAVING, xem phần 4 của loạt bài này.


Tóm tắt

Lệnh SELECT

        SELECT column name(s)
		FROM table name(s)
		[WHERE search_condition]
		[GROUP BY group_list]
		[HAVING search_condition]
		[ORDER BY order_list];

Các điều kiện tìm kiếm

( )Các dấu ngoặc (áp đặt trình tự đánh giá)
NOTPhủ định
AND
ORHoặc

Các toán tử so sánh

=Bằng
<Nhỏ hơn
>Lớn hơn
<>Không bằng
>=Lớn hơn hoặc bằng
<=Nhỏ hơn hoặc bằng

Các thuộc tính so sánh

BETWEENGiữa biểu thức 1 và biểu thức 2
LIKE Mẫu
IN(danh sách)
ISNULL
ISNOT NULL

Hướng dẫn này thảo luận cách diễn đạt nhiều câu hỏi nghiệp vụ thường gặp thành các lệnh SELECT và cách lấy ra, nhóm và sắp xếp thứ tự các dữ liệu đã chọn ra từ các bảng quan hệ.

Hầu hết các câu hỏi được thảo luận trong hướng dẫn này được biểu diễn dễ dàng như các lệnh SELECT tiêu chuẩn và không phải là khó khăn gì cho cả người sử dụng lẫn SQL. Các hướng dẫn còn lại của loạt bài này đề cập đến các câu hỏi khó hơn, các câu hỏi yêu cầu xử lý tuần tự, so sánh các giá trị gộp, xác lập các kết nối phức tạp hơn hay các lệnh SELECT dài.

Trước khi chuyển sang phần tiếp theo, bạn cần phải truy nhập vào Trung tâm thông tin DB2 và đọc đầy đủ tài liệu trực tuyến về lệnh SELECT. Điều này sẽ giúp bạn trở nên quen thuộc với định dạng của tài liệu trợ giúp và ôn lại nhưng thứ bạn vừa mới học.


Tải về

Mô tảTênKích thước
Cơ sở dữ liệu AromaAroma_Data.zip1MB

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

  • Hãy tải xuống DB2 Express-C, một phiên bản DB2 Express miễn phí dành cho cộng đồng nhưng vẫn có đủ các đặc tính dữ liệu cốt lõi giống như phiên bản DB2 Express và cung cấp một cơ sở vững chắc để xây dựng và triển khai các ứng dụng .

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Information Management, SOA và dịch vụ Web
ArticleID=972934
ArticleTitle=Hướng dẫn SQL & XQuery cho IBM DB2, Phần 2: Các truy vấn cơ sở
publish-date=05202009