MySQL学习(五)

分组数据

在这一章我们将学习如何分组,以便能汇总表内容的子集。学习两个新的select语句子句,分别是group by子句和having子句

数据分组

SQL聚集函数可用来汇总数据,分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。

创建分组

select 列名1,列名2 from 表名 group by 条件(列名)
在这里插入图片描述
使用group by子句前,需明白一些规定:

  • group by子句可包含任意数目的列。使得能对分组进行嵌套,为数据分组提供更细致的控制。
  • 如group by子句中嵌套了分组,数据将在最后规定的分组上进行汇总。也就是说,在建立分组时,指定的所有列都一起计算
  • group by子句中列出的每个列都必须是检索列或有效的表达式(但不是聚集函数)。如在select中使用表达式,则必须在group by子句中指定相同的表达式。不能使用别名
  • 除聚集计算语句外,select语句中的每个列都必须在group by子句中给出
  • 如分组列中具有Null值,则null将作为一个分组返回。如列中有多行null值,他们将分为一组
  • group by子句必须出现在where子句后,order by子句之前。

过滤分组

除了可以使用group by分组数据外,MySQL还允许过滤分组,规定哪些分组,排除哪些分组。having子句类似于where,where过滤行,而having过滤分组。
having支持所有的where操作符(包括通配符条件和带多个操作符的子句),所学过的有关where的所有的技术和选项都适用于having,句法相同,关键字不同。where在数据分组前进行过滤,having在数据分组后进行过滤。
在这里插入图片描述

分组和排序

在这里插入图片描述
举两个例子:
在这里插入图片描述
在这里插入图片描述

select子句顺序

在这里插入图片描述
在这里插入图片描述

使用子查询

在之前我们学习的所有查询都是select的简单查询,即从单个数据库中检索数据的单条语句;SQL还允许创建子查询,即嵌套在其他查询中的查询
查询: 任何SQL语句都是查询,但术语一般指select语句

利用子查询进行过滤

在这里插入图片描述
在where子句中使用子查询能够编写出功能很强并且灵活的SQL语句。对于能嵌套的子查询的数目没有限制,不过在实际使用中由于性能的限制,不能嵌套太多的子查询。

作为计算字段使用子查询

相关子查询: 涉及外部查询的子查询
逐渐增加子查询来建立查询: 用子查询测试和调试查询很有技巧性,特别是在语句的复杂性不断增加的情况下更是如此。用子查询建立(和测试)查询的最可靠的方法逐渐进行。首先,建立和测试最内层的查询。然后,用硬编码数据建立和测试外层查询,并且仅在确认它正常后才潜入子查询。再次测试对要增加的每个查询,重复这些步骤。仅给构造查询增加一点点时间,但节省了大量的时间,并且极大的提高查询一开始就正常工作的可能性。

联结表

SQL最强大的功能之一是能在数据检索检查的执行中联结表。我们要很好的理解联结及其语法是学习SQL的一个重要的组成部分。

关系表

为什么需要关系表,相同数据出现多次决不是一件好事,此因素是关系数据库设计的基础。关系表的设计就是要保证把信息分解成多个表,一类数据是一个表。各表通过某些常用的值(即关系设计中的关系)互相关联。
外键: 外键为某个表中的一列,包含另一个表的主键值,定义了两个表之间的关系。
可伸缩性: 能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好。
关系数据可以有效地存储和方便的处理。关系数据库的可伸缩性远比关系数据库要好。

为什么要用联结

数据存储在多个表中,如何用单条select语句检索出数据?可以使用联结,联结是一种机制。可以联结多个表返回一组输出,联结在运行时关联表中正确的行。

创建联结

在这里插入图片描述

where子句的重要性

在一条select语句中联结几个表时,相应的关系时在运行中构造的。
笛卡儿积: 由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

内部联结

等值联结:基于;基于两个表之间的相等测试,也称为内部联结。

联结多个表

SQL对一条select语句中可以联结的表的数目没有限制。创建联结的基本规则也相同。MySQL在运行时关联指定的每个表以处理联结。这种处理可能是非常耗费资源的,不要联结不必要的表。联结的表越多,性能下降越厉害。

猜你喜欢

转载自blog.csdn.net/weixin_41676282/article/details/91351637