1、数据库概述
1.1 为什么要学数据库?
- 以前我们做系统,数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会丢失的效果,当然文件存储也有它的弊端。
假设在文件中存储以下的数据:
姓名 年龄 性别 住址 张三 23 男 北京西三旗 李四 24 女 北京西二旗 王五 25 男 西安软件新城
但是接下来我有这样一个需求:将下面的user.txt文件中的张三年龄修改为35
- 我们要如何实现呢?
- IO技术可以通过将所有的数据读取到内存中,然后进行修改再存到该文件中
- 可以采用字符缓冲流,将每一行数据读取出来,封装为User对象。将多个User对象保存到集合中
- 然后遍历集合,将王五对象的年龄修改为35,再重新将集合中的对象信息写回到文件中
- IO技术可以通过将所有的数据读取到内存中,然后进行修改再存到该文件中
弊端:
- 这一套操作太麻烦了
- 现在只有三条数据,如果文件中存储1T的数据,内存存的下么?存不下
现需要既能持久化存储数据,也要能避免上述问题的技术使用在我们的系统中。数据库就是这样的一门技术。
1.2. 数据库(DB)
DB(Database):数据库,存储数据的“仓库”,它保存了一系列有组织的数据。
1.3 数据库管理系统(DBMS)
管理数据库的大型软件
- DBMS(Database Management System):数据库管理系统,数据库是通过 DBMS 创建和操作的容器。
- 在电脑上安装了数据库管理系统后,就可以通过数据库管理系统创建数据库来存储数据,也可以通过该系统对数据库中的数据进行数据的增删改查相关的操作。我们平时说的MySQL数据库其实是MySQL数据库管理系统。
- 常见的 DBMS 有:Oracle、MySQL 等
•Oracle:收费的大型数据库,Oracle 公司的产品
•MySQL:开源免费的中小型数据库。后来 Sun公司收购了 MySQL,而 Sun 公司又被 Oracle 收购
•SQL Server:MicroSoft 公司收费的中型的数据库。C#、.net 等语言常使用
•PostgreSQL:开源免费中小型的数据库
•DB2:IBM 公司的大型收费数据库产品
•SQLite:嵌入式的微型数据库。如:作为 Android 内置数据库
•MariaDB:开源免费中小型的数据库
我们课程上学习的是MySQL数据库管理系统,PostgreSQL在一些公司也有使用,此时大家肯定会想以后在公司中如果使用我们没有学习过程的PostgreSQL数据库管理系统怎么办?这点大家大可不必担心,如下图所示:
1.4 SQL
- SQL(Structure Query Language):结构化查询语言,专门用来和数据库通信的语言。
- SQL 的优点:
- ① 不是某个特定数据库供应商专有的语言,几乎所有 DBMS 都支持 SQL 。
- ② 简单易学。
- ③ 虽然简单,但实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。
1.5 数据库好处
- 可以持久化存储数据
- 方便存储和管理数据
- 使用了统一的方式操作数据库 — SQL(
Structured Query Language:结构化查询语言
)
1.6 数据库特点
- ① 将数据放到表中,表再放到库中。
- ② 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。
- ③ 表具有一些特性,这些特性定义了数据在表中如何存储,类似于 java 中“类”的设计。
- ④ 表是由列组成,我们也称之为字段。所有表都是由一个或多个列组成,每一列类似于 java 中的“属性”。
- ⑤ 表中的数据是按行存储的,每一行数据类似于 java中的“对象”。
2、MySQL 简介
2.1 概述
- 小型的数据库
- 开源免费(6版本之前免费)
- MySQL 所使用的 SQL 语句是用于访问数据库最常用的标准化语言。
MySQL 数据库隶属于 MySQL AB 公司,总部位于瑞典,后被 Oracle 收购。
2.2 优势
① 成本低:开放源代码,一般可以免费使用。
- ② 性能高:执行很快。
-
2.3 MySQL 的版本
社区版(免费)
-
2.4 MySQL 的安装
2.5 MySQL数据模型
- 关系型数据库是建立在关系模型基础上的数据库,简单说,关系型数据库是由多张能互相连接的 二维表 组成的数据库
- 如下图,
订单信息表
和客户信息表
都是有行有列二维表我们将这样的称为关系型数据库。
接下来看关系型数据库的优点:
- 都是使用表结构,格式一致,易于维护。
- 使用通用的 SQL 语言操作,使用方便,可用于复杂查询。
- 关系型数据库都可以通过SQL进行操作,所以使用方便。
- 复杂查询。现在需要查询001号订单数据,我们可以看到该订单是1号客户的订单,而1号订单是李聪这个客户。以后也可以在一张表中进行统计分析等操作。
- 数据存储在磁盘中,安全。
数据模型:
如上图,我们通过客户端可以通过数据库管理系统创建数据库,在数据库中创建表,在表中添加数据。创建的每一个数据库对应到磁盘上都是一个文件夹。比如可以通过SQL语句创建一个数据库(数据库名称为db1),语句如下。该语句咱们后面会学习。
我们可以在数据库安装目录下的data目录下看到多了一个 db1
的文件夹。所以,在MySQL中一个数据库对应到磁盘上的一个文件夹。
而一个数据库下可以创建多张表,我们到MySQL中自带的mysql数据库的文件夹目录下:
而上图中右边的 db.frm
是表文件,db.MYD
是数据文件,通过这两个文件就可以查询到数据展示成二维表的效果。
小结:
- MySQL中可以创建多个数据库,每个数据库对应到磁盘上的一个文件夹
- 在每个数据库中可以创建多个表,每张都对应到磁盘上一个 frm 文件
- 每张表可以存储多条数据,数据会被存储到磁盘中 MYD 文件中
3、SQL概述
了解了数据模型后,接下来我们就学习SQL语句,通过SQL语句对数据库、表、数据进行增删改查操作。
3.1 SQL简介
- 英文:Structured Query Language,简称 SQL
- 结构化查询语言,一门操作关系型数据库的编程语言
- 定义操作所有关系型数据库的统一标准
- 对于同一个需求,每一种数据库操作的方式可能会存在一些不一样的地方,我们称为“方言”
3.2 通用语法
- ① 每句话用
;
结尾。
- ② 不区分大小写,但是建议大写
- ③ 注释:
- 单行注释: — 注释内容 或 #注释内容(MySQL 特有)
注意:使用— 添加单行注释时,—后面一定要加空格,而#没有要求。
- 多行注释: / 注释 /
- ④ 各个字句一般分行写。
- ⑤ 关键字不能缩写也不能分行。
- ⑥ 用缩进来提高语句的可读性。
3.3 SQL分类
**DDL(Data Definition Language)**
数据定义语言- 用来定义数据库对象:数据库,表,列等。关键字:
create
,drop
,alter
等 - DDL简单理解就是用来操作数据库,表等
- 用来定义数据库对象:数据库,表,列等。关键字:
**DML(Data Manipulation Language)**
数据操作语言- 用来对数据库中表的数据进行增删改。关键字:
insert
,delete
,update
等 - DML简单理解就对表中数据进行增删改
- 用来对数据库中表的数据进行增删改。关键字:
**DQL(Data Query Language)**
数据查询语言- 用来查询数据库中表的记录(数据)。关键字:
select
,where
等 - DQL简单理解就是对数据进行查询操作。从数据库表中查询到我们想要的数据。
- 用来查询数据库中表的记录(数据)。关键字:
**DCL(Data Control Language)**
数据控制语言(了解)- 用来定义数据库的访问权限和安全级别,及创建用户。关键字:
grant
,revoke
等 - DCL简单理解就是对数据库进行权限控制。比如我让某一个数据库表只能让某一个用户进行操作等。
- 用来定义数据库的访问权限和安全级别,及创建用户。关键字:
- sql动词表
| SQL功能 | 动词 | | —- | —- | | 数据查询 | SELECT | | 数据定义 | CREATE、DROP、ALTER | | 数据操纵 | INSERT、UPDATE、DELETE | | 数据控制 | GRANT、REVOKE |
注意: 以后我们最常操作的是
DML
和DQL
,因为我们开发中最常操作的就是数据。
4、DDL 操作数据库
4.1 查询
查询所有的数据库
-- 查询所有数据库
SHOW DATABASES;
运行上面语句效果如下:
上述查询到的是的这些数据库是mysql安装好自带的数据库,我们以后不要操作这些数据库(也不要删除)。
4.2 创建数据库
创建数据库
-- 标准语法 CREATE DATABASE 数据库名称;
而在创建数据库的时候,我并不知道db1数据库有没有创建,直接再次创建名为db1的数据库就会出现错误。-- 创建一个已存在的数据库会报错 -- 错误代码:1007 Can't create database 'db1'; database exists CREATE DATABASE db1;
为了避免上面的错误,在创建数据库的时候先做判断,如果不存在再创建。创建数据库(判断,如果不存在则创建) ```sql — 标准语法 CREATE DATABASE IF NOT EXISTS 数据库名称;
— 创建数据库db2(判断,如果不存在则创建) CREATE DATABASE IF NOT EXISTS db2;
运行语句效果如下:

从上面的效果可以看到虽然db1数据库已经存在,再创建db1也没有报错,而创建db2数据库则创建成功。
- **创建数据库、并指定字符集**
```sql
-- 标准语法
CREATE DATABASE 数据库名称 CHARACTER SET 字符集名称;
-- 创建数据库db3、并指定字符集utf8
CREATE DATABASE db3 CHARACTER SET utf8;
-- 通过查询db3数据库的创建语句确认创建字符集
SHOW CREATE DATABASE db3;
- 创建db4数据库、如果不存在则创建,指定字符集为gbk ```sql — 创建db4数据库、如果不存在则创建,指定字符集为gbk CREATE DATABASE IF NOT EXISTS db4 CHARACTER SET gbk;
— 查看db4数据库的字符集 SHOW CREATE DATABASE db4;
<a name="E5Zci"></a>
## 4.3 修改数据库
- **修改数据库的字符集**
```sql
-- 标准语法
ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称;
-- 修改数据库db4的字符集为utf8
ALTER DATABASE db4 CHARACTER SET utf8;
-- 查看db4数据库的字符集
SHOW CREATE DATABASE db4;
4.4 删除数据库
- 删除数据库
-- 标准语法
DROP DATABASE 数据库名称;
-- 删除db1数据库
DROP DATABASE db1;
- 删除数据库(判断,如果存在则删除)
-- 删除一个不存在的数据库会报错
-- 错误代码:1008 Can't drop database 'db1'; database doesn't exist
DROP DATABASE db2;
运行语句效果如下:
4.5 使用数据库
数据库创建好了,要在数据库中创建表,得先明确在哪儿个数据库中操作,此时就需要使用数据库。
- 使用数据库
-- 标准语法
USE 数据库名称;
- 查看当前使用的数据库
-- 查询当前正在使用的数据库
SELECT DATABASE();
运行语句效果如下:
5、DDL 操作表
操作表也就是对表进行增(Create)删(Retrieve)改(Update)查(Delete)。
5.1 查询表
5.1.1 查询当前数据库下所有表名称
-- 查询库中所有的表
SHOW TABLES;
我们创建的数据库中没有任何表,因此我们进入mysql自带的mysql数据库,执行上述语句查看
5.1.2 查询表结构
-- 标准语法
DESC 表名称;
查看mysql数据库中func表的结构,运行语句如下:
5.1.3 查询表字符集
-- 标准语法
SHOW TABLE STATUS FROM 库名 LIKE '表名';
-- 查看mysql数据库中user表字符集
SHOW TABLE STATUS FROM mysql LIKE 'user';
5.2 创建表
5.2.1 创建数据表
CREATE TABLE 表名 (
字段名1 数据类型1,
字段名2 数据类型2,
…
字段名n 数据类型n
);
-- 注意:最后一列,不需要加逗号
注意:最后一行末尾,不能加逗号
知道了创建表的语句,那么我们创建创建如下结构的表
create table tb_user (
id int,
username varchar(20),
password varchar(32)
);
运行语句如下:
5.2.2 数据库的数据类型
MySQL 支持多种类型,可以分为三类:
- 数值
tinyint : 小整数型,占一个字节 int : 大整数类型,占四个字节 eg : age int double : 浮点类型 使用格式: 字段名 double(总长度,小数点后保留的位数) eg : score double(5,2)
- 日期
date : 日期值。只包含年月日 eg :birthday date : datetime : 混合日期和时间值。包含年月日时分秒
- 字符串
char : 定长字符串。 优点:存储性能高 缺点:浪费空间 eg : name char(10) 如果存储的数据字符个数不足10个,也会占10个的空间 varchar : 变长字符串。 优点:节约空间 缺点:存储性能底 eg : name varchar(10) 如果存储的数据字符个数不足10个,那就数据字符个数是几就占几个的空间
注意:其他类型参考资料中的《MySQL数据类型].xlsx》MySQL数据类型.xlsx
案例:
需求:设计一张学生表,请注重数据类型、长度的合理性
1. 编号
2. 姓名,姓名最长不超过10个汉字
3. 性别,因为取值只有两种可能,因此最多一个汉字
4. 生日,取值为年月日
5. 入学成绩,小数点后保留两位
6. 邮件地址,最大长度不超过 64
7. 家庭联系电话,不一定是手机号码,可能会出现 - 等字符
8. 学生状态(用数字表示,正常、休学、毕业...)
语句设计如下:
create table student (
id int,
name varchar(10),
gender char(1),
birthday date,
score double(5,2),
email varchar(15),
tel varchar(15),
status tinyint
);
5.2.3 复制表
-- 标准语法
CREATE TABLE 表名 LIKE 被复制的表名;
-- 复制product表到product2表
CREATE TABLE product2 LIKE product;
5.3 修改表
5.3.1 修改表名
ALTER TABLE 表名 RENAME TO 新的表名;
-- 将表名student修改为stu
alter table student rename to stu;
5.3.2 修改表的字符集
-- 标准语法
ALTER TABLE 表名 CHARACTER SET 字符集名称;
-- 查看db3数据库中product3数据表字符集
SHOW TABLE STATUS FROM db3 LIKE 'product3';
-- 修改product3数据表字符集为gbk
ALTER TABLE product3 CHARACTER SET gbk;
-- 查看db3数据库中product3数据表字符集
SHOW TABLE STATUS FROM db3 LIKE 'product3';
5.3.3 添加一列
-- 标准语法
ALTER TABLE 表名 ADD 列名 数据类型;
-- 给stu表添加一列address,该字段类型是varchar(50)
alter table stu add address varchar(50);
5.3.4 修改数据类型
-- 修改数据类型 标准语法
ALTER TABLE 表名 MODIFY 列名 新数据类型;
-- 将stu表中的address字段的类型改为 char(50)
alter table stu modify address char(50);
5.3.5 修改列名和数据类型
-- 修改列名和数据类型 标准语法
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
-- 将stu表中的address字段名改为 addr,类型改为varchar(50)
alter table stu change address addr varchar(50);
5.3.6 删除一列
-- 标准语法
ALTER TABLE 表名 DROP 列名;
-- 将stu表中的addr字段 删除
alter table stu drop addr;
5.4 删除表
5.4.1 删除表
-- 标准语法
DROP TABLE 表名;
5.4.2 删除表时判断表是否存在
DROP TABLE IF EXISTS 表名;
运行语句效果如下:
6、Navicat 的使用
6.1 打开和mysql服务的连接
6.2 打开要操作数据库
- 修改表结构
点击了设计表后即出现如下图所示界面,在图中红框中直接修改字段名,类型等信息:
6.3 编写SQL语句并执行
6.4 Navicat常用快捷键
- 打开一个新的查询窗口: Ctrl + Q
- 关闭当前窗口:Ctrl + W
- 运行当前窗口的SQL语句:Ctrl + R
- 运行选中的SQL语句:Ctrl + Shift + R
- 注释选中SQL语句:Ctrl + /
- 取消注释SQL:Ctrl + Shift + /
- 选中当前行SQL:三击鼠标
- 复制一行内容到下一行:Ctrl + D
- 删除当前行:Ctrl + L
- 在表内容显示页面切换到表设计页面:Ctrl + D
- 在表设计页面,快速切换到表内容显示页面:Ctrl + O
- 打开mysql命令行窗口:F6
- 刷新:F5
7、DML 语句
DML主要是对数据进行增(insert)删(delete)改(update)操作。
7.1 DML-INSERT语句
7.1.1 给指定列添加数据
-- 标准语法
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…);
-- 向product表添加指定列数据
-- 查看表中所有数据
7.1.2 默认给全部列添加数据
-- 标准语法
INSERT INTO 表名 VALUES(值1,值2,…);
7.1.3 批量添加数据
-- 默认添加所有列数据 标准语法
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
-- 给指定列添加数据 标准语法
INSERT INTO 表名 VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
注意事项
- 列名和值的数量以及数据类型要对应
- 除了数字类型,其他数据类型的数据都需要加引号(单引双引都可以,推荐单引)
7.2 DML-UPDATE语句
7.2.1 修改表数据语法
-- 标准语法
UPDATE 表名 SET 列名1 = 值1,列名2 = 值2,... [where 条件];
-- 修改手机的价格为3500
UPDATE product SET price=3500 WHERE NAME='手机';
-- 查看所有数据
SELECT * FROM product;
-- 修改电视的价格为1800、库存为36
UPDATE product SET price=1800,stock=36 WHERE NAME='电视';
-- 修改电磁炉的库存为10
UPDATE product SET stock=10 WHERE id=7;
注意事项
- 修改语句中必须加条件
- 如果不加条件,则将所有数据都修改
7.3 DML-DELETE语句
7.3.1 删除表数据语法
-- 标准语法
DELETE FROM 表名 [WHERE 条件];
注意事项
- 删除语句中必须加条件
- 如果不加条件,则将所有数据删除
8、DQL 单表查询
8.1 简介
查询语句很重要,复杂多变,所以单独分出来
页面上展示的数据肯定是在数据库中的表中进行存储,而我们需要将数据库中的数据查询出来并展示在页面给用户看。上图中的是最基本的查询效果,那么数据库其实是很多的,不可能在将所有的数据在一页进行全部展示,而页面上会有分页展示的效果,如下:
当然上图中的难度字段当我们点击也可以实现排序查询操作。从这个例子我们就可以看出,对于数据库的查询时灵活多变的,需要根据具体的需求来实现,而数据库查询操作也是最重要的操作,所以此部分需要大家重点掌握。
接下来我们先介绍查询的完整语法:
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段
HAVING
分组后条件
ORDER BY
排序字段
LIMIT
分页限定
8.2 数据准备
一般格式格式为:
- 数据准备(直接复制执行即可) ```sql — 创建testdb1数据库 CREATE DATABASE testdb1;
— 使用testdb1数据库 USE testdb1;
— 创建数据表 CREATE TABLE product( id INT, — 商品编号 NAME VARCHAR(20), — 商品名称 price DOUBLE, — 商品价格 brand VARCHAR(10), — 商品品牌 stock INT, — 商品库存 insert_time DATE — 添加时间 );
— 添加数据 INSERT INTO product VALUES (1,’华为手机’,3999,’华为’,23,’2088-03-10’), (2,’小米手机’,2999,’小米’,30,’2088-05-15’), (3,’苹果手机’,5999,’苹果’,18,’2088-08-20’), (4,’华为电脑’,6999,’华为’,14,’2088-06-16’), (5,’小米电脑’,4999,’小米’,26,’2088-07-08’), (6,’苹果电脑’,8999,’苹果’,15,’2088-10-25’), (7,’联想电脑’,7999,’联想’,NULL,’2088-11-11’);
<a name="ZMyBZ"></a>
## 8.3 基础查询
- 特点:
- ① 查询列表可以是:表中的字段、常量值、表达式、函数。
- ② 查询的结果是一个虚拟的表格。
<a name="wBdWC"></a>
### 8.3.1 查询全部字段
```sql
-- 标准语法
SELECT * FROM 表名;
-- 查询product表所有数据
SELECT * FROM product;
8.3.2 查询多个字段
-- 标准语法
SELECT 列名1,列名2,... FROM 表名;
-- 查询名称、价格、品牌
SELECT NAME,price,brand FROM product;
8.3.3 去除重复记录
-- 标准语法
SELECT DISTINCT 列名1,列名2,... FROM 表名;
-- 查询品牌
SELECT brand FROM product;
-- 查询品牌,去除重复
SELECT DISTINCT brand FROM product;
注意:只有全部重复的才可以去除
8.3.4 计算列的值(四则运算)
-- 标准语法
SELECT 列名1 运算符(+ - * /) 列名2 FROM 表名;
/*
计算列的值
标准语法:
SELECT 列名1 运算符(+ - * /) 列名2 FROM 表名;
如果某一列为null,可以进行替换
ifnull(表达式1,表达式2)
表达式1:想替换的列
表达式2:想替换的值
*/
-- 查询商品名称和库存,库存数量在原有基础上加10
SELECT NAME,stock+10 FROM product;
-- 查询商品名称和库存,库存数量在原有基础上加10。进行null值判断
SELECT NAME,IFNULL(stock,0)+10 FROM product;
8.3.5 起别名
-- 标准语法 AS可以省略
SELECT 列名1,列名2,... AS 别名 FROM 表名;
-- 查询商品名称和库存,库存数量在原有基础上加10。进行null值判断。起别名为getSum
SELECT NAME,IFNULL(stock,0)+10 AS getsum FROM product;
SELECT NAME,IFNULL(stock,0)+10 getsum FROM product;
8.4 条件查询
8.4.1 条件分类
- ① 按条件表达式筛选:条件运算符:
>
、<
、=
、<>
、!=
、>=
、<=
。 - ② 按逻辑表达式筛选:逻辑运算符:
&&(and)
、||(or)
、!(not)
。 - ③ 模糊查询:
like
、between
and
、in
、is null
、is not null
。 | 符号 | 功能 | | —- | —- | | > | 大于 | | < | 小于 | | >= | 大于等于 | | <= | 小于等于 | | = | 等于 | | <> 或 != | 不等于 | | BETWEEN … AND … | 在某个范围之内(都包含) | | IN(…) | 多选一,在指定范围中获得值 | | LIKE 占位符 | 模糊查询 _单个任意字符 %多个任意字符 | | IS NULL | 是NULL | | IS NOT NULL | 不是NULL | | AND 或 && | 并且 | | OR 或 || | 或者 | | NOT 或 ! | 非,不是 |
8.4.2 条件查询示例
语法:
-- 标准语法
SELECT 列名 FROM 表名 WHERE 条件;
-- 查询库存大于20的商品信息
SELECT * FROM product WHERE stock > 20;
-- 查询品牌为华为的商品信息
SELECT * FROM product WHERE brand='华为';
-- 查询金额在4000 ~ 6000之间的商品信息
SELECT * FROM product WHERE price >= 4000 AND price <= 6000;
SELECT * FROM product WHERE price BETWEEN 4000 AND 6000;
-- 查询库存为14、30、23的商品信息
SELECT * FROM product WHERE stock=14 OR stock=30 OR stock=23;
SELECT * FROM product WHERE stock IN(14,30,23);
-- 查询库存为null的商品信息
SELECT * FROM product WHERE stock IS NULL;
-- 查询库存不为null的商品信息
SELECT * FROM product WHERE stock IS NOT NULL;
8.4.3 模糊查询练习
模糊查询使用like关键字,可以使用通配符进行占位:
(1)_ : 代表**单个**任意字符
(2)% : 代表任意个数字符
-- 查询名称以小米为开头的商品信息
SELECT * FROM product WHERE NAME LIKE '小米%';
-- 查询名称第二个字是为的商品信息
SELECT * FROM product WHERE NAME LIKE '_为%';
-- 查询名称为四个字符的商品信息
SELECT * FROM product WHERE NAME LIKE '____';
-- 查询名称中包含电脑的商品信息
SELECT * FROM product WHERE NAME LIKE '%电脑%';
8.5 函数
8.5.1 概念
- 函数类似于java中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名。
8.5.2 好处
- ① 隐藏了实现细节。
- ② 提高代码的重用性。
8.5.3 分类
- ① 单行函数:将一个数据进行处理,返回一个值,如 length() 、concat() 等。
- ② 分组函数:将虚拟表看做一个组,处理一组数据,返回一个值。
8.5.4 单行函数
8.5.5 分组函数(聚合函数)
分组函数(聚合函数):一组中有多行,但最终一个结果,一般用作统计
就是多行查询结果,聚合计算成一个结果返回
是查到多行返回一个结果,所以就涉及到按某个列进行分组的问题
聚合函数分类 | 函数名 | 功能 | | —- | —- | | count(列名) | 统计数量(一般选用不为null的列) | | max(列名) | 最大值 | | min(列名) | 最小值 | | sum(列名) | 求和 | | avg(列名) | 平均值 |
特点:
- 一般而言,sum 和 avg 用于处理数值型。max 、min 、count 可以处理任何类型。
avg 、count 、max 、min 、sum 都忽略 null 值
。null 值不参与所有聚合函数运算- count 函数一般单独使用,一般使用 count(*) 来统计行数。
- 和分组函数一同查询的字段要求是 group by 后的字段。
- 聚合函数查询 ```sql — 标准语法 SELECT 函数名(列名) FROM 表名 [WHERE 条件];
— 计算product表中总记录条数 SELECT COUNT(*) FROM product;
— 获取最高价格 SELECT MAX(price) FROM product; — 获取最高价格的商品名称 SELECT NAME,price FROM product WHERE price = (SELECT MAX(price) FROM product);
— 获取最低库存 SELECT MIN(stock) FROM product; — 获取最低库存的商品名称 SELECT NAME,stock FROM product WHERE stock = (SELECT MIN(stock) FROM product);
— 获取总库存数量 SELECT SUM(stock) FROM product; — 获取品牌为苹果的总库存数量 SELECT SUM(stock) FROM product WHERE brand=’苹果’;
— 获取品牌为小米的平均商品价格 SELECT AVG(price) FROM product WHERE brand=’小米’;
<a name="FY6pK"></a>
## 8.6 分组查询
- 语法
```sql
SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤];
分组查询的目的是为了做统计,所以一般需要和分组函数一起配合使用
-- 标准语法
SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式];
-- 按照品牌分组,获取每组商品的总金额
SELECT brand,SUM(price) FROM product GROUP BY brand;
-- 对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额
SELECT brand,SUM(price) FROM product WHERE price > 4000 GROUP BY brand;
-- 对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的
SELECT brand,SUM(price) AS getSum FROM product
WHERE price > 4000
GROUP BY brand
HAVING getSum > 7000;
-- 对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的、并按照总金额的降序排列
SELECT brand,SUM(price) AS getSum FROM product
WHERE price > 4000
GROUP BY brand
HAVING getSum > 7000
ORDER BY getSum DESC;
注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
8.7 排序查询
- 排序分类
- 注意:多个排序条件,当前边的条件值一样时,才会判断第二条件 | 关键词 | 功能 | | —- | —- | | ORDER BY 列名1 排序方式1 , 列名2 排序方式2 | 对指定列排序,ASC升序(默认的) DESC降序 |
asc: ascent 升序(默认排序);desc: descent 降序
- 排序语法 ```sql — 标准语法 SELECT 列名 FROM 表名 [WHERE 条件] ORDER BY 列名1 排序方式1,列名2 排序方式2;
— 按照库存升序排序 SELECT * FROM product ORDER BY stock ASC;
— 查询名称中包含手机的商品信息。按照金额降序排序 SELECT * FROM product WHERE NAME LIKE ‘%手机%’ ORDER BY price DESC;
— 按照金额升序排序,如果金额相同,按照库存降序排列 SELECT * FROM product ORDER BY price ASC,stock DESC;
<a name="ZzEU2"></a>
##
<a name="jq834"></a>
## 8.8 分页查询
```sql
-- 标准语法
SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式] LIMIT 开始索引,查询条数;
-- 公式:开始索引 = (当前页码-1) * 每页显示的条数
-- 每页显示2条数据
SELECT * FROM product LIMIT 0,2; -- 第一页 开始索引=(1-1) * 2
SELECT * FROM product LIMIT 2,2; -- 第二页 开始索引=(2-1) * 2
SELECT * FROM product LIMIT 4,2; -- 第三页 开始索引=(3-1) * 2
SELECT * FROM product LIMIT 6,2; -- 第四页 开始索引=(4-1) * 2
8.8.1 分页查询图解
8.9 union 联合查询
- union 联合查询:将多条查询语句的结果合并成一个结果。
语法:
查询语句1 UNION 查询语句2 ……;
特点:
- ① 要求多条查询语句的查询列数是一致的。
- ② 要求多条查询语句的每一列的类型和顺序最好是一致的。
- ③ union 关键字默认是去重,如果使用 union all ,可以包含重复项。