第一章 数据库概述
数据库技术一直是 IT 技术的重要组成部分,使用数据库可以结构化存储大量的数据信息,方便用户进行有效的检索和访问,可以有效地保持数据信息的一致性、完整性,降低数据冗余,可以满足数据应用的共享和安全方面的要求。数据库系统的建设规模、数据库信息量的大小及使用频率一直是衡量一个部门信息化程度的重要标志,因此数据库技术人才需求一直长盛不衰。
数据的概念。在大多数人的头脑中,数据就是数字。其实,数字只是最简单的一种数据,是对数据传统、狭义的理解。从广义上理解,数据种类很多,包括文字、图形、图像、音频、视频等,这些都是数据。
数据:数据是描述事务的符号记录。 这种描述事务的符号可以是数字,也可以是文字、图形等。在日常生活中,人们可以通过自然语言的记录形式来描述。
作为计算机,为了更好地存储和处理这些事物,就需要抽象出一组描述事物的特征。例如下面的例子,就可以抽象出姓名、性别、出生日期、入学省份、入学年份、专业这些特征,具体可以描述为:刘xx,女,2001 年 3 月 28 日,安徽,2020,计算机科学与技术。这里对学生信息的记录就是通常所说的计算机中记录的数据。
姓名 | 性别 | 出生日期 | 入学省份 | 入学年份 | 专业 |
---|---|---|---|---|---|
刘xx | 女 | 2001 年 3 月 28 日 | 安徽 | 2020 | 计算机科学与技术 |
... | ... | ... | ... | ... | ... |
数据库:顾名思义就是存放数据的仓库。这个仓库将数据按照一定的格式,存储在计算机的存储设备上,是有组织、可共享的数据集合,具有较小的数据冗余度、较高的数据独立性和易扩展性,并为各种用户所共享。更重要的是,用户在需要的时候可以从数据库大量的数据中快速找到自己需要的数据,甚至可以分析挖掘出更有用的信息。
数据库管理系统的六大功能
数据库是数据的集合,怎么管理数据或数据库呢?答案是数据库管理系统(Database Management System,DBMS)。
数据库管理系统是一个系统软件,它位于操作系统和应用软件之间,主要提供了如下功能:
- 数据定义:提供数据定义语言(Data Definition Language,DDL),通过它用户可以方便地对数据库中的对象进行定义。
- 数据操作:提供数据操作语言(Data Manipulation Language,DML),用户可以使用 DML 操纵数据实现对数据库的基本操作,如增加、删除、修改、查询等操作。
- 数据库的运行管理:数据库的运行管理功能,数据库在建立、运行和维护时由数据库管理系统统一管理、统一控制,以保证多用户环境下的并发控制、安全性检查和存取限制控制、完整性检查和执行、运行日志的组织管理、事务的管理和自动恢复,这些功能保证了数据库管理系统的正常运行。
- 数据组织、存储与管理:DBMS 对数据的组织、存储与管理对象,主要包括数据字典、用户数据、数据的存取路径等。需要确定以何种文件结构和存取方式在存储设备上组织这些数据,如何实现数据之间的联系。数据组织和存储的基本目标是提高存储空间利用率,选择合适的存取方法提高存取效率。
- 数据库保护:数据已经成为信息社会的战略资源,对数据的保护至关重要。DBMS 对数据库的保护通过四个方面来实现:数据库的恢复、数据库的并发控制、数据库的完整性控制、数据库的安全性控制。
- 数据库维护:数据库维护包括数据库的数据载入、转换功能,数据库的转储、恢复功能,数据库重组织功能以及性能监视、分析功能等,这些功能分别由各个应用程序来完成。
早期数据管理的方式和特点
数据库管理系统已经超过 60 年的历史。短短 60 多年,从数据管理的角度看,数据库技术到目前经历了人工管理阶段、文件系统阶段和数据库管理系统阶段三个阶段。数据库管理系统阶段又可分为第一代的层次型、网状数据库管理系统,第二代的关系模型数据库管理系统,以及第三代的以面向对象模型为主要特征的数据库管理系统。
人工管理
人工管理阶段是计算机数据管理的初级阶段,这个时期的计算机主要用于科学计算。从硬件看,没有磁盘等直接存取的存储设备;从软件看,没有操作系统和管理数据的软件,数据处理方式是批处理。 这个时期数据管理的特点是:
- 数据不能长时间保存;
- 没有对数据进行管理的软件系统;
- 没有文件的概念;
- 数据不具有独立性。
文件系统
文件系统是数据库管理系统的萌芽阶段,出现在 20 世纪中期,可以提供简单的数据存取功能,但无法提供完整、统一的数据管理功能,例如复杂查询等。所以在管理较少、较简单的数据时,会使用文件系统。
这个时期数据管理的特点是:
- 数据可以长期保存;
- 对文件系统进行统一管理;
- 文件的形式已经多样化;
- 数据具有一定的独立性。
数据库管理系统发展的三个阶段
第一阶段,层次型数据库管理系统、网状数据库管理系统。
在这个阶段,网状数据库由于其复杂性、专用性,没有被广泛使用。而在层次型数据库中,IBM 公司的 IMS(Information Management System,信息管理系统)层次型数据库管理系统则得到了极大的发展,一度成为市场份额占比最多的数据库管理系统,拥有巨大的客户群。
第二阶段,关系数据库管理系统。
关系数据库管理系统使用结构化查询语言(Structured Query Language,SQL)作为数据库定义语言 DDL 和数据库操作语言 DML。这种语言和普通的面向过程的语言(如 C 语言)以及面向对象的语言(如 Java)不同,它一诞生,就成为关系型数据库的标准语言。可以这么说,要想学习数据库,必须学习关系型数据库管理系统;要想学习关系型数据库管理系统就必须学习 SQL 结构化查询语言。 这个时期数据管理的特点是:
- 数据结构化;
- 数据的共享性高,冗余度低,容易扩充;
- 数据独立性高;
- 数据由 DBMS 统一管理和控制。
第三阶段,面向对象数据库管理系统。
在这一时期,程序设计开发也逐渐从面向过程编程转向面向对象编程,从面向对象的角度设计、编写程序。把面向对象的方法和数据库管理技术结合起来,可以使数据库管理系统的分析、设计最大限度地与人们对客观世界的认识相一致,并且能够有效地为面向对象程序提供更好的数据库支撑。为了满足人们对新的数据库管理技术的需求,面向对象数据库管理系统应运而生。
非关系型数据库
非关系型数据库也叫 NoSQL 数据库,NoSQL 最常见的解释是“non-relational”。
NoSQL 有如下优点:易扩展,NoSQL 数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展,无形之间也在架构的层面上带来了可扩展的能力。非关系数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。 理论上来说,数据库、数据库管理系统、数据库系统是从小到大的概念。按前文所述,数据库是数据的集合,数据库管理系统是管理数据或数据集合的系统软件,而数据库系统是更大的概念,它包括数据库、数据库管理系统、应用系统、数据库管理员等内容。
但为了表述方便,人们在表达这三层意思的时候,都说“数据库”,如将“Oracle 数据库管理系统”简称为“Oracle 数据库”,本书也用这种约定俗成的表达方式。
经过了 20 世纪末激烈的数据库市场竞争之后,Oracle、MySQL 和 SQL Server 等一批数据库有幸获得主流数据库的称号。
Oracle
Oracle 数据库是 Oracle(甲骨文)公司的数据库产品。Oracle 公司从数据库起家,现已成为世界上最大的企业软件公司,向全球用户提供数据库、工具和应用软件以及相关的咨询、培训和支持服务。 Oracle 数据库是世界上使用最广泛的数据库之一,可应用于企业信息系统、政府管理、Internet(因特网)及电子商务等领域。它能保证分布式信息的安全性、完整性、一致性,具有并发控制和恢复的能力,具有管理超大规模数据的能力,并且具有跨操作系统和硬件平台的数据互操作能力。
MySQL
MySQL 原是瑞典 MySQL AB 公司开发的一款数据库产品。但在 2008 年年初,MySQL AB 公司被 Sun 公司收购,而 Sun 又在 2009 年被 Oracle 收购,所以现在的 MySQL 也属于 Oracle公司。
MySQL 的显著特点是开放源码,基于这个特点,任何人都可以在相关协议的许可下下载并根据个性化的需要对其进行修改。因为它的开源、广泛传播,其迭代非常快速,近 10 年来市场占有率持续增长。
MySQL 因其高效、可靠和适应性而备受关注,由于其灵活、快速、健壮、易用以及较小的硬件开销而被许多中小型系统采用,是学习数据库体系结构的首选,
SQLServer
SQL Server 是微软公司的数据库产品,也是一个关系型数据库管理系统。SQL Server 数据库脱胎于 Sybase,原因是当时微软与 Sybase 以及另外一家公司合作,共同开发这款数据库产品。1988 年,SQL Server 问世,不过当时是基于 OS/2 系统的版本。当微软在操作系统方面推出了 Windows NT 系统以后,微软与 Sybase 在 SQL Server 的开发上已经分道扬镳。微软将 SQL Server 移植到 Windows NT 平台上,并开始专注于推广基于自己操作系统的 SQL Server 数据库管理系统。
SQL Server 有其显著的特点:
第一,操作系统相关。因为微软是一个操作系统产品提供商,所以在数据库产品的设计上,微软 SQL Server 大量利用了 Windows 操作系统的底层结构,与操作系统的结合性好。同样,由于对自己操作系统的保护,SQL Server 基本不能移植到其他操作系统上,就算勉强移植,也无法得到很好的性能。
第二,易于上手。微软 SQL Server 作为一个商业化的产品,其优势是微软产品所共有的—易用性。由于 Windows 操作系统广泛的市场占有率,所以遵循相似操作习惯的 SQL Server 对用户而言更容易上手,也使得数据库管理员可以更容易、更方便、更轻松地进行管理。
第三,以 Transact-SQL(简称 T-SQL)作为它特有的语言。T-SQL 是标准结构化查询语言的增强版,用来让应用程序与 SQL Server 进行沟通。T-SQL 提供标准结构化查询语言的 DDL 和 DML 功能,加上延伸的函数以及控制语句(例如 IF 和 WHILE),让操作数据库更有弹性。
高性能 Key-Value 数据库:Redis
Redis(Remote Dictionary Server),即远程字典服务,是一个开源的使用 ANSIC 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。
Redis 是一个高性能的 key-value 数据库。它支持存储的 value 类型,包括 string(字符串)、list(链表)、set(集合)、zset(sorted set,有序集合)和 hash(哈希类型)。这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis 支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中。
Redis 会周期性地将更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从)同步。
分布式文档储存数据库:MongoDB
MongoDB 是一个基于分布式文件存储的数据库,文档是 MongoDB 中数据的基本单位。
所谓分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户访问的服务器。另外,对等特性允许一些系统扮演客户机和服务器的双重角色。
高性能分布式数据库:HBase
HBase 是一个开源的非关系型分布式数据库,它参考了谷歌的 BigTable 建模,实现的编程语言为 Java。它是 Apache 软件基金会的 Hadoop 项目的一部分,运行于 HDFS 文件系统之上,为 Hadoop 提供类似于 BigTable 规模的服务。因此,它可以容错地存储海量稀疏的数据,该技术来源于 Fay Chang 所撰写的 Google 论文“BigTable:一个结构化数据的分布式存储系统”。
HBase 是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌 BigTable 的开源实现,主要用来存储非结构化和半结构化的松散数据。HBase 的目标是处理非常庞大的表,可以通过水平扩展的方式,利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。HBase 是 Apache 的 Hadoop 项目的子项目。HBase 不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是 HBase 基于列的而不是基于行的模式。
高性能图形数据库:Neo4j
Neo4j 是一个高性能的,非关系图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的 Java 持久化引擎,但是它将结构化数据存储在网(从数学角度叫作图)上而不是表中。
Neo4j 也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中,但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
Neo4j 因其嵌入式、高性能、轻量级等优势,越来越受到关注。
Neo4j 提供了大规模可扩展性,在一台机器上可以处理数十亿节点/关系/属性的图,可以扩展到多台机器并行运行。
相对于关系数据库来说,图数据库善于处理大量复杂、互连接、低结构化的数据,这些数据变化迅速,需要频繁的查询——在关系数据库中,这些查询会导致大量的表连接,因此会产生性能上的问题。Neo4j 重点解决了拥有大量连接的传统 RDBMS 在查询时出现的性能衰退问题。
SQL 语言,是结构化查询语言(Structured Query Language)的简称。是一门特殊的编程语言。
SQL 的作用
SQL 使人们对数据的操作和管理更加简单、高效。
SQL 标准
美国国家标准局(ANSI)和国际标准化组织(ISO)制定了 SQL 标准。1989 年 4 月,国际标准化组织提出了具有完整性特征的 SQL-89 标准,1992 年 11 月又公布了 SQL-92 标准。
各种不同的数据库对 SQL 语言的支持与标准存在着细微的不同。这是因为,有些产品的开发先于标准的公布,另外,各产品开发商为了达到特殊的性能或新的特性,需要对标准进行扩展,所以才会出现不同的 SQL 版本。
SQL 的标准化是一场革命,是关系型数据库管理系统的转折点。数据库和应用系统都使用 SQL 作为共同的数据存取语言和标准接口,使不同数据库系统之间的互操作有了共同的基础,进而实现异构平台、各种操作环境的共享与移植。
SQL 语言三个分类
SQL 语言包括以下三个部分:
- 数据定义语言(DataDefinitionLanguage,DDL),主要是对数据库中表、视图、索引、同义词、聚簇等对象进行定义。
- 数据操作语言(DataManipulationLanguage,DML),用于对数据库中的数据进行增加、删除、更新、查询操作。
- 数据控制语言(Data Control Language,DCL),数据库控制功能,对数据访问进行权限控制的指令等。
第二章 MySQL 数据安装:详细介绍windows下MySQL安装教程_Mysql_脚本之家 (jb51.net)
第三章 单表查询
关系型数据库,是指采用了关系模型来组织数据的数据库,以行和列的形式存储数据。为便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。
关系型数据库的表
二维表在生活中应用十分广泛,例如点名册、成绩单、工资表、个人信息表等。关系型数据库中的表与我们常见的二维表类似,由行和列组成。一个表代表着一类实体,具有二维结构,具有固定的列数和任意的行数。表的示意如下表所示。
ID | Name | Country | District | Population |
---|---|---|---|---|
1 | Kabul | AFG | Kabol | 1780000 |
... | ... | ... | ... | .. |
5 | Amsterdam | NLD | Noord-Holland | 731200 |
对关系模型或表的描述范式:关系名/表名(字段名 1,字段名 2,……,字段名 n)。例如上表的关系模型为,city(ID,Name,CountryCode,District,Population)。这种描述,有助于清晰地了解表的结构。
表的关键字、字段和记录
字段和记录
字段是列的别称,记录是行的别称,它们是通用和互相替代的概念。字段有字段名(如 ID、Name)和字段数据类型(如字符串、整数等)。表是记录的集合。
关键字
一个记录有多个字段,可互相区分,但怎么区分行与行呢?可用来唯一标识一条记录的一个字段或多个字段的组合,称为表的关键字(key)。例如城市表中,ID 就是关键字。 定义表的时候,需要确定每个字段的数据类型。MySQL 支持多种数据类型,大致可以分为三类:数值类型、日期/时间类型和字符串类型。
数值类型
数值类型包括 5 种整数、2 种浮点数和 1 种定点数,如下表所示。
类型 | 长度 | 范围(有符号) | 说明 |
---|---|---|---|
TINYINT | 1 字节 | -128 ~ 127 | 很小的整数 |
SMALLINT | 2 字节 | -32768 ~ 32767 | 小整数 |
MEDIUMINT | 3 字节 | -8388608 ~ 8388607 | 中等大小的整数 |
INT 或 INTEGER | 4 字节 | -2147483648 ~ 2147483647 | 普通整数 |
BIGINT | 8 字节 | -9223372036854775808 ~ 9223372036854775807 | 大整数 |
FLOAT | 4 字节 | -3.402823466E+38 ~-1.175494351E-38, 0, 1.175494351E-38 ~ 3.402823466351E+38 | 单精度浮点数 |
DOUBLE | 8 字节 | -1.7976931348623157E+308 ~-2.2250738585072014E-308, 0, 2.2250738585072014E-308 ~ 1.7976931348623157E+308 | 双精度浮点数 |
DEC 或 DECIMAL(M,D) | 如果 M>D,为 M+2,否则为 D+2 | -1.7976931348623157E+308 ~-2.2250738585072014E-308, 0, 2.2250738585072014E-308 ~ 1.7976931348623157E+308 | 定点数,M 表示总位数,D 表示小数位数 |
时间和日期类型
日期/时间类型如下表所示:
类型 | 大小 | 范围 | 格式 | 说明 |
---|---|---|---|---|
DATE | 3 字节 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 字节 | -838:59:59 至 838:59:59 | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 字节 | 1901 至 2155 | YYYY | 年份值 |
DATETIME | 8 字节 | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 字节 | 1970-01-01 00:00:00 至 2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038 年 1 月 19 日凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串类型
字符串类型如下表所示:
类型 | 大小 | 说明 |
---|---|---|
CHAR(N) | 0-255 字节 | 定长字符串,N 表示字符个数 |
VARCHAR(N) | 0-65535 字节 | 变长字符串,N 表示字符个数 |
TINYTEXT | 0-255 字节 | 短文本字符串 |
TEXT | 0-65 535 字节 | 长文本字符串 |
MEDIUMTEXT | 0-16 777 215 字节 | 中等长度文本数据 |
LONGTEXT | 0-4 294 967 295 字节 | 超大长度文本数据 |
select
SELECT
语句用于从表中选取记录,选取的结果被存储在一个结果集中。
SELECT
的基本语法如下:
SELECT 列名 FROM 表名;
注意,在 SQL 语言中对大小写是不敏感的,所以 SELECT
和 select
是都可以。建议大家对 MySQL 关键字使用全大写格式,这样有利于阅读。
如果需要从表中选取多个列,列名之间用逗号分隔。
SELECT 列名1, 列名2, ……, 列名n FROM 表名;
有的时候我们需要查看表中的所有字段,而表中字段又比较多,一个一个列出来比较麻烦,可以使用符号 *
来表示查询所有的字段。*
是通配符中的一个,表示匹配所有的意思,使用语法如下:
SELECT * FROM 表名;
使用 WHERE
的基本语法如下:
SELECT 列名 FROM 表名 WHERE 列名 运算符 条件值;
在 MySQL 中,主要有以下几种运算符:
- 比较运算符
- 逻辑运算符
- 位运算符
- 算术运算符
MySQL 中的比较运算符如下表所示:
运算符 | 作用 |
---|---|
= | 等于 |
<> 或 != | 不等于 |
< | 小于 |
大于 | |
<= | 小于或等于 |
>= | 大于或等于 |
<=> | 两边为 NULL 返回值 1,一个为 NULL 返回值 0 |
BETWEEN min AND max | 在 min 和 max 的值之间,包含 min 和 max |
IN (value1, value2, …) | 在集合 (value1, value2, …) 中 |
IS NULL | 为空 |
IS NOT NULL | 不为空 |
LIKE | 模糊匹配 |
REGEXP 或 RLIKE | 正则表达式匹配 |
MySQL 中的逻辑运算符如下表所示:
运算符 | 作用 |
---|---|
NOT 或 ! | 逻辑非 |
AND | 逻辑与 |
OR | 逻辑或 |
XOR | 逻辑异或 |
逻辑非:对某个表达式的结果取反。 逻辑与:运算符两边的表达式必须同时满足。 逻辑或:只需要满足其中一个条件即可。 逻辑异或:只能满足其中一个条件。
MySQL 中的位运算符如下表所示:
运算符 | 作用 | |
---|---|---|
& | 按位与 | |
按位或 | ||
按位异或 | ||
! | 取反 | |
<< | 左移 | |
>> | 右移 |
位运算是以二进制作为基础的运算,所以做位运算之前,会先将操作数变成二进制数,然后进行位运算,计算的结果再从二进制变为十进制输出。
-
按位与
SELECT 2 & 3;
-
按位或
SELECT 2 | 3;
-
按位异或
SELECT 2 ^ 3;
-
按位取反
SELECT ~3;
-
按位右移
SELECT 5 >> 2;
-
按位左移
SELECT 5 << 1;
算术表达式
**
数据库中的表存放的是基础数据,有时候我们需要在基础数据上做些运算处理。首先我们要说一下 MySQL 中的算术表达式是什么。
算术表达式可以简单地理解为数学算式,是由算术运算符连接起来的表达式,在 MySQL 中支持的算术运算符如下表所示:
运算符 | 作用 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ 或 DIV | 除法运算 |
% 或 MOD | 取余运算 |
需要注意:在除法和取余运算中,除数不能为 0,否则该表达式非法,返回结果为 NULL。
加法运算
SELECT 1 + 2;
减法运算
SELECT 3 - 2;
乘法运算
SELECT 2 * 3;
除法运算
SELECT 6 / 5;
DIV
用法:
SELECT 3 DIV 2;
需要注意 /
与 DIV
的区别:/
默认保留四位小数,DIV
只取整数部分。
取余运算
SELECT 6 % 4;
在 SQL 语句中可以使用 DISTINCT 关键字,它的作用就是消除重复的行。
在 SELECT 所选字段后面可以指定一个名字,来为原始字段起一个更易理解的别名,特别在所选字段是经过修改或重组时,采用这种方式能让人更加快速的明白所想表达的意思,这就是别名的作用。使用别名时,字段名和别名之间用空格分开
分页查询的语法如下:
SELECT 列名 FROM 表名 LIMIT 起始行行号, 每页显示的行数;
例如:查询 city 表中的记录,跳过前 5 行(起始是从 0 开始),从第 6 行开始显示 4 行记录。
SELECT * FROM city LIMIT 5, 4;
可以使用 ORDER BY
子句后跟一列或多列名字,对查询结果进行排序
在使用 SELECT
FROM
语句时,查询出的记录的顺序是记录的添加顺序。如果我们需要记录按一定规则进行排序后输出,就需要对查询出的记录进行重新排序。
SELECT 列名 FROM 表名 ORDER BY 列名
SELECT 列名 FROM city [WHERE 条件] GROUP BY 列名;
其中 GROUP BY
关键字表示分组,从前面提到的统计要求来看,我们需要按国家代号分组,并加总这些国家的城市的人口数量。
需要注意,在使用 GROUP BY
的时候,查询的字段要么是 GROUP BY
后面的字段,要么是其它列的聚合统计等
HAVING
也是条件筛选,和 WHERE
的作用差不多
前者在分组基础上筛选,后者是基于行的筛选。也可以说,WHERE
子句是在分组之前对表的行进行筛选,而 HAVING
则是在分完组后对组进行条件筛选,其语法如下。
SELECT 列名 FROM city GROUP BY 列名 HAVING 分组条件;
group by和having区别
在 MySQL 数据库中 GROUP BY
是和聚合函数一起使用的,通过把一个或多个列分成多个组,然后使用聚合函数进行分组统计。
HAVING
的作用就是分组后再对组设置查询条件,过滤掉不符合条件的组。