Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
檀越@新空间
Coding Tree
提交
40a0e5ac
C
Coding Tree
项目概览
檀越@新空间
/
Coding Tree
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
Coding Tree
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
40a0e5ac
编写于
3月 29, 2022
作者:
彭世瑜
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix
上级
aa89830b
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
279 addition
and
10 deletion
+279
-10
blog/php-mysql/sql-senior-select.md
blog/php-mysql/sql-senior-select.md
+279
-10
未找到文件。
blog/php-mysql/sql-senior-select.md
浏览文件 @
40a0e5ac
...
...
@@ -5,6 +5,8 @@
```
sql
select
选项
字段列表
from
数据源
-- 5子句
where
条件
group
by
分组
having
条件
...
...
@@ -12,6 +14,8 @@ order by 排序
limit
限制
;
```
## 1、select选项
处理查询到的结果
...
...
@@ -155,7 +159,7 @@ mysql> select * from (select * from my_student) as t1;
根据指定的字段,将数据进行分组,分组的目的是为了统计
## 5.1、分组统计
##
#
5.1、分组统计
```
sql
group
by
字段名
...
...
@@ -182,7 +186,7 @@ mysql> select class_id from my_student group by class_id;
+
----------+
```
##
5.2、统计函数(聚合函数)
##
# 5.2、聚合函数
-
count() 统计数量。如果是字段,不统计null字段
-
avg 平均值
...
...
@@ -221,20 +225,285 @@ mysql> select class_id, group_concat(name), count(*), max(age), min(age), avg(ag
+
----------+--------------------+----------+----------+----------+----------+
```
### 5.3、多分组
对已分组的数据进行再次分组
基本语法
```
sql
-- 按照字段1进行分组,将结果再按照字段2进行分组
group
by
字段
1
,
字段
2
;
```
```
sql
mysql
>
select
*
from
my_student
;
+
----+--------+----------+------+--------+
|
id
|
name
|
class_id
|
age
|
gender
|
+
----+--------+----------+------+--------+
|
1
|
刘备
|
1
|
18
|
2
|
|
2
|
李四
|
1
|
19
|
1
|
|
3
|
王五
|
2
|
20
|
2
|
|
4
|
张飞
|
2
|
21
|
1
|
|
5
|
关羽
|
1
|
22
|
2
|
+
----+--------+----------+------+--------+
mysql
>
select
class_id
,
gender
,
count
(
*
),
group_concat
(
name
)
from
my_student
group
by
class_id
,
gender
;
+
----------+--------+----------+--------------------+
|
class_id
|
gender
|
count
(
*
)
|
group_concat
(
name
)
|
+
----------+--------+----------+--------------------+
|
1
|
1
|
1
|
李四
|
|
1
|
2
|
2
|
刘备
,
关羽
|
|
2
|
1
|
1
|
张飞
|
|
2
|
2
|
1
|
王五
|
+
----------+--------+----------+--------------------+
```
多分组
分组排序
回溯统计
### 5.4、分组排序
按照分组字段排序,默认升序
```
sql
-- 班级升序,性别降序
-- mysql8.012之后,不支持group by 排序,需要使用order by排序
select
class_id
,
gender
,
count
(
*
),
group_concat
(
name
)
from
my_student
group
by
class_id
,
gender
order
by
class_id
asc
,
gender
desc
;
+
----------+--------+----------+--------------------+
|
class_id
|
gender
|
count
(
*
)
|
group_concat
(
name
)
|
+
----------+--------+----------+--------------------+
|
1
|
2
|
2
|
刘备
,
关羽
|
|
1
|
1
|
1
|
李四
|
|
2
|
2
|
1
|
王五
|
|
2
|
1
|
1
|
张飞
|
+
----------+--------+----------+--------------------+
```
### 5.5、回溯排序
having
统计过程中层层上报
order
limit
```
sql
group
by
字段
with
rollup
;
```
```
sql
-- 分组
mysql
>
select
class_id
,
count
(
*
)
from
my_student
group
by
class_id
;
+
----------+----------+
|
class_id
|
count
(
*
)
|
+
----------+----------+
|
1
|
3
|
|
2
|
2
|
+
----------+----------+
-- 分组回溯
mysql
>
select
class_id
,
count
(
*
)
from
my_student
group
by
class_id
with
rollup
;
+
----------+----------+
|
class_id
|
count
(
*
)
|
+
----------+----------+
|
1
|
3
|
|
2
|
2
|
|
NULL
|
5
|
+
----------+----------+
-- 多分组
mysql
>
select
class_id
,
gender
,
count
(
*
)
from
my_student
group
by
class_id
,
gender
;
+
----------+--------+----------+
|
class_id
|
gender
|
count
(
*
)
|
+
----------+--------+----------+
|
1
|
2
|
2
|
|
1
|
1
|
1
|
|
2
|
2
|
1
|
|
2
|
1
|
1
|
+
----------+--------+----------+
-- 多分组回溯
mysql
>
select
class_id
,
gender
,
count
(
*
)
from
my_student
group
by
class_id
,
gender
with
rollup
;
+
----------+--------+----------+
|
class_id
|
gender
|
count
(
*
)
|
+
----------+--------+----------+
|
1
|
1
|
1
|
|
1
|
2
|
2
|
|
1
|
NULL
|
3
|
|
2
|
1
|
1
|
|
2
|
2
|
1
|
|
2
|
NULL
|
2
|
|
NULL
|
NULL
|
5
|
+
----------+--------+----------+
```
## 6、having条件
和where一样,用来进行数据条件筛选
区别:
-
where是从表中取数据,where将数据从磁盘拿到内存,where之后的操作都是内存操作
-
having聚合之后的数据中取数据
用在group by分组之后,可以针对分组数据进行统计筛选
```
sql
mysql
>
select
*
from
my_student
;
+
----+--------+----------+------+--------+
|
id
|
name
|
class_id
|
age
|
gender
|
+
----+--------+----------+------+--------+
|
1
|
刘备
|
1
|
18
|
2
|
|
2
|
李四
|
1
|
19
|
1
|
|
3
|
王五
|
2
|
20
|
2
|
|
7
|
张飞
|
2
|
21
|
1
|
|
8
|
关羽
|
1
|
22
|
2
|
+
----+--------+----------+------+--------+
-- 查询班级人数大于等于3以上的班级
mysql
>
select
class_id
,
count
(
*
)
as
total
from
my_student
group
by
class_id
having
total
>=
3
;
+
----------+-------+
|
class_id
|
total
|
+
----------+-------+
|
1
|
3
|
+
----------+-------+
```
## 7、order by排序
### 7.1、单字段排序
基本语法
```
sql
-- 默认asc升序,desc降序
order
by
字段
[
asc
|
desc
]
```
```
sql
-- 按照年龄降序排序
mysql
>
select
*
from
my_student
order
by
age
asc
;
+
----+--------+----------+------+--------+
|
id
|
name
|
class_id
|
age
|
gender
|
+
----+--------+----------+------+--------+
|
1
|
刘备
|
1
|
18
|
2
|
|
2
|
李四
|
1
|
19
|
1
|
|
3
|
王五
|
2
|
20
|
2
|
|
7
|
张飞
|
2
|
21
|
1
|
|
8
|
关羽
|
1
|
22
|
2
|
+
----+--------+----------+------+--------+
```
聚合函数
### 7.2、多字段排序
基本语法
```
sql
order
by
字段
1
,
字段
2
...
[
asc
|
desc
];
```
```
sql
-- 按照班级和年龄排序
mysql
>
select
*
from
my_student
order
by
class_id
,
age
desc
;
+
----+--------+----------+------+--------+
|
id
|
name
|
class_id
|
age
|
gender
|
+
----+--------+----------+------+--------+
|
8
|
关羽
|
1
|
22
|
2
|
|
2
|
李四
|
1
|
19
|
1
|
|
1
|
刘备
|
1
|
18
|
2
|
|
7
|
张飞
|
2
|
21
|
1
|
|
3
|
王五
|
2
|
20
|
2
|
+
----+--------+----------+------+--------+
```
## 8、limit 限制
限制记录数数量,如果数量不够,仅返回剩余数据
### 8.1、记录数限制
基本语法
```
sql
limit
数量
;
```
```
sql
mysql
>
select
*
from
my_student
;
+
----+--------+----------+------+--------+
|
id
|
name
|
class_id
|
age
|
gender
|
+
----+--------+----------+------+--------+
|
1
|
刘备
|
1
|
18
|
2
|
|
2
|
李四
|
1
|
19
|
1
|
|
3
|
王五
|
2
|
20
|
2
|
|
7
|
张飞
|
2
|
21
|
1
|
|
8
|
关羽
|
1
|
22
|
2
|
+
----+--------+----------+------+--------+
mysql
>
select
*
from
my_student
limit
2
;
+
----+--------+----------+------+--------+
|
id
|
name
|
class_id
|
age
|
gender
|
+
----+--------+----------+------+--------+
|
1
|
刘备
|
1
|
18
|
2
|
|
2
|
李四
|
1
|
19
|
1
|
+
----+--------+----------+------+--------+
```
### 8.2、分页
获取指定区间的数据
基本语法
```
sql
limit
偏移量
,
数量
;
-- 等价于
limit
数量
offset
偏移量
;
```
MySQL下标从0开始
分页计算公式:
```
page: 页数
size: 每页数量
偏移量 = (page - 1) * size
```
```
sql
mysql
>
select
*
from
my_student
;
+
----+--------+----------+------+--------+
|
id
|
name
|
class_id
|
age
|
gender
|
+
----+--------+----------+------+--------+
|
1
|
刘备
|
1
|
18
|
2
|
|
2
|
李四
|
1
|
19
|
1
|
|
3
|
王五
|
2
|
20
|
2
|
|
7
|
张飞
|
2
|
21
|
1
|
|
8
|
关羽
|
1
|
22
|
2
|
+
----+--------+----------+------+--------+
-- 每页2条数据,获取第1页 (1 - 1) * 2, 2
mysql
>
select
*
from
my_student
limit
0
,
2
;
+
----+--------+----------+------+--------+
|
id
|
name
|
class_id
|
age
|
gender
|
+
----+--------+----------+------+--------+
|
1
|
刘备
|
1
|
18
|
2
|
|
2
|
李四
|
1
|
19
|
1
|
+
----+--------+----------+------+--------+
-- 每页2条数据,获取第2页 (2 - 1) * 2, 2
mysql
>
select
*
from
my_student
limit
2
,
2
;
+
----+--------+----------+------+--------+
|
id
|
name
|
class_id
|
age
|
gender
|
+
----+--------+----------+------+--------+
|
3
|
王五
|
2
|
20
|
2
|
|
7
|
张飞
|
2
|
21
|
1
|
+
----+--------+----------+------+--------+
-- 每页3条数据,获取第2页 (3 - 1) * 2, 2
mysql
>
select
*
from
my_student
limit
4
,
2
;
+
----+--------+----------+------+--------+
|
id
|
name
|
class_id
|
age
|
gender
|
+
----+--------+----------+------+--------+
|
8
|
关羽
|
1
|
22
|
2
|
+
----+--------+----------+------+--------+
```
https://www.bilibili.com/video/BV1Vx411g7uJ?p=37&spm_id_from=pageDriver
\ No newline at end of file
https://www.bilibili.com/video/BV1Vx411g7uJ?p=39&spm_id_from=pageDriver
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录