Lệnh SELECT trong SQL Server và các mệnh đề truy vấn dữ liệu
- 25-05-2022
- Toanngo92
- 0 Comments
Nhiều phiên bản sql sử dụng FROM trong truy vấn của họ, nhưng trong tất cả các phiên bản từ SQL server 2005, bao gồm cả SQL Server 2019, người ta có thể sử dụng câu lệnh SELECT mà không cần sử dụng mệnh đề FROM.
Mục lục
Câu lệnh SELECT
Một bảng với dữ liệu của nó có thể được xem bằng cách sử dụng câu lệnh SELECT. Câu lệnh SELECT trong một truy vấn sẽ hiển thị thông tin cần thiết trong một bảng. Câu lệnh SELECT truy xuất các hàng và cột cho một hoặc nhiều bảng. Đầu ra của câu lệnh SELECT là một bảng khác được gọi là tập kết quả. Câu lệnh SELECT cũng nối hai bảng hoặc lấy một tập hợp con các cột từ một hoặc nhiều bảng. Câu lệnh SELECT xác định các cột được sử dụng cho một truy vấn. Cú pháp của câu lệnh SELECT có thể bao gồm một loạt các biểu thức được phân tách bằng dấu phẩy. Mỗi biểu thức trong câu lệnh là một cột trong tập kết quả. Các cột xuất hiện theo trình tự giống như thứ tự của biểu thức trong câu lệnh SELECt. Câu lệnh SELECT lấy các hàng từ cơ sở dữ liệu và cho phép chọn một hoặc nhiều hàng.
Về tuần tự thực hiện, mệnh đề SELECT sẽ được thực thi cuối cùng, mặc dù được viết ở đầu câu
Cú pháp:
SELECT <column_name1> [,column_name2] FROM <table_name>
Ví dụ:
SELECT [BusinessEntityID]
,[PersonType]
,[NameStyle]
,[Title]
,[FirstName]
,[MiddleName]
,[LastName]
,[Suffix]
,[EmailPromotion]
,[AdditionalContactInfo]
,[Demographics]
,[rowguid]
,[ModifiedDate]
FROM [AdventureWorks2019].[Person].[Person]
Select không có FROM
Nhiều phiên bản SQL sử dụng FROM trong truy vấn của họ, nhưng trong tất cả các phiên bản từ SQL Server 2005, bao gồm cả SQL Server2019, có thể sử dụng câu lệnh SELECT mà không cần sử dụng mệnh đề FROM.
Ví dụ:
SELECT LEFT ('Hello World',5)
Hiển thị toàn bộ cột
Từ khóa hoa thị (*) sử dụng cho câu lệnh SELECT để lấy ra dữ liệu của toàn bộ cột trong bảng. Nó được sử dụng như cách viết tắt thay cho việc viết ra danh sách của toàn bộ cột trong bảng.
Cú pháp:
SELECT * FROM <table_name>
Ví dụ:
SELECT * FROM [AdventureWorks2019].[Person].[Person]
Dấu * rất tiện lợi trong trường hợp có quá nhiều column và bạn không thể nhớ hết tên column, hoặc viết ra thì quá dài dòng. Tuy nhiên khi làm thực tế bạn không nên lạm dụng dấu * quá bởi như vậy hệ thống sẽ chạy rất nặng vì dữ liệu sẽ bị dư thừa. Ví dụ bạn xây dựng chức năng hiển thị tên người dùng thì chỉ cần viết select username là ok, không nhất thiết phải SELECT * vì lấy ra càng nhiều cột hiệu năng sẽ càng giảm và tốn nhiều ram.
Các biểu thức khác với SELECT
Câu lệnh SELECT cho phép người dùng chỉ định biểu thức khác nhau để xem tập kết quả một cách có thứ tự. Các biểu thức này gán các tên khác nhau cho các cột trong tập kết quả, tính toán các giá trị và loại bỏ các giá trị trùng lặp
Sử dụng hằng số (constants) trong tập kết quả (result sets)
Hằng số chuỗi ký tự được sử dụng khi các cột ký tự được nối với nhau. Chúng giúp định dạng hoặc khả năng đọc thích hợp. Các hằng số này không được chỉ định như một cột riêng biệt trong tập kết quả. Thông thường ứng dụng xây dựng các giá trị không đổi vào kết quả khi chúng được hiển thị sẽ hiệu quả hơn thay vì sử dụng máy chủ để kết hợp các giá trị không đổi. Ví dụ: để bao gồm ‘:’ và ‘->’ trong tập kết quả để hiển thị tên quốc gia, mã vùng quốc gia và nhóm tương ứng của nó, câu lệnh SELECT được hiển thị trong ví dụ sau:
USE AdventureWorks2019
SELECT Name+':'+CountryRegionCode+'->'+[Group] FROM Sales.SalesTerritory
Đổi tên cột trong tập kết quả
Các cột được hiển thị trong tập kết quả của các truy vấn có tiêu đề tương ứng có thể được thay đổi, đổi tên hoặc có thể được gán một tên mới bằng cách sử dụng mệnh đề AS. Bằng cách tùy chỉnh các tiêu đề, chúng trở nên dễ hiểu và có ngữ nghĩa hơn.
Ví dụ:
USE AdventureWorks2019
SELECT Name+':'+CountryRegionCode+'->'+[Group] AS NameRegion FROM Sales.SalesTerritory
Tính toán giá trị trong tập kết quả
Câu lệnh SELECT có thể chứa các biểu thức toán học bằng cách áp dụng các toán tử cho một hoặc nhiều cột. Nó cho phép tập kết quả chứa các giá trị không tồn tại trong bảng cơ sở, nhưng được tính toán từ các giá trị được lưu trữ trong bảng cơ sở.
Ví dụ giảm 15% cho tập kết quả để sử dụng cho hiển thị khuyến mại:
USE AdventureWorks2019
SELECT ProductID,StandardCost,StandardCost*0.16 AS Discount FROM
Production.ProductCostHistory
GO
Sử dụng DISTINCT
Từ khóa DISTINCT ngăn chặn việc truy xuất các bản ghi trùng lặp. Nó loại bỏ các hàng đang lặp lại khỏi tập kết quả của một câu lệnh SELECT. Ví dụ: nếu cột StandardCost được chọn mà không sử dụng từ khóa DISTINCT, nó sẽ hiển thị mọi bản ghi của StandardCost chỉ một lần như ví dụ:
USE AdventureWorks2019
SELECT DISTINCT ProductID,StandardCost,StandardCost*0.16 AS Discount FROM
Production.ProductCostHistory
GO
Sử dụng TOP và PERCENT trong SELECT
Từ khóa TOP sẽ hiển thị chỉ một phần tập hợp trong tập kết quả. Tập hợp các bảng ghi sẽ được giới hạn bằng số hoặc phần trăm (%), Biểu thức TOP cũng có thể sử dụng với các câu lệnh như INSERT, UPDATE, DELETE.
Cú pháp:
SELECT [ALL|DISTINCT] [TOP expression [PERCENT] [NUMER]] FROM <table_name>
Ví dụ:
USE AdventureWorks2019
SELECT TOP 100 ProductID,StandardCost,StandardCost*0.16 AS Discount FROM
Production.ProductCostHistory
GO
SELECT kết hợp cùng INTO
Mệnh đề INTO tạo một bảng mới và chèn các hàng và cột được liệt kê trong câu lệnh SELECT vào đó.
Mệnh đề INTO cũng chèn các hàng hiện có vào bảng mới. Để thực hiện mệnh đề này với câu lệnh SELECT, người dùng phải có quyền CREATE TABLE trong cơ sở dữ liệu đích.
Cú pháp:
SELECT <column_name1>,[, <column_name2> ...] INTO <new_table> FROM table_list
Ví dụ:
USE AdventureWorks2019
SELECT ProductModelID, Name INTO Production.ProductName FROM production.ProductModel
GO
SELECT kết hợp cùng WHERE
Mệnh đề WHERE với câu lệnh SELECT được sử dụng để chọn hoặc giới hạn có điều kiện ( dễ hiểu hơn là lọc bản ghi) các bản ghi được truy xuất bởi truy vấn. Mệnh đề WHERE chỉ định Biểu thức Boolean để kiểm tra các hàng được trả về bởi truy vấn. Hàng được trả về nếu biểu thức là đúng và bị loại bỏ nếu sai.
Cú pháp:
SELECT <column_name1> [, <column_name2> ...] FROM <table_name> WHERE <search_condition>
Các toán tử quan hệ trong SELECT:
Ví dụ sử dụng mệnh đề WHERE để hiển thị dữ liệu voiws Endate là ngày xác định
USE AdventureWorks2019
SELECT * FROM Production.ProductCostHistory WHERE EndDate ='2013-05-29'
GO
Tất cả các truy vấn trong SQL sử dụng dấu nháy đơn để bao các giá trị văn bản.
Ví dụ:
USE AdventureWorks2019
SELECT * FROM Person.Person WHERE City='Bothell'
Các giá trị số không cần sử dụng dấu nháy đơn để bao
Ví dụ:
USE AdventureWorks2019
SELECT * FROM HumanResources.Department WHERE DepartmentID < 10
GO
Mệnh đề WHERE có thể sử dụng với các kí tự wildcard, là khái niệm về kí tự sử dụng cho từ khóa LIKE để tạo một câu lệnh truy vấn chính xác và cụ thể
Mệnh đề WHERE cũng có thể sử dụng với các toán tử logic như AND, OR, NOT. Các toán tử được sử dụng kết hợp cùng các điều kiện tìm kiếm trong mệnh đề WHERE
Toán tử AND kết hợp 2 hoặc nhiều điều kiện và trả về TRUE chỉ khi cả 2 điều kiện thỏa mãn, kết quả sẽ trả ra tooàn bộ các bản ghi nếu thỏa mãn điều kiện.
Ví dụ:
USE AdventureWorks2019
SELECT * FROM Person.Address WHERE AddressID > 900 AND City='Seattle'
GO
Toán tử OR trả về TRUE và hiển thị các bản ghi nếu nó thỏa mãn một trong các điều kiện trong mệnh đề WHERE.
Ví dụ:
USE AdventureWorks2019
SELECT * FROM Person.Address WHERE AddressID > 900 OR City='Seattle'
GO
Toán tử NOT là phủ định của điều kiện tìm kiếm
Ví dụ:
USE AdventureWorks2019
SELECT * FROM Person.Address WHERE NOT AddressID = 5
Mệnh đề GROUP BY
Mệnh đề GROUP BY phân vùng kết quả thành một hoặc nhiều tập hợp con. Mỗi tập hợp con có các giá trị và biểu thức chung. Nếu một hàm tổng hợp được sử dụng trong mệnh đề GROUP BY, thì tập kết quả sẽ tạo ra các giá trị đơn lẻ cho mỗi tổng hợp
Từ khóa GROUP BY được theo sau bởi một danh sách các cột, được gọi là grouped column ( cột được nhóm lại). Mỗi grouped column hạn chế số hàng của tập kết quả. Đối với mỗi grouped column, chỉ có một hàng.
Mệnh đề GROUP BY có thể có nhiều hơn một grouped column.
SELECT <column_name1>, [, column_name2 , ...] FROM <table_name> GROUP BY <column_name>
Ví dụ:
USE AdventureWorks2019
SELECT WorkOrderID,SUM(ActualResourceHrs) FROM Production.WorkOrderRouting GROUP BY WorkOrderID
HAVING WorkOrderID < 50
GO
Kết quả sẽ trả ra một bảng nhóm WorkOrderID lại, và tính tổng của cột ActualResourceHrs dựa theo WorkOrderID với WorkOrderID < 50
Mệnh đề ORDER BY
Nó chỉ định thứ tự sắp xếp các cột trong một tập kết quả. Nó sắp xếp truy vấn theo một hoặc nhiều cột. Sắp xếp có thể theo thứ tự tăng dần (ASC) hoặc giảm dần (DESC). Theo mặc định, các bản ghi được sắp xếp theo thứ tự ASC. Để chuyển sang chế độ giảm dần, hãy sử dụng từ khóa tùy chọn DESC, Khi sử dụng nhiều trường, SQL Server coi trường ngoài cùng bên trái là cấp sắp xếp chính và những trường khác là cấp sắp xếp thấp hơn.
Cú pháp:
SELECT <column_name> FROM <table_name> ORDER BY <column_name> (ASC|DESC)
Ví dụ:
SELECT * FROM Sales.SalesTerritory ORDER BY SalesLastYear
GO
Làm việc với XML
Extensible Markup Language (XML) cho phép nhà phát triển các thẻ theo ý nghĩa riêng và các chương trình khác có thể hieuer ý nghĩa của các thẻ này ( tương tự thẻ HTML nhưng nhằm mục đích lưu trữ dữ liệu, không phải để trình duyệt đọc). XML là phương tiện ưu tiên cho các nhà phát triển để lưu trữ, định dạng, quản lý dữ liệu trên web. Các ứng dụng ngày nay có sự kết hợp của các công nghệ như ASP, công nghệ .NET, XML, SQL server hoạt động song song với nhau. Trong một số tình huống, lưu trữ dữ liệu XML trong SQL Server là giải pháp hợp lý.
Cơ sở dữ liệu XML nguyên gốc trong SQL Server có một số ưu điểm như sau:
- Hiệu năng tốt hơn: Các truy vấn từ cơ sở dữ liệu XML được triển khai tốt nhanh hơn các truy vấn trên tài liệu được lưu trữ trong hệ thống tệp. Ngoài ra, cơ sở dữ liệu thường phân tích cú pháp từng tài liệu khi lưu trữ nó.
- Xử lý dữ liệu dễ dàng: Tài liệu kích thớc lớn có thể xử lý dễ dàng ( vì XML có cấu trúc)
Máy chủ SQL hỗ trợ lưu trữ nguyên bản dữ liệu XML bằng cách sử dụng kiểu dữ liệu xml. Cơ sở dữ liệu XML nguyên gốc xác định một mô hình logic cho một tài liệu XML – như là mô tả cho dữ liệu trong tài liệu đó – và lưu trữ và truy xuất tài liệu theo mô hình đó. Tối thiểu, mô hình phải bao gồm các phần tử, thuộc tính, PCDATA và thứ tự tài liệu.
Kiểu dữ liệu XML
Ngoài các kiểu dữ liệu thường được sử dụng thông thường, SQL Server 2019 hỗ trợ kiểu dữ liệu XML. Kiểu dữ liệu XML được sử dụng để lưu trữ các tài liệu và phân đoạn XML trong cơ sở dữ liệu SQL Server. Một phân đoạn XML là một thể hiện XML với phần tử cấp cao nhất bị thiếu trong cấu trúc của nó.
Cú pháp:
CREATE TABLE <table_name> ([column_list,] <column_name> xml [, column_list])
Ví dụ:
USE AdventureWorks2019
CREATE TABLE Person.PhoneBilling (Bill_ID int PRIMARY KEY, MobileNumber bigint UNIQUE, CallDetails xml)
GO
Cột kiểu XML cũng có thể được thêm vào một bảng vào một bảng tại thời điểm tạo. Các cột kiểu dữ liệu XML hỗ trợ các từ ngữ DEFAULT cũng như ràng buộc NOT NULL.
Ví dụ:
AdventureWorks2019
INSERT INTO Person.PhoneBilling VALUES (100,98326505,'<Info><Call>Local</Call><Times>45 minuetes</Times><Charges>200</Charges></Info>')
SELECT CallDetails FROM Person.PhoneBilling
GO
Câu lệnh DECLARE được sử dụng để tạo các biến kiểu XML. Mục đích của câu lệnh DECLARE được sử dụng để khai báo một biến trong SQL Server.
Cú pháp:
DECLARE @LOCAL_VẢIABLE datatype [= value]
Tên biến cục bộ phải bắt đầu bằng dấu @. Tham số giá trị được chỉ ra trong cú pháp là một tham số tùy chọn giúp gán giá trị ban đầu cho biến trong quá trình khai báo. Nếu bạn không chỉ định bất kỳ giá trị ban đầu nào được gán cho một biến, nó sẽ được khởi tạo dưới dạng NULL
Ví dụ:
DECLARE @xmlvar xml
SELECT @xmlvar='<Employee name="Toan"/>'
Lưu ý: Kiểu dữ liệu xml không được sử dụng làm khóa chính, khóa ngoại hoặc sử dụng ràng buộc UNIQUE.
Có 2 cách để lưu trữ tài liệu XML trong cột có kiểu dữ liệu xml tên là typed (định kiểu) và untyped (không định kiểu) XML. Một cá thể XML có một lược đồ được liên kết với nó được gọi là cá thể XML đã định kiểu. Một lược đồ là một tiêu đề cho một phiên bản hoặc tài liệu XML. Nó mô tả cấu trúc và giới hạn nội dung của tài liệu XML bằng cách liên kết các lược đồ XML với các phiên bản hoặc tài liệu XML được khuyến nghị vì dữ liệu có thể được xác thực khi nó đang được lưu trữ trong cột kiểu dữ liệu xml.
SQL Server không thực hiện bất kỳ xác thực nào cho dữ liệu được nhập vào cột xml. Tuy nhiên, nó đảm bảo rằng dữ liệu được lưu trữ với một quy chuẩn tốt. Dữ liệu XML không định kiểu có thể được tạo và lưu trữ trong các cột hoặc biến của bảng tùy thuộc vào nhu cầu và phạm vi của dữ liệu.
Bước đầu tiên khi sử dụng typed XML là đăng ký schema. Cú pháp:
CREATE XML SCHEMA COLLECTION <Schema_Collection_name> AS '[xmldefine]'
Ví dụ:
CREATE XML SCHEMA COLLECTION OrderSchemaCollection1
AS N'<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Customer" />
</xsd:schema>'
GO
Tạo một bảng vơ kiểu dữ liệu Order như ví dụ:
CREATE TABLE myOrder (orderID int identity not null, orderInfo xml (OrderSchemaCollection))
Nhập liệu vào kiểu XML vừa tạo:
insert into myOrder values ('<Customer></Customer>')
Ngoài ra, chúng ta hooàn toàn có thể tạo một biến XML bằng cách sử dụng Schema Collaction. Ví dụ:
use myDB
DECLARE @order xml (OrderSchemaCollection1)
SET @order = '<Customer></Customer>'
select @order
GO
Bài tập
Bài 1: Sử dụng database studentManagement để thực hiện các truy vấn sau:
Link bài studentManagement: https://hocvietcode.com/constraint-rang-buoc-table-strong-sql-server/#content_baitap
- Lấy ra toàn bộ student.
- Lấy ra top 3 student.
- Lấy ra top 3 student, sắp xếp theo điểm từ trên xuống.
- Tìm kiếm student có BirthDate nằm giữa '01/01/1993' và '31/12/1998'
- Sử dụng hàm count(), đếm số lượng sinh viên và hiển thị ra bảng biểu diễn có tên: ClassID, ClassNAme, TotalStudent
- Tính điểm trung bình của student và hiển thị ra các bản ghi bao gồm các cột: studentId,StudentName,ClassName,StudentAvarageMark
- Tính tổng tất cả điểm của student, và chỉ hiển thị ra student có tổng điểm lớn hơn 10.
Bài 2: Sử dụng bảng Sales.Customer của AdventureWorks2019, xử lý các tác vụ:
- Viết câu lệnh SELECT hiể thị ra những bản ghi not null và không bị trùng lặp (non-duplicate) lưu trữ trong đơn hàng
- Viếtế câu lệh SELECT hiển thị ra toàn bộ khách hàng chi tiếtế trong cộtTerrioryID thỏa mãn yêu cầu nhỏ hơn 10.
Bài 3: Sử dụng bảng Sales.SalesOrderHeader, thực thi yêi cầu:
SELECt ra tất cả các customderID và orderID
Bài 4: Viết câu lệnh hiển thị toàn bộ cột của bảng Production.ProductionCostHistory được chỉnh sửa vào ngày 17/06/2003
Bài 5: Sử dụng bảng Production.Product thực thi các tác vụ:
- Viết câ truy vấn hiển thị productID và tên cho mỗi sản phẩm trong bảng mà tên bắt đầu bằng Chain
- Viết câu truy vấn hiển thị productID và tên cho mỗi sản phẩm trong bảng mà có chứa từ khóa Lock trong tên sản phẩm
- Viết câu truy vấn hiển thị productID và tên cho mỗi sản phẩm trong bảng mà không chứa từ khóa Lock trong tên sản phẩm
Bài 6: Viết câu query hiển thị toàn bộ bản ghi đuợc cập nhật sau ngày 29 tháng 12 năm 2009. Hiển thị ra các cột: business Entity ID, cột name, cột hiển thị ngày chỉnh sửa Person.Person.
Bài 7: Viết câu truy vấn hiển thị ProductID,Name,Color từ bản ghi trong bảng Production.Product. Chỉ hiển thị những bản ghi mà không có màu nào được gán.
Bài 8: Viết câu truy vấn trả ra business entity ID và cột name trong bảng Person.Person và sắp xếp theo LastName,FirstName,MiddleName
Bài 9: Viết câu truy vấn trong bảng Sales.SpecialOffer. Hiển thị phép hiệu của cột MinQty và MaxQty cùng với cột SpecialOfferId và cột Description
Bài 10:
1. Đọc hiểu bài toán quản lý Học viên và Điểm thi sau:
Có một Cơ sở dữ liệu (CSDL) như hình trên.
Bảng Test lưu danh sách các môn học.
Bảng Student lưu danh sách các học viên.
Bảng StudentTest lưu danh sách điểm thi và ngày thi của mỗi học viên với môn thi.
Một học viên chưa thi môn nào nếu như mã học viên (RN) không xuất hiện trong bảng StudentTest. Một môn học chưa có ai thi nếu mã môn học (TestID) không xuất hiện trong bảng StudentTest.
2. Tạo một file có tên Lab2.sql.
3. Tạo một CSDL đặt tên là ‘Baitap’ và thực hiện các yêu cầu dưới đây.
Tạo 3 bảng và chèn dữ liệu như yêu cầu dưới đây:
Student (Lưu danh sách các học viên gồm mã học viên(RN), tên(Name), tuổi(Age)).
RN (int primary key) |
Name (VarChar (20)) |
Age (tinyint) |
1 |
Nguyen Van BADC |
20 |
2 |
Nguyen Van Tien |
30 |
3 |
Tran Minh Dung |
25 |
4 |
Toi La DEFG |
22 |
Test (Lưu danh sách môn học gồm mã môn học (TestID, tên môn học(Name)).
TestID (int primary key) |
Name (Varchar(20)) |
1 |
EPC |
2 |
HTML |
3 |
SQL |
4 |
PHP |
StudentTest (Lưu điểm thi của học viên với từng môn thi, gồm mã học viên (RN), mã môn học (TestID), ngày thi(Date), điểm thi(Mark)).
RN (int foreign key tham chiếu tới RN của Student) |
TestID (int foreign key tham chiếu tới TestID của Test) |
Date (Date) |
Mark (Float) |
1 |
1 |
7/17/2006 |
8 |
1 |
2 |
7/18/2006 |
5 |
1 |
3 |
7/19/2006 |
7 |
2 |
1 |
7/17/2006 |
7 |
2 |
2 |
7/18/2006 |
4 |
2 |
3 |
7/19/2006 |
2 |
3 |
1 |
7/17/2006 |
10 |
3 |
3 |
7/18/2006 |
1 |
a. Đưa ra điểm của học viên dưới dạng 4 chữ số, 2 chữ số sau dấu phảy.
b. Hiển thị những học viên có tuổi >25.
c. Hiển thị những học viên có tuổi là 20 hoặc 30.
d. Hiển thị những môn học có chứa ký tự ‘s’.
e. Hiển thị tất cả những bản ghi có điểm số >5 trong bảng StudentTest.
f. Hiển thị những học viên có tên gồm 4 ký tự.
g. Hiển thị những học viên có họ gồm 6 ký tự.
h. Hiển thị những học viên có họ gồm 6 ký tự nhưng không chứa ký tự ‘r’.
i. Thêm trường (cột) tên là Status có kiểu varchar(10) và giá trị mặc định là ‘Young’ vào bảng Student .
k. Xóa các ràng buộc khóa ngoại.
l. Xóa các ràng buộc khóa chính.
m. Xóa các bảng.
n. Xóa CSDL.
Extra:
1. Đưa ra tuổi trung bình của các học viên.
2. Tìm những học viên có tuổi cao nhất.
3. Tìm những học viên có tuổi thấp nhất.
4. Tìm những môn học có điểm cao nhất.
5. Tìm những môn học có điểm thấp nhất.
6. Tìm những học viên đã thi gần đây nhất.
7. Tìm những học viên đã thi đầu tiên.
8. Tính tổng tuổi của các học viên.
9. Tính xem đến thời điểm này mỗi môn học đã thi được bao nhiêu ngày rồi.
10. Tìm những học viên đạt điểm cao nhất.
11. Tìm những học viên có điểm thấp nhất.
12. Tính điểm trung bình cho mỗi học viên, điểm phải được sắp xếp giảm dần và được hiển thị dưới dạng 4 số, 2 chữ số sau dấu phảy.
13. Hiển thị danh sách các học viên đã tham gia thi, các môn thi được thi bởi các học viên đó.
14. Hiển thị danh sách các bạn học viên chưa thi môn nào.
15. Hiển thị danh sách học viên phải thi lại, tên môn học phải thi lại và điểm thi (điểm phải thi lại là điểm nhỏ hơn 5).
16. Hiển thị tên và điểm trung bình của học viên có điểm trung bình lớn nhất.
17. Hiển thị tên và điểm trung bình của học viên có điểm trung bình nhỏ nhất.
18. Hiển thị điểm thi cao nhất của từng môn học.
19. Hiển thị danh sách tất cả các học viên và môn học mà các học viên đó đã thi, nếu học viên chưa thi môn nào thì phần tên môn học để Null (LEft join, right join, full join)