MySQL基础(一)

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语句可以单行或多行书写,以分号结尾。

select * from students;

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

select
  *
from students;

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

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


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

连接

# 进入 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. 创建数据库
# 基本语法: 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> 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> show databases;
3. 删除数据库
# 语法
mysql> drop database 数据库名称;

# 删除api_development数据库
mysql> drop database api_development;
4. 选择数据库
# 语法
mysql> use  数据库名称;

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

3.2 数据表的基本操作

1.数据表的创建
# 基本语法
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> 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> 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. 修改字段名称或字段类型
# 修改名称和字段类型
# 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> alter table user_table drop 字段名称;

# 删除 addtime
mysql> alter table user_table drop addtime;
4 .修改数据表名称
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. 日期类型
分类类型名称
yearYYYY 1901~2155
timeHH:MM:SS -838:59:59~838:59:59
dateYYYY-MM-DD 1000-01-01~9999-12-3
datetimeYYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59
timestampYYYY-MM-DD HH:MM:SS 19700101 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. 二进制大对象类型
类型最大容量典型用途
TINYBLOB255 字节小图标、短二进制数据
BLOB65,535 字节图片、文档
MEDIUMBLOB16,777,215 字节高清图片、视频片段
LONGBLOB4,294,967,295 字节大型文件(如 PDF、ISO 镜像)

4.DML数据操作语言

4.1. 数据的增删改

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

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

# 创建数据表
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> update 数据表名称 set 字段1=更新后的值,字段2=更新后的值,... where 更新条件;
# 如果在更新数据时,不指定更新条件,则其会把这个数据表的所有记录全部更新一遍。


update tb_user set gender='保密',address='深圳市' where id=2;
3. 数据的删除操作
# 基本语法 
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> 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;

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

# 创建数据表 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 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
# 创建数据表 非空约束 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数据查询语言

五子句查询

# 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个子句中,五子句的顺序不能颠倒!

创建表

# 商品
CREATE TABLE product
(
    pid         INT PRIMARY KEY, #商品id
    pname       VARCHAR(20), #商品名称
    price       DOUBLE, # 价格
    category_id VARCHAR(32)# 分类
);

数据

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查询

# 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 比较查询
# 查询商品名称为“苹果电脑”的商品所有信息:
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 范围查询
# 查询商品价格在1000到10000之间所有商品
SELECT * FROM product WHERE price BETWEEN 1000 AND 10000;
# 查询商品价格是200或5000的所有商品
SELECT * FROM product WHERE price IN (200,5000);
2.4 逻辑查询
# 查询商品价格在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模糊查询
# 查询以'小'开头的所有商品
SELECT * FROM product WHERE pname LIKE '小%';
# 查询第二个字为'想'的所有商品
SELECT * FROM product WHERE pname LIKE '_想%';

3. 排序查询

# 通过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
# 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.分组查询介绍

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

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

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

-- 根据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 + 聚合函数的使用
-- 统计不同类型商品的平均价格
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的使用
# 统计各个分类商品的个数,且只显示个数大于1的信息
SELECT category_id ,COUNT(*) FROM product GROUP BY category_id HAVING COUNT(*) > 1;

+-------------+----------+
| category_id | COUNT(*) |
+-------------+----------+
| 电脑      |        3 |
| 汽车      |        3 |
| 鞋         |        4 |
| 方便面   |        3 |
| 水         |        2 |
+-------------+----------+
6. limit分页查询
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 | 方便面   |
+-----+-----------------+-------+-------------+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值