background img

Bài Viết Mới

SQL LANGUAGE: FUNCTION [3/3]

Phần này giới thiệu các hàm trong SQL, xin giới thiệu lại là cấu trúc, cú pháp của ngôn ngữ SQL chuẩn sẽ khác đôi chút với MySQL, SQL Server . . .(Điều đó có nghĩa là một số lệnh trình bày ở trên đây sẽ không thực thi được trên các hệ CSDL trên)

Tuy là các hệ csdl này dùng chuẩn SQL nhưng ngoài các thành phần chính có phát triển thêm vài thành phần mang nét riêng của nó, nói là vậy nhưng không có gì đáng lo ngại cả !

(Cuối bài sẽ cập nhật một video hướng dẫn thao tác với các  lệnh cụ thể)





DATE
- Dùng để định dang ngày tháng 

- Định dạng ngày tháng trong các hệ quản trị CSDL có thể khác định dạng trong các ngôn ngữ lập trình như : C#, Java ...

- Nếu nhập vào định dạng ngày tháng không phù hợp sẽ xảy ra lỗi




Các phương thức chính của Date Functions :

MySQL

NOW() : Trả về ngày giờ hiện tại.

CURDATE() : Trả về ngày hiện tại.

CURTIME() : Trả về giờ hiện tại

DATE() : Lấy ra phần ngày của một ngày hoặc biểu thức ngày giờ

EXTRACT() : Trả về một phần duy nhất của ngày/giờ

DATE ADD() : Bổ sung một khoảng thời gian quy định cho một ngày

DATE SUB() : Trừ một khoảng thời gian quy định cho một ngày

DATEDIFF() : Trả về tổng số ngày giữa hai ngày

DATE FORMAT() : Hiện thị ngày/giờ trong các định dạng khác nhau




SQL Server:

GETDATE() : Trả về ngày giờ hiện tại

DATEPART() : Trả về một phần của ngày giờ

DATEADD() : Cộng hoặc trừ một khoảng thời gian quy định từ Ngày

DATEDIFF() : Trả về khoảnh thời gian giữa 2 ngày.

CONVERT() : Hiển thị ngày giờ trong định dạng khác nhau

Chi tiết

NULL Values
- Các cột trong một bảng csdl có thể được thiết lập là IS NULL (Có thể để trống) 

- Nó đối lập với IS NOT NULL (Không được để trống)

Chi tiết

NULL Func
- Dùng để kiểm tra các giá trị là NULL hay không : 

ISNULL(), NVL(), IFNULL() và COALESCE()

Các hàm này được dùng trong các hệ csdl khác nhau nhưng có chung một ý nghĩa

Chi tiết

H.Tập Hợp
- Chỉ trả về một giá trị duy nhất 

- Tính các giá trị trong một cột




AVG() : Tính giá trị trung bình

COUNT() : Tính số hàng (rows)

FIRST() : Trả về giá trị đầu tiên

LAST() : Trả vể giá trị cuối cùng

MAX() : Lấy kết quả lớn nhất

MIN() : Lấy kết quả nhỏ nhất

SUM() : Lấy tổng các giá trị trong cột đó

Chi tiết

H.Vô Hướng
- Trả về một giá trị duy nhất dựa trên giá trị đầu vào 

 




 

UCASE() - Converts một field thành chữ HOA

LCASE() - Converts một field thành chữ thường

MID() - Cắt các ký tự từ một field văn bản

LEN() - Trả về độ dài của một trường văn bản (bao gồm khoảng cách _)

ROUND() - Trả về giá trị quy định trước của số thập phân

NOW() - Trả về giờ hiện tại của Hệ thống

FORMAT() - Định dạng một field đang hiển thị

Chi tiết

Lệnh Khác
- GROUP BY & HAVING được dùng trong hàm tập hợp để thay thế cho SUM, WHERE . . . vì 2 lệnh này đáp ứng cho các nhu cầu cao hơn 

Chi tiết




A1 :
DATE FUNCTONS
Các lệnh trong MYSQL 




NOW(): Trả về ngày giờ hiện tại.

Cú pháp:

SELECT NOW() FROM tableName

Example:

SELECT ProductName, // Lấy dữ liệu cột ProductName

Price, // Và cột Price

Now() AS PerDate// Và thêm cột mới tên là: PerDate

FROM Products;// Từ bảng Products

and more . . .

Các định dạng ngày tháng:

DATE - format YYYY-MM-DD

