Skip to content

Latest commit

 

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

  • Tổng số câu hỏi: 175

Câu 1: SQL132: Làm quen với LearnSQL

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Hi! Mình rất vui khi được đóng góp một chút gì đó để hỗ trợ mọi người trong việc học tập và làm quen với SQL! 😊 Hãy cứ coi đây như một sân chơi để thử nghiệm, sai cũng không sao, miễn là chúng ta rút ra được kinh nghiệm và học hỏi thêm mỗi ngày.


Hôm nay chúng ta sẽ khám phá bảng learnsql – nơi chứa tất cả những hướng dẫn hay ho giúp bạn làm quen với LearnSQL nhé 😊

Nhiệm vụ của bạn: lấy ra hướng dẫn từ bảng learnsql :>


Chúc mọi người học tập vui vẻ và tự tin chinh phục SQL! Đừng quên để lại comment, góp ý tại mục bình luận để mình cùng trao đổi phát triển nha! 💪✨


Câu 2: SQL094: Consecutive number

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bảng: Logs


+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| num         | varchar |
+-------------+---------+


Trong SQL, id là khóa chính của bảng này.

id là cột tự tăng (auto increment).


Nhiệm vụ:

Tìm tất cả các số xuất hiện ít nhất ba lần liên tiếp.

Trả về bảng kết quả theo thứ tự tăng dần các số.


Ví dụ:

Input: Logs table:

+----+-----+
| id | num |
+----+-----+
| 1  | 1   |
| 2  | 1   |
| 3  | 1   |
| 4  | 2   |
| 5  | 1   |
| 6  | 2   |
| 7  | 2   |
+----+-----+


Output:

+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+


Giải thích:

  • Số 1 xuất hiện liên tiếp ít nhất 3 lần (id 1, 2, 3).
  • Các số khác không thỏa mãn điều kiện xuất hiện liên tiếp ít nhất 3 lần.

Câu 3: SQL095: Big Countries

  • Loại câu hỏi: SELECT
  • Độ khó: MEDIUM

Bảng: World

  • name là khóa chính (cột có giá trị duy nhất) của bảng này.
  • Mỗi hàng trong bảng cung cấp thông tin về tên quốc gia, châu lục, diện tích, dân số, và GDP của quốc gia đó.


Điều kiện:

Một quốc gia được coi là lớn nếu:

  • Quốc gia đó có diện tích ít nhất 3 triệu km² (tức là area >= 3000000), hoặc
  • Quốc gia đó có dân số ít nhất 25 triệu người (tức là population >= 25000000).


Nhiệm vụ:

Viết một giải pháp để tìm tên (name), dân số (population), và diện tích (area) của các quốc gia lớn.

Trả về bảng kết quả với thứ tự bất kỳ.


Ví dụ:

Đầu vào:

Bảng World:


Đầu ra:


Giải thích:

  • Afghanistan: Dân số là 25,500,100 người (>= 25 triệu), thỏa mãn điều kiện.
  • Algeria: Dân số là 37,100,000 người và diện tích là 2,381,741 km², thỏa mãn điều kiện.
  • Các quốc gia khác không thỏa mãn bất kỳ điều kiện nào.

Câu 4: SQL096: Replace Employee ID with unique identify

  • Loại câu hỏi: SELECT
  • Độ khó: MEDIUM

Bảng: Employees

  • id là khóa chính của bảng này.
  • Mỗi hàng trong bảng chứa id và tên (name) của một nhân viên trong công ty.


Bảng: EmployeeUNI

  • (id, unique_id) là khóa chính (tổ hợp các cột có giá trị duy nhất).
  • Mỗi hàng trong bảng chứa id và unique_id tương ứng của nhân viên trong công ty.


Nhiệm vụ:

Viết một giải pháp để hiển thị unique_id của mỗi nhân viên. Nếu một nhân viên không có unique_id, hiển thị null.

Trả về bảng kết quả với thứ tự bất kỳ.


Ví dụ:

Đầu vào:

Bảng Employees:

Bảng EmployeeUNI:


Đầu ra:


Giải thích:

  • Alice và Bob không có unique_id, nên hiển thị null.
  • Meir có unique_id là 2.
  • Winston có unique_id là 3.
  • Jonathan có unique_id là 1.

Câu 5: SQL097: Average time of process per machine

  • Loại câu hỏi: SELECT
  • Độ khó: MEDIUM

Bảng: Activity

  • (machine_id, process_id, activity_type) là khóa chính (tổ hợp các cột có giá trị duy nhất) của bảng này.
  • machine_id là ID của máy.
  • process_id là ID của một tiến trình chạy trên máy có machine_id.
  • activity_type là kiểu ENUM với các giá trị ('start', 'end'):
  • 'start' nghĩa là máy bắt đầu tiến trình tại thời điểm timestamp.
  • 'end' nghĩa là máy kết thúc tiến trình tại thời điểm timestamp.
  • timestamp là giá trị thời gian (float) đại diện cho thời gian hiện tại tính bằng giây.


Yêu cầu:

Có một trang web của nhà máy có nhiều máy, mỗi máy chạy cùng số lượng tiến trình. Viết một giải pháp để tìm thời gian trung bình mà mỗi máy thực hiện một tiến trình.

  • Thời gian hoàn thành một tiến trình được tính bằng:
  • timestamp của 'end' - timestamp của 'start'.
  • Thời gian trung bình được tính bằng tổng thời gian hoàn thành của tất cả các tiến trình trên máy chia cho số lượng tiến trình được chạy.

Bảng kết quả nên chứa machine_id cùng với thời gian trung bình (processing_time), làm tròn đến 3 chữ số thập phân.


Ví dụ:

Đầu vào:

Bảng Activity:

Đầu ra:


Giải thích:

Có 3 máy, mỗi máy chạy 2 tiến trình.

  • Máy 0:
  • Tiến trình 0: (1.520 - 0.712) = 0.808.
  • Tiến trình 1: (4.120 - 3.140) = 0.980.
  • Thời gian trung bình: (0.808 + 0.980) / 2 = 0.894.
  • Máy 1:
  • Tiến trình 0: (1.550 - 0.550) = 1.000.
  • Tiến trình 1: (1.420 - 0.430) = 0.990.
  • Thời gian trung bình: (1.000 + 0.990) / 2 = 0.995.
  • Máy 2:
  • Tiến trình 0: (4.512 - 4.100) = 0.412.
  • Tiến trình 1: (5.000 - 2.500) = 2.500.
  • Thời gian trung bình: (0.412 + 2.500) / 2 = 1.456.

Câu 6: SQL098: Delete duplicate emails

  • Loại câu hỏi: DELETE
  • Độ khó: EASY

Table: Person

+-------------+---------+

| Column Name | Type |

+-------------+---------+

| id | int |

| email | varchar |

+-------------+---------+

id is the primary key (column with unique values) for this table.

Each row of this table contains an email. The emails will not contain uppercase letters.

 

Write a solution to delete all duplicate emails, keeping only one unique email with the smallest id.

For SQL users, please note that you are supposed to write a DELETE statement and not a SELECT one.

For Pandas users, please note that you are supposed to modify Person in place.

After running your script, the answer shown is the Person table. The driver will first compile and run your piece of code and then show the Person table. The final order of the Person table does not matter.

The result format is in the following example.

 

Example 1:

Input:

Person table:

+----+------------------+

| id | email |

+----+------------------+

| 1 | john@example.com |

| 2 | bob@example.com |

| 3 | john@example.com |

+----+------------------+

Output:

+----+------------------+

| id | email |

