Câu lệnh SELECT




Câu lệnh SELECT được dùng để truy xuất dữ liệu từ một bảng. Kết quả trả về dưới dạng bảng được lưu trong 1 bảng, gọi là bảng kết quả - result table (còn được gọi là tập kết quả - result set).

Cú pháp

Cú pháp của câu lệnh SELECT như sau:

SELECT tên_các_cột
FROM tên_bảng

Ví dụ, để truy xuất các cột mang tên LastName và FirstName từ một bảng có tên là Persons, ta dùng một câu lệnh SELECT như sau:

SELECT LastName, FirstName FROM Persons

Ta có thể dùng dấu * để thay thế cho tất cả các cột:
SELECT * FROM Persons
Kết quả trả về từ một câu truy vấn SQL được lưu trong 1 tập kết quả (result set). Tập kết quả này sau đó sẽ được lập trình viên tìm cách đưa ra dưới dạng một bảng hoặc một hình thức nào đó. Xin xem chi tiết ở phần lập trình với php
Mệnh đề WHERE



Mệnh đề WHERE được dùng để thiết lập điều kiện truy xuất.
Để truy xuất dữ liệu trong bảng theo các điều kiện nào đó, một mệnh đề WHERE có thể được thêm vào câu lệnh SELECT.

Cú pháp mệnh đề WHERE trong câu lệnh SELECT như sau:

SELECT tên_cột FROM tên_bảng
WHERE tên_cột phép_toán giá_trị

Trong mệnh đề WHERE, các phép toán được sử dụng là

Phép toán Mô tả
= So sánh bằng
<> So sánh không bằng
> Lớn hơn
< Nhỏ hơn
>= Lớn hơn hoặc bằng
<= Nhỏ hơn hoặc bằng
BETWEEN Nằm giữa một khoảng
LIKE So sánh mẫu chuỗi

Lưu ý: Trong một số phiên bản của SQL, phép toán <> có thể được viết dưới dạng !=

Ví dụ để lấy danh sách những người sống ở thành phố Sandnes, ta sử dụng mệnh đề WHERE trong câu lệnh SELECT như sau:

SELECT * FROM Persons
WHERE City = 'Sandnes'
Tóan tử AND và OR


Hai toán tử AND và OR nối hai hoặc nhiều điều kiện trong mệnh đề WHERE lại với nhau.
Toán tử AND sẽ hiển thị 1 dòng nếu TẤT CẢ các điều kiện đều thoả mãn. Toán tử OR hiển thị một dòng nếu BẤT KỲ điều kiện nào được thoả.

Ví dụ: Sử dụng AND để tìm những người có tên là Tove và họ là Svendson:

SELECT * FROM Persons
WHERE FirstName = 'Tove'
AND LastName = 'Svendson'

Ví dụ: Sử dụng OR để tìm những người có tên là Tove hoặc họ là Svendson:

SELECT * FROM Persons
WHERE firstname = 'Tove'
OR lastname = 'Svendson'

Ví dụ: Sử dụng kết hợp AND và OR cùng với dấu ngoặc đơn để tạo nên các câu truy vấn phức tạp:

SELECT * FROM Persons WHERE
(FirstName = 'Tove' OR FirstName = 'Stephen')
AND LastName = 'Svendson'
Từ khoá DISTINCT




Từ khoá DISTINCT được dùng để lọc ra các giá trị khác nhau.

Câu lệnh SELECT sẽ trả về thông tin về các cột trong bảng. Nhưng nếu chúng ta không muốn lấy về các giá trị trùng nhau thì sau?

Với SQL, ta chỉ cần thêm từ khoá DISTINCT vào câu lệnh SELECT theo cú pháp sau:

SELECT DISTINCT tên_cột FROM tên_bảng

Ví dụ: Tìm tất cả các công ty trong bảng đặt hàng, câu lệnh SQL thông thường sẽ như sau:

SELECT Company FROM Orders

Để tìm tất cả các công ty khác nhau trong bảng đặt hàng, ta sử dụng câu lệnh SQL sau:

SELECT DISTINCT Company FROM Orders
Mệnh đề ORDER BY:


