MYSQL查询语句执行流程

数据库查询语句执行流程(MYSQL)

sql语句 : SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY … LIMIT … 的执行顺序为 FROM, WHERE, GROUP BY, SELECT, HAVING, ORDER BY, LIMIT。

数据库准备:

// 创建数据库(schema):
CREATE DATABASE school;
// 创建数据表
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` char(10) DEFAULT NULL,
  `classid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4;
//  插入数据
INSERT INTO student (name, classid) values ('A', 1), ('B', 1), ('C', 2), ('D', 2), ('A', 1), ('F', 1), ('G', 2);

student 表数据如下:

idnameclassid
1A1
2B1
3C2
4D2
5A1
6F1
7G2

查询语句简述:

以SQL语句 : select count(1), name from student where id%2 = 0 group by classid为例。
使用groupby分组,在mysql5.7出现,如下错误:

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘school.student.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

可执行以下三步操作:

  • 在mysql命令行:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
  • 在mysql的配置文件的[mysqld]下加入以下内容:
[mysqld]  
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  • 重启mysql

语句执行:

  1. from student 获取表结果如下:
idnameclassid
1A1
2B1
3C2
4D2
5A1
6F1
7G2
  1. where id%2 = 0 获取表结果如下:
idnameclassid
2B1
4D2
6F1
  1. group by classid 获取表结果如下:
idnameclassid
2B1
4D2

执行到 group by 时, 会将分组内的第一行输出。到此步骤 classid为1的一共有两条, id为6的被"舍弃"。

  1. select count(1), name 获取表结果如下:
count(1)name
2D
1B

count() 相当于在执行select 时获取到的数据表的每行"加"一个字段为count(1), 值为where或where + group by 后对应数据的相应条数。

零散知识点整理:

select count(1) 和 select count(name) 的区别:
如果name中有NULL值, 那么count(name)不记录, 其他情况二者一致。

idnameclassid
2B1
4NULL2
6F1

以上数据表中 执行count(1)和count(name), 值分别为: 3, 2

idnameclassid
2B1
4D2

count(name) 可加参数 distince :

idnameclassid
1A1
2B1
3A2

以上数据表 执行count(distinct name), 值为: 2

聚集函数:

  1. count 计数
    count(1) : 满足条件所有数据条数
    count(name) : 满足条件且name不为NULL的数据条数
    count(distinct name) : 满足条件且name不为NULL的数据去重后的条数
  2. sum 求和
    sum(1) : 与 count(1)效果相同
    sum(age 1 ) : 将所有age不为NULL的数据的age值加起来
    sum(distinct name) : 满足条件且age不为NULL的数据去重后的各age值之和(以下类似)
  3. max 最大值
  4. min 最小值
  5. avg 平均值
  6. group_concat 字符串集合

  1. int类型字段, string类型字段sum()值为0。 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值