+----+------------------+

| 1 | john@example.com |

| 2 | bob@example.com |

+----+------------------+

Explanation: john@example.com is repeated two times. We keep the row with the smallest Id = 1.


Câu 7: SQL099: Find custom referee

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Table: Customer

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
| referee_id  | int     |
+-------------+---------+

In SQL, id is the primary key column for this table.

Each row of this table indicates the id of a customer, their name, and the id of the customer who referred them.

 

Find the names of the customer that are not referred by the customer with id = 2.

Return the result table in any order.

The result format is in the following example.

 

Example 1:

Input:

Customer table:

+----+------+------------+
| id | name | referee_id |
+----+------+------------+
| 1  | Will | null       |
| 2  | Jane | null       |
| 3  | Alex | 2          |
| 4  | Bill | null       |
| 5  | Zack | 1          |
| 6  | Mark | 2          |
+----+------+------------+


Output:

+------+
| name |
+------+
| Will |
| Jane |
| Bill |
| Zack |
+------+

Câu 8: SQL100: Recycle and low fat product

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bảng: Products

  • product_id là khóa chính (cột chứa các giá trị duy nhất) của bảng này.
  • low_fats là kiểu ENUM với các giá trị ('Y', 'N'), trong đó 'Y' nghĩa là sản phẩm ít béo và 'N' nghĩa là không ít béo.
  • recyclable là kiểu ENUM với các giá trị ('Y', 'N'), trong đó 'Y' nghĩa là sản phẩm có thể tái chế và 'N' nghĩa là không thể tái chế.

Nhiệm vụ:

Viết một giải pháp để tìm các ID của sản phẩm vừa ít béo vừa có thể tái chế. Trả về bảng kết quả với thứ tự bất kỳ.

Ví dụ:

Đầu vào:

Bảng Products:

Đầu ra:

Giải thích:

Chỉ có các sản phẩm với ID là 1 và 3 thỏa mãn điều kiện vừa ít béo (low_fats = 'Y') vừa có thể tái chế (recyclable = 'Y').


Câu 9: SQL101: Not boring movie

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bảng: Cinema

  • id là khóa chính của bảng này (cột có giá trị duy nhất).
  • Mỗi hàng chứa thông tin về tên phim (movie), thể loại (description), và đánh giá (rating).
  • rating là số thập phân với 2 chữ số sau dấu phẩy, trong khoảng [0, 10].


Yêu cầu:

Viết một giải pháp để liệt kê các phim có ID là số lẻ và có mô tả (description) không phải là "boring".

Trả về bảng kết quả được sắp xếp theo rating giảm dần.


Ví dụ:

Đầu vào:

Bảng Cinema:

Đầu ra:


Giải thích:

  • Các phim có ID là số lẻ: 1, 3, 5.
  • Trong số đó, phim có ID = 3 có mô tả là "boring", nên không được bao gồm trong kết quả.
  • Phim được sắp xếp theo rating giảm dần, vì vậy thứ tự là:
  • House card (ID = 5) có rating = 9.1.
  • War (ID = 1) có rating = 8.9.

Câu 10: SQL102: Rising temperature

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bảng: Weather

  • id là cột có giá trị duy nhất trong bảng này.
  • Không có hai hàng nào có cùng giá trị recordDate.
  • Bảng chứa thông tin về nhiệt độ (temperature) vào một ngày cụ thể (recordDate).


Yêu cầu:

Viết một giải pháp để tìm tất cả các id của các ngày có nhiệt độ cao hơn so với ngày trước đó (hôm qua).

Trả về bảng kết quả với thứ tự bất kỳ.


Ví dụ:

Đầu vào:

Bảng Weather:

Đầu ra:

Giải thích:

  • Ngày 2015-01-02 (ID = 2): Nhiệt độ 25 cao hơn ngày trước đó (2015-01-01, nhiệt độ = 10).
  • Ngày 2015-01-04 (ID = 4): Nhiệt độ 30 cao hơn ngày trước đó (2015-01-03, nhiệt độ = 20).
  • Ngày 2015-01-03 (ID = 3): Nhiệt độ 20 không cao hơn ngày trước đó (2015-01-02, nhiệt độ = 25).

Câu 11: SQL103: Liệt kê 2 khóa học theo tên giảng viên (sắp xếp theo tên giảm dần)

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bạn có 3 bảng sau:

  1. Bảng Class:
  • Chứa thông tin về các khóa học.
  • Cấu trúc:
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.
  • title (VARCHAR(75)): Tiêu đề khóa học.
  1. Bảng Instructor:
  • Chứa thông tin về giảng viên.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • fname (VARCHAR(50)): Tên của giảng viên.
  • lname (VARCHAR(50)): Họ của giảng viên.
  • started_on (CHAR(10)): Ngày bắt đầu làm việc của giảng viên.
  1. Bảng Teaches:
  • Chứa thông tin về việc giảng viên dạy khóa học nào.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.

Yêu cầu:

-- Liệt kê 2 khóa học theo họ giảng viên (sắp xếp theo lname giảm dần) 


Ví dụ output




Câu 12: SQL104: Tìm các lớp học đang được mở

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bạn có 3 bảng sau:

  1. Bảng Class:
  • Chứa thông tin về các khóa học.
  • Cấu trúc:
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.
  • title (VARCHAR(75)): Tiêu đề khóa học.
  1. Bảng Instructor:
  • Chứa thông tin về giảng viên.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • fname (VARCHAR(50)): Tên của giảng viên.
  • lname (VARCHAR(50)): Họ của giảng viên.
  • started_on (CHAR(10)): Ngày bắt đầu làm việc của giảng viên.
  1. Bảng Teaches:
  • Chứa thông tin về việc giảng viên dạy khóa học nào.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.

Yêu cầu:

Hãy viết truy vấn SQL để liệt kê tất cả các khóa học đang được giảng dạy (mở lớp) bởi các giảng viên. Mỗi khóa học cần hiển thị:


title                   

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

Machine Organization and Assembly Language

Introduction to Operating Systems     

Introduction to Computer Communication Net


Câu 13: SQL105: Liệt kê 2 khóa học theo tên giảng viên (sắp xếp tăng dần)

  • Loại câu hỏi: SELECT
  • Độ khó: MEDIUM

Bạn có 3 bảng sau:

  1. Bảng Class:
  • Chứa thông tin về các khóa học.
  • Cấu trúc:
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.
  • title (VARCHAR(75)): Tiêu đề khóa học.
  1. Bảng Instructor:
  • Chứa thông tin về giảng viên.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • fname (VARCHAR(50)): Tên của giảng viên.
  • lname (VARCHAR(50)): Họ của giảng viên.
  • started_on (CHAR(10)): Ngày bắt đầu làm việc của giảng viên.
  1. Bảng Teaches:
  • Chứa thông tin về việc giảng viên dạy khóa học nào.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.

Yêu cầu:

Liệt kê 2 khóa học theo tên giảng viên (sắp xếp theo tên tăng dần)


Ví dụ output

+----------+------+--------+-------------------------------------------------+
| username | dept | number | title                                           |
+----------+------+--------+-------------------------------------------------+
| djw      | CSE  | 461    | Introduction to Computer Communication Networks |
| levy     | CSE  | 451    | Introduction to Operating Systems               |
+----------+------+--------+-------------------------------------------------+

Câu 14: SQL106: Tìm firstname của Instructor

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bạn có 3 bảng sau:

  1. Bảng Class:

Chứa thông tin về các khóa học.

Cấu trúc:

  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.
  • title (VARCHAR(75)): Tiêu đề khóa học.


  1. Bảng Instructor:

