12/08/2018, 13:37

SQL dành cho tester (Phần II)

Tổng quan và Cơ bản: SQL dành cho tester (Phần I) Một CSDL được thiết kế tốt là một CSDL trong đó mỗi bảng chỉ trình bày các dữ liệu về một thực thể duy nhất, và các thông tin chi tiết có thể được lấy trong một CSDL quan hệ, bằng cách dùng các bảng ngoài, và bằng cách dùng câu lệnh JOIN. Nói ...

Tổng quan và Cơ bản: SQL dành cho tester (Phần I)

Một CSDL được thiết kế tốt là một CSDL trong đó mỗi bảng chỉ trình bày các dữ liệu về một thực thể duy nhất, và các thông tin chi tiết có thể được lấy trong một CSDL quan hệ, bằng cách dùng các bảng ngoài, và bằng cách dùng câu lệnh JOIN. Nói cách khác, JOIN chính là phương tiện dùng để kết hợp các trường từ hai hoặc nhiều bảng bằng việc sử dụng các giá trị chung của mỗi bảng.

Trước khi sử dụng câu lệnh JOIN, chúng ta cần hiểu về khái niệm các khóa (key).

Khóa chính (Primary key):

Đây là khóa chính của bảng, được sử dụng để định danh duy nhất mỗi bản ghi trong bảng trong CSDL. Bên cạnh đó, khóa chính được dùng để thiết lập quan hệ 1-n giữa hai bảng trong CSDL. Giá trị của trường khóa chính phải là duy nhất và không được chứa giá trị NULL.

Mỗi bảng nên chỉ có 1 khóa chính và khóa chính có thể tạo ra từ nhiều trường của bảng.

Khóa ngoại (Foreign key):

Khóa ngoại của một bảng được xem như con trỏ trỏ tới khóa chính của bảng khác trong CSDL. Trong đó, bất kỳ dữ liệu nào ở cột khóa ngoại đều phải có dữ liệu tương ứng ở bảng khác mà cột đó là khóa chính.

Thực hiện JOIN:

Mục đích sử dụng các khóa này chính là để dữ liệu có thể liên hệ với nhau thông qua các bảng mà không cần lặp lại dữ liệu ở tất cả các bảng. Việc nối 2 bảng đó với nhau để có có thông tin đầy đủ được gọi là JOIN.

Có 4 kiểu JOIN mà tester thường hay dùng:

3.1 INNER JOIN (JOIN)

Trả về kết quả các bản ghi mà có các trường được join đều khớp ở các bảng được join, các bản ghi chỉ xuất hiện ở một trong các bảng sẽ bị loại.

Cú pháp:

SELECT ColumnName(s) FROM TableName1 INNER JOIN TableName2 ON TableName1.ColumnName=TableName2.ColumnName;

Hoặc:

SELECT ColumnName(s) FROM TableName1 JOIN TableName2 ON TableName1.ColumnName=TableName2.ColumnName;

Ngữ cảnh: Có 2 bảng thông tin như sau:

  • Bảng “Customers":

CustomersTable.png

  • Bảng “Orders”:

Orders_Table.png

Và bạn muốn xem thông tin về tên khách hàng có order đi kèm của họ. Câu lệnh truy vấn và kết quả trả về như sau:

InnerJoin.png

3.2 LEFT JOIN (LEFT OUTER JOIN)

Được sử dụng khi muốn trả về các bản ghi từ bảng bên trái (TableName1) với các hàng tương ứng trong bảng bên phải (TableName2). Chấp nhận dữ liệu NULL ở bảng TableName2.

Cú pháp:

SELECT ColumnName(s) FROM TableName1 LEFT JOIN TableName2 ON TableName1.ColumnName=TableName2.ColumnName;

Hoặc:

SELECT ColumnName(s) FROM TableName1 LEFT OUTER JOIN TableName2 ON TableName1.ColumnName=TableColumn2.ColumnName;

Ngữ cảnh: Xem tất cả tên khách hàng và các order của họ nếu có. Câu lệnh truy vấn và kết quả trả về như sau:

LeftJoin.png

3.3 RIGHT JOIN (RIGHT OUTER JOIN)

