SQL 入门 2:LIKE、正则、 ORDER BY 与LIMIT

以下为 SQL 中 LIKE、REGEXP、ORDER BY 和 LIMIT 的用法解析。

学习内容

  1. LIKE 模式匹配
  • 模糊查询。% 表示任意长度字符(包括空),_ 表示单个字符。位置任意。
  • REGEXP 正则表达式

    • 复杂模式匹配。支持 ^(开头)、$(结尾)、|(或)、[](字符集)、[a-z](范围)。
  • IS NULL 查找缺失值

    • 筛选空值字段。如 phone IS NULL。
  • ORDER BY 排序

    • 默认按主键排序。可指定列或表达式,DESC 为降序,多列用逗号分隔。
    • MySQL 特性:排序依据不必在选中列,可用列序号(不推荐)。
  • LIMIT 限制结果

    • 控制返回行数。LIMIT 3 取最多 3 行,LIMIT 6, 3 跳过 6 行取后 3 行。
    • 顺序:SELECT → FROM → WHERE → ORDER BY → LIMIT。

    示例代码与讲解

    1. LIKE 模式匹配

    SELECT *

    FROM customers

    WHERE last_name LIKE 'B%';

    • 姓以 'B' 开头,% 匹配任意后续字符。

    SELECT *

    FROM customers

    WHERE last_name LIKE '%a%';

    • 姓中包含 'a'。

    SELECT *

    FROM customers

    WHERE last_name LIKE '_a%';

    • 姓第二个字母为 'a',_ 占位单个字符。

    SELECT *

    FROM customers

    WHERE last_name LIKE 'b____y';

    • 姓以 'b' 开头,后接 4 个字符,以 'y' 结尾。

    2. REGEXP 正则表达式

    SELECT *

    FROM customers

    WHERE last_name REGEXP 'field';

    • 姓中包含 'field',等价于 LIKE '%field%'。

    SELECT *

    FROM customers

    WHERE last_name REGEXP '^B';

    • 姓以 'B' 开头。

    SELECT *

    FROM customers

    WHERE last_name REGEXP 'y$';

    • 姓以 'y' 结尾。

    SELECT *

    FROM customers

    WHERE last_name REGEXP '^b|y$|h';

    • 姓以 'b' 开头、'y' 结尾或包含 'h'。

    SELECT *

    FROM customers

    WHERE last_name REGEXP '[ghm]a';

    • 姓中包含 'ga'、'ha' 或 'ma'。

    SELECT *

    FROM customers

    WHERE last_name REGEXP '[a-p]a';

    • 姓中包含 'aa' 到 'pa' 的组合。

    3. IS NULL 查找缺失值

    SELECT *

    FROM customers

    WHERE phone IS NULL;

    • 电话号码为空的客户。

    4. ORDER BY 排序

    SELECT *

    FROM customers

    ORDER BY birth_date;

    • 按生日升序。

    SELECT *

    FROM customers

    ORDER BY birth_date DESC;

    • 按生日降序。

    SELECT *

    FROM customers

    ORDER BY state, first_name DESC;

    • 先按州升序,再按名降序。

    SELECT birth_date

    FROM customers

    ORDER BY state, first_name DESC;

    • 按未选中列排序(MySQL 特性)。

    SELECT birth_date, 10 AS NEW

    FROM customers

    ORDER BY NEW, first_name DESC;

    • 新列 NEW 排序。

    SELECT first_name, last_name

    FROM customers

    ORDER BY 1, 2;

    • 按选中列序号排序(1 为 first_name,2 为 last_name),不推荐。

    5. LIMIT 限制结果

    SELECT *

    FROM customers

    LIMIT 3;

    • 前 3 行。

    SELECT *

    FROM customers

    LIMIT 6, 3;

    • 跳过前 6 行,取第 7-9 行。

    作业

    1. 地址筛选

    SELECT *

    FROM customers

    WHERE address LIKE '%TRAIL%' OR address LIKE '%AVENUE';

    • 地址含 'TRAIL' 或 'AVENUE'。

    2. 电话筛选

    SELECT *

    FROM customers

    WHERE phone LIKE '%9';

    • 电话以 '9' 结尾。

    3. 正则匹配名字

    SELECT *

    FROM customers

    WHERE first_name REGEXP '^ELKA\|\^AMBUR';

    • 名字为 'ELKA' 或 'AMBUR'。

    4. 正则匹配姓

    SELECT *

    FROM customers

    WHERE last_name REGEXP 'EY\|ON';

    • 姓以 'EY' 或 'ON' 结尾。

    5. 正则开头匹配

    SELECT *

    FROM customers

    WHERE last_name REGEXP '^MY|SE';

    • 姓以 'MY' 或 'SE' 开头。

    6. 正则字符集

    SELECT *

    FROM customers

    WHERE last_name REGEXP 'B[RU]';

    • 姓含 'BR' 或 'BU'。

    7. 缺失值查找

    SELECT *

    FROM orders

    WHERE shipped_date IS NULL;

    • 未发货订单。

    8. 排序练习

    SELECT *

    FROM order_items

    WHERE order_id = 2

    ORDER BY quantity * unit_price DESC;

    • 订单 ID 为 2,按总价降序。

    9. 综合查询

    SELECT *

    FROM customers

    WHERE birth_date >= '1990-01-01'

    ORDER BY points DESC

    LIMIT 3;

    • 1990 年后出生,按积分降序,前 3 名。

    总结

    本次覆盖 LIKE 和 REGEXP 的模式匹配、IS NULL 的空值筛选、ORDER BY 的排序,以及 LIMIT 的结果控制。内容基于 sql_store 数据库。后续将继续深入 SQL 语法。

相关推荐
GDAL2 小时前
SQLite 的适用场景与选型指南:它不是轻量 MySQL,而是「文件的升级版」
数据库·mysql·sqlite
yttandb2 小时前
数据库-CRUD
数据库
{Hello World}2 小时前
MySQL学习----------相关库表操作
数据库·学习·mysql
青衫码上行2 小时前
高频 SQL 50题(基础版)| 连接
数据库·sql·mysql
一个响当当的名号2 小时前
lectrue17 时间戳排序并发控制
数据库
xyzhan2 小时前
SQL Server - 列出数据库中所有固定长度字段
数据库·sql·oracle·sql server
skywalk81632 小时前
新华字典:pwxcoo/chinese-xinhua 中华新华字典数据库。包括歇后语,成语,词语,汉字。
数据库·字典
念越2 小时前
MySQL 聚合函数与分组查询全解析
数据库·mysql
知识分享小能手3 小时前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019 数据库的备份与恢复 — 语法知识点及使用方法详解(19)
数据库·学习·sqlserver