Chứa thông tin về giảng viên.

Cấu trúc:

  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • fname (VARCHAR(50)): Tên của giảng viên.
  • lname (VARCHAR(50)): Họ của giảng viên.
  • started_on (CHAR(10)): Ngày bắt đầu làm việc của giảng viên.


  1. Bảng Teaches:

Chứa thông tin về việc giảng viên dạy khóa học nào.

Cấu trúc:

  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.


Yêu cầu:

Tìm

-- Tên (firstname) của Instructor có tên đăng nhập (login) là 'zahorjan'?


fname   

----------

John 


Câu 15: SQL107: Các khóa học cấp độ 400 (4xx) của CSE đang mở là gì

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bạn có 3 bảng sau:

  1. Bảng Class:
  • Chứa thông tin về các khóa học.
  • Cấu trúc:
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.
  • title (VARCHAR(75)): Tiêu đề khóa học.
  1. Bảng Instructor:
  • Chứa thông tin về giảng viên.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • fname (VARCHAR(50)): Tên của giảng viên.
  • lname (VARCHAR(50)): Họ của giảng viên.
  • started_on (CHAR(10)): Ngày bắt đầu làm việc của giảng viên.
  1. Bảng Teaches:
  • Chứa thông tin về việc giảng viên dạy khóa học nào.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.

Yêu cầu:


-- Các khóa học cấp độ 400 (4xx) của CSE đang mở là gì?


dept    number   title               

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

CSE     451     Introduction to Operating Systems

CSE     461     Introduction to Computer Communic


Câu 16: SQL108: Tìm lớp học của thầy Levy

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bạn có 3 bảng sau:

  1. Bảng Class:
  • Chứa thông tin về các khóa học.
  • Cấu trúc:
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.
  • title (VARCHAR(75)): Tiêu đề khóa học.
  1. Bảng Instructor:
  • Chứa thông tin về giảng viên.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • fname (VARCHAR(50)): Tên của giảng viên.
  • lname (VARCHAR(50)): Họ của giảng viên.
  • started_on (CHAR(10)): Ngày bắt đầu làm việc của giảng viên.
  1. Bảng Teaches:
  • Chứa thông tin về việc giảng viên dạy khóa học nào.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.

Yêu cầu:

-- Những lớp nào đang dạy bởi levy hoặc djw?


username  dept    number   

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

djw     CSE     461    

levy    CSE     451


Câu 17: SQL109: Quản lý product

  • Loại câu hỏi: CREATE
  • Độ khó: EASY

Bạn được giao nhiệm vụ quản lý thông tin về sản phẩm trong một cửa hàng bán lẻ. Hãy tạo một bảng để lưu trữ thông tin chi tiết về sản phẩm. Bạn cần tạo bảng products với các yêu cầu sau:

  1. Tên bảng: products
  2. Các cột:
  • product_id: ID của sản phẩm (kiểu INT, tự động tăng và là khóa chính).
  • product_name: Tên của sản phẩm (kiểu VARCHAR(255), không được để trống).
  • category: Danh mục của sản phẩm (kiểu VARCHAR(100)).
  • price: Giá của sản phẩm (kiểu DECIMAL(10, 2)).
  • stock_quantity: Số lượng sản phẩm còn trong kho (kiểu INT).
  • created_at: Ngày sản phẩm được thêm vào (kiểu TIMESTAMP, mặc định là thời gian hiện tại).

Yêu cầu:

  • Tạo bảng này trong cơ sở dữ liệu để tạo bảng products theo yêu cầu trên.

Câu 18: SQL110: Những khóa học nào có tên bắt đầu bằng "Introduction"

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bạn có 3 bảng sau:

  1. Bảng Class:
  • Chứa thông tin về các khóa học.
  • Cấu trúc:
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.
  • title (VARCHAR(75)): Tiêu đề khóa học.
  1. Bảng Instructor:
  • Chứa thông tin về giảng viên.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • fname (VARCHAR(50)): Tên của giảng viên.
  • lname (VARCHAR(50)): Họ của giảng viên.
  • started_on (CHAR(10)): Ngày bắt đầu làm việc của giảng viên.
  1. Bảng Teaches:
  • Chứa thông tin về việc giảng viên dạy khóa học nào.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.

Yêu cầu:

-- Những khóa học nào có tên bắt đầu bằng "Introduction"?


dept    number   title               

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

CSE     451     Introduction to Operating Systems

CSE     461     Introduction to Computer Communic


Câu 19: SQL111: Sửa tiêu đề gõ sai

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bạn có 3 bảng sau:

  1. Bảng Class:
  • Chứa thông tin về các khóa học.
  • Cấu trúc:
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.
  • title (VARCHAR(75)): Tiêu đề khóa học.
  1. Bảng Instructor:
  • Chứa thông tin về giảng viên.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • fname (VARCHAR(50)): Tên của giảng viên.
  • lname (VARCHAR(50)): Họ của giảng viên.
  • started_on (CHAR(10)): Ngày bắt đầu làm việc của giảng viên.
  1. Bảng Teaches:
  • Chứa thông tin về việc giảng viên dạy khóa học nào.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.

Yêu cầu:

-- Nếu gõ nhầm Introduction thành INtroduction, làm thế nào để vẫn ra kết quả đúng?


dept    number   title               

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

CSE     451     Introduction to Operating Systems

CSE     461     Introduction to Computer Communic


Câu 20: SQL112: Hiển thị tên khóa học và độ dài của nó

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bạn có 3 bảng sau:

  1. Bảng Class:
  • Chứa thông tin về các khóa học.
  • Cấu trúc:
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.
  • title (VARCHAR(75)): Tiêu đề khóa học.
  1. Bảng Instructor:
  • Chứa thông tin về giảng viên.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • fname (VARCHAR(50)): Tên của giảng viên.
  • lname (VARCHAR(50)): Họ của giảng viên.
  • started_on (CHAR(10)): Ngày bắt đầu làm việc của giảng viên.
  1. Bảng Teaches:
  • Chứa thông tin về việc giảng viên dạy khóa học nào.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.

Yêu cầu:

-- Hiển thị tên khóa học và độ dài của nó


title                     LENGTH

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

Machine Organization and Assembly Language 42      

Introduction to Operating Systems      33      

Introduction to Computer Communication Net 47 


Câu 21: SQL113: Chuẩn hóa tên các khóa học

  • Loại câu hỏi: SELECT
  • Độ khó: MEDIUM

Bạn có 3 bảng sau:

  1. Bảng Class:
  • Chứa thông tin về các khóa học.
  • Cấu trúc:
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.
  • title (VARCHAR(75)): Tiêu đề khóa học.
  1. Bảng Instructor:
  • Chứa thông tin về giảng viên.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • fname (VARCHAR(50)): Tên của giảng viên.
  • lname (VARCHAR(50)): Họ của giảng viên.
  • started_on (CHAR(10)): Ngày bắt đầu làm việc của giảng viên.
  1. Bảng Teaches:
  • Chứa thông tin về việc giảng viên dạy khóa học nào.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.

Yêu cầu:

-- Cắt tên các khóa học về còn 12 ký tự


dept    number   short_title 

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

CSE     378     Machine Orga

CSE     451     Introduction

CSE     461     Introduction


