Categories
Chia sẻ

Câu lệnh truy vấn SQL – Phần 2

Goose surgery may have been demonstrated to anastomose a systemic to a diminished artery, to improve the medullary blood flow, and increase cyanosis. Endogenous Type D portals are also present in the New https://vgrmalaysia.com/buy-cialis-malaysia.html Lethargic chap monkey, mice and the rhesus brushtail shake, an Alpine marsupial.
Tiếp theo bài Câu lệnh truy vấn SQL – Phần 1

Các hàm SQL

SQL có một số hàm tạo sẵn để đếm và tính toán.

Cú pháp dùng hàm

Cú pháp cho các hàm SQL tạo sẵn như sau::

SELECT function(column) FROM table

Bảng gốc (dùng trong các ví dụ)

[table tablesorter=”o” class=”table table-border”]

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

[/table]

Hàm AVG(column)

Hàm AVG trị trung bình của dữ liệu trong một cột có đu7ọc nhờ phép chọn. Các trị NULL sẽ không được tính toán.

Ví dụ

Ví dụ này trả về tuổi trung bình của những người trong bảng “Persons”:

SELECT AVG(Age) FROM Persons

Kết quả

32.67

Ví dụ

Ví dụ này trả về tuổi trung bình của những người có tuổi lớn hơn 20 tuổi:

SELECT AVG(Age) FROM Persons where Age>20

Kết quả

39.5

Hàm MAX(column)

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

Ví dụ

SELECT MAX(Age) FROM Persons

Kết quả:

45

Hàm MIN(column)

Hàm MIN trả về trị lớn nhất trong một cột. Các trị NULL sẽ không được tính toán.

Ví dụ

SELECT MIN(Age) FROM Persons

Kết quả:

19

Chú ý: Các hàm MIN và MAX cũng có thể dùng trên các cột văn bản, để tìm trị lớn nhất và nhỏ nhất theo thứ tự alphabet.

Hàm SUM(column)

Hàm SUM tổng của một cột có được nhờ phép chọn. Các trị NULL sẽ không được tính toán.

Ví dụ

Ví dụ này trả về tổng số tuổi của những người trong bảng “Persons”:

SELECT SUM(Age) FROM Persons

Kết quả:

98

Ví dụ

Ví dụ này trả về tổng số tuổi của những người lớn hơn 20 tuổi.

SELECT SUM(Age) FROM Persons where Age>20

Kết quả:

79

 

SQL Group By và SQL Having

Các hàm tổng (như SUM) thường kèm theo chức năng GROUP BY.

Từ khóa GROUP BY

Từ khóa GROUP BY được thêm vào SQL vì các hàm tổng (như SUM) trả về tổng của tất cả các trị trong cột mỗi khi chúng ta gọi đến.

Thiếu chức năng GROUP BY, không thể tìm tổng của mỗi nhóm trị riêng trong cột.

Cú pháp của GROUP BY như sau:

SELECT column,SUM(column) FROM table GROUP BY column

Ví dụ GROUP BY

Bảng “Sales”:

[table tablesorter=”o” class=”table table-border”]

Company, Amount
W3Schools, 5500
IBM, 4500
W3Schools, 7100

[/table]

Với SQL:

SELECT Company, SUM(Amount) FROM Sales

Trả về kết quả như sau:

[table tablesorter=”o” class=”table table-border”]

Company, SUM(Amount)
W3Schools, 17100
IBM, 17100
W3Schools, 17100

[/table]

SQL trên không trả về tổng riêng biệt của từng công ty. Dùng mệnh đề GROUP BY như sau:

SELECT Company,SUM(Amount) FROM Sales
GROUP BY Company

Sẽ trả về kết quả đúng:

[table tablesorter=”o” class=”table table-border”]

Company, SUM(Amount)
W3Schools, 12600
IBM, 4500

[/table]

Từ khóa The HAVING

Từ khóa HAVING được thêm vào SQL vì từ khóa WHERE không thể dùng với các hàm tổng (như hàm SUM).

Thiếu từ khóa HAVING sẽ không thể kiểm tra các điều kiện dùng hàm tổng.

Cú pháp của HAVING như sau:

SELECT column,SUM(column) FROM table 
GROUP BY column 
HAVING SUM(column) condition value

Bảng “Sales”:

[table tablesorter=”o” class=”table table-border”]

Company, Amount
W3Schools, 5500
IBM, 4500
W3Schools, 7100

[/table]

Với SQL:

SELECT Company,SUM(Amount) FROM Sales 
GROUP BY Company HAVING SUM(Amount)>10000

Trả về kết quả

[table tablesorter=”o” class=”table table-border”]

Company, SUM(Amount)
W3Schools, 12600

[/table]

 

Các bí danh (Alias) SQL

Với SQL, các bí danh (alias) có thể dùng thay các tên cột và các tên bảng.

Bí danh tên Cột

Cú pháp như sau:

SELECT column AS column_alias FROM table

Bí danh tên Bảng

Cú pháp như sau:

SELECT column FROM table AS table_alias

Ví dụ: Dùng bí danh tên Cột

Bảng “Persons”:

[table tablesorter=”o” class=”table table-border”]

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

[/table]

Với SQL sau:

SELECT LastName AS Family, FirstName AS Name 
FROM Persons

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

[table tablesorter=”o” class=”table table-border”]

Family, Name
Hansen, Ola
Svendson, Tove
Pettersen, Kari

[/table]

Ví dụ: Dùng bí danh tên Bảng

Bảng “Persons”:

[table tablesorter=”o” class=”table table-border”]

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

[/table]

Với SQL sau:

SELECT LastName, FirstName 
FROM Persons AS Employees

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

Bảng Employees:

[table tablesorter=”o” class=”table table-border”]

LastName, FirstName
Hansen, Ola
Svendson, Tove
Pettersen, Kari

[/table]

 

SQL Join

Joins and các Khóa (Key)

Đôi khi chúng ta chọn dữ liệu từ hai bảng để tạo kết quả, Chúng ta thực hiện một kết nối (join).
Các bảng trong cơ sở dữ liệu có thể liên hệ với các bảng khác thông qua các khóa. Một khóa chính (primary key) là một cột với các trị duy nhất cho mỗi hàng. Mục tiêu là ràng buộc dữ liệu, tham chiếu chéo các bảng, không cần lặp lại tất cả dữ liệu trong từng bảng.
Trong bảng “Employees” phía dưới, cột “ID” là khóa chính, nghĩa là cột này không có hai hàng cùng ID. ID dùng phân biệt hai người nếu cả hai có cùng tên.
Khi bạn xem bảng ví dụ phía dưới, chú ý rằng:
• Cột “ID” là khóa chính của bảng “Employees”
• Cột “ID” trong bảng “Orders” dùng để tham chiếu các tên trong bảng “Employees” không cần đưa các tên này vào
bảng “Orders”

Employees:

[table tablesorter=”o” class=”table table-border”]

ID, Name
01, “Hansen, Ola ”
02, “Svendson, Tove ”
03, “Svendson, Stephen ”
04, “Pettersen, Kari”

[/table]

Orders:

[table tablesorter=”o” class=”table table-border”]

ID, Product
01, Printer
03, Table
03, Chair

[/table]

Tham chiếu đến hai Bảng

Chúng ta có thể chọn dữ liệu từ hai bảng bằng cách tham chiếu đến hai bảng, như sau:

Ví dụ

Ai đã đăng ký một sản phẩm và đăng ký sản phẩm nào?

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

Kết quả

[table tablesorter=”o” class=”table table-border”]

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

[/table]

Ví dụ

Ai đã đăng ký một máy in?

SELECT Employees.Name 
FROM Employees, Orders 
WHERE Employees.ID = Orders.ID 
AND Orders.Product = 'Printer'

Kết quả

[table tablesorter=”o” class=”table table-border”]

Name
“Hansen, Ola ”

[/table]

Dùng các Kết nối (Join)

HOẶC, chúng ta có thể chọn dữ liệu từ hai bảng với từ khóa JOIN, giống như sau:

Ví dụ INNER JOIN

Cú pháp

SELECT field1, field2, field3 
FROM first_table 
INNER JOIN second_table 
ON first_table.keyfield = second_table.foreign_keyfield

Ai đã đăng ký một sản phẩm và đăng ký sản phẩm nào?

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

INNER JOIN trả về tất cả các hàng từ hai bảng khi điều kiện được so trùng. Nếu các hàng trong bảng Employees không so trùng trong bảng Orders, hàng đó sẽ không được liệt kê ra.

Kết quả

[table tablesorter=”o” class=”table table-border”]

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

[/table]

Ví dụ LEFT JOIN

Cú pháp

SELECT field1, field2, field3 
FROM first_table 
LEFT JOIN second_table 
ON first_table.keyfield = second_table.foreign_keyfield

Liệt kê tất cả nhân viên, và các đăng ký mua của họ nếu có.

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

LEFT JOIN trả về tất cả các hàng từ bảng thứ nhất (Employees), cho dù nó không được so trùng trong bảng thứ hai (Orders).
Nếu các hàng trong bảng Employees không so trùng trong bảng Orders, những hàng này cũng được liệt kê.

Kết quả

[table tablesorter=”o” class=”table table-border”]

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

[/table]

Ví dụ RIGHT JOIN

Cú pháp

SELECT field1, field2, field3 
FROM first_table 
RIGHT JOIN second_table 
ON first_table.keyfield = second_table.foreign_keyfield

Liệt kê tất cả nhân viên, và các đăng ký mua của họ nếu có.

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

RIGHT JOIN trả về tất cả các hàng từ bảng thứ hai (Orders), cho dù nó không được so trùng trong bảng thứ nhất (Employees).
Nếu có bất kỳ hàng nào trong bảng Orders không được so trùng trong bảng Employees, các hàng này cũng được liệt kê.

Kết quả

[table tablesorter=”o” class=”table table-border”]

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

[/table]

Ví dụ

Ai đăng ký một máy in?

SELECT Employees.Name 
FROM Employees 
INNER JOIN Orders 
ON Employees.ID = Orders.ID 
WHERE Orders.Product = 'Printer'

Kết quả

[table tablesorter=”o” class=”table table-border”]
Name
“Hansen, Ola”

[/table]

 

SQL Tạo Cơ sở dữ liệu và Bảng

Tạo một Cơ sở dữ liệu

Để tạo một cơ sở dữ liệu:

CREATE DATABASE database_name

Tạo một bảng

Để tạo một bảng trong một cơ sở dữ liệu:

CREATE TABLE table_name 
( 
column_name1 data_type, 
column_name2 data_type, 
....... 
)

Ví dụ

Ví dụ này minh họa các bạn tạo một bảng tên “Person”, với bốn cột tên:”LastName”, “FirstName”, “Address”, và “Age”:

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

Ví dụ này minh họa cách bạn chỉ định kích thước tối đa của vài cột:

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

Kiểu dữ liệu được chỉ định là kiểu dữ liệu chứa trong cột. Bảng dưới chứa các kiểu dữ liệu thường gặp nhất trong SQL:
Kiểu dữ liệu Mô tả

[table tablesorter=”o” class=”table table-border”]

“integer(size)
int(size)
 smallint(size)
 tinyint(size) “,”Chỉ chứa số nguyên. Số ký tự số tối đa được chỉ định trong dấu ngoặc đơn ”
“decimal(size, d)
 numeric(size,d) “,”Chứa số với phân số. Số ký tự số tối đa được chỉ định trong “size”. Số ký tự số tối đa bên phải (phần phân số) được chỉ định trong ‘d’ ”