DATETIME - format: YYYY-MM-DD HH:MM:SS

TIMESTAMP - format: YYYY-MM-DD HH:MM:SS

YEAR - format YYYY or YY

----------------------------------------------------------------------

Các lệnh trong SQL Server :

Định Dạng:

DATE - format YYYY-MM-DD

DATETIME - format: YYYY-MM-DD HH:MM:SS

SMALLDATETIME - format: YYYY-MM-DD HH:MM:SS

TIMESTAMP - format: a unique number

---------------------------------------------------------------------

Test lệnh:

Lệnh query với SQL
- SELECT * FROM Orders WHERE OrderDate='1997-11-11'

To Top




A2 :
NULL VALUES
 IS NULL / IS NOT NULL

- Bạn có thể dùng 2 toán tử này để áp đặt điều kiện trả về cho câu truy vấn như dưới đây
SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NOT NULL;

To Top



A3 :
NULL FUNCTIONS
SQL Server/ MS Access:  ISNULL()
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0)) FROM Products;





Oracle : NVL()
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0)) FROM Products;

MySQL:IFNULL() / COALESCE()
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products;

hoặc
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0)) FROM Products ;

To Top



A4 :
Hàm Tập Hợp
AVG() : Tính giá trị trung bình
SQL Server:

- SELECT AVG(Price) AS PriceAverage FROM Products;

- SELECT ProductName, Price FROM Products

WHERE Price>(SELECT AVG(Price) FROM Products);

COUNT():Tính số hàng (rows)

 
SELECT COUNT(CustomerID) AS OrdersFromCustomerID7 FROM Orders WHERE CustomerID=7;// Đếm số giá trị cao trong cột (Không đếm giá trị NULL)

 
SELECT COUNT(*) AS NumberOfOrders FROM Orders;// Đếm số rows có trong bảng

 
SELECT COUNT(DISTINCT CustomerID) AS NumberOfCustomers FROM Orders;// Đếm giá trị của cột được chỉ định (bỏ qua các giá trị trùng)

FIRST() :  Trả về giá trị đầu tiên

MS Access
- SELECT FIRST(ContactName ) AS FirstCustomer FROM Customers;

SQL Server
- SELECT TOP 1 ContactName FROM Customers ORDER BY CustomerID ASC;

MySQL
- SELECT ContactName FROM Customer ORDER BY CustomerID ASC LIMIT 1;

Oracle
-SELECT ContactName FROM Customers ORDER BY CustomerID ASC WHERE ROWNUM <=1;

LAST()  : Trả vể giá trị cuối cùng

 

MS Access
-  SELECT LAST(CustomerName) AS FirstCustomer FROM Customers;

 

SQL Server
- SELECT TOP 1 CustomerName FROM Customers ORDER BY CustomerID DESC;

 

MySQL
- SELECT CustomerName FROM Customers ORDER BY CustomerID DESC LIMIT 1;

 

Oracle
- SELECT CustomerName FROM Customers ORDER BY CustomerID DESC WHERE ROWNUM <=1;

MAX() : Lấy kết quả lớn nhất
SELECT MAX(Price) AS HighestPrice FROM Products;

MIN() : Lấy kết quả nhỏ nhất
SELECT MIN(Price) AS SmallestOrderPrice FROM Products;

SUM() : Tính tổng
SELECT SUM(Quantity) AS TotalItemsOrdered FROM OrderDetails;

To Top



A5 :
Hàm Vô Hướng
UCASE() : Converts một field thành chữ HOA
SQL Server

- SELECT UCASE(CustomerName) AS Customer, City FROM Customers;

LCASE() : Converts một field thành chữ thường
SQL Server

- SELECT LCASE(CustomerName) AS Customer, City FROM Customers;

MID() : Cắt các ký tự từ một field văn bản

 
SELECT MID(City,1,4) AS ShortCity FROM Customers;

LEN() : Trả về độ dài của một trường văn bản (bao gồm khoảng cách _)

 
SELECT ContactName,LEN(Address) as LengthOfAddress FROM Customers;

ROUND() : Trả về giá trị quy định trước của số thập phân

 
SELECT ProductName, ROUND(Price,0) AS RoundedPrice FROM Products;

NOW() : Trả về giờ hiện tại của Hệ thống

 
SELECT ProductName, Price, Now() AS PerDate FROM Products;

FORMAT() : Định dạng một field đang hiển thị

 
SELECT ProductName, Price, FORMAT(Now(),'YYYY-MM-DD') AS PerDate FROM Products;