Câu 22: SQL114: Những instructors nào bắt đầu dạy trước 1990

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bạn có 3 bảng sau:

  1. Bảng Class:
  • Chứa thông tin về các khóa học.
  • Cấu trúc:
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.
  • title (VARCHAR(75)): Tiêu đề khóa học.
  1. Bảng Instructor:
  • Chứa thông tin về giảng viên.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • fname (VARCHAR(50)): Tên của giảng viên.
  • lname (VARCHAR(50)): Họ của giảng viên.
  • started_on (CHAR(10)): Ngày bắt đầu làm việc của giảng viên.
  1. Bảng Teaches:
  • Chứa thông tin về việc giảng viên dạy khóa học nào.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.

Yêu cầu:

-- Những instructors nào bắt đầu dạy trước 1990?


username  fname    lname    started_on

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

zahorjan  John    Zahorjan  1985-01-01

levy    Hank    Levy    1988-04-01


Câu 23: SQL115: Những instructors nào bắt đầu dạy trước thời điểm hiện tại

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bạn có 3 bảng sau:

  1. Bảng Class:
  • Chứa thông tin về các khóa học.
  • Cấu trúc:
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.
  • title (VARCHAR(75)): Tiêu đề khóa học.
  1. Bảng Instructor:
  • Chứa thông tin về giảng viên.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • fname (VARCHAR(50)): Tên của giảng viên.
  • lname (VARCHAR(50)): Họ của giảng viên.
  • started_on (CHAR(10)): Ngày bắt đầu làm việc của giảng viên.
  1. Bảng Teaches:
  • Chứa thông tin về việc giảng viên dạy khóa học nào.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.

Yêu cầu:


-- Những instructors nào bắt đầu dạy trước thời điểm hiện tại?

-- (Hopefully, this is all of them!)


username  fname    lname    started_on

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

zahorjan  John    Zahorjan  1985-01-01

djw     David    Wetherall  1999-07-01

tom     Tom     Anderson  1997-10-01

levy    Hank    Levy    1988-04-01


Câu 24: SQL116: Những instructors bắt đầu dạy vào hoặc sau ngày 1 tháng 1 của 20 năm trước

  • Loại câu hỏi: SELECT
  • Độ khó: MEDIUM

Bạn có 3 bảng sau:

  1. Bảng Class:
  • Chứa thông tin về các khóa học.
  • Cấu trúc:
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.
  • title (VARCHAR(75)): Tiêu đề khóa học.
  1. Bảng Instructor:
  • Chứa thông tin về giảng viên.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • fname (VARCHAR(50)): Tên của giảng viên.
  • lname (VARCHAR(50)): Họ của giảng viên.
  • started_on (CHAR(10)): Ngày bắt đầu làm việc của giảng viên.
  1. Bảng Teaches:
  • Chứa thông tin về việc giảng viên dạy khóa học nào.
  • Cấu trúc:
  • username (VARCHAR(8)): Tên tài khoản giảng viên.
  • dept (VARCHAR(6)): Mã phòng ban của khóa học.
  • number (INTEGER): Số hiệu khóa học.

Yêu cầu:

-- Những instructors bắt đầu dạy vào hoặc sau ngày 1 tháng 1 của 20 năm trước?


username  fname    lname    started_on

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

djw     David    Wetherall  1999-07-01

tom     Tom     Anderson  1997-10-01


Câu 25: SQL117: Sửa dữ liệu sai trong bảng

  • Loại câu hỏi: ALTER
  • Độ khó: EASY

Bảng party_guests:

Trong quá trình thiết kế cơ sở dữ liệu cho một buổi tiệc, bảng party_guests đã được tạo để quản lý danh sách khách mời, bao gồm thông tin về mã định danh khách mời, tên, tuổi và số lượng đồ uống mà họ đã đặt trước. Tuy nhiên, do một số nhầm lẫn trong quá trình thiết kế, kiểu dữ liệu của một vài trường đã bị nhập sai. Nhiệm vụ của bạn là sửa lại kiểu dữ liệu cho các trường này để bảng hoạt động chính xác.

Cấu trúc bảng party_guests hiện tại:

  • guest_id (INT, khóa chính): Mã định danh duy nhất cho mỗi khách.
  • guest_name (VARCHAR(100)): Tên của khách mời.
  • age (VARCHAR(3)): Tuổi của khách. (Lỗi: Kiểu dữ liệu này cần là INT để lưu tuổi).
  • rsvp (BOOLEAN): Khách có tham gia hay không (TRUE/FALSE).
  • drinks_count (VARCHAR(5)): Số lượng đồ uống khách đã đặt trước. (Lỗi: Kiểu dữ liệu này cần là INT vì nó là số lượng).

Nhiệm vụ của bạn:

Sửa lỗi kiểu dữ liệu cho các trường age và drinks_count như sau:

  • Thay đổi kiểu dữ liệu của cột age từ VARCHAR(3) sang INT.
  • Thay đổi kiểu dữ liệu của cột drinks_count từ VARCHAR(5) sang INT.
+--------------+--------------+-------------+--------------------------+----------------+-------------+-------------------+
| COLUMN_NAME  | COLUMN_TYPE  | IS_NULLABLE | CHARACTER_MAXIMUM_LENGTH | COLUMN_DEFAULT | KEY_TYPE    | REFERENCED_COLUMN |
+--------------+--------------+-------------+--------------------------+----------------+-------------+-------------------+
| age          | int          | YES         |                          |                |             |                   |
| drinks_count | int          | YES         |                          |                |             |                   |
| guest_id     | int          | NO          |                          |                | PRIMARY KEY |                   |
| guest_name   | varchar(100) | YES         | 100                      |                |             |                   |
| rsvp         | tinyint(1)   | YES         |                          |                |             |                   |
+--------------+--------------+-------------+--------------------------+----------------+-------------+-------------------+

Câu 26: SQL118: Thiết kế cơ sở dữ liệu với bảng đăng ký khóa học

  • Loại câu hỏi: CREATE
  • Độ khó: EASY

Trong cơ sở dữ liệu hiện có hai bảng Students và Courses đã được tạo sẵn với cấu trúc như sau:

  • Bảng Students:
  • student_id (kiểu INT): Mã định danh duy nhất cho mỗi sinh viên (khóa chính).
  • student_name (kiểu VARCHAR(100)): Tên của sinh viên, không được để trống.
  • age (kiểu INT): Tuổi của sinh viên.
  • Bảng Courses:
  • course_id (kiểu INT): Mã định danh duy nhất cho mỗi khóa học (khóa chính).
  • course_name (kiểu VARCHAR(100)): Tên của khóa học, không được để trống.
  • credit_hours (kiểu INT): Số tín chỉ của khóa học.

Yêu cầu:

Nhiệm vụ của bạn là tạo một bảng mới có tên Enrollments để quản lý thông tin đăng ký khóa học của sinh viên. Bảng Enrollments cần chứa các thông tin sau:

  1. enrollment_id (kiểu INT): Mã định danh duy nhất cho mỗi lần đăng ký (khóa chính).
  2. student_id (kiểu INT): Mã sinh viên tham chiếu từ bảng Students (khóa ngoại).
  3. course_id (kiểu INT): Mã khóa học tham chiếu từ bảng Courses (khóa ngoại).
  4. enrollment_date (kiểu DATE): Ngày sinh viên đăng ký khóa học.

Yêu cầu kỹ thuật:

  • Xác định rõ các khóa chính và khóa ngoại để đảm bảo sự toàn vẹn dữ liệu giữa các bảng.
  • Bảng Enrollments cần có khóa chính là enrollment_id.
  • Cần đảm bảo các cột student_id và course_id là khóa ngoại, lần lượt tham chiếu đến bảng Students và Courses.

