前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL基础(一)

MySQL基础(一)

原创
作者头像
落幕
发布2025-05-27 17:37:33
发布2025-05-27 17:37:33
1970
举报

MySQL基础(一)

1. 数据库概述

1.1 数据库介绍

数据库就是==存储数据的仓库==,其本质是一个文件系统,按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作

  • 可以结构化存储大量的数据;
  • 可以有效的保持数据的一致性、完整性;
  • 读写效率极高。

1.2 数据库分类

1. 关系型数据库(RDBMS
  • 特点:基于表格结构,使用 SQL 查询,支持 ACID 事务
  • 常见的数据库:
    • MySQL:开源、广泛使用的关系型数据库
    • ostgreSQL:功能强大的开源关系型数据库,支持复杂查询
    • Oracle Database:企业级商业数据库,高稳定性
    • Microsoft SQL Server:微软推出的关系型数据库,与 Windows 生态深度集成。
2. 非关系型数据库(NoSQL)
  • 特点:灵活的数据模型,适合高并发、大数据场景,通常不支持 ACID。
  • 子类及代表数据库
  • 文档型数据库:以 JSON/XML 格式存储数据。
    • MongoDB:最流行的文档数据库,支持动态模式。
    • Couchbase:分布式文档数据库,支持内存缓存。
  • 键值对数据库:通过键快速存取数据
    • Redis:内存键值数据库,支持持久化和复杂数据结构(如列表、集合)。

1.3 数据库管理系统

  • 定义: DBMS 是管理数据库的软件,提供创建、查询、更新和删除数据的功能,同时负责数据安全、权限控制、备份恢复等。
  • 核心功能:
    • 数据定义(DDL):创建、修改数据库结构(如建表)。
    • 数据操作(DML):增删改查数据(如 INSERT, SELECT)。
    • 数据控制(DCL):权限管理和事务控制(如用户授权)。
  • 与数据库的关系: DBMS 是操作数据库的工具,数据库是 DBMS 管理的数据集合。 类比:DBMS 如同“仓库管理员”,数据库如同“仓库”。

1.4 SQL是什么(Structured Query Language)

结构化查询语言(Structured Query Language)简称SQL,是关系型数据库管理系统都需要遵循的规范,是数据库认识的语句。不同的数据库生产厂商都支持SQL语句,但都有特有内容。

  • 定义: SQL 是用于与关系型数据库交互的标准化编程语言,通过编写 SQL 语句操作 DBMS 中的数据。
  • 核心功能
    • DDL(数据定义语言):CREATE, ALTER, DROP(定义表结构)。
    • DML(数据操作语言):SELECT, INSERT, UPDATE, DELETE(操作数据)。
    • DML(专用于复杂查询):SELECT ... JOINGROUP BYHAVING 等高级查询。
    • DCL(数据控制语言):GRANT, REVOKE(权限管理)。
    • TCL(事务控制语言):COMMIT, ROLLBACK(事务管理)。

1.5 SQL基本语法

① SQL语句可以单行或多行书写,以分号结尾。

代码语言:mysql
复制
select * from students;

② 可使用空格和缩进来增强语句的可读性

代码语言:mysql
复制
select
  *
from students;

③ MySQL数据库的SQL语句不区分大小写,关键字建议使用大写

代码语言:mysql
复制
SELECT * FROM user;
等价于
select * from user; 

1.6 SQL规范

  1. SQL语句不区分大小写,建议SQL关键字大写,表名和列表小写
  2. 命令用分号结尾
  3. 命令可以缩进和换行,一种类型的关键字放在一行
  4. 可以写单行和多行注释 , #和--是单行注释,/***/多行注释

2. MySQL

1、MySQL介绍

MySQL是一个关系型数据库管理系统,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件,它是由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品,MySQL 是最流行的关系型数据库管理系统中的一个。

2、MySQL的特点

MySQL是开源的,所以你不需要支付额外的费用。

MySQL支持大型的数据库。可以处理拥有上千万条记录的大型数据库。

MySQL使用标准的SQL数据语言形式。

MySQL可以安装在不同的操作系统,并且提供多种编程语言的操作接口。这些编程语言包括C、C++、Python、Java、Ruby等等。

3、MySQL版本

  • MySQL Community Server:社区版本,开源免费,但不提供官方技术支持。==
  • MySQL Enterprise Edition:企业版本,需付费,可以试用30天。
  • MySQL Cluster:集群版,开源免费。可将几个MySQL Server封装成一个Server。
  • MySQL Cluster CGE:高级集群版,需付费。
  • MySQL Workbench(GUITOOL):一款专为MySQL设计的ER/数据库建模工具。它是著名的数据库设计工具DBDesigner4的继任者。MySQL Workbench又分为两个版本,分别是社区版(MySQL Workbench OSS)、商用版(MySQL WorkbenchSE)。

我使用MySQL8.0版本, MySQL Community Server进行学习。 通过docker安装的mysql

4、通过docker安装mysql

docker-compose.mysql.yml

代码语言:yaml
复制
services:
 # 名为 mysql 的服务
  mysql:
  # 使用官方 MySQL 镜像 mysql:8.3.0
    image: mysql:8.3.0
    command:
     # 设置默认身份验证插件为 mysql_native_password
      --default-authentication-plugin=mysql_native_password
      #设置服务器默认字符集为 utf8mb4
      --character-set-server=utf8mb4
      #设置默认排序规则为 utf8mb4_general_ci
      --collation-server=utf8mb4_general_ci
    environment:
      # 设置 MySQL root 用户的密码为
      - MYSQL_ROOT_PASSWORD='密码'
      # 设置表名是否区分大小写: 需确保应用代码中的表名与数据库中的大小写完全一致
      - MYSQL_LOWER_CASE_TABLE_NAMES=0
    ports:
      - "3306:3306"
    volumes:
      - ./data/mysql:/var/lib/mysql

连接

代码语言:bash
复制
# 进入 MySQL 容器的命令行(b-express-mysql-1 容器名称)
docker exec -it b-express-mysql-1 bash
# 在容器内使用 MySQL 客户端(root角色) 
#-p 表示登录时使用的密码。
#-u 表示以哪个用户身份登录 MySQL
 mysql -u root -p
# 使用 --password= 参数
mysql -u root --password=’密码‘

5. MySQL的组成结构

一个MySQL DBMS可以同时存放多个数据库,理论上一个项目就对应一个数据库。如博客项目blog数据库、商城项目shop数据库、微信项目wechat数据库。

一个数据库中还可以同时包含多个数据表,而数据表才是真正用于存放数据的位置。(类似我们Office软件中的Excel表格),理论上一个功能就对应一个数据表。如博客系统中的用户管理功能,就需要一个user数据表、博客中的文章就需要一个article数据表、博客中的评论就需要一个message数据表。

一个数据表又可以拆分为多个字段,每个字段就是一个属性。

一个数据表除了字段以外,还有很多行,每一行都是一条完整的数据(记录)。

3. DDL操作

3.1 数据库的基本操作

1. 创建数据库
代码语言:mysql
复制
# 基本语法: api_development
mysql> create database 数据库名称 [设置编码格式];

# 创建api_development库
mysql>create database api_development;

# 创建api_development库并指定默认字符集
mysql>create database api_development default charset gbk;


/**
   # 设置默认身份验证插件为 mysql_native_password
      --default-authentication-plugin=mysql_native_password
      #设置服务器默认字符集为 utf8mb4
      --character-set-server=utf8mb4
      
     
**/

#  安装mysql 设置了默认的字符集为 utf8mb4

编码格式

代码语言:mysql
复制
# 查看数据库编码格式
mysql> SHOW CREATE DATABASE api_development;
+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Database        | Create Database                                                                                                                           |
+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| api_development | CREATE DATABASE `api_development` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

/**
  编码格式,常见的gbk(中国的编码格式)与utf8(国际通用编码格式)
  国内汉字无法通过256个字符进行描述,所以国内开发了自己的编码格式gb2312,升级gbk
  支持多国语言,标准化组织开发了一套通用编码utf8,后来5.6版本以后又进行了升级utf8mb4
**/
2. 查看数据库
代码语言:mysql
复制
# 语法
mysql> show databases;
3. 删除数据库
代码语言:mysql
复制
# 语法
mysql> drop database 数据库名称;

# 删除api_development数据库
mysql> drop database api_development;
4. 选择数据库
代码语言:mysql
复制
# 语法
mysql> use  数据库名称;

# 选择api_development数据库
mysql>use api_development;
# 查看正在使用的数据库(8.0以后版本需要基于select查询来获取当前数据库)
mysql> select database();

3.2 数据表的基本操作

1.数据表的创建
代码语言:mysql
复制
# 基本语法
mysql> create table 数据表名称(
	字段1 字段类型 [字段约束],
	字段2 字段类型 [字段约束],
	...
); 

# 创建一个user_table用户表,拥有3个字段(编号、用户名称、用户密码)
mysql> create table user_table(
	id tinyint,
    username varchar(255),
    password char(255)
) engine=innodb default charset=utf8mb4;

#  ENGINE=InnoDB 指定表的存储引擎为 InnoDB(支持事务、行级锁、外键等)
#  default charset=utf8mb4 	设置表的默认字符集为 utf8mb4
2. 查询已创建数据表
代码语言:mysql
复制
# 显示所有数据表(当前数据库)
mysql> show tables;

#语法
# 显示数据表的创建过程(编码格式、字段等信息)
mysql> desc 数据表名称;
# 查看user
desc user_table;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int          | NO   | PRI | NULL    | auto_increment |
| username | varchar(255) | YES  |     | NULL    |                |
| password | char(255)    | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
3. 修改数据表信息
1. 数据表字段添加
代码语言:mysql
复制
# 语法

mysql> alter table 数据表名称 add 新字段名称 字段类型 first|after 其他字段名称;
’/**选项说明:
first:把新添加字段放在第一位
after 字段名称:把新添加字段放在指定字段的后面
**/
#  user_table表中添加一个addtime字段,类型为date(年-月-日),添加到username字段后面
mysql> alter table user_table add addtime date after addtime;

mysql> desc user_table;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int          | NO   | PRI | NULL    | auto_increment |
| username | varchar(255) | YES  |     | NULL    |                |
| addtime  | date         | YES  |     | NULL    |                |
| password | char(255)    | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
4 rows in set (0.02 sec)
2. 修改字段名称或字段类型
代码语言:mysql
复制
# 修改名称和字段类型
# user_table表 username 类型 varchar(255)改成 varchar(40);且名称username改为name
mysql> alter table user_table change username   user varchar(40);

mysql> desc user_table;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int         | NO   | PRI | NULL    | auto_increment |
| user     | varchar(40) | YES  |     | NULL    |                |
| addtime  | date        | YES  |     | NULL    |                |
| password | char(255)   | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.02 sec)
3. 删除某个字段
代码语言:mysql
复制
# 基本语法
mysql> alter table user_table drop 字段名称;

