where,group by,having,order by执行顺序和编写顺序
编写顺序
编写 SQL 查询时,通常的顺序是:
- SELECT:指定要查询的列,可以使用 * 表示所有列。
- FROM:指定数据源表,可以使用多个表(通过 JOIN 连接)。
- WHERE:用于过滤记录,只有满足条件的记录才会被选中。
- GROUP BY:将结果集按一个或多个列进行分组。
- HAVING:用于过滤分组后的记录,通常与聚合函数一起使用。
- ORDER BY:对结果集进行排序,可以指定升序(ASC)或降序(DESC)。
SELECT
column1, column2, ... -- 选择的列
FROM
table_name -- 数据源表
WHERE
condition -- 过滤条件
GROUP BY
column1, column2, ... -- 分组列
HAVING
condition -- 对分组后的数据进行过滤
ORDER BY
column1 [ASC|DESC], column2 [ASC|DESC]; -- 排序
执行顺序
SQL 查询执行时,实际的执行顺序是:
- FROM:确定数据源。
- WHERE:过滤数据。
- GROUP BY:对数据进行分组。
- HAVING:对分组后的数据进行过滤。
- SELECT:选择需要的列。
- ORDER BY:对结果进行排序。
sql中count(1)、count(*)与count(列名)的区别
执行效果上:
count(*)
包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL
count(1)包括了忽略所有列
,用1代表代码行,在统计结果的时候,会统计表中的所有的记录数,包含字段为null 的记录
count(列名)只包括列名那一列
,在统计结果的时候,会忽略列值为空(这里的空不是值空字符串或者0,而是表示null)的计数
,即某个字段值为NULL时,不统计。
执行效率上:
列名为主键,count(列名)会比count(1)快
- 列名
不为主键,count(1)会比count(列名)快
- 如果
表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)
- 如果
有主键,则 select count(主键)的执行效率是最优的
- 如果
表只有一个字段,则 select count(*)最优
。
有where条件时,count(列名 非主键)比count(*)慢
。
一般情况下,count(*)都是优解。除非count(主键)
分页查询:limit语法
语法:
select _column,_column from _table [where Clause] [limit N][offset M]
- select * : 返回所有记录
- limit N : 返回 N 条记录
- offset M : 跳过 M 条记录, 默认 M=0, 单独使用似乎不起作用
- limit N,M : 相当于 limit M offset N , 从第 N 条记录开始, 返回 M 条记录
分页查询的关键在于,首先要确定每页需要显示的结果数量pageSize(这里是3),然后根据当前页的索引pageIndex(从1开始),确定LIMIT和OFFSET应该设定的值:
- LIMIT总是设定为pageSize;
- OFFSET计算公式为pageSize * (pageIndex - 1)。
这样就能正确查询出第N页的记录集。
-- 查询 第一页 每页条数三
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 0;
-- 查询第2页:
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 3;
-- 查询第3页:
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 6;
-- 查询第4页:
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 9;
-- 如果原本记录集一共就10条记录,但我们把OFFSET设置为20
-- OFFSET超过了查询的最大数量并不会报错,而是得到一个空的结果集。
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 20;
```# sql中count(1)、count(*)与count(列名)的区别
DISTINCT语句
基本语法
DISTINCT子句与SELECT语句一起组合来消除结果集中的重复行。
SELECT DISTINCT
columns
FROM
table_name
WHERE
where_conditions;
如果列具有NULL值,并且对该列使用DISTINCT子句,MySQL将保留一个NULL值,并删除其它的NULL值,因为DISTINCT子句将所有NULL值视为相同的值
可以使用具有多个列的DISTINCT子句。 在这种情况下,MySQL使用所有列的组合来确定结果集中行的唯一性。
例如,要从customers表中获取城市(city)和州(state)的唯一组合,可以使用以下查询:该语句将返回两个列中所有唯一的组合
SELECT DISTINCT
state, city
FROM
customers
WHERE
state IS NOT NULL
ORDER BY state , city;
DISTINCT子句与GROUP BY子句比较
一般而言,DISTINCT子句是GROUP BY子句的特殊情况。
DISTINCT是在查询结果集
的基础上去除重复记录
,并返回唯一的记录集。
GROUP BY是在查询过程
中对结果集进行分组
,并返回每组的聚合值。
如果将ORDER BY子句添加到使用DISTINCT子句的语句中,则结果集将被排序,并且与使用GROUP BY子句的语句返回的结果集相同。
DISTINCT子句和GROUP BY子句之间的区别是GROUP BY子句可对结果集进行排序,而DISTINCT子句不进行排序
。
更换主键需要注意的事项
MySql如何储存和获取ip地址
replace into 和 on duplicate key update
replace into 和 on duplicate key update
datetime类型的字段范围查询
LIKE 声明中的%和_是什么意思?
% 对 应 于 0 个 或 更 多 字 符
_
只 是 LIKE 语 句 中 的 一 个 字 符