Được dùng khi muốn trả về các bản ghi từ bảng bên phải (TableName2) với các bản ghi tương ứng ở bảng bên trái (TableName1). Chấp nhận dữ liệu NULL ở bảng TableName1.

Cú pháp:

SELECT ColumnName(s) FROM TableName1 RIGHT JOIN TableName2 ON TableName1.ColumnName=TableName2.ColumnName;

Hoặc:

SELECT ColumnName(s) FROM TableName1 RIGHT OUTER JOIN TableName2 ON TableName1.ColumnName=TableName2.ColumnName;

Ngữ cảnh: Xem tất cả khách hàng và các Order có thể có của khách hàng. Câu lệnh truy vấn và kết quả trả về như sau:

RightJoin.png

3.4 FULL JOIN (FULL OUTER JOIN)

Là sự kết hợp của LEFT JOIN and RIGHT JOIN.

Cú pháp:

SELECT ColumnName(s) FROM TableName1 FULL [OUTER] JOIN TableName2 ON TableName1.ColumnName = TableName2.ColumnName;

Ngữ cảnh: Xem tất cả những khách hàng và các order có thể có. Câu lệnh truy vấn và kết quả trả về như sau:

FullJoin.png

DISTINCT được sử dụng kết hợp với câu lệnh SELECT để loại tất cả các bản sao của bản ghi và chỉ lấy các bản ghi duy nhất.

Cú pháp:

SELECT DISTINCT ColumnName(s);

Ngữ cảnh: Có một bảng chứa thông tin về khách hàng đến từ nhiều thành phố khác nhau trên thế giới, trong đó có những khách hàng đến từ các thành phố giống nhau. Bạn muốn xem danh sách các thành phố của khách hàng mà không lặp lại. Câu lệnh truy vấn và kết quả trả về như sau:

Distinct.png

ALIAS được dùng để đặt tên tạm thời một bảng hay cột trong CSDL. Thông thường ALIAS sẽ được tạo ra khi bạn muốn các tên cột trả về dễ đọc và dễ hiểu.

5.1 ALIAS cho cột

Cú pháp:

` SELECT ColumnName AS AliasName FROM TableName;

Ngữ cảnh: Nối các cột Address, City, PostalCode và Country với nhau và tạo ra một định danh tên là “FullAddress” của các khách hàng. Câu lệnh truy vấn và kết quả trả về như sau:

Alias.png

5.2 ALIAS cho bảng

Cú pháp:

SELECT AliasName1.ColumnName1, AliasName1.ColumnName2, AliasName2.ColumnName3 FROM TableName1 AS AliasName1, TableName2 AS AliasName2 Where AliasName1.ColumnName1 = [Value] AND AliasName1.ColumnName2 = AliasName2.ColumnName3;

Ngữ cảnh: Xem tất cả các order từ khách hàng có CustomerName = "Around the Horn" và CustomerID = "4". Ở đây, chúng ta sẽ cần dùng hai bảng “Customers” và “Orders”, và để câu SQL ngắn gọn hơn, ta sẽ dùng các định danh “c" và “o" cho hai bảng này.

Câu lệnh truy vấn và kết quả trả về như sau:

AliasTable.png

Trong SQL, subquery là một truy vấn trong một truy vấn. Các subquery hay được tìm thấy trong mệnh đề WHERE. Những truy vấn con còn được gọi là truy vấn con lồng nhau.

Cú pháp:

SELECT ColumnName(s) FROM TableName1 WHERE ColumnName1 IN (SELECT ColumnName1 FROM TableName2 WHERE ColumnName2 = [VALUE];

Ngữ cảnh: Xem thông tin khách hàng, gồm Tên và ID từ bảng Customers mà có ShipperId = “2” từ bảng Orders. Câu lệnh truy vấn và kết quả trả về như sau:

Subquery_Where.png

Ngoài ra, Subquery còn được bắt gặp trong mệnh đề FROM và SELECT.

(To be continued .....)

Trên đây là những câu lệnh khá phức tạp mà trong thực tế tester hay dùng khi kiểm thử CSDL. Phần III tiếp theo sẽ đề cập đến các hàm hữu ích trong SQL mà tester thường hay sử dụng trong kiểm thử CSDL.

Nguồn dữ liệu sử dụng làm ví dụ trong bài viết: http://www.w3schools.com/sql/

0