# 删除 addtime
mysql> alter table user_table drop addtime;
4 .修改数据表名称
代码语言:mysql
复制
rename table 旧名称 to 新名称;

3.3 字段类型详解

1. 整数类型

分类

类型名称

说明

==tinyint==

很小的整数

-128 ~ 127

smallint

小的整数

-32768 ~ 32767

mediumint

中等大小的整数

-8388608 ~ 8388607

==int(integer)==

普通大小的整数

-2147483648 ~ 2147483647

整数类型的选择,看数字范围!

unsigned无符号型,只有正数,没有负数情况,tinyint unsigned,表示范围0-255

2. 浮点类型(带小数点数据类型)

浮点类型(精度失真情况)和定点类型(推荐使用定点类型)

分类

类型名称

float

单精度浮点数

double

双精度浮点数

==decimal(m,d)==

定点数,decimal(10,3)

decimal(10,2) :代表这个数的总长度为10 = 整数长度 + 小数长度,3代表保留3位小数

3. 日期类型

分类

类型名称

year

YYYY 1901~2155

==time==

HH:MM:SS -838:59:59~838:59:59

==date==

YYYY-MM-DD 1000-01-01~9999-12-3

==datetime==

YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59

timestamp

YYYY-MM-DD HH:MM:SS 1970~01~01 00:00:01 UTC~2038-01-19 03:14:07UTC

