MySQL:在 SELECT 查询中过滤数据

SELECT ... WHERE ...

需要有条件的从数据表中查询数据 ,可以使用 WHERE 关键字来指定查询条件

sql 复制代码
SELECT select_list  FROM tablename
WHERE
    search_condition;

查询条件:

  • 带 比较运算符 和 逻辑(布尔)运算符 的查询条件

    • AND:记录满足所有查询条件时,才会被查询出来。
    • OR:记录满足任意一个查询条件时,才会被查询出来。
    • XOR:记录满足其中一个条件,且不满足另一个条件时,才会被查询出来
  • 带 BETWEEN AND 关键字的查询条件

  • 带 IS NULL 关键字的查询条件

  • 带 IN 和 NOT IN 关键字的查询条件

  • 带 LIKE 关键字的查询条件

当执行带有 WHERE 子句的 SELECT 语句时,MySQL 计算 WHERE 子句在 FROM 子句之后,在 SELECT 和 ORDER BY 子句之前

SELECT ... DISTINCT ...

在 MySQL 中使用 SELECT 语句执行简单的数据查询时,返回的是所有匹配的记录。如果表中的某些字段没有唯一性约束,那么这些字段就可能存在重复值。为了实现查询不重复的数据,可以使用 DISTINCT 关键字去重

DISTINCT 关键字的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据给用户。

sql 复制代码
SELECT DISTINCT columnlists
FROM tablename;
  • DISTINCT 关键字只能在 SELECT 语句中使用。

  • 在对一个或多个字段去重 时,DISTINCT 关键字必须在所有字段的最前面。

  • 如果 DISTINCT 关键字后有多个字段,则会对多个字段进行组合去重,也就是说,只有多个字段组合起来完全是一样的情况下才会被去重。

  • 若字段中包含多个 NULL 值,会将多个 NULL 值视为相同的值,对多个NULL进行去重

当执行带有 DISTINCT 子句的 SELECT 语句时,MySQL会在 FROM, WHERE 和 SELECT 子句之后,ORDER BY 子句之前计算 DISTINCT 子句:

SELECT ... LIMIT ...

当数据表中有上万条数据时,一次性查询出表中的全部数据会降低数据返回的速度,同时给数据库服务器造成很大的压力。

这时可以用 LIMIT 关键字来限制查询结果返回的条数:

sql 复制代码
SELECT select_list FROM table_name 
LIMIT [offset,] row_count;
  • offset 用于指定查询的起始位置,开始位置为0,而不是1
  • row_count 用于指定最大返回行数,若大于查询总行数,则显示所有记录
  • offset 和 row_count 均为正整数
不指定初始位置

当仅使用 LIMIT 而不指定 OFFSET 时,查询将从结果集的第一条记录开始返回,直到达到指定的 row_count。

sql 复制代码
SELECT select_name FROM table_name
LIMIT row_count;

#等价于
LIMIT 0, row_count;

这里,LIMIT 0, row_count 中的 0 表示从第一条记录开始,row_count 是想要获取的记录数量。但通常,直接写 LIMIT row_count 就足够了,因为默认就是从第一条记录开始。

与 OFFSET 关键字结合

OFFSET 关键字用于指定在开始返回记录之前要跳过的记录数。常用于实现分页功能。

sql 复制代码
SELECT select_name FROM table_name
LIMIT row_count OFFSET offset_;
  • offset_ 是想要跳过的记录数
  • row_count 是希望从跳过的记录之后获取的记录数。
  • 例如,如果想要获取第11到20条记录(假设每页显示10条),可以设置 OFFSET 10 和 LIMIT 10。
与 ORDER BY 结合

按照特定的排序顺序返回指定数量的结果, ORDER BY 子句会根据指定的排序表达式对结果集进行排序,然后 LIMIT 子句会从这个已排序的结果集中选取记录。

sql 复制代码
SELECT select_name FROM table_name
ORDER BY sort_expr
LIMIT [offset,] row_count;
  • sort_expr 是你想要根据其排序的表达式(可以是列名、列名的函数等)
  • [offset,] row_count 中的 offset 是可选的,用于指定跳过的记录数, row_count是希望获取的记录数。

SELECT ... BETWEEN ... AND ...

IS NULL

IS NULL 关键字,用来判断字段的值是否为空值(NULL) 。空值不同于 0,也不同于空字符串。

如果字段的值是空值,则满足查询条件,该记录将被查询出来。如果字段的值不是空值,则不满足查询条件。

sql 复制代码
IS [NOT] NULL;

Mysql 并未内置 boolean 型数据,而是使用 TINYINT(1) 的数据来代表布尔型数据:1 代表 true ,0 代表 false

sql 复制代码
SELECT 1 IS NULL,         -- 0
       0 IS NULL,         -- 0
       NULL IS NULL;      -- 1

SELECT 1 IS NOT NULL,     -- 1
	   0 IS NOT NULL,     -- 1
	   NULL IS NOT NULL;  -- 0
语句特性

为了与 ODBC 程序兼容,MySQL支持 IS NULL 操作符的一些特殊功能。

处理日期 '0000-00-00'

如果一个 DATE 或 DATETIME 型列有 NOT NULL \[非空约束] ,并且含有类似于 '0000-00-00' 的值,可以使用 IS NULL 语句来获取它们:

sql 复制代码
SELECT * 
FROM projects
WHERE complete_date IS NULL;
@@sql_auto_is_null 变量

@@sql_auto_is_null 是 MySQL 数据库的系统变量 ,用于控制插入或更新操作中自增列是否允许为 NULL 值。

它的值为 1 表示允许自增列的 NULL 值,值为 0 则表示不允许。默认情况下变量值为0。

@@sql_auto_is_null 是只读变量 ,无法直接修改,可以使用 SET 命令对该变量的值进行修改

相关推荐
程序猿DD3 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
余槐i6 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
数据库小学妹6 小时前
PostgreSQL表膨胀怎么办?autovacuum清不动的根因与排查命令
数据库·postgresql·表膨胀·mvcc·数据库运维
mister_guo6 小时前
MySQL-1267错误:排序规则冲突的原因与解决方案
数据库·mysql
需要8266 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
骇客野人6 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
凤山老林7 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
美狐美颜SDK开放平台8 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
Lost_the_wind8 小时前
MySQL学习笔记五
mysql
伯恩bourne8 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端