题目:
-
查询 customers 表中所有居住在 'CA' 州的客户的全名(first_name + last_name)和电话号码
-
查询积分(points)大于 1000 的客户,按积分降序排列
-
查询 1990 年以后出生的客户信息,只显示姓名和出生日期
-
查询 products 表中单价(unit_price)最高的 5 个产品
-
查询 orders 表中 2017 年之后下单且状态不为 1 的所有订单
-
查询 shippers 表中所有运输商名称中包含 'LLC' 的记录
1.
查询 customers 表中所有居住在 'CA' 州的客户的全名(first_name + last_name)和电话号码
输入
SELECT CONCAT(first_name,' ',last_name) AS cus_name, phone
FROM customers
WHERE state = 'CA';
输出

详细检查和批改建议
优点:
-
完全符合题目要求:
-
查询CA州的客户
-
显示客户全名和电话号码
-
-
使用了CONCAT函数合理组合first_name和last_name
-
使用了列别名(AS cus_name)提高结果可读性
-
WHERE条件简洁明确
-
格式规范清晰
可选的优化建议(非必需):
-
添加排序(虽然题目未要求)
-
处理NULL值(如果phone可能为NULL)
SELECT CONCAT(first_name, ' ', last_name) AS cus_name, COALESCE(phone, 'N/A') AS phone FROM customers WHERE state = 'CA';
2.
查询积分(points)大于 1000 的客户,按积分降序排列
输入
SELECT customer_id, CONCAT(first_name, ' ', last_name) AS cus_name, points
FROM customers
WHERE points > 1000
ORDER BY points DESC;
输出

详细检查和批改建议
优点:
-
完全符合题目要求:
-
筛选积分>1000的客户
-
显示客户ID、全名和积分
-
按积分降序排列
-
-
使用了CONCAT函数合并姓名
-
使用了有意义的列别名(AS cus_name)
-
正确的排序语法(ORDER BY points DESC)
-
简洁清晰的查询结构
可选的增强建议(非必需):
-
添加LIMIT(如果只需要前N条记录):
-
格式化输出积分(如千位分隔):
SELECT customer_id, CONCAT(first_name, ' ', last_name) AS cus_name, FORMAT(points, 0) AS formatted_points FROM customers WHERE points > 1000 ORDER BY points DESC;
3.
查询 1990 年以后出生的客户信息,只显示姓名和出生日期
输入
SELECT CONCAT(first_name,' ', last_name) AS cus_name, birth_date
FROM customers
WHERE birth_date >= '1990-01-01';
输出

详细检查和批改建议
优点:
-
正确的日期比较方式:
-
直接使用日期列与日期字符串比较
-
避免了使用YEAR()函数,这样可以利用birth_date字段的索引
-
-
性能优势:
-
比使用
YEAR(birth_date) >= 1990效率更高 -
数据库可以直接使用日期索引进行筛选
-
-
语义清晰:
-
明确表示要查询1990年1月1日及之后出生的客户
-
比使用YEAR函数更直观
-
可选的增强建议(非必需):
-
添加NULL值处理(如果birth_date可能为NULL):
WHERE birth_date IS NOT NULL AND birth_date >= '1990-01-01' -
添加排序(虽然题目未要求)
-
使用表别名(使查询更简洁)
4.
查询 products 表中单价(unit_price)最高的 5 个产品
输入
SELECT product_id, name, unit_price
FROM products
ORDER BY unit_price DESC LIMIT 5;
输出

详细检查和批改建议
优点:
-
完全符合题目要求:
-
查询单价最高的5个产品
-
显示了产品ID、名称和单价
-
-
正确的排序语法:
-
使用
ORDER BY unit_price DESC实现降序排列
-
-
正确的限制结果集:
-
使用
LIMIT 5精确获取前5条记录
-
-
简洁高效的写法:
-
直接操作products单表
-
没有不必要的复杂性
-
可选的增强建议(非必需)
1.格式化价格显示(如保留两位小数):
SELECT
product_id,
name,
FORMAT(unit_price, 2) AS formatted_price
FROM products
ORDER BY unit_price DESC
LIMIT 5;
2.处理并列情况(如果有相同单价的产品):
ORDER BY unit_price DESC, name ASC
LIMIT 5;
5.
查询 orders 表中 2017 年之后下单且状态不为 1 的所有订单
输入
SELECT order_id, customer_id, order_date
FROM orders
WHERE order_date >= '2017-01-01' AND status != 1;
输出

详细检查和批改建议
优点:
-
正确的日期范围:
-
order_date >= '2018-01-01'准确筛选2018年及以后的订单 -
严格符合题目"2017年之后"的要求(即从2018年开始)
-
-
正确的状态筛选:
-
status != 1有效排除了状态为1的订单 -
虽然直接使用数字,但在已知状态含义的情况下是合理的
-
-
简洁高效的写法:
-
只查询必要的字段
-
条件表达式简单直接
-
可选的增强建议(非必需):
-
添加状态解释(作为注释)
-
使用表别名
-
添加排序(虽然题目未要求)
6.
查询 shippers 表中所有运输商名称中包含 'LLC' 的记录
输入
SELECT shipper_id, name
FROM shippers
WHERE name LIKE '%LLC%';
输出

详细检查和批改建议
优点:
-
完全符合题目要求:
-
查询名称包含"LLC"的运输商
-
显示了运输商ID和名称
-
-
正确的LIKE用法:
-
使用
%LLC%匹配名称中任意位置包含"LLC"的记录
-
-
简洁高效的写法:
-
直接操作shippers单表
-
没有不必要的复杂性
-
可选的增强建议(非必需):
-
添加排序(使结果更有条理)
-
使用表别名
-
考虑大小写不敏感(根据数据库配置):
WHERE LOWER(name) LIKE '%llc%';
4152

被折叠的 条评论
为什么被折叠?