日期时间类型的选择主要看格式!

4. 文本类型

类型名称

说明

==char(m)==

m为0~255之间的整数定长(固定长度)

==varchar(m)==

m为0~65535之间的整数变长(变化长度)

==text==

允许长度0~65535字节

mediumtext

允许长度0~167772150字节

longtext

允许长度0~4294967295字节

255个字符以内,固定长度使用char(字符长度),变化长度使用varchar(字符长度)

假设:有一个数据,一共有5个字符,char(11),实际占用11个字符,相同长度数据,char类型查询要比varchar要快一些;变化长度varchar(11),实际占用5个字符长度。

超过255个字符,选择text文本类型!

ENUMSET:字符串对象类型

类型

描述

示例

ENUM

只能存储预定义值中的一个(单选)。

ENUM('男', '女', '未知')

SET

可以存储预定义值中的多个(多选,最多 64 个值)。

SET('阅读', '音乐', '运动')

5. 二进制大对象类型

类型

最大容量

典型用途

TINYBLOB

255 字节

小图标、短二进制数据

BLOB

65,535 字节

图片、文档

MEDIUMBLOB

16,777,215 字节

高清图片、视频片段

LONGBLOB

4,294,967,295 字节

大型文件(如 PDF、ISO 镜像)

4.DML数据操作语言

