1 Cơ bản về MySQL (phần 2) - Các toán tử và hàm cơ bản Sun Oct 09, 2011 8:44 pm
Trunks-Kun
Administrator
Toán tử lô-gic AND và OR
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ả.
Bảng dữ liệu dùng trong ví dụ
Sử dụng AND để tìm những người có tên là Tove và họ là Svendson:
Sử dụng OR để tìm những người có tên là Tove hoặc họ là Svendson:
Bạn cũng có thể 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:
LastNameFirstNameAddressCitySvendsonToveBorgvn 23SandnesSvendsonStephenKaivn 18Sandnes
Toán tử BETWEEN...AND
Toán tử BETWEEN...AND lấy ra một miền dữ liệu nằm giữa hai giá trị. Hai giá trị này có thể là số, chuỗi văn bản hoặc ngày tháng.
Tìm tất cả những người có họ (sắp xếp theo ABC) nằm giữa Hansen (tính luôn Hansen) và Pettersen (không tính Pettersen):
Ví dụ 2
Để tìm những người có họ (sắp xếp theo ABC) nằm ngoài khoảng hai giá trị ở ví dụ 1, ta dùng thêm toán tử NOT:
LastNameFirstNameAddressCityPettersenKariStorgt 20StavangerSvendsonToveBorgvn 23Sandnes
Câu lệnh INSERT INTO.
Câu lệnh INSERT INTO
Câu lệnh INSERT INTO được dùng để chèn dòng mới vào bảng.
Cú pháp:
Ta có bảng Persons như sau:
Câu lệnh SQL sau:
Với bảng Persons như trên, câu lệnh SQL sau:
Câu lệnh UPDATE
Câu lệnh UPDATE
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:
Giả sử ta muốn bổ xung thêm phần tên cho người có họ là Rasmussen:
Bây giờ ta lại muốn đổi tên và địa chỉ:
LastNameFirstNameAddressCityNilsenFredKirkegt 56StavangerRasmussenNinaStien 12Stavanger
Câu lệnh DELETE
Câu lệnh DELETE được dùng để xoá các dòng ra khỏi bảng.
Cú pháp:
Ta xoá người có tên là Nina Rasmussen:
Đô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:
Hàm COUNT
SQL có sẵn lệnh để đếm các dòng trong CSDL.
Cú pháp của 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:
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:
Lưu ý: Các ví dụ dưới đây chỉ hoạt động với CSDL Oracle và MS 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:
Phần Nâng [You must be registered and logged in to see this link.]-Hàm
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:
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ụ:
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ụ:
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:
Tìm tổng số tuổi của tất cả những người có tuổi lớn hơn 20:
Tạo CSDL và bảng với CREATE
Tạo một CSDL
Tạo một bảng tên Person có bốn cột: LastName, FirstName, Address và Age:
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:
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:
Tạo một chỉ mục đơn có tên là PersonIndex trên cột LastName của bảng Person:
Bạn có thể xoá chỉ mục đã tạo bằng lệnh DROP.
Để xoá một CSDL (các bảng trong CSDL cũng đồng thời được xoá):
Câu lệnh ALTER
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.
Ví dụ: ta có bảng Person như sau:
LastNameFirstNameCityPettersenKari
internet
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ả.
Bảng dữ liệu dùng trong ví dụ
LastNameFirstNameAddressCityHansenOlaTimoteivn 10SandnesSvendsonToveBorgvn 23SandnesSvendsonStephenKaivn 18Sandnes
Ví dụ 1Sử dụng AND để tìm những người có tên là Tove và họ là Svendson:
SELECT * FROM PersonsWHERE FirstName = 'Tove'AND LastName = 'Svendson'Kết quả trả về:
LastNameFirstNameAddressCitySvendsonToveBorgvn 23Sandnes
Ví dụ 2Sử dụng OR để tìm những người có tên là Tove hoặc họ là Svendson:
SELECT * FROM PersonsWHERE firstname = 'Tove'OR lastname = 'Svendson'Kết quả trả về:
LastNameFirstNameAddressCitySvendsonToveBorgvn 23SandnesSvendsonStephenKaivn 18Sandnes
Ví dụ 3Bạn cũng có thể 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'Kết quả trả về:
LastNameFirstNameAddressCitySvendsonToveBorgvn 23SandnesSvendsonStephenKaivn 18Sandnes
Toán tử BETWEEN...AND
Toán tử BETWEEN...AND lấy ra một miền dữ liệu nằm giữa hai giá trị. Hai giá trị này có thể là số, chuỗi văn bản hoặc ngày tháng.
SELECT tên_cột FROM tên_bảngBảng dữ liệu dùng trong ví dụ
WHERE tên_cột
BETWEEN giá_trị_1 AND giá_trị_2
LastNameFirstNameAddressCityHansenOlaTimoteivn 10SandnesNordmannAnnaNeset 18SandnesPettersenKariStorgt 20StavangerSvendsonToveBorgvn 23Sandnes
Ví dụ 1Tìm tất cả những người có họ (sắp xếp theo ABC) nằm giữa Hansen (tính luôn Hansen) và Pettersen (không tính Pettersen):
SELECT * FROM Persons WHERE LastNameKết quả trả về:
BETWEEN 'Hansen' AND 'Pettersen'
LastNameFirstNameAddressCityHansenOlaTimoteivn 10SandnesNordmannAnnaNeset 18Sandnes
Lưu ý quan trọng: Toán tử BETWEEN...END sẽ trả về những kết quả khác nhau trên các hệ CSDL khác nhau. Với một số hệ CSDL, toán tử BETWEEN...END sẽ trả về các dòng mà có giá trị thực sự "nằm giữa" hai khoảng giá trị (tức là bỏ qua không tính đến các giá trị trùng với giá trị của hai đầu mút). Một số hệ CSDL thì sẽ tính luôn các giá trị trùng với hai đầu mút. Trong khi đó một số hệ CSDL khác lại chỉ tính các giá trị trùng với đầu mút thứ nhất mà không tính đầu mút thứ hai (như ở ví dụ phía trên). Do vậy, bạn phải kiểm tra lại hệ CSDL mà bạn đang dùng khi sử dụng toán tử BETWEEN...AND.Ví dụ 2
Để tìm những người có họ (sắp xếp theo ABC) nằm ngoài khoảng hai giá trị ở ví dụ 1, ta dùng thêm toán tử NOT:
SELECT * FROM Persons WHERE LastNameKết quả trả về:
NOT BETWEEN 'Hansen' AND 'Pettersen'
LastNameFirstNameAddressCityPettersenKariStorgt 20StavangerSvendsonToveBorgvn 23Sandnes
Câu lệnh INSERT INTO.
Câu lệnh INSERT INTO
Câu lệnh INSERT INTO được dùng để chèn dòng mới vào bảng.
Cú pháp:
INSERT INTO tên_bảng
VALUES (giá_trị_1, giá_trị_2,....)Bạn cũng có thể chỉ rõ các cột/trường nào cần chèn dữ liệu:
INSERT INTO tên_bảng (cột_1, cột_2,...)
VALUES (giá_trị_1, giá_trị_2,....)Chèn 1 dòng mới
Ta có bảng Persons như sau:
LastNameFirstNameAddressCityPettersenKariStorgt 20Stavanger
Câu lệnh SQL sau:
INSERT INTO Persons
VALUES ('Hetland', 'Camilla', 'Hagabakka 24', 'Sandnes')sẽ tạora kết quả trong bảng Persons như sau:
LastNameFirstNameAddressCityPettersenKariStorgt 20StavangerHetlandCamillaHagabakka 24Stavanger
Chèn dữ liệu vào các cột/trường cụ thểVới bảng Persons như trên, câu lệnh SQL sau:
INSERT INTO Persons (LastName, Address)
VALUES ('Rasmussen', 'Storgt 67')Sẽ tạo ra kết quả:
LastNameFirstNameAddressCityPettersenKariStorgt 20StavangerHetlandCamillaHagabakka 24StavangerRasmussenStorgt 67
Câu lệnh UPDATE
Câu lệnh UPDATE
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:
LastNameFirstNameAddressCityNilsenFredKirkegt 56StavangerRasmussenStorgt 67
Cập nhật 1 cột trên 1 dòngGiả 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:
LastNameFirstNameAddressCityNilsenFredKirkegt 56StavangerRasmussenNinaStorgt 67
Cập nhật nhiều cột trên 1 dòngBâ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à:
LastNameFirstNameAddressCityNilsenFredKirkegt 56StavangerRasmussenNinaStien 12Stavanger
Câu lệnh DELETE
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ảngVí dụ: Bảng Person của ta như sau:
WHERE tên_cột = giá_trị
LastNameFirstNameAddressCityNilsenFredKirkegt 56StavangerRasmussenNinaStien 12Stavanger
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á:
LastNameFirstNameAddressCityNilsenFredKirkegt 56Stavanger
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_namehoặcDELETE * FROM table_name
Hàm COUNT
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ảngHà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:
NameAgeHansen, Ola34Svendson, Tove45Pettersen, Kari19
Câu lệnh sau sẽ trả về số lượng các dòng trong bảng:SELECT COUNT(*) FROM Personsvà kết quả trả về sẽ là:
3Câ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 > 20kết quả trả về sẽ là:
2Hà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:
NameAgeHansen, Ola34Svendson, Tove45Pettersen, 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 Personsvà kết quả trả về sẽ là:
2Mệnh đề COUNT DISTINCT
Lưu ý: Các ví dụ dưới đây chỉ hoạt động với CSDL Oracle và MS 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 tableVí dụ ta có bảng Orders như sau:
CompanyOrderNumberSega3412W3Schools2312Trio4678W3Schools6798
Câu lệnh SQL sau:SELECT COUNT(DISTINCT Company) FROM Orderssẽ trả về kết quả là:3
Phần Nâng [You must be registered and logged in to see this link.]-Hàm
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ảngBảng dữ liệu chúng ta sẽ dùng trong các ví sụ tiếp theo:
NameAgeHansen, Ola34Svendson, Tove45Pettersen, Kari19
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:Ví dụ:
SELECT AVG(Age) FROM Persons WHERE Age > 20kết quả trả về sẽ là:
39.5Hà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 Personskết quả trả về:
45Hà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 Personskết quả trả về:
19Lưu ý: Hàm MIN và MAX 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 Personskết quả trả về:
98Ví 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 > 20kết quả trả về:79
Tạo CSDL và bảng với CREATE
Tạo một CSDL
CREATE DATABASE tên_CSDLTạo một bảng trong một CSDL
CREATE TABLE tên_bảngVí dụ
(
tên_cột_1 kiểu_dữ_liệu,
tên_cột_2 kiểu_dữ_liệu,
.......
)
Tạo một bảng tên Person có bốn cột: LastName, FirstName, Address và Age:
CREATE TABLE PersonTạo bảng và đặt kích thước tối đa của các cột:
(
LastName varchar,
FirstName varchar,
Address varchar,
Age int
)
CREATE TABLE PersonKiể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:
(
LastName varchar(30),
FirstName varchar,
Address varchar,
Age int(3)
)
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ụcint(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)
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ụcChỉ mục đơn (Simple Index)
ON tên_bảng (tên_cột)
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ụcVí dụ
ON tên_bảng (tên_cột)
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 PersonIndexNế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:
ON Person (LastName)
CREATE INDEX PersonIndexNếu bạn muốn tạo chỉ mục trên nhiều cột:
ON Person (LastName DESC)
CREATE INDEX PersonIndexXoá chỉ mục
ON Person (LastName, Firstname)
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ụcXoá 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 ALTER
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ảngLưu ý: Một số hệ CSDL không cho phép việc xoá bỏ cột trong bảng.
ADD tên_cột kiểu_dữ_liệu
ALTER TABLE tên_bảng
DROP COLUMN tên_cột
Ví dụ: ta có bảng Person như sau:
LastNameFirstNameAddressPettersenKariStorgt 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ả:
LastNameFirstNameAddressCityPettersenKariStorgt 20
Xoá cột Address:ALTER TABLE Person DROP COLUMN Addresskết quả:
LastNameFirstNameCityPettersenKari
internet