Câu 27: SQL119: Chỉnh sửa bảng cơ sở dữ liệu với kiểu dữ liệu sai

  • Loại câu hỏi: ALTER
  • Độ khó: EASY

Đề bài: Chỉnh sửa bảng cơ sở dữ liệu với kiểu dữ liệu sai

Trong cơ sở dữ liệu hiện tại, bảng Employees đã được tạo với các trường như sau:

sql


CREATE TABLE Employees (

employee_id VARCHAR(255),

employee_name VARCHAR(100),

hire_date VARCHAR(50),

salary VARCHAR(100)

);


Tuy nhiên, có một số vấn đề với kiểu dữ liệu của các trường trong bảng này. Cụ thể:

  1. employee_id: Đã được thiết lập là VARCHAR(255), tuy nhiên trường này nên là số nguyên (INT) vì nó là mã định danh duy nhất cho mỗi nhân viên.
  2. hire_date: Hiện đang là VARCHAR(50), nhưng nên sử dụng kiểu dữ liệu ngày (DATE) để lưu trữ ngày tháng tuyển dụng chính xác.
  3. salary: Đã được đặt là VARCHAR(100), tuy nhiên trường này nên là số thực (DECIMAL) để thể hiện đúng mức lương của nhân viên.

Yêu cầu:

Nhiệm vụ của bạn là sửa đổi bảng Employees để khắc phục các vấn đề liên quan đến kiểu dữ liệu của các trường. Cụ thể:

Thay đổi kiểu dữ liệu của employee_id thành INT.

Thay đổi kiểu dữ liệu của hire_date thành DATE.

Thay đổi kiểu dữ liệu của salary thành DECIMAL(10, 2).

Yêu cầu kỹ thuật:

  • Bạn cần sử dụng lệnh ALTER TABLE để thay đổi kiểu dữ liệu của các trường trong bảng.
  • Đảm bảo rằng các kiểu dữ liệu mới phù hợp với thông tin mà các trường này lưu trữ

Câu 28: SQL120: Tạo procedure lấy danh sách nhân viên

  • Loại câu hỏi: PROCEDURE
  • Độ khó: EASY

Viết một thủ tục (stored procedure) có tên GetEmployeeById để lấy thông tin của một nhân viên từ bảng Employees theo id. Thủ tục này cần nhận vào một tham số đầu vào là employeeId (kiểu INT) và trả về thông tin của nhân viên có id tương ứng.

Mô tả bảng:

Bảng Employees có cấu trúc như sau:


Employees (

id INT PRIMARY KEY,

name VARCHAR(255)

);

  • id: Mã định danh duy nhất của mỗi nhân viên (kiểu INT, khóa chính).
  • name: Tên của nhân viên (kiểu VARCHAR).

Yêu cầu:

Tạo một thủ tục có tên GetEmployeeById với đầu vào là id của nhân viên.


Câu 29: SQL125: Cập nhật kết quả sinh viên

  • Loại câu hỏi: UPDATE
  • Độ khó: EASY

Giả sử bạn có một bảng cơ sở dữ liệu tên là SinhVien với cấu trúc và dữ liệu như sau:

Yêu cầu:

Viết câu lệnh SQL để cập nhật cột TrangThai của bảng SinhVien dựa trên giá trị của cột DiemTB theo các quy tắc sau:

  • Nếu DiemTB lớn hơn hoặc bằng 5.0, đặt TrangThai là "Đạt".
  • Nếu DiemTB nhỏ hơn 5.0, đặt TrangThai là "Không đạt".

Câu 30: SQL126: Confirmation Rate

  • Loại câu hỏi: SELECT
  • Độ khó: MEDIUM

Bảng: Signups

  • user_id là cột có giá trị duy nhất trong bảng này.
  • Mỗi hàng chứa thông tin về thời gian đăng ký (time_stamp) của người dùng với user_id.


Bảng: Confirmations

  • (user_id, time_stamp) là khóa chính (kết hợp các cột có giá trị duy nhất).
  • user_id là khóa ngoại (foreign key) tham chiếu đến bảng Signups.
  • action là kiểu ENUM với các giá trị ('confirmed', 'timeout'):
  • 'confirmed' nghĩa là người dùng đã xác nhận.
  • 'timeout' nghĩa là thông báo xác nhận hết thời gian mà không được xác nhận.

Yêu cầu:

Tỷ lệ xác nhận (confirmation rate) của một người dùng được tính bằng:

Số lượng thông báo được xác nhận ('confirmed') chia cho tổng số thông báo yêu cầu xác nhận.

  • Nếu người dùng không yêu cầu bất kỳ thông báo xác nhận nào, tỷ lệ xác nhận của họ là 0.
  • Làm tròn tỷ lệ xác nhận đến hai chữ số thập phân.

Viết giải pháp để tính toán tỷ lệ xác nhận của mỗi người dùng.


Ví dụ:

Đầu vào:

Bảng Signups:

Bảng Confirmations:

Đầu ra:


Giải thích:

  • Người dùng 6: Không yêu cầu thông báo xác nhận nào, nên tỷ lệ xác nhận là 0.00.
  • Người dùng 3: Gửi 2 yêu cầu, cả hai đều hết thời gian (timeout), nên tỷ lệ xác nhận là 0.00.
  • Người dùng 7: Gửi 3 yêu cầu, tất cả đều được xác nhận (confirmed), nên tỷ lệ xác nhận là 1.00.
  • Người dùng 2: Gửi 2 yêu cầu, 1 được xác nhận và 1 hết thời gian, nên tỷ lệ xác nhận là 1 / 2 = 0.50.



Câu 31: SQL127: Number of Unique Subject taught by each teacher

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bảng: Teacher

  • (subject_id, dept_id) là khóa chính (tổ hợp các cột có giá trị duy nhất) của bảng này.
  • Mỗi hàng trong bảng cho biết giáo viên có teacher_id giảng dạy môn học subject_id trong khoa dept_id.


Nhiệm vụ:

Viết một giải pháp để tính số lượng môn học duy nhất mà mỗi giáo viên giảng dạy trong trường đại học.

Trả về bảng kết quả với thứ tự bất kỳ.


Ví dụ:

Đầu vào:

Bảng Teacher:

Đầu ra:


Giải thích:

  • Giáo viên 1:
  • Dạy môn học 2 trong các khoa 3 và 4.
  • Dạy môn học 3 trong khoa 3.
  • -> Số môn học duy nhất = 2.
  • Giáo viên 2:
  • Dạy môn học 1, 2, 3, 4 trong khoa 1.
  • -> Số môn học duy nhất = 4.



Câu 32: SQL128: Class more than 5 student

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Table: Courses

+-------------+---------+

| Column Name | Type |

+-------------+---------+

| student | varchar |

| class | varchar |

+-------------+---------+

(student, class) is the primary key (combination of columns with unique values) for this table.

Each row of this table indicates the name of a student and the class in which they are enrolled.

 

Write a solution to find all the classes that have at least five students.

Return the result table in any order.

The result format is in the following example.

 

Example 1:

Input:

Courses table:

+---------+----------+

| student | class |

+---------+----------+

| A | Math |

| B | English |

| C | Math |

| D | Biology |

| E | Math |

| F | Computer |

| G | Math |

| H | Math |

| I | Math |

+---------+----------+

Output:

+---------+

| class |

+---------+

| Math |

+---------+

Explanation:

- Math has 6 students, so we include it.

- English has 1 student, so we do not include it.

- Biology has 1 student, so we do not include it.

- Computer has 1 student, so we do not include it.