4.1. 数据的增删改

1. 数据的增加操作
代码语言:mysql
复制
# 基本语法: INSERT INTO 是 SQL 中用于向数据库表中插入数据的语句
mysql> insert into 数据表名称([字段1,字段2,字段3...]) values (字段1的值,字段2的值,字段3的值...);

特别注意:在SQL语句中,除了数字,其他类型的值,都需要使用引号引起来,否则插入时会报错。

代码语言:mysql
复制
# 创建数据表
mysql> create table tb_user(
	id int,
	username varchar(20),
	age tinyint unsigned,
	gender enum('男','女','保密'),
	address varchar(255)
) engine=innodb default charset=utf8mb4;

#gender enum('','',''), 在cmd中可以无法显示中文
#   SET NAMES 'utf8mb4'; MySQL 客户端字符集设置

# 使用insert语句插入数据
mysql> insert into tb_user values (1,'张三',22,'男','武汉市');
mysql> insert into tb_user(id,username,age) values (2,'李四',44);

#批量插入多条数据
mysql> insert into tb_user values (3,'王五',19,'女','上海市浦东新区'),(4,'赵六',18,'女','北京'),(5,'孙七',26,'男','天津');
2 .数据的修改操作
代码语言:mysql
复制
# 基本语法 
mysql> update 数据表名称 set 字段1=更新后的值,字段2=更新后的值,... where 更新条件;
# 如果在更新数据时,不指定更新条件,则其会把这个数据表的所有记录全部更新一遍。


update tb_user set gender='保密',address='深圳市' where id=2;
3. 数据的删除操作
代码语言:sql
复制
# 基本语法 
mysql> delete from 数据表名称 [where 删除条件];
# 删除tb_user表中,id=1的用户信息
mysql> delete from tb_user where id=1;

# delete from与truncate清空数据表操作
mysql> delete from 数据表;
mysql> truncate 数据表;

delete from与truncate区别在哪里?

delete from与truncate区别在哪里?

  • delete:删除==数据记录==
    • 数据操作语言(DML)
    • 删除==大量==记录速度慢,==只删除数据,主键自增序列不清零==
    • 可以==带条件==删除
  • truncate:删除==所有数据记录==
    • 数据定义语言(DDL)
    • 清里大量数据==速度快==,==主键自增序列清零==
    • ==不能带条件删除==

5. SQL 约束

1.主键约束

  • PRIMARY KEY 约束唯一标识数据库表中的每条记录。
  • 主键必须包含唯一的值。
  • 主键列不能包含 NULL 值。
  • 每个表都应该有一个主键,并且每个表只能有一个主键。

主键的选择标准

  • 最少性 尽量选择单个键作为主键
  • 稳定性 ,由于主键是用来在两个表间建立联接的,所以不能经常更新,最好就不更新
代码语言:mysql
复制
# 创建数据表 主键约束
mysql> create table tb_user2(
	id int PRIMARY KEY, # 主键约束
	username varchar(20)
) engine=innodb default charset=utf8mb4;

