数据库的group 和group by 的用法

数据库的group 和group by 的用法,第1张

Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。

它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。注意:group by 是先排序后分组。

举例子说明:如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表:每个部门有多少人,就要用到分组的技术

selectDepartmentIDas“部门名称”。

COUNT() as“个数” from BasicDepartment group by DepartmentID

这个就是使用了group by +字段进行了分组,其中我们就可以理解为我们按照了部门的名称ID

DepartmentID将数据集进行了分组;然后再进行各个组的统计数据分别有多少;

如果不用count()而用类似下面的语法

selectDepartmentID,DepartmentNamefromBasicDepartmentgroupbyDepartmentID

将会出现错误

消息8120,级别16,状态1,第1行

选择列表中的列“BasicDepartment。DepartmentName”无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

扩展资料

结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式。

所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。

接下来,我们将使用员工相关的四张样本数据表,来学习SQL,建议你在学习过程中多动手练习,理解才会更深刻。表和字段含义,如下图:

如何利用SQL语句来 *** 作以上数据呢?我们必须将样本数据导入MySQL客户端(如:Navicat)中。可以在客户端 *** 作数据,或者在终端窗口。工作中经常在客户端 *** 作,所以本文所有SQL语句将在Navicat中学习。

首先将sql脚本保存到桌面(获取方式:关注"Python之每日一课"公众号,后来回复"sql基础数据",即可。),导入SQL脚本的具体 *** 作流程如下:

现在数据准备完成。这里是导入sql脚本;导出同理,选择”转储SQL“文件。当然了,Navicat也支持将当前表或查询结果导出Excel、CSV等文件类型。

下面可以写SQL语句了(每个sql脚本可以保存,下次直接使用),如下:

类似于Python中 :print(要打印的东西)

①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在

② 要查询的东西 可以是常量值、表达式、字段、也可以是函数

补充:可以给字段起别名,好处是提高可读性,更方便理解;多表连接时,区分字段。用AS 或 空格来实现。如下:

2、 条件查询

条件查询:根据条件过滤原始表的数据,查询到想要的数据

1)语法

2)分类

①条件表达式

②逻辑表达式

③模糊查询

⭐ 注意:where 一定要放到 from 后面。NULL 不是假,也不是真,而是"空";任何运算符,判断符碰到NULL,都得NULL;NULL的判断只能用is null,is not null;NULL 影响查询速度,一般避免使值为NULL。exists查询可以与in型子查询互换,它们之间区别以后语句优化时会详细讲解。

3、 排序查询

1)语法

2)举栗

⭐ 注意:order by 一定要放到 语句最后(limit前面)

4、分组查询

1)语法

2)特点

①可以按单个字段分组

②和分组函数一同查询的字段最好是分组后的字段

③分组筛选(where 和 having区别)

④可以按多个字段分组,字段之间用逗号隔开

⑤可以支持排序

⑥having后可以支持别名

3)举栗

⭐ 注意:关键字顺序是where —>group by—>having—>order by—>limit( having不能单独使用,需结合group by ,表示对分组后的结果进行筛选;而 group by 必须结合分组聚合函数一起使用 ,比如:count()、max()等)

5、 常见函数

1)单行函数

2)分组函数

3)分组函数特点

①以上五个分组函数都忽略null值,除了count()

②sum和avg一般处理数值型,max、min、count可以处理任何数据类型

③都可以搭配distinct使用,用于统计去重后的结果

④count的参数可以支持:字段、、常量值,一般放1

6、连接查询(多表查询)

单个表不能满足需求时,需要结合多张表,去除有关联的数据。这时就需要用连接查询,连接查询有三种,通常join使用的最多。

①等值连接的结果 = 多个表的交集

②多个表不分主次,没有顺序要求

③一般为表起别名,提高阅读性和性能

①语法

②好处

语句上,连接条件和筛选条件实现了分离,简洁。

⭐ 注意:左右连接可互换 A left join B 等价于B right join A;内连接是左</pre>

右连接的交集;mysql没有外连接。

