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 表数据如下:
id | name | classid |
---|---|---|
1 | A | 1 |
2 | B | 1 |
3 | C | 2 |
4 | D | 2 |
5 | A | 1 |
6 | F | 1 |
7 | G | 2 |
查询语句简述:
以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 获取表结果如下:
id | name | classid |
---|---|---|
1 | A | 1 |
2 | B | 1 |
3 | C | 2 |
4 | D | 2 |
5 | A | 1 |
6 | F | 1 |
7 | G | 2 |
- where id%2 = 0 获取表结果如下:
id | name | classid |
---|---|---|
2 | B | 1 |
4 | D | 2 |
6 | F | 1 |
- group by classid 获取表结果如下:
id | name | classid |
---|---|---|
2 | B | 1 |
4 | D | 2 |
执行到 group by 时, 会将分组内的第一行输出。到此步骤 classid为1的一共有两条, id为6的被"舍弃"。
- select count(1), name 获取表结果如下:
count(1) | name |
---|---|
2 | D |
1 | B |
count() 相当于在执行select 时获取到的数据表的每行"加"一个字段为count(1), 值为where或where + group by 后对应数据的相应条数。
零散知识点整理:
select count(1) 和 select count(name) 的区别:
如果name中有NULL值, 那么count(name)不记录, 其他情况二者一致。
id | name | classid |
---|---|---|
2 | B | 1 |
4 | NULL | 2 |
6 | F | 1 |
以上数据表中 执行count(1)和count(name), 值分别为: 3, 2
id | name | classid |
---|---|---|
2 | B | 1 |
4 | D | 2 |
count(name) 可加参数 distince :
id | name | classid |
---|---|---|
1 | A | 1 |
2 | B | 1 |
3 | A | 2 |
以上数据表 执行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。 ↩︎