# 删除主键约束:如需撤销 PRIMARY KEY 约束,请使用下面的 SQL
alter table tb_user2 drop primary key;

我们通常希望在每次插入新记录时,数据库自动生成字段的值。

代码语言:mysql
复制
# 创建数据表 auto_increment (自动增长列)
mysql> create table tb_user3(
	id int auto_increment PRIMARY KEY, # 主键约束
	username varchar(20)
) engine=innodb default charset=utf8mb4;

# 添加数据
insert into tb_user3  values(null,'张三'),(null,'李四');
insert into tb_user3(username) values('Bill','Gates');

2. 非空约束

  • NOT NULL 约束强制列不接受 NULL 值。
  • NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
代码语言:mysql
复制
# 创建数据表 非空约束 not null
mysql> create table tb_user3(
	id int, 
	username varchar(20) not null #  非空约束
) engine=innodb default charset=utf8mb4;

3. 唯一约束

  • UNIQUE 约束唯一标识数据库表中的每条记录。
  • UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
  • PRIMARY KEY 拥有自动定义的 UNIQUE 约束。

4 外键约束

外键约束(==多表==关联使用)

成绩表中的学生ID应该在学生表中是存在的 我们应该让成绩表中的ID只能引用学生表中的ID,它们的值应该是一一对应的,也就是说成绩表中的ID是成绩表中的外键,对应学生表的主键 ,这样就可以保证数据的引用完整性

  • 主表没有记录,子表中不能添加相应的记录
  • 修改和删除主表记录不能让子表记录孤立,必须相应修改和删除

5. 标识列

MySQL中的标识列(Identity Column),也称为自增列(Auto Increment Column),是一种特殊的列,它会在插入新行时自动为该列生成唯一的值。这个特性通常用于主键(Primary Key)列,以确保每行都有一个唯一的标识符。

MySQL中的标识列主要通过AUTO_INCREMENT属性来实现。它通常应用于整数类型的列(如INTBIGINT等)。

6. DQL数据查询语言

五子句查询

代码语言:mysql
复制
# select 查询
select * from 数据表 [where子句] [group by分组子句] [having子句] [order by子句] [limit子句];
# WHERE 子句过滤数据
① where子句
# GROUP BY 分组
② group by子句
# 筛选分组后的结果进行筛选的子句 它与 GROUP BY 子句配合使用,类似于 WHERE 子句
③ having子句
# ORDER BY 排序
④ order by子句
# LIMIT 限制结果
⑤ limit子句
注意:在以上5个子句中,五子句的顺序不能颠倒!

创建表

代码语言:mysql
复制
# 商品
CREATE TABLE product
(
    pid         INT PRIMARY KEY, #商品id
    pname       VARCHAR(20), #商品名称
    price       DOUBLE, # 价格
    category_id VARCHAR(32)# 分类
);

数据

代码语言:mysql
复制
INSERT INTO product VALUES (1,'联想电脑',5000,'电脑');
INSERT INTO product VALUES (2,'苹果电脑',9000,'电脑');
INSERT INTO product VALUES (3,'华为电脑',5000,'电脑');
INSERT INTO product VALUES (4,'小米汽车',70000,'汽车');
INSERT INTO product VALUES (5,'BYD汽车',60000,'汽车');
INSERT INTO product VALUES (6,'长城汽车',44000,'汽车');
INSERT INTO product VALUES (7,'安踏鞋',200,'鞋');
INSERT INTO product VALUES (8,'李宁鞋',600,'鞋');
INSERT INTO product VALUES (9,'NINK鞋',800,'鞋');
INSERT INTO product VALUES (10,'白象方便面',15,'方便面');
INSERT INTO product VALUES (11,'娃哈哈纯净水',2,'水');
INSERT INTO product VALUES (12,'特步鞋',100,'鞋');
INSERT INTO product VALUES (13,'怡宝纯净水',1,'水');
INSERT INTO product VALUES (14,'康师傅方便面',1,'方便面');
INSERT INTO product VALUES (15,'三太子方便面',1,'方便面');

1. select查询

