SQL 入门 1:从 SELECT 到 WHERE

艺帆风顺 发布于 2025-04-18 34 次阅读



USE sql_store;

2025.3.25 - SQL SELECT 与 WHERE 语句学习笔记

今天是 2025 年 3 月 25 日,我们一起来学习 SQL 中的 SELECT 和 WHERE 语句。这些是数据库查询的基础,掌握它们可以让我们灵活地从数据库中提取所需数据。以下是本次学习的主要内容:

学习内容

  1. SQL 不区分大小写SQL 关键字(如 SELECTFROMWHERE)不区分大小写,但为了规范,我们通常将关键字大写,字段名保持原有大小写。

  2. SELECT 语句基础

  • SELECT 用于选择要查询的列,可以用 * 表示所有列。
  • FROM 指定数据来源的表。
  • 显示顺序取决于 SELECT 中列的顺序。
  • 可以在 SELECT 中进行运算(如加减乘除),并用 AS 为新列命名(建议用引号规范命名)。
  • WHERE 筛选数据

    • WHERE 用于条件筛选,支持比较运算符(>>==!=)。
    • 支持逻辑运算符:AND(与)、OR(或)、NOT(取反)。
    • 注意:AND 的优先级高于 OR,可以用括号明确运算顺序。
  • ORDER BY 排序

    • ORDER BY 用于排序,默认升序,可按列名排序。
    • WHEREFROM 和 ORDER BY 都是可选的,但关键字顺序固定:SELECT → FROM → WHERE → ORDER BY
  • DISTINCT 去重

    • DISTINCT 用于选择唯一值,去除重复结果。
  • IN 和 BETWEEN

    • IN 用于匹配多个离散值,用括号包裹。
    • BETWEEN 用于范围筛选,用 AND 连接,包含边界值。

    示例代码与讲解

    1. 基础查询与筛选

    SELECT *FROM customersWHERE customer_id = 5;
    • 查询 customers 表中 customer_id 为 5 的记录。
    SELECT *FROM customersORDER BY first_name;
    • 查询所有客户并按 first_name 排序。

    2. 选择列与运算

    SELECT first_name, last_nameFROM customers;
    SELECT last_name, first_nameFROM customers;
    • 显示顺序取决于 SELECT 中列的顺序。
    SELECT first_name, last_name, points, points + 100FROM customers;
    • 在查询中对 points 加 100。
    SELECT    first_name,    last_name,    points,    points * 10 + 100 AS "discount_dactor"FROM customers;
    • 更规范的写法:列分行排列,用 AS 命名新列。

    3. 去重查询

    SELECT stateFROM customers;
    SELECT DISTINCT stateFROM customers;
    • DISTINCT 去除重复的州名。

    4. WHERE 条件筛选

    SELECT *FROM customersWHERE points > 1344;
    • 查询积分大于 1344 的客户。
    SELECT *FROM customersWHERE state != 'VA';
    • 查询州不等于 'VA' 的客户(!= 和  等价)。
    SELECT *FROM customersWHERE birth_date > '1990-01-01';
    • 查询出生日期晚于 1990-01-01 的客户,日期需用引号。

    5. 逻辑运算符

    SELECT *FROM customersWHERE birth_date > '1990-01-01' AND points 1000;
    • AND:出生日期晚于 1990-01-01 且积分小于等于 1000。
    SELECT *FROM customersWHERE birth_date > '1990-01-01' OR points 1000;
    • OR:满足任一条件即可。
    SELECT *FROM customersWHERE (birth_date > '1990-01-01' OR points 1000AND state = 'VA';
    • 括号明确优先级:先计算 OR,再与 state = 'VA' 结合。
    SELECT *FROM customersWHERE birth_date > '1990-01-01' OR points 1000 AND state = 'VA';
    • 无括号时,AND 优先级更高,相当于 (points '1990-01-01'
    SELECT *FROM customersWHERE NOT (birth_date > '1990-01-01' OR points 1000);
    • NOT 取反,相当于 birth_date 1000

    6. IN 和 BETWEEN

    SELECT *FROM customersWHERE state IN ('VA''GA''FL');
    • 查询州在 'VA'、'GA'、'FL' 中的客户。
    SELECT *FROM customersWHERE state NOT IN ('VA''GA''FL');
    • 查询州不在这些值中的客户。
    SELECT *FROM customersWHERE points BETWEEN 1000 AND 2000;
    • 查询积分在 1000 到 2000 之间的客户(包含边界)。

    作业

    作业 1:新价格计算

    SELECT    name,    unit_price,    unit_price * 1.1 AS "new price"FROM products;
    • 计算产品单价上浮 10% 后的新价格。

    作业 2:2019 年订单

    SELECT *FROM ordersWHERE order_date >= '2019-01-01';
    • 查询 2019 年及以后的订单,注意使用 >= 包含边界。

    作业 3:订单项筛选

    SELECT *FROM order_itemsWHERE order_id = 6 AND quantity * unit_price >= 30;
    • 查询订单 ID 为 6 且总价(数量 × 单价)大于等于 30 的订单项。

    作业 4:库存筛选

    SELECT *FROM productsWHERE quantity_in_stock IN (384972);
    • 查询库存量为 38、49 或 72 的产品。

    作业 5:出生日期范围

    SELECT *FROM customersWHERE birth_date BETWEEN '1990-01-01' AND '2000-01-01';
    • 查询 1990-2000 年出生的客户(包含边界)。

    小结

    通过本次学习,我们掌握了 SQL 中 SELECT 和 WHERE 的基本用法,包括筛选、排序、去重以及逻辑运算。希望大家通过练习加深理解,下次我们将继续探索更多 SQL 功能。