
Bài viết này cập nhật các đáp án bài tập Cơ Sở Dữ Liệu. Lưu ý, việc sử dụng bài giải sẽ là con dao 2 lưỡi. Chúng ta cần cân nhắc trước khi xem đáp án. Bạn có thể tham khảo lời giải của mình để chắc chắn là bạn có cùng đáp án. Qua đó, bạn sẽ tự tin hơn với những quyết định của bản thân. Nhưng nếu bạn quá lạm dụng, chúng sẽ làm bạn ỷ lại, giết chết sự sáng tạo và khả năng giải quyết vấn đề.
Lưu ý, có nhiều lời giải cho một bài toán. Nên, nếu câu truy vấn của bạn và của mình có khác biệt, hay kiểm tra thử kết quả của chúng. Trong một số lời giải, mình sẽ thay đổi một xíu, để lồng ghép cái gì đó vào. Các bạn hãy chú ý.
1, Liệt kê các nhân viên của cửa hàng.
1 2 |
SELECT CONCAT(FirstName, ' ', LastName) AS FullName, Title FROM Employee; |
2, Tìm các nhân viên tên có chứa ít nhất 1 chữ ‘a’.
1 2 3 |
SELECT CONCAT(FirstName, ' ', LastName) AS FullName, Title FROM Employee WHERE FirstName LIKE '%a%'; |
3, Liệt kê tất cả thể loại (genre) – sắp xếp theo tên từ A->Z.
1 2 3 |
SELECT * FROM Genre ORDER BY Name; |
4, Đếm số lượng thể loại.
1 2 |
SELECT COUNT(GenreId) AS NoG FROM Genre; |
5, Liệt kê các track theo từng yêu cầu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
-- Album id = 1 SELECT * FROM Track WHERE AlbumId = 1; -- Thời lượng lớn hơn 250.000 milliseconds SELECT * FROM Track WHERE Milliseconds > 250000; -- Được sáng tác bởi tác giả có tên Smith SELECT * FROM Track WHERE Composer LIKE '%Smith%'; -- Có định dạng (Media Type) là 'MPEG audio file' SELECT * FROM Track INNER JOIN MediaType ON Track.MediaTypeId = MediaType.MediaTypeId WHERE MediaType.Name = 'MPEG audio file'; |
6, Liệt kê các thành phố xuất hiện trong bảng khách hàng (customers).
1 2 3 |
SELECT DISTINCT City FROM Customer ORDER BY City; |
7, Liệt kê 10 hóa đơn có giá trị cao nhất.
1 2 3 |
SELECT TOP(10) * FROM Invoice ORDER BY Total DESC; |
8, Truy vấn hóa đơn thứ 100 (sắp xếp theo ngày).
1 2 3 4 5 |
SELECT * FROM Invoice ORDER BY InvoiceDate OFFSET 99 ROWS FETCH FIRST 1 ROW ONLY; |
9, Liệt kê các bài hát thuộc một trong hai album: ‘Supernatural’, ‘Use Your Illusion I’.
1 2 3 4 5 |
SELECT * FROM Track INNER JOIN Album ON Track.AlbumId = Album.AlbumId WHERE Album.Title = 'Supernatural' OR Album.Title = 'Use Your Illusion I'; |
10, Liệt kê các hóa đơn trong tháng 2 năm 2011.
1 2 3 |
SELECT * FROM Invoice WHERE InvoiceDate BETWEEN '2011-02-01' AND '2011-02-28'; |
11, Xem chi tiết hóa đơn số 47.
1 2 3 |
SELECT * FROM InvoiceLine WHERE InvoiceId = 47; |
12, Liệt kê các bài hát thuộc thể loại ‘Jazz’, ‘Blues’ và ‘Pops’.
1 2 3 4 |
SELECT * FROM Track INNER JOIN Genre ON Track.GenreId = Genre.GenreId WHERE Genre.Name IN ('Jazz', 'Blues', 'Pops'); |
13, Liệt kê các bài hát không xác định tác giả.
1 2 3 |
SELECT * FROM Track WHERE Composer IS NULL; |
14, Đếm số lượng bài hát trong Album có id = 1.
1 2 3 4 |
SELECT AlbumId, COUNT(TrackId) AS Track_no FROM Track GROUP BY AlbumId HAVING AlbumId = 10; |
15, Liệt kê các Album có từ 18 đến 20 bài hát, sắp xếp theo thứ tự AlbumId tăng dần.
1 2 3 4 5 |
SELECT AlbumId, COUNT(TrackId) FROM Track GROUP BY AlbumId HAVING COUNT(TrackId) BETWEEN 18 AND 20 ORDER BY AlbumId; |
16, Liệt kê tất cả các khách hàng, được các nhân viên có mã PostalCode bắt đầu bằng ‘T2P’.
1 2 3 4 5 6 7 |
SELECT CustomerId, CONCAT(FirstName, ' ', LastName) AS Customer_Name FROM Customer WHERE SupportRepId IN ( SELECT EmployeeId FROM Employee WHERE PostalCode LIKE 'T2P%' ); |
17, Tính dung lượng trung bình của mỗi Album.
1 2 3 4 5 6 |
SELECT AVG(MyAlbum.Size) FROM ( SELECT SUM(CAST(Bytes AS BIGINT)) AS Size FROM Track GROUP BY AlbumId ) AS MyAlbum; |
18, Liệt kê Id, tiêu đề và số bài hát trong mỗi Album. Sắp xếp theo số lượng bài hát giảm dần.
1 2 3 4 5 6 7 8 |
SELECT AlbumId, Title, ( SELECT COUNT(TrackId) FROM Track WHERE Track.AlbumId = Album.AlbumId ) AS Track_Count FROM Album ORDER BY Track_Count DESC; |
19, Liệt kê CustomerId, FirstName, LastName và Country của các khách hàng.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
-- Khách hàng không ở USA SELECT CustomerId, CONCAT(FirstName, ' ', LastName) AS 'FullName', Country FROM Customer WHERE Country <> 'USA' -- Khách hàng ở Brazil SELECT CustomerId, CONCAT(FirstName, ' ', LastName) AS 'FullName', Country FROM Customer WHERE Country = 'Brazil' |
20, Truy vấn thông tin InvoiceId, FirstName, LastName, InvoiceDate và Total các hóa đơn của khách hàng tại Brazil. Sắp xếp kết quả theo thứ tự giảm dần giá trị hóa đơn.
1 2 3 4 5 6 7 8 9 |
SELECT I.InvoiceId, CONCAT(C.FirstName, ' ', C.LastName) AS 'FullName', I.InvoiceDate, I.Total FROM Invoice AS I INNER JOIN Customer AS C ON I.CustomerId = C.CustomerId WHERE C.Country = 'Brazil' ORDER BY I.Total DESC |
21, Liệt kê các nhân viên kinh doanh.
1 2 3 |
SELECT CONCAT(FirstName, ' ', LastName) AS 'FullName' FROM Employee WHERE Title LIKE '%Sale%' |
22, Tính tổng giá trị hóa đơn trong năm 2009, 2010, 2011.
1 2 3 4 5 6 |
SELECT YEAR(InvoiceDate) AS InvoiceYear, SUM(Total) AS Total FROM Invoice WHERE YEAR(InvoiceDate) IN (2009, 2010, 2011) GROUP BY YEAR(InvoiceDate) |
23, Đếm số lượng items trong hóa đơn có id = 37.
1 2 3 |
SELECT COUNT(*) FROM InvoiceLine WHERE InvoiceId = 37; |
24, Đếm số lượng items của từng hóa đơn. Sắp xếp theo số lượng item giảm dần.
1 2 3 4 |
SELECT InvoiceId, COUNT(*) AS Items FROM InvoiceLine GROUP BY InvoiceId ORDER BY COUNT(*) DESC |
25, Liệt kê tên quốc gia, số lượng hóa đơn của quốc gia tương ứng > 20 hóa đơn. Sắp xếp theo thứ tự tăng dần số lượng hóa đơn.
1 2 3 4 5 |
SELECT BillingCountry, COUNT(*) AS Invoice_No FROM Invoice GROUP BY BillingCountry HAVING COUNT(*) > 20 ORDER BY COUNT(*) |
26, Liệt kê tên Playlist và số lượng bài hát trong từng playlist
1 2 3 4 |
SELECT Playlist.Name, COUNT(PlaylistTrack.TrackId) AS Track_No FROM Playlist INNER JOIN PlaylistTrack ON Playlist.PlaylistId = PlaylistTrack.PlaylistId GROUP BY Playlist.Name |
27, Truy vấn thông tin nhân viên kinh doanh có doanh thu lớn nhất vào năm 2010.
1 2 3 4 5 6 |
SELECT TOP(1) E.EmployeeId, SUM(I.Total) AS Sales FROM Employee AS E INNER JOIN Customer AS C ON E.EmployeeId = C.SupportRepId INNER JOIN Invoice AS I ON C.CustomerId = I.CustomerId WHERE YEAR(I.InvoiceDate) = 2010 GROUP BY E.EmployeeId |
28, Truy vấn EmployeeId, FirstName, LastName và số lượng khách hàng của mỗi nhân viên.
1 2 3 4 5 6 7 8 9 10 |
SELECT EmployeeId, CONCAT(FirstName, ' ', LastName) AS Fullname, Support.Clients FROM Employee INNER JOIN ( SELECT SupportRepId, COUNT(*) AS Clients FROM Customer GROUP BY SupportRepId ) AS Support ON Employee.EmployeeId = Support.SupportRepId |
29, Truy vấn thông tin 3 khách hàng chi tiêu nhiều nhất trong năm 2012.
1 2 3 4 5 6 7 8 9 |
SELECT * FROM Customer WHERE CustomerId IN ( SELECT TOP(3) CustomerId FROM Invoice WHERE YEAR(InvoiceDate) = 2012 GROUP BY CustomerId ORDER BY SUM(Total) DESC ) |
30, Truy vấn 3 thể loại được ưa chuộng nhất của cửa hàng.
1 2 3 4 5 6 |
SELECT TOP(3) Genre.Name, COUNT(*) AS Sales FROM InvoiceLine INNER JOIN Track ON InvoiceLine.TrackId = Track.TrackId INNER JOIN Genre ON Genre.GenreId = Track.GenreId GROUP BY Genre.Name ORDER BY Sales DESC |
31, Liệt kê tất cả thông tin trong bảng “Playlist”.
1 2 |
SELECT * FROM Playlist |
32, Liệt kê tất cả các quốc tra trong bảng “Customer”. Mỗi giá trị chỉ in ra 1 lần duy nhất.
1 2 |
SELECT DISTINCT Country FROM Customer |
33, Liệt kê tất cả các Track có tên tác giả (Composer) có từ ‘smith’ VÀ genreId = 3.
1 2 3 |
SELECT * FROM Track WHERE Composer LIKE '%smith%' AND GenreId = 3 |
34, Liệt kê thông tin của 5 hóa đơn có giá trị cao nhất trong năm 2012.
1 2 3 4 |
SELECT TOP(5) * FROM Invoice WHERE YEAR(InvoiceDate) = 2012 ORDER BY Total DESC |
35, Tính tổng doanh thu của cửa hàng trong năm 2012.
1 2 3 |
SELECT SUM(total) AS 'Total Income 2012' FROM Invoice WHERE YEAR(InvoiceDate) = 2012 |
36, Đếm số lượng bài hát của từng thể loại.
1 2 3 4 |
SELECT Genre.Name AS Genre, COUNT(*) AS Track_No FROM Track INNER JOIN Genre ON Track.GenreId = Genre.GenreId GROUP BY Genre.Name |
37, Liệt kê tất cả các bài hát (Track) thuộc thể loại nhạc ‘Rock’.
1 2 3 4 |
SELECT Track.* FROM Track INNER JOIN Genre ON Track.GenreId = Genre.GenreId WHERE Genre.Name = 'Rock' |
38, Liệt kê tên tất cả Album của Artist “AC/DC”.
1 2 3 4 |
SELECT Album.Title AS Album, Artist.Name AS Artist FROM Album INNER JOIN Artist ON Album.ArtistId = Artist.ArtistId WHERE Artist.Name = 'AC/DC' |
39, Liệt kê tất cả thể loại.
1 2 |
SELECT * FROM Genre |
40, Liệt kê tất cả các playlist.
1 2 |
SELECT * FROM Playlist |
41, Liệt kê tất cả các nghệ sĩ.
1 2 |
SELECT * FROM Artist |
42, Liệt kê tất cả các thành phố trong bảng Invoice. Mỗi giá trị chỉ được hiển thị 1 lần duy nhất.
1 2 |
SELECT DISTINCT BillingCity FROM Invoice |
43, Liệt kê tất cả các quốc gia trong bảng Invoice. Mỗi giá trị chỉ được hiển thị 1 lần duy nhất
1 2 |
SELECT DISTINCT BillingCountry FROM Invoice |
44, Liệt kê tất cả các quốc gia trong bảng Customer. Mỗi giá trị chỉ được hiển thị 1 lần duy nhất.
1 2 |
SELECT DISTINCT Country FROM Customer |
45, Liệt kê tất cả các khách hàng tại ‘USA’ hoặc ‘Brazil’.
1 2 3 |
SELECT * FROM Customer WHERE Country = 'USA' OR Country = 'Brazil' |
46, Liệt kê tất cả các khách hàng tại thành phố ‘Toronto’, ‘Canada’.
1 2 3 |
SELECT * FROM Customer WHERE City = 'Toronto' AND Country = 'Canada' |
47, Liệt kê tất cả khách hàng có FirstName bắt đầu bằng chữ ‘h’ hoặc chữ ‘k’.
1 2 3 |
SELECT * FROM Customer WHERE FirstName LIKE 'h%' OR FirstName LIKE 'k%' |
48, Liệt kê các hóa đơn trong tháng 5 năm 2012.
1 2 3 |
SELECT * FROM Invoice WHERE InvoiceDate BETWEEN '2012-05-01' AND '2012-05-31' |
49, Liệt kê các hóa đơn có giá trị từ 5 – 10 USD.
1 2 3 |
SELECT * FROM Invoice WHERE Total BETWEEN 5 AND 10 |
50, Liệt kê các hóa đơn từ một trong những thành phố: ‘New York’, ‘Chicago’ và ‘Toronto’.
1 2 3 |
SELECT * FROM Invoice WHERE BillingCity IN ('New York', 'Chicago', 'Toronto') |
51, Liệt kê 5 hóa đơn có giá trị lớn nhất.
1 2 3 |
SELECT TOP(5) * FROM Invoice ORDER BY Total DESC |
52, Liệt kê 5 bài hát có giá cao nhất.
1 2 3 |
SELECT TOP(5) * FROM Track ORDER BY UnitPrice DESC |
53, Liệt kê 5 bài hát có thời lượng dài nhất.
1 2 3 |
SELECT TOP(5) * FROM Track ORDER BY Milliseconds DESC |
54, Tính giá trị trung bình các hóa đơn.
1 2 |
SELECT AVG(Total) FROM invoice |
55, Tính giá tiền trung bình các bài hát.
1 2 |
SELECT AVG(UnitPrice) FROM Track |
56, Đếm tổng số lượng khách hàng.
1 2 |
SELECT COUNT(*) FROM Customer |
57, Đếm số lượng bài hát theo từng AlbumId.
1 2 3 |
SELECT AlbumId, COUNT(*) FROM Track GROUP BY AlbumId |
58, Đếm số lượng bài hát theo từng GenreId.
1 2 3 |
SELECT GenreId, COUNT(*) FROM Track GROUP BY GenreId |
59, Đếm số lượng bài hát theo từng MediaTypeId.
1 2 3 |
SELECT MediaTypeId, COUNT(*) FROM Track GROUP BY MediaTypeId |
60, Liệt kê tất cả bài hát thuộc thể loại nhạc ‘Pop’.
1 2 3 4 |
SELECT * FROM Track INNER JOIN Genre ON Track.GenreId = Genre.GenreId WHERE Genre.Name = 'Pop' |
61, Liệt kê tất cả bài hát thuộc album ‘Big Ones’.
1 2 3 4 |
SELECT * FROM Track INNER JOIN Album ON Track.AlbumId = Album.AlbumId WHERE Album.Title = 'Big Ones' |
62, Liệt kê tất cả bài hát có định dạng Media là ‘MPEG audio file’.
1 2 3 4 |
SELECT * FROM Track INNER JOIN MediaType ON Track.MediaTypeId = MediaType.MediaTypeId WHERE MediaType.Name = 'MPEG audio file' |
63, Liệt kê tất cả bài hát kèm theo tên Album tương ứng.
1 2 3 |
SELECT * FROM Track INNER JOIN Album ON Track.AlbumId = Album.AlbumId |
64, Liệt kê tất cả các Album kèm theo tên nghệ sĩ tương ứng.
1 2 3 |
SELECT * FROM Album INNER JOIN Artist ON Album.ArtistId = Album.AlbumId |
65, Liệt kê tất cả các hóa đơn kèm theo thông tin khách hàng tương ứng.
1 2 3 |
SELECT * FROM Invoice INNER JOIN Customer ON Invoice.CustomerId = Customer.CustomerId |
66, Liệt kê các thể loại (kèm số lượng bài hát tương ứng) có số lượng bài hát lớn hơn 100.
1 2 3 4 5 |
SELECT Genre.GenreId, COUNT(*) FROM Track INNER JOIN Genre ON Track.GenreId = Genre.GenreId GROUP BY Genre.GenreId HAVING COUNT(*) > 100 |
67, Liệt kê tên album (kèm số lượng bài hát tương ứng) có số lượng bài hát lớn hơn 15.
1 2 3 4 5 |
SELECT Album.AlbumId, COUNT(*) FROM Track INNER JOIN Album ON Track.AlbumId = Album.AlbumId GROUP BY Album.AlbumId HAVING COUNT(*) > 15 |
68, Liệt tên các loại Media (kèm số lượng bài hát tương ứng) có số lượng bài hát lớn hơn 200.
1 2 3 4 5 |
SELECT MediaType.MediaTypeId, COUNT(*) FROM Track INNER JOIN MediaType ON Track.MediaTypeId = MediaType.MediaTypeId GROUP BY MediaType.MediaTypeId HAVING COUNT(*) > 200 |