Câu 33: SQL129: Invalid Tweets

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bảng: Tweets

  • tweet_id là khóa chính (cột có giá trị duy nhất) của bảng này.
  • Bảng này chứa tất cả các tweet trên một ứng dụng mạng xã hội.


Nhiệm vụ:

Viết một giải pháp để tìm các ID của những tweet không hợp lệ. Một tweet được coi là không hợp lệ nếu số lượng ký tự trong nội dung (content) của nó lớn hơn 15.

Trả về bảng kết quả với thứ tự bất kỳ.


Ví dụ:

Đầu vào:

Bảng Tweets:


Đầu ra:


Giải thích:

  • Tweet 1 có độ dài = 11 ký tự, nên là một tweet hợp lệ.
  • Tweet 2 có độ dài = 33 ký tự, nên là một tweet không hợp lệ.



Câu 34: SQL130: Product Sales Anaysis

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bảng: Sales

  • (sale_id, year) là khóa chính (tổ hợp các cột có giá trị duy nhất).
  • product_id là khóa ngoại (cột tham chiếu) tới bảng Product.
  • Mỗi hàng trong bảng biểu thị một giao dịch bán sản phẩm product_id trong một năm cụ thể.
  • Lưu ý rằng giá (price) là giá mỗi đơn vị.


Bảng: Product

  • product_id là khóa chính (cột có giá trị duy nhất).
  • Mỗi hàng trong bảng biểu thị tên sản phẩm (product_name) của sản phẩm tương ứng.


Yêu cầu:

Viết một giải pháp để báo cáo:

  • Tên sản phẩm (product_name).
  • Năm (year) của giao dịch bán hàng.
  • Giá bán (price) của mỗi giao dịch (sale_id).

Trả về bảng kết quả với thứ tự bất kỳ.


Ví dụ:

Đầu vào:

Bảng Sales:

Bảng Product:

Đầu ra:


Giải thích:

  • Từ sale_id = 1, có thể kết luận rằng sản phẩm "Nokia" được bán với giá 5000 trong năm 2008.
  • Từ sale_id = 2, có thể kết luận rằng sản phẩm "Nokia" được bán với giá 5000 trong năm 2009.
  • Từ sale_id = 7, có thể kết luận rằng sản phẩm "Apple" được bán với giá 9000 trong năm 2011.



Câu 35: SQL131: Customer who bought all product

  • Loại câu hỏi: SELECT
  • Độ khó: MEDIUM

Bảng: Customer

+-------------+---------+

| Tên Cột | Kiểu Dữ Liệu |

+-------------+---------+

| customer_id | int |

| product_key | int |

+-------------+---------+

Bảng này có thể chứa các hàng trùng lặp.

  • customer_id không được NULL.
  • product_key là khóa ngoại (cột tham chiếu) tới bảng Product.

Bảng: Product

+-------------+---------+

| Tên Cột | Kiểu Dữ Liệu |

+-------------+---------+

| product_key | int |

+-------------+---------+

  • product_key là khóa chính (cột có giá trị duy nhất) của bảng này.

Yêu cầu:

Viết một giải pháp để báo cáo các customer_id từ bảng Customer đã mua tất cả các sản phẩm trong bảng Product.

Trả về bảng kết quả với thứ tự bất kỳ.

Ví dụ 1:

Đầu vào:

Bảng Customer:

+-------------+-------------+

| customer_id | product_key |

+-------------+-------------+

| 1 | 5 |

| 2 | 6 |

| 3 | 5 |

| 3 | 6 |

| 1 | 6 |

+-------------+-------------+

Bảng Product:

+-------------+

| product_key |

+-------------+

| 5 |

| 6 |

+-------------+

Đầu ra:

+-------------+

| customer_id |

+-------------+

| 1 |

| 3 |

+-------------+

Giải thích:

  • Những khách hàng đã mua tất cả các sản phẩm (5 và 6) là khách hàng có customer_id = 1 và customer_id = 3.



Câu 36: SQL133: Average Selling Price

  • Loại câu hỏi: SELECT
  • Độ khó: MEDIUM

Bảng: Prices

+------------+------------+------------+--------+

| Tên Cột | Kiểu Dữ Liệu |

+------------+------------+------------+--------+

| product_id | int |

| start_date | date |

| end_date | date |

| price | int |

+------------+------------+------------+--------+

  • (product_id, start_date, end_date) là khóa chính (tổ hợp các cột có giá trị duy nhất).
  • Mỗi hàng biểu thị giá của sản phẩm (product_id) trong khoảng thời gian từ start_date đến end_date.
  • Với mỗi product_id, không có hai khoảng thời gian nào trùng lặp.

Bảng: UnitsSold

+------------+---------------+-------+

| Tên Cột | Kiểu Dữ Liệu |

+------------+---------------+-------+

| product_id | int |

| purchase_date | date |

| units | int |

+------------+---------------+-------+

  • Bảng này có thể chứa các hàng trùng lặp.
  • Mỗi hàng biểu thị ngày bán (purchase_date), số lượng (units), và sản phẩm (product_id) được bán.


Yêu cầu:

Viết một giải pháp để tìm giá bán trung bình (average_price) của mỗi sản phẩm.

  • average_price = Tổng giá bán / Tổng số lượng sản phẩm bán được.
  • Làm tròn giá bán trung bình đến 2 chữ số thập phân.
  • Nếu sản phẩm không có bất kỳ đơn vị nào được bán, giá bán trung bình được giả định là 0.

Trả về bảng kết quả với thứ tự bất kỳ.


Ví dụ 1:

Đầu vào:

Bảng Prices:

+------------+------------+------------+--------+

| product_id | start_date | end_date | price |

+------------+------------+------------+--------+

| 1 | 2019-02-17 | 2019-02-28 | 5 |

| 1 | 2019-03-01 | 2019-03-22 | 20 |

| 2 | 2019-02-01 | 2019-02-20 | 15 |

| 2 | 2019-02-21 | 2019-03-31 | 30 |

+------------+------------+------------+--------+

Bảng UnitsSold:

+------------+---------------+-------+

| product_id | purchase_date | units |

+------------+---------------+-------+

| 1 | 2019-02-25 | 100 |

| 1 | 2019-03-01 | 15 |

| 2 | 2019-02-10 | 200 |

| 2 | 2019-03-22 | 30 |

+------------+---------------+-------+

Đầu ra:

+------------+---------------+

| product_id | average_price |

+------------+---------------+

| 1 | 6.96 |

| 2 | 16.96 |

+------------+---------------+


Giải thích:

  1. Sản phẩm 1:
  • Ngày 2019-02-25: Giá 5, Số lượng 100.
  • Ngày 2019-03-01: Giá 20, Số lượng 15.
  • Tổng giá bán = (100 × 5) + (15 × 20) = 500 + 300 = 800.
  • Tổng số lượng bán được = 100 + 15 = 115.
  • Giá trung bình = 800 / 115 ≈ 6.96.
  1. Sản phẩm 2:
  • Ngày 2019-02-10: Giá 15, Số lượng 200.
  • Ngày 2019-03-22: Giá 30, Số lượng 30.
  • Tổng giá bán = (200 × 15) + (30 × 30) = 3000 + 900 = 3900.
  • Tổng số lượng bán được = 200 + 30 = 230.
  • Giá trung bình = 3900 / 230 ≈ 16.96.



Câu 37: SQL134: Movie rating

  • Loại câu hỏi: SELECT
  • Độ khó: HARD

Bảng: Movies

+-------------+---------+

| Tên Cột | Kiểu Dữ Liệu |

+-------------+---------+

| movie_id | int |

