Archive for the ‘Học MySQL’ category

Lưu nội dung file ảnh vào CSDL MYSQL

March 31st, 2008

Nhu cầu phát triển web của PHP là lưu nội dung của file ảnh vào trong một cơ sở dữ liệu (CSDL) và sau đó là đọc nội dung của file ảnh đã lưu trong CSDL ra và hiển thị ra trình duyệt. Nhu cầu này có một số đặc điểm sau:

TỔNG QUAN
Nhu cầu phát triển web của PHP là lưu nội dung của file ảnh vào trong một cơ sở dữ liệu (CSDL) và sau đó là đọc nội dung của file ảnh đã lưu trong CSDL ra và hiển thị ra trình duyệt. Nhu cầu này có một số đặc điểm sau:
● Lưu nội dung file ảnh vào CSDL thì sẽ không phụ thuộc vào đường dẫn đến thư mục chứa hình. Nếu bạn dùng theo cách hiển thị nội dung hình ảnh theo cách truyền thống thì đường đến file hình thật chính xác thì file hình mới hiển thị ra, chẳng may thư cấu trúc thư mục đó bị thay đổi thì chúng ta phải cập nhật lại rất nhiều đường dẫn trên website, hay file ảnh có thể bị xóa mất hay bạn restore hay backup bị thiếu….Chỉ thiếu một phần nhỏ là file hình không hiển thị được rồi. Để giảm được những rủi ro này bạn dùng cách như thế này là lưu nội dung file ảnh vào CSDL như vậy là không phụ thuộc vào đường dẫn hay cấu trúc thư mục… rất là lôi thôi. Chúng ta chỉ phụ thuộc vào nơi chứa nội dung chủa file hình.
● Lưu nội dung file ảnh vào CSDL thì rất thuận tiện cho việc backup và restore. Trong đó dùng cách truy cập trực tiếp đến hình thì khi backup hay restore thì chúng ta phải backup/restore rất nhiều file nhỏ rất là mệt. Trong khi đó dùng cách lưu nội dung file ảnh vào CSDL thì chúng ta chỉ cần backup/restore lại một file là đủ, thông thường là file SQL.
● Nếu chúng ta dùng cách truy cập trực đến file hình thì khi chúng ta upload hình lên server qua (form upload) thì một số host không cho ta quyền ghi vào thư mục (write) thì chúng ta không đưa hình lên trang web của mình được. Lưu file trong CSDL là một giải pháp khá thích hợp trong hoàn cảnh này.
● Không chỉ lưu giới hạn file ảnh vào CSDL mà chúng ta còn lưu rất nhiều file khác nhau vào CSDL. Để đơn giản chúng ta sẽ tìm hiểu cách lưu file ảnh vào CSDL MySQL và ngôn ngữ thực hiện là PHP.

THIẾT KẾ CSDL
Chúng ta chỉ cần một bảng để lưu nội dung của một fila ảnh và trong bảng này chúng ta sẽ thiết kế như sau:
● Cột nhận dạng (ID) của file ảnh, chúng ta dùng kiểu dữ liệu AUTO_INCREMENT để làm ID cho các file ảnh đã lưu trong CSDL.
● Cột lưu nội dung file ảnh, đây là cột quan trọng quyết định hình ảnh sẽ hiển thị lên trình duyệt. Nội dung của file ảnh cũa là một chuỗi nhưng dữ liệu nhị phân. Vì vậy chúng ta sẽ sử dụng kiểu dữ liệu mediumblob để lưu nội dung của file ảnh (kiểu dữ liệu blob cũng là chuỗi nhị phân, nhưng chiều dài tối đa chỉ có 65Kb, sẽ không đủ cho chúng ta muốn lưu một fila ảnh lớn).
● Và bảng chúng ta sẽ có cấu trúc như sau

CREATE TABLE imgData (
imgID int NOT NULL AUTO_INCREMENT,
imgContents mediumblob NOT NULL,
PRIMARY KEY (imgID)
);

LƯU NỘI DUNG FILE ẢNH VÀO CSDL
Chúng ta xem như đã có trên server. Và đoạn chương trình sau sẽ mở file ảnh thông qua tên file để đọc nội dung của file ảnh và lưu nội dung file ảnh vào trong CSDL.

