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,而不是1row_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 命令对该变量的值进行修改