| title | varchar |

+-------------+---------+


  • movie_id là khóa chính (cột có giá trị duy nhất).
  • title chứa tên của bộ phim.

Bảng: Users

+-------------+---------+

| Tên Cột | Kiểu Dữ Liệu |

+-------------+---------+

| user_id | int |

| name | varchar |

+-------------+---------+

  • user_id là khóa chính (cột có giá trị duy nhất).
  • name chứa tên của người dùng, và giá trị trong cột này là duy nhất.

Bảng: MovieRating

+-------------+---------+

| Tên Cột | Kiểu Dữ Liệu |

+-------------+---------+

| movie_id | int |

| user_id | int |

| rating | int |

| created_at | date |

+-------------+---------+

  • (movie_id, user_id) là khóa chính (cột có giá trị duy nhất).
  • Bảng này chứa đánh giá của người dùng (rating) về các bộ phim (movie_id).
  • created_at ghi lại ngày mà người dùng thực hiện đánh giá.


Yêu cầu:

  1. Tìm tên của người dùng đã đánh giá nhiều bộ phim nhất. Trong trường hợp có nhiều người dùng đánh giá số lượng phim như nhau, trả về tên người có thứ tự từ điển (lexicographically) nhỏ hơn.
  2. Tìm tên của bộ phim có xếp hạng trung bình cao nhất trong tháng 2 năm 2020. Trong trường hợp có nhiều phim có xếp hạng trung bình bằng nhau, trả về tên phim có thứ tự từ điển (lexicographically) nhỏ hơn.

Trả về bảng kết quả với một cột results.


Ví dụ 1:

Đầu vào:

Bảng Movies:

+-------------+--------------+

| movie_id | title |

+-------------+--------------+

| 1 | Avengers |

| 2 | Frozen 2 |

| 3 | Joker |

+-------------+--------------+

Bảng Users:

+-------------+--------------+

| user_id | name |

+-------------+--------------+

| 1 | Daniel |

| 2 | Monica |

| 3 | Maria |

| 4 | James |

+-------------+--------------+

Bảng MovieRating:

+-------------+--------------+--------------+-------------+

| movie_id | user_id | rating | created_at|

+-------------+--------------+--------------+-------------+

| 1 | 1 | 3 | 2020-01-12 |

| 1 | 2 | 4 | 2020-02-11 |

| 1 | 3 | 2 | 2020-02-12 |

| 1 | 4 | 1 | 2020-01-01 |

| 2 | 1 | 5 | 2020-02-17 |

| 2 | 2 | 2 | 2020-02-01 |

| 2 | 3 | 2 | 2020-03-01 |

| 3 | 1 | 3 | 2020-02-22 |

| 3 | 2 | 4 | 2020-02-25 |

+-------------+--------------+--------------+-------------+

Đầu ra:

+--------------+

| results |

+--------------+

| Daniel |

| Frozen 2 |

+--------------+

Giải thích:

  1. Người dùng đánh giá nhiều phim nhất:
  • Daniel và Monica đều đánh giá 3 bộ phim: "Avengers", "Frozen 2", và "Joker".
  • Tên của Daniel nhỏ hơn lexicographically, nên kết quả là Daniel.
  1. Bộ phim có xếp hạng trung bình cao nhất trong tháng 2 năm 2020:
  • Frozen 2: (5 + 2) / 2 = 3.5.
  • Joker: (3 + 4) / 2 = 3.5.
  • Cả hai phim có cùng xếp hạng trung bình, nhưng Frozen 2 có thứ tự từ điển nhỏ hơn, nên kết quả là Frozen 2.

Câu 38: SQL136: Students and examinations

  • Loại câu hỏi: SELECT
  • Độ khó: MEDIUM

Bảng: Students

+-------------+-------------+

| Tên Cột | Kiểu Dữ Liệu |

+-------------+-------------+

| student_id | int |

| student_name | varchar |

+-------------+-------------+

  • student_id là khóa chính (cột có giá trị duy nhất).
  • Mỗi hàng trong bảng chứa thông tin về ID và tên của một học sinh trong trường.

Bảng: Subjects

+--------------+-------------+

| Tên Cột | Kiểu Dữ Liệu |

+--------------+-------------+

| subject_name | varchar |

+--------------+-------------+

  • subject_name là khóa chính (cột có giá trị duy nhất).
  • Mỗi hàng trong bảng chứa tên của một môn học trong trường.

Bảng: Examinations

+--------------+-------------+

| Tên Cột | Kiểu Dữ Liệu |

+--------------+-------------+

| student_id | int |

| subject_name | varchar |

+--------------+-------------+

  • Không có khóa chính trong bảng này.
  • Bảng có thể chứa các hàng trùng lặp.
  • Mỗi hàng cho biết rằng một học sinh với student_id đã tham dự kỳ thi của môn học subject_name.


Yêu cầu:

Viết một giải pháp để tìm số lần mỗi học sinh tham dự mỗi kỳ thi.

Kết quả trả về cần được sắp xếp theo student_id và subject_name.


Ví dụ 1:

Đầu vào:

Bảng Students:

+------------+--------------+

| student_id | student_name |

+------------+--------------+

| 1 | Alice |

| 2 | Bob |

| 13 | John |

| 6 | Alex |

+------------+--------------+

Bảng Subjects:

+--------------+

| subject_name |

+--------------+

| Math |

| Physics |

| Programming |

+--------------+

Bảng Examinations:

+------------+--------------+

| student_id | subject_name |

+------------+--------------+

| 1 | Math |

| 1 | Physics |

| 1 | Programming |

| 2 | Programming |

| 1 | Physics |

| 1 | Math |

| 13 | Math |

| 13 | Programming |

| 13 | Physics |

| 2 | Math |

| 1 | Math |

+------------+--------------+

Đầu ra:

+------------+--------------+--------------+----------------+

| student_id | student_name | subject_name | attended_exams |

+------------+--------------+--------------+----------------+

| 1 | Alice | Math | 3 |

| 1 | Alice | Physics | 2 |

| 1 | Alice | Programming | 1 |

| 2 | Bob | Math | 1 |

| 2 | Bob | Physics | 0 |

| 2 | Bob | Programming | 1 |

| 6 | Alex | Math | 0 |

| 6 | Alex | Physics | 0 |

| 6 | Alex | Programming | 0 |

| 13 | John | Math | 1 |

| 13 | John | Physics | 1 |

| 13 | John | Programming | 1 |

+------------+--------------+--------------+----------------+


Giải thích:

  • Bảng kết quả cần bao gồm tất cả học sinh và tất cả môn học, kể cả khi học sinh không tham gia kỳ thi nào.
  • Alice tham dự kỳ thi Math 3 lần, Physics 2 lần, và Programming 1 lần.
  • Bob tham dự kỳ thi Math 1 lần, Programming 1 lần, và không tham dự Physics.
  • Alex không tham dự kỳ thi nào.
  • John tham dự mỗi kỳ thi Math, Physics, và Programming 1 lần.



Câu 39: SQL137: Managers with at least 5 direction report

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bảng: Employee

+-------------+---------+

| Tên Cột | Kiểu Dữ Liệu |

+-------------+---------+

| id | int |

| name | varchar |

| department | varchar |

| managerId | int |

+-------------+---------+

  • id là khóa chính (cột có giá trị duy nhất).
  • Mỗi hàng trong bảng biểu thị thông tin của một nhân viên, bao gồm tên (name), phòng ban (department), và ID của quản lý trực tiếp (managerId).
  • Nếu managerId là NULL, nghĩa là nhân viên không có quản lý.
  • Không có nhân viên nào là quản lý của chính mình.