代码语言:mysql
复制
# 1.查询所有的商品.  
select * from product;
# 2.查询商品名和商品价格. 
select pname,price from product;
# 3.查询结果是表达式(运算查询):将所有商品的价格+10元进行显示.
select pname,price+10 from product;

2 .条件查询

2.1 SQL运算符
1. 算术运算符

运算符

说明

加运算,求两个数或表达式相加的和,如1+1

减少减运算,求两个数或表达式相减的差,如4-1

乘运算,求两个数或表达式相乘的积,如2*2

/

除运算,求两个数或表达式相除的商,如6/4的值为1

%

取模运算,求两个数或表达式相除的余数,如:6%4的值为2

2. 逻辑运算符

运算符

说明

AND

当且仅当两个布尔表达式都为true时,返回TRUE

OR

当且仅当两个布尔表达式都为false,返回FALSE

NOT

布尔表达式的值取反

3. 比较运算符

运算符

说明

=

等于

大于

<

小于

<>

不等于

=

大于等于

<=

小于等于

!=

不等于

2.2 比较查询
代码语言:mysql
复制
# 查询商品名称为“苹果电脑”的商品所有信息:
SELECT * FROM product WHERE pname = '苹果电脑';

# 查询价格不是9000的所有商品
SELECT * FROM product WHERE price != 9000;
SELECT * FROM product WHERE price <> 9000;

# 查询商品价格小于等于800元的所有商品信息
SELECT * FROM product WHERE price <= 800;
2.3 范围查询
代码语言:mysql
复制
# 查询商品价格在1000到10000之间所有商品
SELECT * FROM product WHERE price BETWEEN 1000 AND 10000;
# 查询商品价格是200或5000的所有商品
SELECT * FROM product WHERE price IN (200,5000);
2.4 逻辑查询
代码语言:mysql
复制
# 查询商品价格在200到1000之间所有商品
SELECT * FROM product WHERE price >= 200 AND price <=1000;
# 查询商品价格是200或800的所有商品
SELECT * FROM product WHERE price = 200 OR price = 800;
# 查询价格不是800的所有商品
SELECT * FROM product WHERE NOT(price = 800);
2.5模糊查询
代码语言:mysql
复制
# 查询以'小'开头的所有商品
SELECT * FROM product WHERE pname LIKE '小%';
# 查询第二个字为'想'的所有商品
SELECT * FROM product WHERE pname LIKE '_想%';

3. 排序查询

代码语言:mysql
复制
# 通过order by语句,可以将查询出的结果进行排序。暂时放置在select语句的最后。
格式:SELECT * FROM 表名 ORDER BY 排序字段 ASC|DESC;
ASC 升序 (默认)
DESC 降序

# 1.使用价格排序(降序)
SELECT * FROM product ORDER BY price DESC;
# 2.在价格排序(降序)的基础上,以分类排序(降序)
SELECT * FROM product ORDER BY price DESC,category_id DESC;

4 聚合查询

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;==另外聚合函数会忽略空值==。

聚合函数

作用

count()

统计指定列不为NULL的记录行数;

sum()

计算指定列的数值和,如果指定列类型不是数值类型,则计算结果为0

max()

计算指定列的最大值,如果指定列是字符串类型,使用字符串排序运算;

min()

计算指定列的最小值,如果指定列是字符串类型,使用字符串排序运算;

avg()

计算指定列的平均值,如果指定列类型不是数值类型,则计算结果为0

代码语言:mysql
复制
# 1、查询商品的总条数
SELECT COUNT(*) FROM product;
# 2、查询价格大于200商品的总条数
SELECT COUNT(*) FROM product WHERE price > 200;
# 3、查询分类为'电脑'的所有商品的总和
SELECT SUM(price) FROM product WHERE category_id = '电脑';
# 4、查询分类为'汽车'所有商品的平均价格
SELECT AVG(price) FROM product WHERE categrory_id = '汽车';
# 5、查询商品的最大价格和最小价格
SELECT MAX(price),MIN(price) FROM product;

5. 分组查询与having子句

1.分组查询介绍

分组查询就是将查询结果按照指定字段进行分组,字段中数据相等的分为一组。

