高频SQL50题(基础版)三

简介: 高频SQL50题(基础版)三

620.有趣的电影(简单)

表:cinema

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

| Column Name    | Type     |

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

| id             | int      |

| movie          | varchar  |

| description    | varchar  |

| rating         | float    |

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

id 是该表的主键(具有唯一值的列)。

每行包含有关电影名称、类型和评级的信息。

评级为 [0,10] 范围内的小数点后 2 位浮点数。

编写解决方案,找出所有影片描述为 非 boring (不无聊) 的并且 id 为奇数 的影片。

返回结果按 rating 降序排列

结果格式如下示例。

示例 1:

输入:

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

|   id    | movie     |  description |  rating   |

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

|   1     | War       |   great 3D   |   8.9     |

|   2     | Science   |   fiction    |   8.5     |

|   3     | irish     |   boring     |   6.2     |

|   4     | Ice song  |   Fantacy    |   8.6     |

|   5     | House card|   Interesting|   9.1     |

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

输出:

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

|   id    | movie     |  description |  rating   |

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

|   5     | House card|   Interesting|   9.1     |

|   1     | War       |   great 3D   |   8.9     |

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

解释:

我们有三部电影,它们的 id 是奇数:1、3 和 5。id = 3 的电影是 boring 的,所以我们不把它包括在答案中。

代码SQL如下:

select * from cinema
where description != 'boring' and id%2!=0
order by rating desc;

1251.平均售价(简单)

表:Prices

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

| Column Name   | Type    |

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

| product_id    | int     |

| start_date    | date    |

| end_date      | date    |

| price         | int     |

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

(product_id,start_date,end_date) 是 prices

表的主键(具有唯一值的列的组合)。

prices

表的每一行表示的是某个产品在一段时期内的价格。

每个产品的对应时间段是不会重叠的,这也意味着同一个产品的价格时段不会出现交叉。

表:UnitsSold


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

| Column Name   | Type    |

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

| product_id    | int     |

| purchase_date | date    |

| units         | int     |

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

该表可能包含重复数据。

该表的每一行表示的是每种产品的出售日期,单位和产品 id。

编写解决方案以查找每种产品的平均售价。average_price 应该 四舍五入到小数点后两位。如果产品没有任何售出,则假设其平均售价为 0。


返回结果表 无顺序要求 。


结果格式如下例所示。

示例 1:

输入:

Prices table:

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

| 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     |

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

UnitsSold table:

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

| 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    |

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

输出:

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

| product_id | average_price |

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

| 1          | 6.96          |

| 2          | 16.96         |

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

解释:

平均售价 = 产品总价 / 销售的产品数量。

产品 1 的平均售价 = ((100 * 5)+(15 * 20) )/ 115 = 6.96

产品 2 的平均售价 = ((200 * 15)+(30 * 30) )/ 230 = 16.96

代码SQL如下:

SELECT a.product_id AS product_id,
        ROUND(SUM(a.t_price)/SUM(a.units),2) AS average_price
FROM(
        SELECT  p.product_id,
                p.price*u.units AS t_price,
                u.units AS units
        FROM Prices p 
        JOIN UnitsSold u 
            ON u.product_id=p.product_id 
        WHERE u.purchase_date BETWEEN p.start_date AND p.end_date    
    ) AS a
GROUP BY a.product_id

1075.项目员工I(简单)

项目表 Project

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

| Column Name | Type    |

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

| project_id  | int     |

| employee_id | int     |

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

主键为 (project_id, employee_id)。

employee_id 是员工表

Employee 表的外键。

这张表的每一行表示 employee_id 的员工正在 project_id 的项目上工作。

员工表 Employee:


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

| Column Name      | Type    |

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

| employee_id      | int     |

| name             | varchar |

| experience_years | int     |

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

主键是 employee_id。数据保证 experience_years 非空。

这张表的每一行包含一个员工的信息。

请写一个 SQL 语句,查询每一个项目中员工的 平均 工作年限,精确到小数点后两位。

以 任意 顺序返回结果表。

查询结果的格式如下。


示例 1:

输入:

Project 表:

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

| project_id  | employee_id |

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

| 1           | 1           |

| 1           | 2           |

| 1           | 3           |

| 2           | 1           |

| 2           | 4           |

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


Employee 表:

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

| employee_id | name   | experience_years |

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

| 1           | Khaled | 3                |

| 2           | Ali    | 2                |

| 3           | John   | 1                |

| 4           | Doe    | 2                |

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


输出:

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

| project_id  | average_years |

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

| 1           | 2.00          |

| 2           | 2.50          |

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

解释:第一个项目中,员工的平均工作年限是 (3 + 2 + 1) / 3 = 2.00;第二个项目中,员工的平均工作年限是 (3 + 2) / 2 = 2.50

代码SQL如下:

select t1.project_id,round(avg(t2.experience_years),2) as average_years 
from Project as t1
join Employee as t2
on t1.employee_id = t2.employee_id 
group by project_id ;

1633.各赛事的用户注册率(简单)

用户表: Users

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

| Column Name | Type    |

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

| user_id     | int     |

| user_name   | varchar |

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

user_id 是该表的主键(具有唯一值的列)。

该表中的每行包括用户 ID 和用户名。

注册表: Register

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

| Column Name | Type    |

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

| contest_id  | int     |

| user_id     | int     |

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

(contest_id, user_id) 是该表的主键(具有唯一值的列的组合)。

该表中的每行包含用户的 ID 和他们注册的赛事。

编写解决方案统计出各赛事的用户注册百分率,保留两位小数。

返回的结果表按 percentage降序 排序,若相同则按 contest_id升序 排序。

返回结果如下示例所示。

示例 1:

1. 输入:
2. Users

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

| user_id | user_name |

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

| 6       | Alice     |

| 2       | Bob       |

| 7       | Alex      |

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

Register

表:

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

| contest_id | user_id |

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

| 215        | 6       |

| 209        | 2       |

| 208        | 2       |

| 210        | 6       |

| 208        | 6       |

| 209        | 7       |

| 209        | 6       |

| 215        | 7       |

| 208        | 7       |

| 210        | 2       |

| 207        | 2       |

| 210        | 7       |

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

输出:

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

| contest_id | percentage |

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

| 208        | 100.0      |

| 209        | 100.0      |

| 210        | 100.0      |

| 215        | 66.67      |

| 207        | 33.33      |

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

解释:

所有用户都注册了 208、209 和 210 赛事,因此这些赛事的注册率为 100% ,我们按 contest_id 的降序排序加入结果表中。

Alice 和 Alex 注册了 215 赛事,注册率为 ((2/3) * 100) = 66.67%

Bob 注册了 207 赛事,注册率为 ((1/3) * 100) = 33.33%

代码SQL如下:

select contest_id ,round(count(user_id)*100 / (select count(*) from Users),2) as percentage 
from Register 
group by contest_id 
order by percentage desc,contest_id; 

1211.查询结果的质量和占比(简单)

Queries 表:

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

| Column Name | Type    |

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

| query_name  | varchar |

| result      | varchar |

| position    | int     |

| rating      | int     |

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

此表可能有重复的行。

此表包含了一些从数据库中收集的查询信息。

“位置”(

“位置”(position)列的值为 1500

“评分”(rating)列的值为15 。评分小于 3 的查询被定义为质量很差的查询。


将查询结果的质量 quality 定义为:

各查询结果的评分与其位置之间比率的平均值。

将劣质查询百分比 poor_query_percentage 定义为:

评分小于 3 的查询结果占全部查询结果的百分比。

编写解决方案,找出每次的 query_namequalitypoor_query_percentage

qualitypoor_query_percentage 都应 四舍五入到小数点后两位

任意顺序 返回结果表。

结果格式如下所示:

示例 1:

输入:

Queries table:

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

| query_name | result            | position | rating |

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

| Dog        | Golden Retriever  | 1        | 5      |

| Dog        | German Shepherd   | 2        | 5      |

| Dog        | Mule              | 200      | 1      |

| Cat        | Shirazi           | 5        | 2      |

| Cat        | Siamese           | 3        | 3      |

| Cat        | Sphynx            | 7        | 4      |

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

输出:

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

| query_name | quality | poor_query_percentage |

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

| Dog        | 2.50    | 33.33                 |

| Cat        | 0.66    | 33.33                 |

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

解释:

Dog 查询结果的质量为 ((5 / 1) + (5 / 2) + (1 / 200)) / 3 = 2.50

Dog 查询结果的劣质查询百分比为 (1 / 3) * 100 = 33.33

Cat 查询结果的质量为 ((2 / 5) + (3 / 3) + (4 / 7)) / 3 = 0.66

Cat 查询结果的劣质查询百分比为 (1 / 3) * 100 = 33.33

代码SQL如下:

SELECT 
    query_name, 
    ROUND(AVG(rating/position), 2) quality,
    ROUND(SUM(IF(rating < 3, 1, 0)) * 100 / COUNT(*), 2) poor_query_percentage
FROM Queries
Where query_name IS NOT NULL
GROUP BY query_name 


相关文章
|
9天前
|
SQL
高频SQL50题(基础版)二
高频SQL50题(基础版)二
|
9天前
|
SQL
高频SQL50题(基础版)
高频SQL50题(基础版)
|
SQL
国际站 SQL Server 发布 标准单机基础版
信息摘要: 国际站 SQL Server 发布 标准单机基础版,提供更高性价比的SQL Server 实例适用客户: 使用SQL Server 的用户,适用于中小企业管理软件,如财务管理、进销存管理、ERP、CRM等系统。
846 0
|
SQL Web App开发 数据库
|
1月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
3月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
85 13
|
3月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
3月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
56 6
|
2月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
324 0
|
3月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
247 1