//connect vào CSDL MySQL
//host = localhost
//username = root
//password = root
$conn = mysql_connect(”localhost”, “root”, “root”);

//chọn database làm việc
mysql_select_db(”imgSave”, $conn);

//tên file ảnh
$imgFilename = “imgData.jpg”;

//mở file ảnh để đọc với chế độ đọc binary
$f = fopen($imgFilename, “rb”);
$imgContents = fread($f, filesize($imgFilename));
fclose($f);

//chèn nội dung file ảnh vào table imgConetnts
$sql = “INSERT INTO imgData (imgContents) VALUES(’” . mysql_real_escape_string($imgContents, $conn) . “‘)”;
mysql_query($sql, $conn);
?>

ĐỌC NỘI DUNG FILE ẢNH TỪ CSDL
Để đọc nội dung của file ảnh từ CSDL, ta cần ID của file ảnh nếu chúng ta muốn hiển thị tấm hình nào. Đoạn mã sau sẽ minh hoạ chi tiết, nhưng ở đây ta chỉ lấy 1 tấm hình có chỉ số ID = 1.

//connect vào CSDL MySQL
//host = localhost
//username = root
//password = root
$conn = mysql_connect(”localhost”, “root”, “root”);

//chọn database làm việc
mysql_select_db(”imgSave”, $conn);

//ID của file ảnh
$imgID = 1;

//đọc nội dung file ảnh từ table tblImage
$sql = “SELECT * FROM imgData WHERE imgID=” . $imgID;
$result = mysql_query($sql, $conn);

while($row = mysql_fetch_array($result)){
$imgData = $row['imgContents'];
}
?>

Biến $imgData sẽ chứa nội dung của file ảnh. Bước tiếp theo, ta xuất nội dung của file ảnh ra browser. Quá trình xuất nội dung của file ảnh ra browser. Nhưng chúng ta phải báo cho Browser biết nội dung của chúng ta xuất ra là hình ảnh, đơn giản là chúng ta chỉ chèn vào một dòng
header(”Content-type: image/jpeg”); là được. Và sau đây là quy trình xuất ra nội dung một file ảnh như sau.
header(”Content-type: image/jpeg”);
echo $imgData;
?>
Như bạn đã thấy rồi đó lưu file ảnh vào CSDL và đọc nội dung của một file ảnh từ CSDL để xuất ra Browser thật là không dễ chút nào. Nhưng chúng ta chỉ cần lưu ý các bước sau đây.
· Đọc nội dung file vào 1 biến, bạn nhớ phải mở file với chế độ đọc binary.
· Xử lý các ký tự đặc biệt trước khi lưu vào database (sử dụng hàm mysql_real_escape_string).
· Trước khi xuất nội dung file ra browser, bạn nhớ dùng hàm header để báo cho browser biết kiểu file mà chương trình của bạn chuẩn bị trả về là một file ảnh.

KẾT LUẬN
Chúng ta có thể dùng cách này để viết một chương trình quản lý download trên website của mình. Tuy nhiên chúng ta cũng cần có một vài điều chú ý như sau:
· Làm như vậy thì server sẽ xử lý nhiều công việc hơn cách download file trực tiếp.
· Tốc độ download sẽ chậm hơn rất nhiều so với download file trực tiếp.
· Nội dung file thì được lưu trữ trong CSDL mà CSDL cho số lượng người kết nối vào có hạn, trong khí đó với 1 file có dung lượng lớn thì chúng ta có thể mất rất nhiều thời gian để download

MỘT THÍ DỤ VỀ CHƯƠNG TRÌNH DOWNLOAD
Giả sử chúng ta có 1 file example.zip nằm trong cùng một thư mục với file download.php. Nhưng chỉ người viết mới biết là file này nằm ở đâu, người truy cập muốn lấy file example.zip về thì phải truy cập vào trang download.php và trang download.php sẽ có nội dung như sau:
//file download.php

$filename = “example.zip”;
$f = fopen($filename, “rb”);

header(”Content-type: application/octet-stream”);
header(”Content-length: ” . filesize($filename));

fpassthru($f);
fclose($f);
?>

