ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MYSQL——GROUP BY与 JOIN

2020-10-21 19:31:53  阅读:233  来源: 互联网

标签:GROUP name MYSQL list table JOIN type id


目录

GROUP BY

简述

Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理

示例

1.新建表如下

MariaDB [sawyer]> create table groupby(type varchar(5) not null,number tinyint(4),exp varchar(100));

MariaDB [sawyer]> desc groupby_test;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| type   | varchar(5)   | NO   |     | NULL    |       |
| number | tinyint(4)   | NO   |     | NULL    |       |
| exp    | varchar(100) | YES  |     | NULL    |       |
+--------+--------------+------+-----+---------+-------+

2.向表内插入数据

MariaDB [sawyer]> insert groupby_test values('a',5,'a2002'),('a',2,'a2001'),('b',10,'b2003'),('b',6,'b2002'),('b',3,'b2001'),('c',9,'c2005'),('c',9,'c2004'),('c',8,'c2003'),('c',7,'c2002'),('c',4,'c2001'),('a',11,'a2001');
Query OK, 11 rows affected (0.001 sec)
Records: 11  Duplicates: 0  Warnings: 0


MariaDB [sawyer]> select * from groupby_test;
+------+--------+-------+
| type | number | exp   |
+------+--------+-------+
| a    |      5 | a2002 |
| a    |      2 | a2001 |
| b    |     10 | b2003 |
| b    |      6 | b2002 |
| b    |      3 | b2001 |
| c    |      9 | c2005 |
| c    |      9 | c2004 |
| c    |      8 | c2003 |
| c    |      7 | c2002 |
| c    |      4 | c2001 |
| a    |     11 | a2001 |
+------+--------+-------+
11 rows in set (0.001 sec)

3.简单Group By

select type '类型',sum(number) '最大值' from groupby_test GROUP BY type;

效果见下

这里以type字段进行分组,将相同类别的数量进行比较,取各个类别中的数量最大值

4.GROUP BY与Order by

select type '类型',sum(number) '最大值' from groupby_test GROUP BY type ORDER BY sum(number) desc;

效果见下

5.组合GROUP BY

SELECT
	type '类型',
	sum( number ) '最大值',
	exp '说明' 
FROM
	groupby_test 
GROUP BY
	type,
	groupby_test.exp 
ORDER BY
	sum( number ) DESC

效果如下

当group by 后接多个字段时,我们可以将多个字段看作一个整体,这里只有type=a的2行内容满足条件,所以其和为11+2=13.

Group By与聚合函数

由于GROUP BY用法下,会出现一个字段内存在多个值出现,这在sql中时不允许的。所以GROUPBY经常与聚合函数一起使用。

函数 作用
sum(列名) 求和
max(列名) 最大值
min(列名) 最小值
avg(列名) 平均值
count(列名) 统计记录数

Join详解

简述

SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段来进行操作。

现假设有两张表:com_list 和 nation_list

com_list

com_list

nation_list

  • 后续将以这两张table作为实例

INNER JOIN

内连接是最常见的一种连接,只连接表中匹配的行。

  • 语法:
select column_name(s)
from table 1
INNER JOIN table 2
ON
table 1.column_name=table 2.column_name

注意:INNER JOIN与JOIN是相同的。

示例

1.创建两张表

MariaDB [sawyer]> create table com_list(id int(4) not null primary key auto_increment,name varchar(50) not null);
Query OK, 0 rows affected (0.007 sec)

#修改表相应字段的编码类型
ariaDB [sawyer]> alter table com_list modify name varchar(50) character set utf8;
Query OK, 0 rows affected (0.013 sec)              
Records: 0  Duplicates: 0  Warnings: 0



#导入数据
MariaDB [sawyer]> insert com_list values(1,'Google'),(2,'淘宝'),(3,'微博'),(4,'Facebook');
Query OK, 4 rows affected (0.001 sec)
Records: 4  Duplicates: 0  Warnings: 0


MariaDB [sawyer]> select * from com_list;
+----+----------+
| id | name     |
+----+----------+
|  1 | Google   |
|  2 | 淘宝     |
|  3 | 微博     |
|  4 | Facebook |
+----+----------+
4 rows in set (0.000 sec)

#创建nation_list表(修改编码为UTF8)
MariaDB [sawyer]> create table nation_list(id int(4) primary key not null,address varchar(50)) default charset = utf8;

#添加数据
MariaDB [sawyer]> insert nation_list values(1,'美国'),(5,'中国'),(3,'中国'),(6,'
美国');
Query OK, 4 rows affected (0.002 sec)
Records: 4  Duplicates: 0  Warnings: 0
MariaDB [sawyer]> select * from nation_list;
+----+---------+
| id | address |
+----+---------+
|  1 | 美国    |
|  3 | 中国    |
|  5 | 中国    |
|  6 | 美国    |
+----+---------+
4 rows in set (0.000 sec)

2.将两张表INNER JOIN

SELECT
	a.id,
	a.NAME,
	b.address 
FROM
	com_list a
	INNER JOIN nation_list b ON a.id = b.id

执行结果如下

LEFT JOIN

LEFT JOIN返回左表的全部行和右表满足ON条件的行,如果左表的行在右表中没有匹配,那么这一行右表中对应数据用NULL代替。

  • LEFT JOIN 语法
select column_name(s)
from table 1
LEFT JOIN table 2
ON table 1.column_name=table 2.column_name

示例

同样将上两张表进行LEFT JOIN连接

SELECT
	a.id,
	a.NAME,
	b.address 
FROM
	com_list a
	LEFT JOIN nation_list b ON a.id = b.id

执行结果如下

RIGHT JOIN

RIGHT JOIN返回右表的全部行和左表满足ON条件的行,如果右表的行在左表中没有匹配,那么这一行左表中对应数据用NULL代替

  • RIGHT JOIN语法
select column_name(s)
from table 1
RIGHT JOIN table 2
ON table 1.column_name=table 2.column_name

实例

将上两张table进行RIGHT JOIN操作

SELECT
	a.id,
	a.NAME,
	b.address 
FROM
	com_list a
	RIGHT JOIN nation_list b ON a.id = b.id

执行结果如下

标签:GROUP,name,MYSQL,list,table,JOIN,type,id
来源: https://www.cnblogs.com/sawyer95/p/13854196.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有