单表查询练习

 题目:

  1. 查询 customers 表中所有居住在 'CA' 州的客户的全名(first_name + last_name)和电话号码

  2. 查询积分(points)大于 1000 的客户,按积分降序排列

  3. 查询 1990 年以后出生的客户信息,只显示姓名和出生日期

  4. 查询 products 表中单价(unit_price)最高的 5 个产品

  5. 查询 orders 表中 2017 年之后下单且状态不为 1 的所有订单

  6. 查询 shippers 表中所有运输商名称中包含 'LLC' 的记录


1. 

查询 customers 表中所有居住在 'CA' 州的客户的全名(first_name + last_name)和电话号码

输入

SELECT CONCAT(first_name,' ',last_name) AS cus_name, phone
FROM customers
WHERE state = 'CA';

输出

详细检查和批改建议

优点:

  1. 完全符合题目要求:

    • 查询CA州的客户

    • 显示客户全名和电话号码

  2. 使用了CONCAT函数合理组合first_name和last_name

  3. 使用了列别名(AS cus_name)提高结果可读性

  4. WHERE条件简洁明确

  5. 格式规范清晰 

可选的优化建议(非必需):

  1. 添加排序(虽然题目未要求)

  2. 处理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;

输出

详细检查和批改建议

优点:

  1. 完全符合题目要求:

    • 筛选积分>1000的客户

    • 显示客户ID、全名和积分

    • 按积分降序排列

  2. 使用了CONCAT函数合并姓名

  3. 使用了有意义的列别名(AS cus_name)

  4. 正确的排序语法(ORDER BY points DESC)

  5. 简洁清晰的查询结构

可选的增强建议(非必需):

  1. 添加LIMIT(如果只需要前N条记录):

  2. 格式化输出积分(如千位分隔):

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

输出

详细检查和批改建议

优点:

  1. 正确的日期比较方式

    • 直接使用日期列与日期字符串比较

    • 避免了使用YEAR()函数,这样可以利用birth_date字段的索引

  2. 性能优势

    • 比使用YEAR(birth_date) >= 1990效率更高

    • 数据库可以直接使用日期索引进行筛选

  3. 语义清晰

    • 明确表示要查询1990年1月1日及之后出生的客户

    • 比使用YEAR函数更直观

可选的增强建议(非必需):

  1. 添加NULL值处理(如果birth_date可能为NULL):

    WHERE birth_date IS NOT NULL AND birth_date >= '1990-01-01'
  2. 添加排序(虽然题目未要求)

  3. 使用表别名(使查询更简洁)


4.

查询 products 表中单价(unit_price)最高的 5 个产品

输入

SELECT product_id, name, unit_price
FROM products
ORDER BY unit_price DESC LIMIT 5;

输出

详细检查和批改建议

优点:

  1. 完全符合题目要求

    • 查询单价最高的5个产品

    • 显示了产品ID、名称和单价

  2. 正确的排序语法

    • 使用ORDER BY unit_price DESC实现降序排列

  3. 正确的限制结果集

    • 使用LIMIT 5精确获取前5条记录

  4. 简洁高效的写法

    • 直接操作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;

    输出

    详细检查和批改建议

    优点:

    1. 正确的日期范围

      • order_date >= '2018-01-01' 准确筛选2018年及以后的订单

      • 严格符合题目"2017年之后"的要求(即从2018年开始)

    2. 正确的状态筛选

      • status != 1 有效排除了状态为1的订单

      • 虽然直接使用数字,但在已知状态含义的情况下是合理的

    3. 简洁高效的写法

      • 只查询必要的字段

      • 条件表达式简单直接

    可选的增强建议(非必需):

    1. 添加状态解释(作为注释)

    2. 使用表别名

    3. 添加排序(虽然题目未要求)


    6.

    查询 shippers 表中所有运输商名称中包含 'LLC' 的记录

    输入

    SELECT shipper_id, name
    FROM shippers
    WHERE name LIKE '%LLC%';

    输出

    详细检查和批改建议

    优点:

    1. 完全符合题目要求

      • 查询名称包含"LLC"的运输商

      • 显示了运输商ID和名称

    2. 正确的LIKE用法

      • 使用%LLC%匹配名称中任意位置包含"LLC"的记录

    3. 简洁高效的写法

      • 直接操作shippers单表

      • 没有不必要的复杂性

    可选的增强建议(非必需):

    1. 添加排序(使结果更有条理)

    2. 使用表别名

    3. 考虑大小写不敏感(根据数据库配置):

      WHERE LOWER(name) LIKE '%llc%';

    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值