Chúng ta chỉ cần bấy nhiêu là hoàn thành một trang download. Nhưng nếu muốn cho trang download chúng ta đẹp hơn, hoàn thiện hơn thì chúng ta phải cải tiến thêm.

Giải thích những câu lệnh trên
Đầu tiên, ta mở file example.zip để đọc ở chế độ nhị phân (binary):
$f = fopen($filename, “rb”);

Tiếp theo ta báo cho browser biết data trả về từ server là dữ liệu nhị phân chứ không phải là văn bản HTML như thông thường:
header(”Content-type: application/octet-stream”);
Đồng thời ta cũng báo cho browser biết dung lượng của file sẽ được tải xuống:
header(”Content-length: ” . filesize($filename));
Và cuối cùng là đọc nội dung file và echo lại cho browser download:

fpassthru($f);.
Lệnh fpassthru($f); tương đương với 2 lệnh:
$content = fread($f, filesize($filename));
echo $content;

Và như thế chúng ta có thể thí dụ chạy trên nhiều kiểu file khác nhau như (word, excel, PDF…) và bạn sẽ thấy có một vài chỗ thật khó chịu vì browser mặc định sẽ lưu file của bạn lên đĩa với tên là download.php bạn phải đổi tên lại cho đúng và trước khi mở file đó ra đọc.
Để giải quyết vấn đề trên ta chỉ cần thêm một lệnh header() nữa là được.
header(’Content-disposition: attachment; filename=”‘.$filename.’”‘);
Tham số “attachment” của header “Content-disposition” sẽ báo cho browser biết là nên download và save file thay vì open. Tham số “filename=” sẽ báo cho browser biết tên của file đang được download.

Tới đây chúng ta có thể nâng cấp trang web của mình lên cho người dùng chọn file để download. Có nghĩa là chúng ta hiển thị ra 1 list các tập tin cho người dùng download và liên kết các file download đều đến file download.php?filename=”Tên file cần download”. Trong file download.php chỉ cần $_GET['filename'] là chúng ta có thể download về được.

Và file download.php sẽ có nội dung như sau:

$filename = isset($_GET['file'])?$_GET['file']:”;
$upload_dir = “../upload/”;

//Mở file với chế độ nhị phân
$fp = fopen($upload_dir.$filename, “rb”);
//gởi header đến cho browser
header(’Content-type: application/octet-stream’);
header(’Content-disposition: attachment; filename=”‘.$filename.’”‘);
header(’Content-length: ‘ . filesize($upload_dir.$filename));
//đọc file và trả dữ liệu về cho browser
fpassthru($fp);
fclose($fp);

Posted by : ducmanh@thegioiwebsite.net

Câu lệnh ALTER

March 22nd, 2008

Thay đổi cấu trúc bảng.
Câu lệnh ALTER TABLE được sử dụng để thêm hoặc xoá cột trong một bảng.

 

ALTER TABLE tên_bảng
ADD tên_cột kiểu_dữ_liệu

ALTER TABLE tên_bảng
DROP COLUMN tên_cột

Lưu ý: Một số hệ CSDL không cho phép việc xoá bỏ cột trong bảng.

Ví dụ: ta có bảng Person như sau:

LastName FirstName Address
Pettersen Kari Storgt 20

Thêm một cột tên là City vào bảng Person:

ALTER TABLE Person ADD City varchar(30)

kết quả:

LastName FirstName Address City
Pettersen Kari Storgt 20  

Xoá cột Address:

ALTER TABLE Person DROP COLUMN Address

kết quả:

LastName FirstName City
Pettersen Kari

Tạo CSDL và bảng với CREATE

March 22nd, 2008

Tạo một CSDL
CREATE DATABASE tên_CSDL

 

Tạo một bảng trong một CSDL

CREATE TABLE tên_bảng
(
tên_cột_1 kiểu_dữ_liệu,
tên_cột_2 kiểu_dữ_liệu,
…….
)

Ví dụ

Tạo một bảng tên Person có bốn cột: LastName, FirstName, AddressAge:

CREATE TABLE Person
(
LastName varchar,
FirstName varchar,
Address varchar,
Age int
)

Tạo bảng và đặt kích thước tối đa của các cột:

CREATE TABLE Person
(
LastName varchar(30),
FirstName varchar,
Address varchar,
Age int(3)
)