Yêu cầu:

Viết một giải pháp để tìm các quản lý có ít nhất 5 nhân viên báo cáo trực tiếp.

Trả về bảng kết quả với thứ tự bất kỳ.


Ví dụ 1:

Đầu vào:

Bảng Employee:

+-----+-------+------------+-----------+

| id | name | department | managerId |

+-----+-------+------------+-----------+

| 101 | John | A | NULL |

| 102 | Dan | A | 101 |

| 103 | James | A | 101 |

| 104 | Amy | A | 101 |

| 105 | Anne | A | 101 |

| 106 | Ron | B | 101 |

+-----+-------+------------+-----------+

Đầu ra:

+------+

| name |

+------+

| John |

+------+

Giải thích:

  • John (ID = 101) là quản lý của 5 nhân viên: Dan, James, Amy, Anne, và Ron.
  • Vì vậy, kết quả trả về là John.



Câu 40: SQL138: Fix name in a table

  • Loại câu hỏi: UPDATE
  • Độ khó: EASY

Bảng: Users

+----------------+---------+

| Tên Cột | Kiểu Dữ Liệu |

+----------------+---------+

| user_id | int |

| name | varchar |

+----------------+---------+

  • user_id là khóa chính (cột có giá trị duy nhất).
  • Bảng này chứa thông tin ID và tên của người dùng.
  • Tên (name) chỉ chứa các ký tự chữ cái in thường hoặc in hoa.


Yêu cầu:

Viết một giải pháp để chỉnh sửa các tên sao cho:

  • Chỉ ký tự đầu tiên được viết hoa.
  • Các ký tự còn lại phải được chuyển thành chữ thường.

Trả về bảng kết quả được sắp xếp theo user_id.


Ví dụ 1:

Đầu vào:

Bảng Users:

+---------+-------+

| user_id | name |

+---------+-------+

| 1 | aLice |

| 2 | bOB |

+---------+-------+

Đầu ra:

+---------+-------+

| user_id | name |

+---------+-------+

| 1 | Alice |

| 2 | Bob |

+---------+-------+

Giải thích:

  • Tên của người dùng được chuẩn hóa sao cho chỉ ký tự đầu tiên viết hoa:
  • aLice → Alice.
  • bOB → Bob.



Câu 41: SQL139: Empoyee bonus

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Bảng: Employee

+-------------+---------+

| Tên Cột | Kiểu Dữ Liệu |

+-------------+---------+

| empId | int |

| name | varchar |

| supervisor | int |

| salary | int |

+-------------+---------+

  • empId là cột có giá trị duy nhất trong bảng này.
  • Mỗi hàng biểu thị thông tin ID, tên (name), mức lương (salary), và ID của người giám sát (supervisor) của một nhân viên.


Bảng: Bonus

+-------------+------+

| Tên Cột | Kiểu Dữ Liệu |

+-------------+------+

| empId | int |

| bonus | int |

+-------------+------+

  • empId là cột có giá trị duy nhất trong bảng này.
  • empId là khóa ngoại tham chiếu đến cột empId của bảng Employee.
  • Mỗi hàng biểu thị ID của một nhân viên và số tiền thưởng (bonus) của họ.


Yêu cầu:

Viết một giải pháp để báo cáo tên (name) và số tiền thưởng (bonus) của mỗi nhân viên có tiền thưởng nhỏ hơn 1000.

  • Nếu nhân viên không có tiền thưởng, cột bonus sẽ hiển thị NULL.

Trả về bảng kết quả với thứ tự bất kỳ.

Ví dụ 1:

Đầu vào:

Bảng Employee:

+-------+--------+------------+--------+

| empId | name | supervisor | salary |

+-------+--------+------------+--------+

| 3 | Brad | NULL | 4000 |

| 1 | John | 3 | 1000 |

| 2 | Dan | 3 | 2000 |

| 4 | Thomas | 3 | 4000 |

+-------+--------+------------+--------+

Bảng Bonus:

+-------+-------+

| empId | bonus |

+-------+-------+

| 2 | 500 |

| 4 | 2000 |

+-------+-------+

Đầu ra:

+------+-------+

| name | bonus |

+------+-------+

| Brad | NULL |

| John | NULL |

| Dan | 500 |

+------+-------+


Giải thích:

  • Brad (empId = 3) không có tiền thưởng, nên bonus là NULL.
  • John (empId = 1) không có tiền thưởng, nên bonus là NULL.
  • Dan (empId = 2) có tiền thưởng là 500 (< 1000), nên bonus là 500.
  • Thomas (empId = 4) có tiền thưởng là 2000 (> 1000), không được đưa vào kết quả.

Câu 42: SQL147: Danh sách các đối tác cung cấp hàng cho công ty

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Cho cơ sở dữ liệu sau được dùng để quản lý công tác giao hàng trong một công ty kinh doanh

Bảng NHACUNGCAP lưu trữ dữ liệu về các đối tác cung cấp hàng cho công ty.

Bảng MATHANG lưu trữ dữ liệu về các mặt hàng hiện có trong công ty

Bảng LOAIHANG phân loại các mặt hàng hiện có

Bảng NHANVIEN có dữ liệu là các thông tin về nhân viên làm việc trong công ty

Bảng KHACHHANG được sử dụng để lưu trữ các thông tin về khách hàng của công ty


Câu hỏi: Cho biết danh sách các đối tác cung cấp hàng cho công ty?


Ouput mẫu:


Câu 43: SQL148: Mã hàng, tên hàng và số lượng của các mặt hàng hiện có trong công ty

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Cho cơ sở dữ liệu sau được dùng để quản lý công tác giao hàng trong một công ty kinh doanh

Bảng NHACUNGCAP lưu trữ dữ liệu về các đối tác cung cấp hàng cho công ty.

Bảng MATHANG lưu trữ dữ liệu về các mặt hàng hiện có trong công ty

Bảng LOAIHANG phân loại các mặt hàng hiện có

Bảng NHANVIEN có dữ liệu là các thông tin về nhân viên làm việc trong công ty

Bảng KHACHHANG được sử dụng để lưu trữ các thông tin về khách hàng của công ty


Câu hỏi: Cho biết Mã hàng, tên hàng và số lượng của các mặt hàng hiện có trong công ty?


Câu 44: SQL149: Họ tên, địa chỉ và năm bắt đầu làm việc của các nhân viên trong cty

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Cho cơ sở dữ liệu sau được dùng để quản lý công tác giao hàng trong một công ty kinh doanh

Bảng NHACUNGCAP lưu trữ dữ liệu về các đối tác cung cấp hàng cho công ty.

Bảng MATHANG lưu trữ dữ liệu về các mặt hàng hiện có trong công ty

Bảng LOAIHANG phân loại các mặt hàng hiện có

Bảng NHANVIEN có dữ liệu là các thông tin về nhân viên làm việc trong công ty

Bảng KHACHHANG được sử dụng để lưu trữ các thông tin về khách hàng của công ty


Câu hỏi: Cho biết Họ tên, địa chỉ và năm bắt đầu làm việc của các nhân viên trong cty?

Output:


Câu 45: SQL150: Cho biết mỗi mặt hàng trong công ty do ai cung cấp

  • Loại câu hỏi: SELECT
  • Độ khó: EASY

Cho cơ sở dữ liệu sau được dùng để quản lý công tác giao hàng trong một công ty kinh doanh

About

Đề và Code môn Cơ sở dữ liệu (SQL) trên DBPTIT

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages