MySQL:在 SELECT 查询中过滤数据

SELECT ... WHERE ...

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

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

查询条件:

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

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

  • IS NULL 关键字的查询条件

  • INNOT IN 关键字的查询条件

  • LIKE 关键字的查询条件

当执行带有 WHERE 子句的 SELECT 语句时,MySQL 计算 WHERE 子句在 FROM 子句之后,在 SELECTORDER 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 用于指定最大返回行数,若大于查询总行数,则显示所有记录
  • offsetrow_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 10LIMIT 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 代表 true0 代表 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 命令对该变量的值进行修改

相关推荐
Fleshy数模1 分钟前
MySQL 表创建全攻略:Navicat 图形化与 Xshell 命令行双模式实践
linux·mysql
Nandeska12 分钟前
15、基于MySQL的组复制
数据库·mysql
程序员良许28 分钟前
三极管推挽输出电路分析
后端·嵌入式
Java水解34 分钟前
【JAVA 进阶】Spring AOP核心原理:JDK与CGLib动态代理实战解析
后端·spring
Java水解38 分钟前
Spring Boot 4 升级指南:告别RestTemplate,拥抱现代HTTP客户端
spring boot·后端
宫水三叶的刷题日记41 分钟前
工商银行今年的年终奖。。
后端
大黄评测1 小时前
双库协同,各取所长:.NET Core 中 PostgreSQL 与 SQLite 的优雅融合实战
后端
Java编程爱好者1 小时前
Java 后端定时任务怎么选:@Scheduled、Quartz 还是 XXL-Job?
后端
Java编程爱好者1 小时前
线程池用完不Shutdown,CPU和内存都快哭了
后端
AllData公司负责人1 小时前
AllData数据中台-数据同步平台【Seatunnel-Web】整库同步MySQL同步Doris能力演示
大数据·数据库·mysql·开源