自连接相当于等值连接,但是等值连接涉及多个表,而自连接仅仅是它自己。如下:在员工信息表里,查询员工名和直接上级的名。

7、子查询

一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询。在外面的查询语句,称为主查询或外查询。

①子查询都放在小括号内

②子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧

③子查询优先于主查询执行,主查询使用了子查询的执行结果

④子查询根据查询结果的行数不同分为以下两类:

2)举栗

8、分页查询 (可选)

实际web开发中,当显示的数据,一页显示不完时,需要分页提交sql请求。

2)特点

①起始条目索引默认从0开始

②limit子句放在查询语句的最后

③公式:select from 表 limit (page-1)sizePerPage,

3)举栗

9、union联合查询

union用于把涉及多个表的SELECT语句的结果组合到一个结果集合中。适用于查询条件较多,多个表之间没有连接关系的场景。</pre>

2)特点

①多条查询语句的查询的列数必须是一致的

②多条查询语句的查询的列的类型几乎相同

③union 代表去重,union all 代表不去重

3)举栗

UNION 和 UNION ALL 运行结果的区别如下:

⭐ 注意:在多个 SELECT 语句中,第一个 SELECT 语句中被使用的字段名称将被用于结果的字段名称。当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION

好,今天学习到这里。工作中用的最多就是查询。如果能消化本文涉及到的所有内容,大概能解决80%的工作需求。本文更多的是原理介绍,例子不多,只有先知道是什么,才能知道怎么学。那么,接下来最重要的是要多练习实践。因为实际的业务场景要复杂很多,给大家推荐两个刷题的网站,力扣和牛客网,里面有大量的sql面试题。能进一步提高我们sql的水平。这篇文章主要是SQL的常用查询。明天继续学习SQL的DML增删改。一起加油!

select

分组列1,分组列2,

聚合列1,聚合列2

from

group

by

分组列1,分组列2

order

by

分组列或聚合列

--------

分组查询中,做为查询结果显示的列,必须是用于分组的列,或者聚合的列

比如:sum(),count(),avg()等等

in *** 作符允许我们在 WHERE 子句中规定多个值。

where 字段名 in (值1,值2,值3)

示例: where age in (20,21,25);

age 字段的值 只要是 20或者21或者25 的数据 都满足条件

where not in (值1,值2,值3)</pre>

示例: where age in (20,21,25);

age 字段的值 只要 不是 20或者21或者25 的数据 都满足条件

select

from sc

where score in (70,80,90);

select

from sc

where score not in (70,80,90);

select

from student

where birthday in ('1990-01-01','1990-12-21','2017-12-20','2012-06-06');</pre>

select

from student

where birthday not in ('1990-01-01','1990-12-21','2017-12-20','2012-06-06');

MySQL中的分页查询, limit 通常放在sql 语句的最末尾

limit 4

查询前4条数据

limit 4,3

从第4条数据之后开始,查询3条数据

也就是 第5,6,7条的数据

limit 4 offset 10;

offset后面的数字是指记录数

从第10条 之后的数据开始 查询4条数据

也就是 第 11,12,13,14条数据

select from student limit 5;

select from student limit 9,6;

select from student limit 6 offset 9;

查询成绩表中 前7条的数据;

select from sc limit 7;

查询成绩表中 第 5到10 条的数据

select from sc limit 4,6;

查询成绩表中 第 3到8 条的数据;

select from sc limit 2 , 6;

如果字段没有要求非空,则字段值 可以为空,就是null值。如果要查询某个 字段 为 null的数据,不能使用 字段名=null,要用 字段名 is null;

where 字段名 is null;

字段名 为空的符合条件

where 字段名 is not null;

字段名 不为空的符合条件

1查询teacher表,给tid 起别名为 教师编号,tname 起别名为 教师姓名

select tid as 教师编号,tname as 教师姓名 from teacher

2查询 sc 表, 给 cid 起别名为 课程编号,sid 起别名为 学生编号, score起别名为分数;

select cid 课程编号 ,sid 学生编号,score 分数 from sc

3查询 course 表,给表起别名为 c,使用 c字段查询 表数据

select c from course as c ;

起别名是为了后续学习多表联查 做铺垫,语法十分简单

比如查询 student 表的 学生姓名 和 生日 的sql语句:

select sname,birthday from student;

给 sname,birthday字段 起别名 ,改为中文

select sname as 姓名,birthday as 生日 from student;

起了别名后,查出来的字段会以别名展示。

as 关键字也可以省略,字段名 和 别名之间 用空格隔开即可

select sname 姓名, birthday 生日 from student;

例子:

select asname, abirthday from student as a;

给表 起别名 同样是 使用 as关键字(可以使用空格隔开代替as关键字), a 就代表 student表,查询字段时,可以 使用 asname 代表 student的sname字段。

给表起别名 通常用在 多表查询,本次使用演示,先熟悉语法。

在某些复杂的场景下,可能需要多条sql 才能查询出想要的数据,把多条sql拼接起来 就是嵌套查询

句式1

select XXX from A表 where xx =/in (select XXX from B表)

句式2

select XXX from (select XXX from XXXX)b

句式3

select XXX from A表 a

join (select XXX from B表)b on axx = bxx

select from sc where sid = (select sid from student where sname = '周梅');

select from sc where sid in (select sid from student where sex='女');

select asname,bscore,cscore from student a

inner join (select sid,score from sc where cid =1) b on asid = bsid

inner join (select sid,score from sc where cid = 2) c on asid = csid

where bscore › cscore;

聚合函数对一组值执行计算,并返回单个值,也被称为组函数。

就是sql提供的一种查询方法,比如查询 最大值,最小值,总数,平均等等。

聚合函数不能写在where的查询条件里面

查询 最小值

select min(字段) from 表;

查询 最大值

select max(字段) from 表;

select max(tid) from teacher;

select min(tid) from teacher;

select max(ascore) ,bcname from sc a

inner join course b on acid=bcid

where asid =(select sid from student where sname='周梅') group by bcname limit 1 ;

查询 该字段的 总数

select sum(字段) from 表

查询 该字段的 平均数

select avg(字段) from 表

select avg(score) from sc;

select avg(sscore) from student a inner join sc s on asid = ssid

where asex ='女';

查询 数据 总条数

count( ) 是查询总共有多少条数据

count(字段) 是查询该字段 不为 null的 总共有多少条数据

例:

select count( ) from 表

去重,查询数据时,相同的数据只展示 一条

语法:

select distinct 字段 from 表;

例:去重查询学生表中的生日字段

select distinct birthday from student;

聚集函数

和大多数其它关系数据库产品一样,PostgreSQL

支持聚集函数。一个聚集函数从多个输入行中计算出一个结果。比如,我们有在一个行集合上计算

count(数目),

sum(总和),

avg(均值),

max(最大值),

min(最小值)的函数。

比如,我们可以用下面的语句找出所有低温中的最高温度:

SELECT

max(temp_lo)

FROM

weather;

max

-----

46

(1

row)如果我们想知道该读数发生在哪个城市,可能会用:

SELECT

city

FROM

weather

WHERE

temp_lo

=

max(temp_lo);

--

错!不过这个方法不能运转,因为聚集函数

max

不能用于

WHERE

子句中。存在这个限制是因为

WHERE

子句决定哪些行可以进入聚集阶段;因此它必需在聚集函数之前计算。不过,我们可以用其它方法实现这个目的;这里我们使用子查询:

SELECT

city

FROM

weather

WHERE

temp_lo

=

(SELECT

max(temp_lo)

FROM

weather);

city

---------------

San

Francisco

(1

row)这样做是可以的,因为子查询是一次独立的计算,它独立于外层查询计算自己的聚集。

聚集同样也常用于

GROUP

BY

子句。比如,我们可以获取每个城市低温的最高值:

SELECT

city,

max(temp_lo)

FROM

weather

GROUP

BY

city;

city

|

max

---------------+-----

Hayward

|

37

San

Francisco

|

46

(2

rows)这样每个城市一个输出。每个聚集结果都是在匹配该城市的行上面计算的。我们可以用