Mệnh đề ORDER BY được dùng để sắp xếp các dòng.
Cú pháp: Select..... ORDER BY tên các cột [ASC/DESC]
ORER BY có thể đi kèm từ khóa DESC để sắp xếp theo chiều giảm dần, hoặc ASC để sắp xếp theo chiều tăng dần của các cột

VD: Để 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

VD 2: 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

VD 3: 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
Phân trang trong ứng dụng PHP/MySQL
Khi truy vấn dữ liệu mà nhận được một danh sách kết quả quá dài, người ta thường phải phân trang ứng dụng cho phù hợp (ít nhất là về mặt thẩm mỹ).

Nguyên tắc của việc phân trang ứng dụng như sau:

- Bước 1: Tính tóan số lượng bản ghi thỏa mãn điều kiện trả về ( thường sử dụng hàm count trong câu lệnh SQL).
- Bước 2: Xác định số lượng bản ghi sẽ hiển thị trên một trang.
- Bước 3: Dựa trên các thông tin có được từ bước 1 và 2, xác định được số trang cần hiển thị.
- Bước 4: Tính tóan số lượng bản ghi sẽ hiển thị tính từ trang nào đó do NSD lựa chọn (Sử dụng câu lệnh LIMIT).

Dưới đây tôi sẽ cung cấp cho các bạn 2 function,
- Function GetPageLinks ($Sql, $PageSize): Trả về một chuỗi văn bản chứa số trang hiển thị, với dữ liệu vào bao gồm câu lệnh SQL ($Sql) xác định số lượng bản ghi thỏa mãn điều kiện tìm kiếm, và "kích thước" của một trang ($PageSize)




function GetPageLinks($Sql,$PageSize)
{
$result=mysql_query ($Sql);
if (!$result or mysql_num_rows ($result)==0)
{
}
else
{
$line=mysql_fetch_array($result);
$Pages=ceil($line[0]/$PageSize);
if ($Pages>1)
{
$PageLink="Trang ";
for ($i=0;$i<=$Pages-1;$i++)
{
$j=$i+1;
if ($j==$_GET["page"])
{
$PageLink.=" {$j} | ";
}
else
{
$NewGet="";
reset ($_GET);
while (list($key, $val) = each($_GET))
{
if ($key!='page')
{
$NewGet.="&{$key}={$val}";
}

}
$NewGet.="&page={$j}";
$NewGet=substr($NewGet,1);

$PageLink.=" <a href='?{$NewGet}'>{$j}</a> | ";
}
}
$PageLink=substr($PageLink,0,-2);
}
}
return $PageLink;
}
Hàm tiếp theo sẽ hiển thị danh sách các record của một trang nào đó, đồng thời demo cách sử dụng hàm GetPageLinks ở trên:
(VD dưới đây sử dụng một câu truy vấn lấy dữ liệu từ một bảng dulieu với một Category có id xác định:






function LoadList()
{
if (isset($_GET["CatId"]) and is_numeric ($_GET["CatId"]))
$Dieukien="where CatId={$_GET["CatId"]}";

// Cau lenh truy van chinh khi chua phan trang:
$Sql="Select * from dulieu {$Dieukien} ";
// Tinh toan so luong ban ghi tra ve:
$PageSize=20;
$CountSQL="Select count(*) from dulieu {$Dieukien}";
$PageLinks= GetPageLinks ($CountSQL,$PageSize);

if (isset ($_GET["page"]) and is_numeric ($_GET["page"]))
{
$StartNum=$PageSize * ($_GET["page"]-1); // Xac dinh vi tri ban ghi bat dau
}
else
{
$StartNum=0;
}
//Tiep tuc xay dung cau lenh truy van de lay du lieu theo trang
$Sql.= " Limit {$StartNum}, {$PageSize}";
$result=mysql_query ($Sql);
if (!$result or mysql_num_rows ($result)==0)
{
$tmp="Híc, tui chẳng mò được chi cả!";
}
else
{
$tmp="{$PageLinks}";
//========== Hiển thị dữ liệu, các bạn tự viết cho phù hợp với yêu cầu
$tmp.="{$PageLinks}";
}

return $tmp;
}