mysql问题

where,group by,having,order by执行顺序和编写顺序

编写顺序

编写 SQL 查询时,通常的顺序是:

  1. SELECT:指定要查询的列,可以使用 * 表示所有列。
  2. FROM:指定数据源表,可以使用多个表(通过 JOIN 连接)。
  3. WHERE:用于过滤记录,只有满足条件的记录才会被选中。
  4. GROUP BY:将结果集按一个或多个列进行分组。
  5. HAVING:用于过滤分组后的记录,通常与聚合函数一起使用。
  6. 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 查询执行时,实际的执行顺序是:

  1. FROM:确定数据源。
  2. WHERE:过滤数据。
  3. GROUP BY:对数据进行分组。
  4. HAVING:对分组后的数据进行过滤。
  5. SELECT:选择需要的列。
  6. 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地址

MySql如何储存和获取ip地址

replace into 和 on duplicate key update

replace into 和 on duplicate key update

datetime类型的字段范围查询

datetime类型的字段范围查询

LIKE 声明中的%和_是什么意思?

% 对 应 于 0 个 或 更 多 字 符

_只 是 LIKE 语 句 中 的 一 个 字 符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

?abc!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值