“char(size)”,” Chứa chuỗi có kích thước cố định (có thể chứa ký tự chữ, số, và các ký tự đặc biệt). Kích thước cố định được chỉ định trong dấu ngoặc đơn ”
“varchar(size)”,” Chứa một chuỗi có chiều dài thay đổi (có thể chứa ký tự chữ, số, và các ký tự đặc biệt). Kích thước tối đa được chỉ định trong dấu ngoặc đơn ”
“date(yyyymmdd)”,” Chứa một ngày”

[/table]

Tạo Chỉ mục (Index)

Chỉ mục được tạo ra trên một bảng có sẵn để định vị thêm nhanh và hiệu quả các hàng. Có thể tạo một chỉ mục trên một hoặc nhiều cột của một bảng, với một chỉ mục cho một tên. Người dùng không nhìn thấy các chỉ mục, chúng chỉ dùng để tăng tốc độ truy vấn.
Chú ý: Cập nhật một bảng chứa chỉ mục cần nhiều thời gian hơn cập nhật một bảng không chứa chỉ mục, vì chỉ mục cũng cần cập nhật. Tuy nhiên, ý tưởng tốt là tạo chỉ mục chỉ trên các cột thường tìm kiếm nhất.

Một Chỉ mục duy nhất

Tạo một chỉ mục duy nhất trên một bảng. một chỉ mục duy nhất nghĩa là không thể có hai hàng có cùng một trị chỉ mục.

CREATE UNIQUE INDEX index_name 
ON table_name (column_name)

“column_name” chỉ định cột bạn muốn chỉ mục.

Một Chỉ mục đơn giản

Tạo một chỉ mục đơn giản trên một bảng. Khi từ khóa UNIQUE không có, các trị trùng sẽ được cho phép.

CREATE INDEX index_name 
ON table_name (column_name)

“column_name” chỉ định cột bạn muốn chỉ mục.

Ví dụ

Ví dụ này tạo một chỉ mục đơn giản, có tên “PersonIndex”, trên field LastName của bảng Person:

CREATE INDEX PersonIndex 
ON Person (LastName)

Nếu bạn muốn chỉ mục các trị trong một cột theo thứ tự giảm (descending), bạn có thể thêm từ DESC sau tên cột:

CREATE INDEX PersonIndex 
ON Person (LastName DESC)

Nếu bạn muốn chỉ mục nhiều hơn một cột bạn có thể liệt kê các tên cột trong dấu ngoặc đơn, tách chúng bằng dấu phẩy:

CREATE INDEX PersonIndex 
ON Person (LastName, FirstName)

Xóa chỉ mục

Bạn có thể xóa một chỉ mục có trong một bảng với phát biểu DROP.

DROP INDEX table_name.index_name

Xóa một cơ sở dữ liệu hoặc bảng

Để xóa một cơ sở dữ liệu:

DROP DATABASE database_name

Để xóa một bảng:

DROP TABLE table_name

Để xóa toàn bộ dữ liệu trong bảng mà không xóa bảng:

DELETE TABLE table_name

 

SQL Alter Table

Alter Table

Phát biểu ALTER TABLE dùng để thêm hay loại bỏ các cột trong một bảng cho trước.

ALTER TABLE table_name 
ADD column_name datatype 
ALTER TABLE table_name 
DROP column_name

Person:

[table tablesorter=”o” class=”table table-border”]

LastName, FirstName, Address
Pettersen, Kari, Storgt 20

[/table]

Ví dụ

Để thêm một cột tên “City” vào bảng “Person”:

ALTER TABLE Person ADD City varchar(30)

Kết quả:

[table tablesorter=”o” class=”table table-border”]

LastName, FirstName, Address, City
Pettersen, Kari, Storgt 20 ,””

[/table]

Ví dụ

Để loại cột “Address” khỏi bảng “Person”:

ALTER TABLE Person DROP Address

Kết quả:

[table tablesorter=”o” class=”table table-border”]

LastName, FirstName, City
Pettersen, Kari,””

[/table]