文章

MySQL 在单一表格中获取数据

MySQL 在单一表格中获取数据

选择语句

1
2
3
4
5
6
USE store

SELECT *
FROM customers
WHERE customer_id < 4
ORDER BY first_name

SELECT 字句

SELECT最简单的用法是选择所有列或者指定列。

1
2
3
4
5
6
7
8
9
10
SELECT *
FROM table_name;
-- 这里是选中了所有列

SELECT 
  column1, 
  column2, 
  ...
FROM table_name;
-- 这里是选中了指定列

我们还可以使用数学公式对列进行变换,并使用AS关键字为列指定新名称

1
2
3
4
5
SELECT 
  c1 * 1.1 AS d1, 
  c2 / 0.9 AS d2, 
  ...
FROM table_name

我们还能使用DISTINCTSELECT进行修饰,以去除结果中的重复值

1
2
3
4
5
6
7
8
9
SELECT DISTINCT country
FROM customers;
-- 从 customers 表中选出所有不同的国家,每个国家只出现一次

SELECT DISTINCT 
  first_name, 
  last_name
FROM employees;
-- 只有当某一行的 first_name 和 last_name 两列的组合完全相同时,才会被视为“重复”,被去除掉。

WHERE 语句

WHERE是用于行筛选的条件子句,它会对表中的每一行(每条记录)逐一进行判断,筛选出满足条件的行。

1
2
3
4
SELECT *
FROM employees
WHERE salary > 5000
-- 仅返回薪资在5000以上的

还存在的比较条件有:<,!=,>=,<=,=(注意不同于一般的编程语言,SQL中的相等为单个等号)


AND,OR,NOT 运算符

此处与Python中的语意类似,故不累述。


IN 运算符

有时候我们会写如下代码:

1
WHERE department = 'HR' OR department = 'Finance' OR department = 'IT'

此时我们可以使用IN来简化操作:

1
WHERE department IN ('HR', 'Finance', 'IT')

IN运算符用于判断某个字段的值是否属于指定的多个值中的一个。

我们还能使用NOT进行修饰以达到相反的结果。


BETWEEN 运算符

有时候我们会写如下代码:

1
2
3
WHERE salary >= 5000 AND salary <= 8000;
WHERE order_date >= '2024-01-01' AND order_date <= '2024-12-31'
-- SQL中标准的日期表达为 YYYY-MM-DD

此时我们可以使用BETWEEN来简化操作:

1
2
WHERE salary BETWEEN 5000 AND 8000;
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31';

BETWEEN运算符用于判断某个字段的值是否在两个值之间(包含边界)。常用于筛选数值范围和日期范围。


LIKE 运算符

LIKE运算符用于在WHERE子句中进行模糊匹配,通常与通配符%_搭配使用,用于查找符合特定模式的字符串。 % 匹配任意数量的任意字符(可以是 0 个) _ 匹配任意单个字符

1
2
3
SELECT code
FROM products
WHERE code LIKE '%A_1%';

此处我们将匹配一个子串,字串第一位为A,第二位为任意字符,第三位为1

我们同样能加上NOT来进行修饰


REGEXP 运算符

正则表达式相比于LIKE更强大,可用于复杂模式的字符串筛选。 常用的正则表达式符号 |符号|含义| |:—:|:—:| |^|匹配开头| |$|匹配结尾| |.|匹配任意单个字符| |*|匹配前一个字符重复 0 次或多次| |[abc]|匹配 a 或 b 或 c 中的任意一个| |[a-c]|匹配一个 a 到 c 的任意字母| |||或逻辑符号|

好麻烦啊哪个天才想出来的 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT name
FROM users
WHERE name REGEXP '[aeiou]';
-- 匹配包含任一元音字母的名字。

SELECT name
FROM users
WHERE name REGEXP '^A.*n$';
/* 
  匹配以 A 开头,以 n 结尾的子段
  ^A:以 A 开头
  .*:中间任意数量的字符
  n$:以 n 结尾
*/

IS NULL 运算符

用于判断某个字段的值是否为 NULL,也就是检查该字段是否缺失或未赋值。 这么简单就不讲了

1
2
3
4
SELECT name, email
FROM customers
WHERE email IS NULL;
-- 这会查找那些没有填写电子邮箱地址的客户记录。

注意反过来不是 NOT IS NULL 而是符合语法表达的 IS NOT NULL

还需要注意 NULL''并不一样


ORDER BY子句

ORDER BY用于对查询结果进行排序,默认是按升序(从小到大)排列的。

1
2
3
4
SELECT *
FROM customers
WHERE customer_id < 4
ORDER BY first_name;

你还可以根据多个列排序:

1
2
ORDER BY department, salary DESC
-- 先按部门排,再在部门内部按工资从高到低排。

不仅可以写列名,还可以写:

  • 数学表达式,比如:
    1
    
    ORDER BY price * quantity
    
  • 没出现在 SELECT 的列(MySQL 支持,其他数据库可能不行)
  • 列的别名(MySQL 支持,也可以是常数定义出来的别名)
    1
    2
    3
    4
    5
    
    SELECT 
    name, 
    salary * 12 AS yearly_salary
    FROM employees
    ORDER BY yearly_salary DESC;
    

    这个就用了一个在 SELECT 中定义的别名 yearly_salary 作为排序依据。

    排序方向可以在每个列名后加 DESC(降序)或 ASC(升序,默认)


LIMIT 子句

LIMIT 子句用于限制返回结果的行数。

1
2
3
4
SELECT *
FROM products
LIMIT 5;
-- 返回products表中的前5行,不管总共有多少条数据。

也可以配合 ORDER BY 一起使用,选出“最前”或“最后”的数据:

1
2
3
4
5
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 3;
--给出工资最高的前三位

某些数据库(如 MySQL)支持分页查询的写法:

1
LIMIT 10 OFFSET 20

意思是:从第 21 行开始,取 10 行(因为 OFFSET 是从 0 开始数的) 也可以合并写成:

1
2
LIMIT 20, 10
-- 含义相同,先跳过 20 行,再取 10 行。

有些数据库(如 SQL Server)不支持 LIMIT,而是用 TOPFETCH FIRST 等关键词。

本文由作者按照 CC BY 4.0 进行授权