代码语言:mysql
复制
#基本语法
GROUP BY 列名 [HAVING 条件表达式] [WITH ROLLUP]
  • 列名: 是指按照指定字段的值进行分组。
  • HAVING 条件表达式: 用来过滤分组后的数据。
  • WITH ROLLUP:在所有记录的最后加上一条记录,显示select查询时聚合函数的统计和计算结果
2. group by的使用

group by可用于单个字段分组,也可用于多个字段分组

代码语言:mysql
复制
-- 根据gender字段来分组
select category_id from product group by category_id;
mysql> select category_id from product group by category_id;
#
+-------------+
| category_id |
+-------------+
| 电脑      |
| 汽车      |
| 鞋         |
| 方便面   |
| 水         |
+-------------+
5 rows in set (0.00 sec)

-- 根据pname和category_id字段进行分组
select pname, category_id from product group by pname, category_id;
  • group by可以实现去重操作
  • group by的作用是为了实现分组统计(group by + 聚合函数)
3. group by + 聚合函数的使用
代码语言:mysql
复制
-- 统计不同类型商品的平均价格
select category_id,avg(price) from product group by category_id;
+-------------+--------------------+
| category_id | avg(price)         |
+-------------+--------------------+
| 电脑      |  6333.333333333333 |
| 汽车      |              58000 |
| 鞋         |                425 |
| 方便面   | 12.333333333333334 |
| 水         |                2.5 |
+-------------+--------------------+

-- 统计不同类型商品的个数
select category_id,count(*) from product group by category_id;
+-------------+----------+
| category_id | count(*) |
+-------------+----------+
| 电脑      |        3 |
| 汽车      |        3 |
| 鞋         |        4 |
| 方便面   |        3 |
| 水         |        2 |
+-------------+----------+
5 rows in set (0.00 sec)
4.group by + having的使用
代码语言:mysql
复制
# 统计各个分类商品的个数,且只显示个数大于1的信息
SELECT category_id ,COUNT(*) FROM product GROUP BY category_id HAVING COUNT(*) > 1;

+-------------+----------+
| category_id | COUNT(*) |
+-------------+----------+
| 电脑      |        3 |
| 汽车      |        3 |
| 鞋         |        4 |
| 方便面   |        3 |
| 水         |        2 |
+-------------+----------+
6. limit分页查询
代码语言:mysql
复制
SELECT 字段1,字段2... FROM 表名 LIMIT M,N
M: 整数,表示从第几条索引开始,计算方式 (当前页-1)*每页显示条数
N: 整数,表示查询多少条数据
SELECT 字段1,字段2... FROM 表名 LIMIT 0,5
SELECT 字段1,字段2... FROM 表名 LIMIT 5,5
# 从零开始
SELECT* FROM product LIMIT 0,5;
#从5开始
SELECT* FROM product LIMIT 5,5;

+-----+-----------------+-------+-------------+
| pid | pname           | price | category_id |
+-----+-----------------+-------+-------------+
|   6 | 长城汽车    | 44000 | 汽车      |
|   7 | 安踏鞋       |   200 | 鞋         |
|   8 | 李宁鞋       |   600 | 鞋         |
|   9 | NINK鞋         |   800 | 鞋         |
|  10 | 白象方便面 |    15 | 方便面   |
+-----+-----------------+-------+-------------+

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MySQL基础(一)
    • 1. 数据库概述
      • 1.1 数据库介绍
      • 1.2 数据库分类
      • 1.3 数据库管理系统
      • 1.4 SQL是什么(Structured Query Language)
      • 1.5 SQL基本语法
      • 1.6 SQL规范
    • 2. MySQL
      • 1、MySQL介绍
      • 2、MySQL的特点
      • 3、MySQL版本
      • 4、通过docker安装mysql
      • 5. MySQL的组成结构
    • 3. DDL操作
      • 3.1 数据库的基本操作
      • 3.2 数据表的基本操作
      • 3.3 字段类型详解
    • 4.DML数据操作语言
      • 4.1. 数据的增删改
    • 5. SQL 约束
      • 1.主键约束
      • 2. 非空约束
      • 3. 唯一约束
      • 4 外键约束
      • 5. 标识列
    • 6. DQL数据查询语言
      • 1. select查询
      • 2 .条件查询
      • 3. 排序查询
      • 4 聚合查询
      • 5. 分组查询与having子句
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档