Kiểu dữ liệu sẽ qui định loại dữ liệu nào được phép lưu trữ trong cột. Sau đây là các kiểu dữ liệu thường dùng nhất trong SQL:

integer(n)
int(n)
smallint(n)
tinyint(n)
Chỉ lưu trữ dữ liệu là số nguyên. Số lượng tối đa các chữ số được qui định bởi n.
decimal(n,d)
numeric(n,d)
Lưu trữ số thập nhân. Số lượng tối đa các chữ số được qui định bởi n. Số lượng tối đa các chữ số sau dấu phảy thập phân được qui định bởi d.
char(n) Lưu trữ n ký tự.
varchar(n) Lưu trữ tối đa n ký tự.
date(yyyymmdd) Lưu trữ ngày tháng (dạng năm-tháng-ngày)

Tạo chỉ mục

Chỉ mục được tạo ra nhằm để các dòng trong bảng được truy xuất nhanh và hiệu quả hơn. Chỉ mục có thể được tạo trên một hoặc nhiều cột của bảng, và mỗi chỉ mục được đặt một tên. Người dùng không thấy được các chỉ mục này, chúng chỉ được dùng để tăng tốc cho CSDL.

Lưu ý: Sau khi bảng đã được tạo chỉ mục thì việc cập nhật thay thêm dòng mới vào bảng sẽ mất nhiều thời gian hơn là đối với bảng không có chỉ mục. Lý do là vì khi cập nhật bảng, các chỉ mục đồng thời cũng phải được cập nhật theo. Vì thế, ta chỉ nên tạo chỉ mục cho các cột thường xuyên dùng trong các tác vụ tìm kiếm.

Chỉ mục đơn nhất (Unique Index)

Chỉ mục đơn nhất sẽ bắt buộc hai dòng bất kỳ của bảng sẽ không được phép mang cùng giá trị ở cột được tạo chỉ mục.

Cú pháp:

CREATE UNIQUE INDEX tên_chỉ_mục
ON tên_bảng (tên_cột)

Chỉ mục đơn (Simple Index)

Khi không dùng từ khoá UNIQUE trong câu lệnh tạo chỉ mục, các giá trị trùng nhau trong cột sẽ được phép.

Cú pháp:

CREATE INDEX tên_chỉ_mục
ON tên_bảng (tên_cột)

Ví dụ

Tạo một chỉ mục đơn có tên là PersonIndex trên cột LastName của bảng Person:

CREATE INDEX PersonIndex
ON Person (LastName
)

Nếu bạn muốn tạo chỉ mục sắp xếp giảm dần, bạn sử dụng thêm từ dành riêng DESC:

CREATE INDEX PersonIndex
ON Person (LastName
DESC)

Nếu bạn muốn tạo chỉ mục trên nhiều cột:

CREATE INDEX PersonIndex
ON Person (LastName, Firstname)

Xoá chỉ mục

Bạn có thể xoá chỉ mục đã tạo bằng lệnh DROP.

DROP INDEX tên_bảng.tên_chỉ_mục

Xoá CSDL hoặc bảng

Để xoá một CSDL (các bảng trong CSDL cũng đồng thời được xoá):

DROP DATABASE tên_CSDL

Để xoá một bảng (toàn bộ cấu trúc, dữ liệu và chỉ mục của bảng sẽ được xoá):

DROP TABLE tên_bảng

Câu lệnh JOIN

March 22nd, 2008

Nối kết và khoá
Đôi khi chúng ta phải lấy dữ liệu từ hai bảng cùng một lúc, chúng ta thực hiện một kết nối.

 

Các bảng trong CSDL có thể quan hệ ràng buộc với nhau thông qua các khoá. Một khoá chính (primary key) là một cột mà trong đó mỗi giá trị của hàng phải là duy nhất. Mục đích của khoá là kết nối dữ liệu lại với nhau, từ nhiều bảng khác nhau mà không gây trùng lắp dữ liệu giữa các bảng.

Trong bảng Employees (nhân viên) ở ví dụ dưới đây có cột Employees_ID là khoá chính, bảo đảm rằng không thể có hai dòng nào có trùng Employees_ID. Employees_ID dùng để phân biệt hai nhân viên khi họ trùng tên.

Trong ví dụ dưới đây:

  • Employee_ID là khoá chính của bảng Employees.
  • Prod_ID là khoá chính của bảng Orders.
  • Cột Employeed_ID trong bảng Orders được sử dụng để kết nối với bảng Employees, chỉ đến nhân viên trong bảng Employees.

Bảng Employees:

Employees_ID Name
01 Hansen, Ola
02 Svendson, Tove
03 Svendson, Stephen
04 Pettersen, Kari

Bảng Orders:

Prod_ID Product Employee_ID
234 Printer 01
657 Table 03
865 Chair 03

Kết nối hai bảng với nhau

Chúng ta có thể lấy dữ liệu từ hai bảng bằng cách kết nối chúng, tương tự như sau:

Ví dụ: Tìm xem ai đã đặt hàng sản phẩm và họ đã đặt món hàng gì:

SELECT Employees.Name, Orders.Product
FROM Employees, Orders
WHERE Employees.Employee_ID = Orders.Employee_ID

kết quả trả về:

Name Product
Hansen, Ola Printer
Svendson, Stephen Table
Svendson, Stephen Chair

Ví dụ: Tìm xem ai đã đặt hàng máy in:

SELECT Employees.Name
FROM Employees, Orders
WHERE Employees.Employee_ID = Orders.Employee_ID
AND Orders.Product = ‘Printer’

kết quả trả về:

Name
Hansen, Ola

Sử dụng JOIN

Ta có thể sử dụng từ khoá JOIN để kết nối dữ liệu từ hai bảng.

Ví dụ: INNER JOIN

Cú pháp:

SELECT cột_1, cột_2, cột_3
FROM bảng_1
INNER JOIN bảng_2
ON bảng_1.khoá_chính = bảng_2.khoá_ngoại

Ai đã đặt hàng và họ đã đặt món hàng nào:

SELECT Employees.Name, Orders.Product
FROM Employees
INNER JOIN Orders
ON Employees.Employee_ID = Orders.Employee_ID

INNER JOIN trả về tất cả các dòng ở cả hai bảng khi chúng tương ứng với nhau. Nếu có một dòng ở bảng Employees không ứng với dòng nào ở bảng Orders, dòng đó sẽ không được tính.

kết quả trả về:

Name Product
Hansen, Ola Printer
Svendson, Stephen Table
Svendson, Stephen Chair

Ví dụ: LEFT JOIN

Cú pháp:

SELECT cột_1, cột_2, cột_3
FROM bảng_1
LEFT JOIN bảng_2
ON bảng_1.khoá_chính = bảng_2.khoá_ngoại

Liệt kê tất cả các nhân viên và món hàng mà họ đặt (nếu có):

SELECT Employees.Name, Orders.Product
FROM Employees
LEFT JOIN Orders
ON Employees.Employee_ID = Orders.Employee_ID

LEFT JOIN trả về tất cả các dòng của bảng thứ nhất (Employees), ngay cả khi các dòng đó không ứng với dòng nào ở bảng thứ hai (Orders). Nếu có một dòng nào ở bảng Employees không ứng với bất cứ dòng nào ở bảng Orders thì dòng đó cũng vẫn được tính.

kết quả trả về:

Name Product
Hansen, Ola Printer
Svendson, Tove
Svendson, Stephen Table
Svendson, Stephen Chair
Pettersen, Kari

Ví dụ: RIGHT JOIN

Cú pháp:

SELECT cột_1, cột_2, cột_3
FROM bảng_1
RIGHT JOIN bảng_2
ON bảng_1.khoá_chính = bảng_2.khoá_ngoại

Liệt kê tất cả các mặt hàng được đặt và tên người đặt hàng (nếu có):

SELECT Employees.Name, Orders.Product
FROM Employees
RIGHT JOIN Orders
ON Employees.Employee_ID = Orders.Employee_ID

RIGHT JOIN trả về tất cả các dòng ở bảng thứ hai (Orders), ngay cả khi các dòng đó không ứng với dòng nào ở bảng thứ nhất (Employees). Nếu có một dòng nào ở bảng Orders không ứng với bất cứ dòng nào ở bảng Employees thì dòng đó cũng vẫn được tính.

kết quả trả về:

Name Product
Hansen, Ola Printer
Svendson, Stephen Table
Svendson, Stephen Chair

Ví dụ: Ai đã đặt hàng máy in:

SELECT Employees.Name
FROM Employees
INNER JOIN Orders
ON Employees.Employee_ID = Orders.Employee_ID
WHERE Orders.Product = ‘Printer’

kết quả trả về:

Name
Hansen, Ola

Bí danh (AS)

March 22nd, 2008

Với SQL, bí danh có thể được sử dụng cho tên của cột và tên của bảng.


Bí danh cột:

Cú pháp bí danh cột như sau:

SELECT tên_cột AS bí_danh_cột FROM tên_bảng

Bí danh bảng:

Bí danh bảng có cú pháp như sau:

SELECT tên_cột FROM tên_bảng AS bí_danh_bảng

Ví dụ sử dụng bí danh cột:

Ta có bảng Persons như sau:

LastName FirstName Address City
Hansen Ola Timoteivn 10 Sandnes
Svendson Tove Borgvn 23 Sandnes
Pettersen Kari Storgt 20 Stavanger

Câu lệnh SQL sau:

SELECT LastName AS Họ, FirstName AS Tên
FROM Persons

Sẽ trả về kết quả:

Họ Tên
Hansen Ola
Svendson Tove
Pettersen Kari

GROUP BY và HAVING

March 22nd, 2008

Các hàm tập hợp (ví dụ như SUM) thông thường cần thêm chức năng của mệnh đề GROUP BY.


GROUP BY

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ẻ trong cộ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ụ sử dụng GROUP BY:

Giả sử ta có bảng Sales như sau:

Company Amount
W3Schools 5500
IBM 4500
W3Schools 7100

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.

HAVING

Mệnh đề 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ảng Sales ở 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ả:

Company SUM(Amount)
W3Schools 12600


Phần Nâng cao-Hàm

March 22nd, 2008

SQL có sẵn khá nhiều hàm để thực hiện đếm và tính toán.


Cú pháp:

Cú pháp để gọi hàm trong câu lệnh SQL như sau:

SELECT function(tên_cột) FROM tên_bảng

Bảng dữ liệu chúng ta sẽ dùng trong các ví sụ tiếp theo:

Name Age
Hansen, Ola 34
Svendson, Tove 45
Pettersen, Kari 19

Hàm AVG(column)

Hàm AVG trả về giá trị trung bình tính theo cột được chỉ định của các dòng được chọn. Các giá trị NULL sẽ không được xét đến khi tính giá trị trung bình.

Ví dụ:

Câu lệnh sau sẽ tính số tuổi trung bình của những người có tuổi trên 20:

SELECT AVG(Age) FROM Persons WHERE Age > 20

kết quả trả về sẽ là:

39.5

Hàm MAX(column)

Hàm MAX trả về giá trị lớn nhất trong cột. Các giá trị NULL sẽ không được xét đến.

Ví dụ:

SELECT MAX(Age) FROM Persons

kết quả trả về:

45

Hàm MIN(column)

Hàm MAX trả về giá trị nhỏ nhất trong cột. Các giá trị NULL sẽ không được xét đến.

Ví dụ:

SELECT MIN(Age) FROM Persons

kết quả trả về:

19

Lưu ý: Hàm MINMAX cũng có thể áp dụng cho các cột có dữ liệu là chuỗi văn bản. Dữ liệu trong cột sẽ được so sánh theo thứ tự tăng dần của từ điển

Hàm SUM(column)

Hàm SUM trả về tổng giá trị của cột. Các giá trị NULL sẽ không được xét đến.

Ví dụ:

Tìm tổng số tuổi của tất cả những người có trong bảng:

SELECT SUM(Age) FROM Persons

kết quả trả về:

98

Ví dụ:

Tìm tổng số tuổi của tất cả những người có tuổi lớn hơn 20:

SELECT SUM(Age) FROM Persons WHERE Age > 20

kết quả trả về:

79

Hàm COUNT

March 22nd, 2008

SQL có sẵn lệnh để đếm các dòng trong CSDL.
Cú pháp của hàm COUNT:
SELECT COUNT(tên_cột) FROM tên_bảng
Hàm COUNT(*):

 

