Advanced Query Techniques Advanced Query Techniques Bởi: Khoa CNTT ĐHSP KT Hưng Yên Trong phần đào sâu số câu lệnh nâng cao SELECT, INSERT Có thể nói biết qua câu lệnh kiểu "SELECT * FROM TABLENAME WHERE " có nhiều người đến tính chất nâng cao Cú pháp đầy đủ câu lệnh SELECT phức tạp nhiên trình bày nét lệnh mà thôi: SELECT select_list [ INTO new_table ] FROM table_source [ WHERE search_condition ] [ GROUP BY group_by_expression ] [ HAVING search_condition ] [ ORDER BY order_expression [ ASC | DESC ] ] Chúng ta nghiên cứu clause (mệnh đề) câu lệnh SELECT Clause Sau keyword (từ khóa) SELECT ta có danh sách cột mà ta muốn select cách dấu "," Có Keywords cần nhấn mạnh phần SELECT • Distinct : Khi có keyword vào cho kết cột không trùng Ví dụ Orders table Norwind database (database mẫu di kèm với SQL Server) chứa giá trị trùng lập (duplicate value) cột ShipCity Nếu ta muốn select danh sách ShipCity city xuất lần kết nhận ta dùng sau: SELECT DISTINCT ShipCity, ShipRegion FROM Orders ORDER BY ShipCity • Topn : Nếu ta muốn select n hàng mà ta dùng Top keyword Nếu có thêm ORDER BY kết order trước sau 1/4 Advanced Query Techniques select Chúng ta select số hàng dựa phần trăm cách thêm Keyword Percent vào Ví dụ sau select 10 hàng theo thứ tự: SELECT DISTINCT TOP 10 ShipCity, ShipRegion FROM Orders ORDER BY ShipCity • As : Ðôi muốn cho SELECT statement dễ đọc chút ta dùng alias (tức từ thay hay từ viết tắt) với keyword As hay keyword As: table_name As table_alias hay table_nametable_alias Ví dụ: USE pubs SELECT p.pub_id, p.pub_name AS PubName FROM publishers AS p Ngoài Select list ta select dạng expression sau: SELECT FirstName + ' ' + LastName AS "Employee Name", IDENTITYCOL AS "Employee ID", HomePhone, Region FROM Northwind.dbo.Employees ORDER BY LastName, FirstName ASC Trong ví dụ ta select cột "Employee Name" sản phẩm ghép lại cột FirstName LastName cách khoảng trắng Một giá trị thuộc loại identity để làm cột "Employee ID" Kết theo thứ tự từ nhỏ tới lớn (ASC) (còn DESC từ lớn tới nhỏ) cột LastName trước tới cột FirstName The INTO Clause INTO Clause cho phép ta select data từ hay nhiều table sau kết insert vào table Table tạo kết câu lệnh SELECT INTO Ví dụ: 2/4 Advanced Query Techniques SELECT FirstName, LastName INTO EmployeeNames FROM Employers Câu lệnh tên tạo table có tên EmployeeNames với cột FirstName LastName sau kết select từ table Employers insert vào table Nếu table EmployeeNames tồn SQL Server báo lỗi Câu lệnh thường hay sử dụng để select lượng data lớn từ nhiều table khác vào table (thường dùng cho mục đích tạm thời (temporary table)) mà khỏi phải thực thi câu lệnh Insert nhiều lần Một cách khác select data từ hay nhiều table insert vào table khác dùng "Insert Into Select " Nhưng câu lệnh không tạo table Nghĩa ta table phải tồn trước Ví dụ: INSERT INTO EmployeeNames SELECT FirstName, LastName FROM Employers Chú ý chữ "Value" câu Insert The GROUP BY and HAVING Clauses GROUP BY dùng để tạo giá trị tổng (aggregate values) cho hàng kết select Chỉ có hàng cho giá trị riêng biệt (distinct) cột Các cột select phải nằm GROUP BY Clause Hãy xem ví dụ phức tạp sau: SELECT OrdD1.OrderID AS OrderID, SUM(OrdD1.Quantity) AS "Units Sold", SUM(OrdD1.UnitPrice * OrdD1.Quantity) AS Revenue FROM [Order Details] AS OrdD1 WHERE OrdD1.OrderID in (SELECT DISTINCT OrdD2.OrderID FROM [Order Details] AS OrdD2 WHERE OrdD2.UnitPrice > $100) 3/4 Advanced Query Techniques GROUP BY OrdD1.OrderID HAVING SUM(OrdD1.Quantity) > 100 Trong ví dụ ta select order riêng biệt (distinct) từ Order Details table với giá > 100 Sau tiếp tục select OrderID, "Units Sold", Revenue từ kết "Units Sold" Revenue aggregate columns (cho giá trị tổng cột hàng có OrderID) HAVING Clause đóng vai trò filter dùng để lọc lại giá trị cần select mà HAVING Clause thường chung với GROUP BY xuất riêng lẻ UNION Uninon keyword có nhiệm vụ ghép nối kết hay nhiều queries lại thành kết Ví dụ: Giả sử có table1(ColumnA varchar(10), ColumnB int) table2(ColumnC varchar(10), ColumnD int) Ta muốn select data từ table1 ghép với data từ table2 để tạo thành kết ta làm sau: SELECT * FROM Table1 UNION ALL SELECT * FROM Table2 Nếu keyword ALL hàng giống từ table xuất lần kết Còn dùng ALL hàng table có kết bất chấp việc lập lại Khi Dùng Union phải ý hai chuyện: số cột select queries phải data type cột tương ứng phải compatible (tương thích) 4/4 .. .Advanced Query Techniques select Chúng ta select số hàng dựa phần trăm cách thêm Keyword Percent vào Ví... từ hay nhiều table sau kết insert vào table Table tạo kết câu lệnh SELECT INTO Ví dụ: 2/4 Advanced Query Techniques SELECT FirstName, LastName INTO EmployeeNames FROM Employers Câu lệnh tên tạo... (SELECT DISTINCT OrdD2.OrderID FROM [Order Details] AS OrdD2 WHERE OrdD2.UnitPrice > $100) 3/4 Advanced Query Techniques GROUP BY OrdD1.OrderID HAVING SUM(OrdD1.Quantity) > 100 Trong ví dụ ta select