MYSQL查询语句执行流程

    技术2022-07-10  141

    MYSQL学习笔记

    数据库查询语句执行流程(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 表数据如下:

    idnameclassid1A12B13C24D25A16F17G2

    查询语句简述:

    以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

    语句执行:

    from student 获取表结果如下: idnameclassid1A12B13C24D25A16F17G2 where id%2 = 0 获取表结果如下: idnameclassid2B14D26F1 group by classid 获取表结果如下: idnameclassid2B14D2

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

    select count(1), name 获取表结果如下: count(1)name2D1B

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

    零散知识点整理:

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

    idnameclassid2B14NULL26F1

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

    idnameclassid2B14D2

    count(name) 可加参数 distince :

    idnameclassid1A12B13A2

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

    聚集函数:

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

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

    Processed: 0.016, SQL: 9