
数据库
PostgreSQL 18.6 安装记录
一、环境 项值主机192.168.6.98系统CentOS Stream 9(x86\64)SELinuxEnforcing防火墙firewalld(active)安装方式PGDG
CREATE TABLE wulaoer (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
grade FLOAT,sex CHAR(2)
)
INSERT INTO wulaoer(name,grade,sex)
VALUES ('宋江',40,'男'),
('卢俊义',100,'男'),
('皇母娘娘',900,'女'),
('孙悟空',5000,'男'),
('贾宝玉',36,'女'),
('诸葛亮',56,'男'),
('司马懿',56,'男'),
('皇母娘娘',900,'男');
下面先使用关键词distinct做去重,在使用distinct之前我们必须要说一点,distinct必须放在查询字段的最前面,不能放到查询字段的中间或者后面。
mysql> select * from wulaoer; +----+--------------+-------+------+ | id | name | grade | sex | +----+--------------+-------+------+ | 1 | 宋江 | 40 | 男 | | 2 | 诸葛亮 | 100 | 男 | | 3 | 皇母娘娘 | 900 | 女 | | 4 | 孙悟空 | 5000 | 男 | | 5 | 贾宝玉 | 36 | 女 | | 6 | 诸葛亮 | 56 | 男 | | 7 | 司马懿 | 56 | 男 | | 8 | 皇母娘娘 | 900 | 女 | +----+--------------+-------+------+ 8 rows in set (0.00 sec)这是表中的内容,下面使用distinct关键词去重grade字段。
mysql> select distinct grade from wulaoer; +-------+ | grade | +-------+ | 40 | | 100 | | 900 | | 5000 | | 36 | | 56 | +-------+ 6 rows in set (0.00 sec)这是针对grade列做的去重,如果针对所有列去重,只需要在distinct后增加需要去重的字段即可。
mysql> select distinct name,grade,sex from wulaoer; +--------------+-------+------+ | name | grade | sex | +--------------+-------+------+ | 宋江 | 40 | 男 | | 诸葛亮 | 100 | 男 | | 皇母娘娘 | 900 | 女 | | 孙悟空 | 5000 | 男 | | 贾宝玉 | 36 | 女 | | 诸葛亮 | 56 | 男 | | 司马懿 | 56 | 男 | +--------------+-------+------+ 7 rows in set (0.00 sec)因为在列表中我们把name字段的做了重复,如果有一个字段中没有重复,就会打印所有内容,和select * from wulaoer的结果一样,这里就不举例了。 这就是distinct的用法,distinct会对所有字段都起作用,distinct去重是查询的所有字段完全重复的数据,而不是只对distinct后面的单个字段重复的数据,也就是distinct对name,grade,sex都起作用,如果查询多个字段只对一个字段去重distinct是无法实现的。
mysql> select name,avg(grade),sex from wulaoer group by name,grade,sex; +--------------+------------+------+ | name | avg(grade) | sex | +--------------+------------+------+ | 司马懿 | 56 | 男 | | 孙悟空 | 5000 | 男 | | 宋江 | 40 | 男 | | 皇母娘娘 | 900 | 女 | | 诸葛亮 | 56 | 男 | | 诸葛亮 | 100 | 男 | | 贾宝玉 | 36 | 女 | +--------------+------------+------+这里有一个问题,如果grade列不是数值,就无法去重来,看下面的例子,去重sex看看。
mysql> select name,grade,sum(sex) from wulaoer group by name,grade,sex; +--------------+-------+----------+ | name | grade | sum(sex) | +--------------+-------+----------+ | 司马懿 | 56 | 0 | | 孙悟空 | 5000 | 0 | | 宋江 | 40 | 0 | | 皇母娘娘 | 900 | 0 | | 诸葛亮 | 56 | 0 | | 诸葛亮 | 100 | 0 | | 贾宝玉 | 36 | 0 | +--------------+-------+----------+ 7 rows in set, 8 warnings (0.01 sec)group by一般在聚类函数中使用(avg,count,sum等),也可以单独使用,group by也对后面所有的字段均起作用,即使去重查询的所有字段完全重复的数据,而不是只对group by后面连接的单个字段重复的数据,查询的字段与group by后面分组的字段没有限制。
评论 0