HAVING

过滤这些分组:

SELECT

city,

max(temp_lo)

FROM

weather

GROUP

BY

city

HAVING

max(temp_lo)

<

40;

city

|

max

---------+-----

Hayward

|

37

(1

row)这样就只给出那些

temp_lo

值曾经有低于

40

度的城市。最后,如果我们只关心那些名字以"S"开头的城市,我们可以用:

SELECT

city,

max(temp_lo)

FROM

weather

WHERE

city

LIKE

'S%'

GROUP

BY

city

HAVING

max(temp_lo)

<

40;语句中的

LIKE

执行模式匹配,在节97里有解释。

理解聚集和

SQL

WHERE

HAVING

子句之间的关系非常重要。WHERE

HAVING

的基本区别如下:WHERE

在分组和聚集计算之前选取输入行(它控制哪些行进入聚集计算),而

HAVING

在分组和聚集之后选取输出行。因此,WHERE

子句不能包含聚集函数;因为试图用聚集函数判断那些行将要输入给聚集运算是没有意义的。相反,HAVING

子句总是包含聚集函数。当然,你可以写不使用聚集的

HAVING

子句,但这样做没什么好处,因为同样的条件可以更有效地用于

WHERE

阶段。

在前面的例子里,我们可以在

WHERE

里应用城市名称限制,因为它不需要聚集。这样比在

HAVING

里增加限制更加高效,因为我们避免了为那些未通过

WHERE

检查的行进行分组和聚集计算。

sum是用作汇总合计

count是汇总记录数

如select count() from table 该语句是汇总表中有多少条记录

select sum(qty) from table 是汇总某数字型字段内数量合计

希望可以帮到你

--查询选修了“计算机体系结构”的学生的基本信息。

select

from 学生

where 学号 in

(select 学号

from 选课

where 课程号 in

(select 课程号

from 课程

where 课程名称='计算机体系结构'))

--查询年龄比李勇小的学生的学号和成绩。

select 学号,成绩

from 选课

where 学号 in

(select 学号

from 学生

where 年龄<

(select 年龄

from 学生

where 姓名 ='李勇'))

--查询其他系中比系编号为“D1”的学生中年龄最小者要最大的学生的信息。

select

from 学生

where 系编号<>'D1'and 年龄>

(select min (年龄)

from 学生

where 系编号='D1')

--查询其他系中比系编号为“D3”的学生年龄都大的学生的姓名。

select 姓名

from 学生

where 系编号<>'D3'and 年龄>all

(select 年龄

from 学生

where 系编号='D3')

--查询“C1”课程的成绩高于70分的学生姓名。

select 姓名

from 学生

where 学号 in

(select 学号

from 选课

where 课程号 ='C1'and 成绩>70)

--查询“C1”课程的成绩不高于70分的学生姓名。

select 姓名

from 学生

where 学号 in

(select 学号

from 选课

where 课程号 ='C1'and 成绩<=70)

--查询选修了所有课程的学生姓名。

select 姓名

from 学生

where not exists

(select

from 课程

where not exists

(select

from 选课

where 学生学号=选课学号 and 课程课程号=选课课程号))

--查询学校开设的课程总数。

select count()

from 课程

--查询选修两门以上课程的学生姓名。

select 姓名

from 学生

where 学号 in

(select 学号

from 选课 group by 学号 having count()>=2)

--查询开设的课程和选修该课程的学生的总成绩、平均成绩、最高成绩和最低成绩。

select 课程号,sum(成绩),avg(成绩),max(成绩),min(成绩)

from 选课 group by 课程号

--查询系编号为“D2”或选修课程的最低成绩大于等于60分的学生信息。

select

from 学生

where 系编号='D2'

union

select

from 学生

where 学号 in

(select 学号

from 选课 group by 学号 having min(成绩)>=60)

以上就是关于数据库的group 和group by 的用法全部的内容,包括:数据库的group 和group by 的用法、数据库基础篇(二)—— SQL之数据查询、我想在数据库中的一个表中查询出全部数据 并且按照一个分组和排序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9350837.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存