Hàm COUNT(*) trả về số lượng các dòng được chọn ở trong bảng.

Ví dụ ta có bảng Persons như sau:

Name Age
Hansen, Ola 34
Svendson, Tove 45
Pettersen, Kari 19

Câu lệnh sau sẽ trả về số lượng các dòng trong bảng:

SELECT COUNT(*) FROM Persons

và kết quả trả về sẽ là:

3

Câu lệnh sau sẽ trả về số lượng những người lớn hơn 20 tuổi:

SELECT COUNT(*) FROM Persons WHERE Age > 20

kết quả trả về sẽ là:

2

Hàm COUNT(column):

Hàm COUNT(column) sẽ trả về số lượng các dòng có giá trị khác NULL ở cột được chỉ định.

Ví dụ ta có bảng Persons như sau:

Name Age
Hansen, Ola 34
Svendson, Tove 45
Pettersen, Kari  

Câu lệnh sau sẽ trả về số lượng những người mà cột Age trong bảng không rỗng:

SELECT COUNT(Age) FROM Persons

và kết quả trả về sẽ là:

2

Mệnh đề COUNT DISTINCT

Lưu ý: Các ví dụ dưới đây chỉ hoạt động với CSDL OracleMS SQL Server, không hoạt động trên MS Access (chưa thử nhiệm với các hệ CSDL khác!)

Từ khoá DISTINCT và COUNT có thể được dùng chung với nhau để đếm số lượng các kết quả không trùng nhau.

Cú pháp như sau:

SELECT COUNT(DISTINCT column(s)) FROM table

Ví dụ ta có bảng Orders như sau:

Company OrderNumber
Sega 3412
W3Schools 2312
Trio 4678
W3Schools 6798

Câu lệnh SQL sau:

SELECT COUNT(DISTINCT Company) FROM Orders

sẽ trả về kết quả là:

3

Câu lệnh DELETE

March 22nd, 2008

Câu lệnh DELETE được dùng để xoá các dòng ra khỏi bảng.


Cú pháp:

DELETE FROM tên_bảng
WHERE tên_cột = giá_trị

Ví dụ: Bảng Person của ta như sau:

LastName FirstName Address City
Nilsen Fred Kirkegt 56 Stavanger
Rasmussen Nina Stien 12 Stavanger

Xoá 1 dòng:

Ta xoá người có tên là Nina Rasmussen:

DELETE FROM Person WHERE LastName = ‘Rasmussen’

Kết quả sau khi xoá:

LastName FirstName Address City
Nilsen Fred Kirkegt 56 Stavanger

Xoá tất cả các dòng:

Đôi khi ta muốn xoá tất cả dữ liệu trong bảng nhưng vẫn giữ lại bảng cùng với cấu trúc và tất cả các thuộc tính của bảng, ta có thể dùng câu lệnh:

DELETE FROM table_name

hoặc

DELETE * FROM table_name

Câu lệnh UPDATE

March 22nd, 2008

Câu lệnh UPDATE được sử dụng để cập nhật/sửa đổi dữ liệu đã có trong bảng.

Cú pháp:

UPDATE tên_bảng
SET tên_cột = giá_trị_mới
WHERE tên_cột = giá_trị

Ví dụ: bảng Person của ta như sau:

LastName FirstName Address City
Nilsen Fred Kirkegt 56 Stavanger
Rasmussen   Storgt 67  

Cập nhật 1 cột trên 1 dòng

Giả sử ta muốn bổ xung thêm phần tên cho người có họ là Rasmussen:

UPDATE Person SET FirstName = ‘Nina’
WHERE LastName = ‘Rasmussen’

Ta sẽ có kết quả như sau:

LastName FirstName Address City
Nilsen Fred Kirkegt 56 Stavanger
Rasmussen Nina Storgt 67  

Cập nhật nhiều cột trên 1 dòng

Bây giờ ta lại muốn đổi tên và địa chỉ:

UPDATE Person
SET Address = ‘Stien 12′, City = ‘Stavanger’
WHERE LastName = ‘Rasmussen’

Kết quả sẽ là:

LastName FirstName Address City
Nilsen Fred Kirkegt 56 Stavanger
Rasmussen Nina Stien 12 Stavanger