To Top



 

A6 :
GROUP BY & HAVING
1. GROUP BY

Có 2 bảng như sau trong csdl NorthWind :









Bảng : Categories 










Bảng : Products 

Từ Bảng Products

Dùng lệnh query sau:
SELECT  SUM(UnitsInStock)  AS NumberOfOrders FROM Products;


Kết quả này chính là tổng tất cả giá trị tại cột UnitsInStock

Ta thử lại lệnh trên với GROUP BY
SELECT  SUM(UnitsInStock)  AS NumberOfOrders,  ProductName  FROM Products GROUP BY ProductName;

- Khác với lệnh đầu tiên một chút. Bây giờ ta nhóm ProductName. Điều này có nghĩa là tính tổng tất cả giá trị tại cột UnitsInStock cho giá trị ProductName cùng tên. Nếu khác tên thì tính riêng như hình bên.

- Điều này lệnh SUM không thể làm được nếu không có sự trợ giúp của lệnh GROUP BY

- Lệnh Group By còn có thể nhóm nhiều bảng và nhiều cột cùng lúc như ví dụ dưới . . .
Xin lấy làm mẫu một đoạn lệnh Query như sau:
SELECT Categories.CategoryName,COUNT(Products.ProductID)

AS NumberOfOrders

FROM Products

LEFT JOIN Categories

ON Products.CategoryID = Categories.CategoryID

GROUP BY CategoryName;


// Đoạn lệnh trên lấy ra 2 cột và có nghĩa như sau :

Lấy Products  LEFT JOIN với Categories (xem lại bài 2)

Và lấy ra 2 giá trị sau:

CategoryName  ( Trong bảng Categories )

NumberOfOrders 

(Tổng số hàng của ProductID trong bảng Products )

Điều kiện tiến quyết CategoryID bằng nhau

Và GROUP BY bởi giá trị CategoryName
Bây giờ chúng ta tiếp một ví dụ nữa đó là GROUP BY 2 cột trong bảng Products
SELECT SUM(UnitsInStock) AS NumberOfOrders,ProductID, ProductName FROM Products GROUP BY ProductID,ProductName;

 - Kết quả cũng tương tự như nhóm giá trị cho một cột, bây giờ ta nhóm cho 2 cột thì nếu như cả hai cột này có giá trị trùng (Match) thì nhóm thành 1 nhóm và tính tổng giá trị. Tương tự ví dụ trước thôi nhỉ ?

- Nhóm cho 2 cột và 2 bảng trở lên bạn tự test xem nhé . . .

 

 

 

 

2. HAVING

- Nếu ta sử dụng các hàm tập hợp và đặc biệt là có sử dụng Group By thì Where không thể phát huy tác dụng của nó. Nên SQL mới sinh ra lệnh HAVING

- Chúng ta sẽ lấy lại ví dụ ở trên nhé:

(Tôi thêm lệnh Having vào cuối như dưới)
SELECT  SUM(UnitsInStock)

AS NumberOfOrders,  ProductName

FROM Products GROUP BY ProductName

Having  SUM(UnitsInStock) > 100;










Kick vào để xem ảnh lớn hơn

Nhìn kết quả bạn có kết luận gì ? Thì ở đây đơn giản là sau khi tính toán chỉ hiển thị những nhóm có giá trị lớn hơn 100.


To Top

-------------------------------------------------------------------------------------End !


(Vì vấn đề thời gian bài viết này sẽ được cập nhật video demo với các lệnh SQL trên SQL Server trong thời gian tới)

:ahhyes:


Thank you for reading !


Nguồn: Tự Học IT Online - http://tuhocit.net

9 nhận xét: Leave Your Comments

  1. :yawndoodle: Viết nhanh quá ấy mà. Nhìn mặt gian thấy sợ :doubt:

    Trả lờiXóa
  2. Sân nhà mà ku phết 8/10 start á :run:

    Trả lờiXóa
  3. 2 đứa tự sướng với nhau :ahhyes:

    Trả lờiXóa
  4. Mà hình watermark cái bravohex.com rồi à @@
    A mà mua tên miền đó, muốn mua lại a bán 500K là ít =))

    Trả lờiXóa
  5. Đục nước béo anh hả :burning:

    Trả lờiXóa
  6. watermark đâu. Dùng PTS, làm sẵn cái templ kéo thả phát cho tiện ;))

    Trả lờiXóa

Xem Nhiều