Professional Documents
Culture Documents
Tìm hiểu về câu lệnh truy vấn là gì
Tìm hiểu về câu lệnh truy vấn là gì
Tìm hiểu về câu lệnh truy vấn là gì
Nó là một câu lệnh SQL với mục đích truy vấn một hoặc nhiều dữ liệu
nào đó từ một cơ sở dữ liệu đã có và bằng một số câu lệnh mà SQL hỗ
trợ sau đây:
Dữ liệu trả về được lưu trữ trong một bảng kết quả, được gọi là tập
kết quả.
Cú pháp
Câu lệnh SELECT DISTINCT chỉ được sử dụng để trả về các giá trị
riêng biệt (khác nhau).
Bên trong một bảng, một cột thường chứa nhiều giá trị trùng lặp, và
đôi khi bạn chỉ muốn liệt kê các giá trị khác nhau (riêng biệt).
Cú pháp
Mệnh đề WHERE chỉ được sử dụng để trích xuất những dữ liệu đáp ứng
một điều kiện cụ thể.
1.1 Cú pháp
Ví dụ: Câu lệnh SQL sau chọn tất cả khách hàng từ quốc gia
“Stavaer”, trong bảng “Customers”:
Operato
Mô tả
r
= Bằng
Khác. Lưu ý: Trong một số phiên bản SQL, toán tử này có thể được
<>
viết là !=
Mệnh đề WHERE có thể được kết hợp với các toán tử AND, OR và NOT.
Toán tử AND và OR được sử dụng để lọc các dữ liệu dựa trên nhiều hơn
một điều kiện:
Toán tử AND hiển thị một dữ liệu nếu tất cả các điều kiện được phân
tách bằng AND đều ĐÚNG.
Toán tử OR hiển thị một dữ liệu nếu bất kỳ điều kiện nào được phân
tách bởi OR là TRUE.
Toán tử NOT hiển thị bản ghi nếu (các) điều kiện KHÔNG ĐÚNG.
2.1 Cú pháp AND
2.2 Cú pháp OR
Ví dụ: Câu lệnh SQL sau chọn tất cả các trường từ “Customers” trong
đó quốc gia là “Germany” VÀ thành phố phải là “Berlin” HOẶC
“München” (sử dụng dấu ngoặc đơn để tạo biểu thức phức tạp):
SELECT * FROM Customers
WHERE Country='Germany' AND (City='Berlin' OR City='München');
SELECT * FROM Customers
WHERE NOT Country='Germany' AND NOT Country='USA';
Từ khóa ORDER BY được sử dụng để sắp xếp tập hợp kết quả theo thứ tự
tăng dần hoặc giảm dần.
Từ khóa ORDER BY sắp xếp các dữ liệu theo thứ tự tăng dần theo mặc
định. Để sắp xếp các dữ liệu theo thứ tự giảm dần, hãy sử dụng từ
khóa DESC.
3.1 Cú pháp
Ví dụ: Câu lệnh SQL sau chọn tất cả khách hàng từ bảng “Customers”,
được sắp xếp theo cột “Country” và cột “CustomerName”. Điều này có
nghĩa là nó đặt hàng theo Quốc gia, nhưng nếu một số hàng có cùng
Quốc gia, nó sẽ đặt hàng theo CustomerName:
1.1. Cú pháp
Cách đầu tiên chỉ định cả tên cột và giá trị sẽ được chèn:
Câu lệnh SQL sau sẽ chèn một dữ liệu mới, nhưng chỉ chèn dữ liệu
trong các cột “CustomerName”, “City” và “Country” (CustomerID sẽ
được cập nhật tự động):
Câu lệnh UPDATE được sử dụng để sửa đổi các dữ liệu hiện có trong
bảng.
2.1. Cú pháp
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
Lưu ý: Hãy cẩn thận khi cập nhật các dữ liệu trong một bảng! Lưu ý
mệnh đề WHERE trong câu lệnh UPDATE. Mệnh đề WHERE chỉ định (các) dữ
liệu cần được cập nhật. Nếu bạn bỏ qua mệnh đề WHERE, tất cả các dữ
liệu trong bảng sẽ được cập nhật!
Ví dụ: Câu lệnh SQL sau cập nhật khách hàng đầu tiên (CustomerID =
1) với tên người liên hệ và thành phố.
UPDATE Customers
SET ContactName = 'Cafedev', City= 'HCM'
WHERE CustomerID = 1;
Đó là mệnh đề WHERE xác định có bao nhiêu bản ghi sẽ được cập nhật.
Câu lệnh SQL sau sẽ cập nhật tên liên hệ thành “Cafedev” cho tất cả
các dữ liệu có quốc gia là “VN”:
UPDATE Customers
SET ContactName='Cafedev'
WHERE Country='VN';
Lưu ý: Hãy cẩn thận khi cập nhật. Nếu bạn bỏ qua mệnh đề WHERE, TẤT
CẢ các dữ liệu sẽ được cập nhật!
UPDATE Customers
SET ContactName='Cafedev';
Câu lệnh DELETE được sử dụng để xóa các dữ liệu hiện có trong bảng.
Ví dụ: Câu lệnh SQL sau xóa khách hàng “Cafedev” khỏi bảng
“Customers”:
Có thể xóa tất cả các hàng trong bảng mà không cần xóa bảng. Điều
này có nghĩa là cấu trúc bảng, thuộc tính và chỉ mục sẽ được giữ
nguyên:
Mệnh đề SELECT TOP hữu ích trên các bảng lớn với hàng nghìn dữ liệu.
Trả lại một số lượng lớn bản ghi có thể ảnh hưởng đến hiệu suất.
Lưu ý: Không phải tất cả các hệ thống cơ sở dữ liệu đều hỗ trợ mệnh
đề SELECT TOP. MySQL hỗ trợ mệnh đề LIMIT để chọn một số dữ liệu với
giới hạn, trong khi Oracle sử dụng ROWNUM.
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number;
Ví dụ: Câu lệnh SQL sau chọn ba bản ghi đầu tiên từ bảng “Customers”
(dành cho SQL Server / MS Access):
Hàm MIN() trả về giá trị nhỏ nhất của cột đã chọn.
Hàm MAX() trả về giá trị lớn nhất của cột đã chọn.
SELECT MIN(column_name)
FROM table_name
WHERE condition;
SELECT MAX(column_name)
FROM table_name
WHERE condition;
Ví dụ: Câu lệnh SQL sau tìm giá của sản phẩm rẻ nhất:
Hàm COUNT() trả về số hàng phù hợp với tiêu chí được chỉ định.
Hàm AVG() trả về giá trị trung bình của một cột số.
SELECT COUNT(column_name)
FROM table_name
WHERE condition;
SELECT AVG(column_name)
FROM table_name
WHERE condition;
SELECT SUM(column_name)
FROM table_name
WHERE condition;
Ví dụ: Câu lệnh SQL sau tìm số lượng sản phẩm:
SELECT COUNT(ProductID)
FROM Products;
Lưu ý: Giá trị NULL không được tính.
Ví dụ: Câu lệnh SQL sau tìm giá trung bình của tất cả các sản phẩm:
SELECT AVG(Price)
FROM Products;
Lưu ý: Giá trị NULL bị bỏ qua.
Ví dụ: Câu lệnh SQL sau tìm tổng các trường “Quantity” trong bảng
“OrderDetails”:
SELECT SUM(Quantity)
FROM OrderDetails;
Ký
Mô tả Ví dụ
hiệu.
Đại diện cho không hoặc nhiều bl* sẽ tìm thấy bl, black, blue,
*
ký tự and blob
Đại diện cho bất kỳ ký tự đơn h[oa]t sẽ tìm thấy hot and hat,
[]
nào trong dấu ngoặc but not hit
Đại diện cho bất kỳ ký tự nào h[!oa]t sẽ tìm thấy hit, but not
!
không có trong dấu ngoặc hot and hat
– Đại diện cho một loạt các ký c[a-b]t sẽ tìm thấy cat and cbt
tự
Ký
Mô tả Ví dụ
hiệu.
Đại diện cho bất kỳ ký tự đơn nào h[oa]t sẽ tìm thấy hot
[]
trong dấu ngoặc and hat, but not hit
Đại diện cho bất kỳ ký tự nào không h[^oa]t sẽ tìm thấy hit,
^
có trong dấu ngoặc but not hot and hat
Dưới đây là một số ví dụ hiển thị các toán tử LIKE khác nhau với các
ký tự đại diện ‘%’ và ‘_’:
WHERE CustomerName LIKE ‘a%’ Tìm bất kỳ giá trị nào bắt đầu bằng “a”
WHERE CustomerName LIKE ‘%a’ Tìm bất kỳ giá trị nào kết thúc bằng “a”
WHERE CustomerName LIKE ‘%or Tìm bất kỳ giá trị nào có “hoặc” ở bất
%’ kỳ vị trí nào
WHERE CustomerName LIKE ‘a__ Tìm bất kỳ giá trị nào bắt đầu bằng “a”
%’ và có ít nhất 3 ký tự
4. Ví dụ
Câu lệnh SQL sau chọn tất cả khách hàng có CustomerName bắt
đầu bằng “a”:
Câu lệnh SQL sau chọn tất cả các khách hàng có CustomerName
kết thúc bằng “a”:
Câu lệnh SQL sau đây chọn tất cả khách hàng có CustomerName
có “or” ở bất kỳ vị trí nào:
Câu lệnh SQL sau đây chọn tất cả khách hàng có CustomerName
bắt đầu bằng “a” và có ít nhất 3 ký tự:
Câu lệnh SQL sau đây chọn tất cả khách hàng có CustomerName
KHÔNG bắt đầu bằng “a”:
Cú pháp:
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);
or
SELECT column_name(s)
FROM table_name
WHERE column_name IN (SELECT STATEMENT);
Trong cú pháp trên có SELECT STATEMENT, đây là một câu truy vấn nào
đó để lấy ra 1 or nhiều giá trị cho toán tử IN.
Ví dụ:
Câu lệnh SQL sau đây chọn tất cả khách hàng ở “VN”, “US”
hoặc “UK”:
Câu lệnh SQL sau đây chọn tất cả khách hàng đến từ các quốc
gia giống như nhà cung cấp:
Toán tử BETWEEN chọn các giá trị trong một phạm vi nhất định. Các
giá trị có thể là số, văn bản hoặc ngày tháng.
Toán tử BETWEEN được bao gồm: giá trị bắt đầu và kết thúc được bao
gồm.
Cú pháp:
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
Ví dụ:
Câu lệnh SQL sau đây chọn tất cả các sản phẩm có giá GIỮA 10
và 20:
Để hiển thị các sản phẩm nằm ngoài phạm vi của ví dụ trước,
hãy sử dụng KHÔNG GIỮA:
Câu lệnh SQL sau đây chọn tất cả các sản phẩm có giá GIỮA 10
và 20. Ngoài ra; không hiển thị các sản phẩm có CategoryID
là 1,2 hoặc 3:
SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20
AND CategoryID NOT IN (1,2,3);
Câu lệnh SQL sau đây chọn tất cả các sản phẩm có Tên sản
phẩm GIỮA Bia và Rượi:
Câu lệnh SQL sau đây chọn tất cả các sản phẩm có Tên sản
phẩm KHÔNG GIỮA Bia và Rượi:
Câu lệnh SQL sau đây chọn tất cả các đơn hàng có Ngày đặt
hàng GIỮA ’01 -July-1996 ‘và ’31 -July-1996’:
Bí danh thường được sử dụng để làm cho tên cột dễ đọc hơn.
SELECT column_name(s)
FROM table_name AS alias_name;
2. Ví dụ
Câu lệnh SQL sau tạo hai bí danh, một cho cột CustomerID và
một cho cột CustomerName:
Câu lệnh SQL sau tạo hai bí danh, một cho cột Tên khách hàng
và một cho cột Tên liên hệ. Lưu ý: Nó yêu cầu dấu ngoặc kép
hoặc dấu ngoặc vuông nếu tên bí danh chứa khoảng trắng:
Câu lệnh SQL sau tạo một bí danh có tên “Address” kết hợp
bốn cột (Address, PostalCode, City and Country);
SELECT CustomerName, Address + ', ' + PostalCode + ' ' + City + ', '
+ Country AS Address
FROM Customers;
Lưu ý: Để câu lệnh SQL ở trên hoạt động trong MySQL, hãy sử dụng như
sau:
Câu lệnh SQL sau chọn tất cả các đơn đặt hàng từ khách hàng
có CustomerID = 4 . Chúng tôi sử dụng bảng “Customers” và
“Orders” và cung cấp cho chúng bí danh bảng tương ứng là “c”
và “o” (Ở đây chúng tôi sử dụng bí danh để làm cho SQL ngắn
hơn):
Câu lệnh SQL sau giống như trên, nhưng không có bí danh:
Có nhiều hơn một bảng liên quan đến một truy vấn
Các hàm được sử dụng trong truy vấn
Tên cột lớn hoặc không dễ đọc
Hai hoặc nhiều cột được kết hợp với nhau
Lưu ý rằng cột “CustomerID” trong bảng “Orders” tham chiếu đến
“CustomerID” trong bảng “Customers”. Mối quan hệ giữa hai bảng trên
là cột “CustomerID”.
Về các bảng này bạn nên tham khảo bài đầu trong file sql để xem cấu
trúc của nó.
Sau đó, chúng ta có thể tạo câu lệnh SQL sau (có chứa INNER JOIN),
chọn các bản ghi có giá trị phù hợp trong cả hai bảng:
Dưới đây là các kiểu khác nhau của các JOIN trong SQL:
(INNER) JOIN: Trả về các dữ liệu có giá trị phù hợp trong cả
hai bảng
JOIN LEFT (OUTER): Trả về tất cả các dữ liệu từ bảng bên
trái và các dữ liệu đã khớp từ bảng bên phải
RIGHT (OUTER) JOIN: Trả về tất cả các dữ liệu từ bảng bên
phải và các dữ liệu phù hợp từ bảng bên trái
FULL (OUTER) JOIN: Trả về tất cả các dữ liệu khi có sự trùng
khớp trong bảng bên trái hoặc bên phải
Từ khóa INNER JOIN chọn các dữ liệu có giá trị phù hợp trong cả hai
bảng.
Cú pháp
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
Ví dụ:
Câu lệnh SQL sau chọn tất cả các đơn hàng có thông tin khách
hàng:
Về các bảng này bạn nên tham khảo bài đầu để xem cấu trúc của nó.
Join 3 bảng
Câu lệnh SQL sau chọn tất cả các đơn đặt hàng có thông tin về khách
hàng và người giao hàng:
Từ khóa LEFT JOIN trả về tất cả các dữ liệu từ bảng bên trái
(table1) và các dữ liệu được so khớp từ bảng bên phải (table2). Kết
quả là NULL từ phía bên phải, nếu không có kết quả phù hợp.
Cú pháp
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
Lưu ý: Trong một số cơ sở dữ liệu, LEFT JOIN được gọi là LEFT OUTER
JOIN.
Ví dụ:
Về các bảng này bạn nên tham khảo bài đầu để xem cấu trúc của nó.
Câu lệnh SQL sau sẽ chọn tất cả khách hàng và bất kỳ đơn hàng nào mà
họ có thể có:
Từ khóa RIGHT JOIN trả về tất cả các dữ liệu từ bảng bên phải
(table2) và các dữ liệu được so khớp từ bảng bên trái (table1). Kết
quả là NULL từ phía bên trái, khi không có kết quả phù hợp.
Cú pháp
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
Lưu ý: Trong một số cơ sở dữ liệu, RIGHT JOIN được gọi là RIGHT
OUTER JOIN.
Ví dụ:
Về các bảng này bạn nên tham khảo bài đầu để xem cấu trúc của nó.
Câu lệnh SQL sau sẽ trả về tất cả nhân viên và bất kỳ đơn
hàng nào họ có thể đã đặt:
Từ khóa FULL OUTER JOIN trả về tất cả các dữ liệu khi có sự trùng
khớp trong các dữ liệu bảng bên trái (table1) hoặc bên phải
(table2).
Lưu ý: FULL OUTER JOIN có thể trả về tập kết quả rất lớn!
Cú pháp
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;
Ví dụ:
Về các bảng này bạn nên tham khảo bài đầu để xem cấu trúc của nó.
Câu lệnh SQL sau chọn tất cả khách hàng và tất cả các đơn
đặt hàng:
Một self JOIN là một phép nối thông thường, nhưng bảng được nối với
chính nó.
Cú pháp
SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;
T1 và T2 là các bí danh bảng khác nhau cho cùng một bảng.
Ví dụ:
Câu lệnh SQL sau phù hợp với khách hàng đến từ cùng một thành phố:
Toán tử UNION chỉ chọn các giá trị riêng biệt theo mặc định. Để cho
phép các giá trị trùng lặp, hãy sử dụng UNION ALL:
Ví dụ:
Câu lệnh SQL sau trả về các thành phố (chỉ các giá trị khác
biệt) từ cả bảng “Customers” và “Suppliers”:
Câu lệnh SQL sau trả về các thành phố (cũng có giá trị trùng lặp) từ
cả bảng “Customers” và “Suppliers”:
Câu lệnh SQL sau trả về các thành phố của Đức (cũng có giá
trị trùng lặp) từ cả bảng “Customers” và “Suppliers”:
Toán tử EXISTS trả về true nếu truy vấn con trả về một hoặc nhiều dữ
liệu.
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);
Ví dụ:
Câu lệnh SQL sau trả về TRUE và liệt kê các nhà cung cấp có
giá sản phẩm nhỏ hơn 20:
SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE
Products.SupplierID = Suppliers.supplierID AND Price < 20);
Câu lệnh SQL sau trả về TRUE và liệt kê các nhà cung cấp có
giá sản phẩm bằng 22:
SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE
Products.SupplierID = Suppliers.supplierID AND Price = 22);
Toán tử BẤT CỨ và TẤT CẢ được sử dụng với mệnh đề WHERE hoặc HAVING.
Toán tử ANY trả về true nếu bất kỳ giá trị truy vấn con nào đáp ứng
điều kiện.
Toán tử ALL trả về true nếu tất cả các giá trị truy vấn con đáp ứng
điều kiện.
Cú pháp Any
SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY
(SELECT column_name FROM table_name WHERE condition);
Cú pháp All
SELECT column_name(s)
FROM table_name
WHERE column_name operator ALL
(SELECT column_name FROM table_name WHERE condition);
Lưu ý: Toán tử phải là toán tử so sánh chuẩn (=, <>,! =,>,> =, <,
Hoặc <=).
Ví dụ: Any
Toán tử BẤT KỲ trả về TRUE nếu bất kỳ giá trị truy vấn con nào đáp
ứng điều kiện.
Câu lệnh SQL sau trả về TRUE và liệt kê tên sản phẩm nếu nó
tìm thấy BẤT KỲ bản ghi nào trong bảng OrderDetails mà số
lượng = 10:
SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE
Quantity = 10);
Câu lệnh SQL sau trả về TRUE và liệt kê tên sản phẩm nếu nó
tìm thấy BẤT KỲ bản ghi nào trong bảng OrderDetails có số
lượng> 99:
SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE
Quantity > 99);
Ví dụ: All
Toán tử ALL trả về TRUE nếu tất cả các giá trị truy vấn con đáp ứng
điều kiện.
Câu lệnh SQL sau trả về TRUE và liệt kê tên sản phẩm nếu TẤT CẢ các
bản ghi trong bảng OrderDetails có số lượng = 10 (vì vậy, ví dụ này
sẽ trả về FALSE, vì không phải TẤT CẢ các bản ghi trong bảng
OrderDetails đều có số lượng = 10):
SELECT ProductName
FROM Products
WHERE ProductID = ALL (SELECT ProductID FROM OrderDetails WHERE
Quantity = 10);
Câu lệnh GROUP BY thường được sử dụng với các hàm tổng hợp (COUNT,
MAX, MIN, SUM, AVG) để nhóm tập hợp kết quả theo một hoặc nhiều cột.
Cú pháp
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
Ví dụ:
Câu lệnh SQL sau liệt kê số lượng khách hàng ở mỗi quốc gia:
Câu lệnh SQL sau liệt kê số lượng khách hàng ở mỗi quốc gia,
được sắp xếp từ cao đến thấp:
Câu lệnh SQL sau liệt kê số lượng đơn đặt hàng được gửi bởi
mỗi người gửi hàng:
Nếu một trường trong bảng là tùy chọn, có thể chèn dữ liệu mới hoặc
cập nhật dữ liệu mà không cần thêm giá trị vào trường này. Sau đó,
trường sẽ được lưu với giá trị NULL.
Lưu ý: Giá trị NULL khác với giá trị 0 hoặc trường chứa khoảng
trắng. Trường có giá trị NULL là trường đã bị bỏ trống trong quá
trình tạo dữ liệu!
Không thể kiểm tra các giá trị NULL bằng các toán tử so sánh, chẳng
hạn như =, .
Thay vào đó, chúng ta sẽ phải sử dụng các toán tử IS NULL và IS NOT
NULL.
Cú pháp IS NULL
SELECT column_names
FROM table_name
WHERE column_name IS NULL;
Cú pháp IS NOT NULL
SELECT column_names
FROM table_name
WHERE column_name IS NOT NULL;
Ví dụ: IS NULL
Toán tử IS NULL được sử dụng để kiểm tra các giá trị trống (giá trị
NULL).
SQL sau liệt kê tất cả các khách hàng có giá trị NULL trong trường
“Address”:
Toán tử IS NOT NULL được sử dụng để kiểm tra các giá trị không trống
(giá trị NOT NULL).
SQL sau liệt kê tất cả các khách hàng có giá trị trong trường
“Address”:
SELECT CustomerName, ContactName, Address
FROM Customers
WHERE Address IS NOT NULL;
Ta có bảng:
UnitsOnOrde
P_Id ProductName UnitPrice UnitsInStock
r
1 Jarlsberg 10.45 16 15
2 Mascarpone 32.56 23
3 Gorgonzola 15.67 9 20
Giả sử rằng cột “UnitsOnOrder” là tùy chọn và có thể chứa giá trị
NULL.
MySQL
Hàm IFNULL () trong MySQL cho phép bạn trả về một giá trị thay thế
nếu một biểu thức là NULL:
Hàm ISNULL () của SQL Server cho phép bạn trả về một giá trị thay
thế khi một biểu thức là NULL:
Hàm MS Access IsNull () trả về TRUE (-1) nếu biểu thức là giá trị
rỗng, ngược lại FALSE (0):
Cú pháp
2. Xoá Database
Câu lệnh DROP DATABASE được sử dụng để xoá cơ sở dữ liệu SQL hiện
có.
Cú pháp
Câu lệnh BACKUP DATABASE được sử dụng trong SQL Server để tạo bản
sao lưu đầy đủ của cơ sở dữ liệu SQL hiện có.
Cú pháp
Một sao lưu khác biệt(DIFFERENTIAL) chỉ sao lưu các phần của cơ sở
dữ liệu đã thay đổi kể từ lần sao lưu cơ sở dữ liệu đầy đủ cuối
cùng.
Cú pháp
Câu lệnh SQL sau tạo một bản sao lưu khác biệt của cơ sở dữ liệu
“cafedevDB”: