如何做网站seo优化,wordpress author template,做视频怎样传到网站,宁波四方网络网站建设文章目录 1 数据库概述2 MySQL概述2.1 MySQL安装2.1.1 解压添加环境变量2.1.2 初始化MySQL2.1.3 注册MySQL服务2.1.4 启动MySQL服务2.1.5 修改默认账户密码2.1.6 登录MySQL 2.2 卸载MySQL2.3 连接服务器上部署的数据库2.4 数据模型2.5 SQL简介2.5.1 SQL通用语法2.3.2 分类… 文章目录 1 数据库概述2 MySQL概述2.1 MySQL安装2.1.1 解压添加环境变量2.1.2 初始化MySQL2.1.3 注册MySQL服务2.1.4 启动MySQL服务2.1.5 修改默认账户密码2.1.6 登录MySQL 2.2 卸载MySQL2.3 连接服务器上部署的数据库2.4 数据模型2.5 SQL简介2.5.1 SQL通用语法2.3.2 分类 3 数据库设计-DDL3.1 数据库的项目开发流程3.2 数据库操作3.2.1 查询数据库3.2.2 创建数据库3.2.3 使用数据库2.2.4 删除数据库 3.3 图形化工具3.4 表操作3.4.1 创建3.4.2 查询3.4.3 修改 4 数据库操作-DML4.1 增加(insert) 4.2 修改(update)4.3 删除(delete) 5 数据库操作-DQL5.1 语法5.2 基本查询不带任何条件5.3 条件查询where5.4 分组查询group by5.4.1 聚合函数5.4.2 分组查询 5.5 排序查询order by5.6 分页查询limit 6 多表设计6.1 外键约束6.2 一对多6.3 一对一6.4 多对多 7 多表查询7.1 分类7.2 内连接7.3 外连接7.4 子查询7.4.1 介绍7.4.2 标量子查询7.4.3 列子查询7.4.4 行子查询7.4.5 表子查询 7.5 相关案例及代码 8 事物8.1 介绍8.2 操作8.3 四大特性 9 索引9.1 介绍9.2 结构9.3 语法 1 数据库概述 数据库英文为 DataBase简称DB它是存储和管理数据的仓库。 数据库管理系统DataBase Management System (DBMS)操纵和管理数据库的大型软件。 SQLStructured Query Language简称SQL结构化查询语言它是操作关系型数据库的编程语言定义了一套操作关系型数据库的统一标准。 关系型数据库RDBMS建立在关系模型基础上由多张相互连接的二维表组成的数据库。而所谓二维表指的是由行和列组成的表如下图 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J6yz7641-1692540509322)(E:\javaweb\笔记\day06\img\图1.png)] 二维表的优点 使用表存储数据格式统一便于维护 使用SQL语言操作标准统一使用方便可用于复杂查询
2 MySQL概述
2.1 MySQL安装
官网下载地址
2.1.1 解压添加环境变量
首先解压对应的安装包到对应的文件夹目录下然后配置环境变量到path中 如何验证是否添加成功 右键开始菜单(就是屏幕左下角)选择命令提示符(管理员)或者搜索cmd一定要以管理员身份打开)打开黑框敲入mysql回车。 如果提示Cant connect to MySQL server on localhost则证明添加成功 如果提示mysql不是内部或外部命令也不是可运行的程序或批处理文件则表示添加添加失败请重新检查步骤并重试。 2.1.2 初始化MySQL
以管理员身份运行命令行窗口 在刚才的命令行中输入如下的指令
mysqld --initialize-insecure2.1.3 注册MySQL服务
命令行注意必须以管理员身份启动中输入如下的指令回车执行
mysqld -install2.1.4 启动MySQL服务
在黑框里敲入net start mysql回车。
net start mysql // 启动mysql服务net stop mysql // 停止mysql服务2.1.5 修改默认账户密码
在黑框里敲入mysqladmin -u root password 1234这里的1234就是指默认管理员(即root账户)的密码可以自行修改成你喜欢的。
mysqladmin -u root password 12342.1.6 登录MySQL
右键开始菜单选择命令提示符打开黑框。 在黑框中输入mysql -uroot -p回车出现下图且左下角为password然后正确输入密码则登录成功。
退出mysql
exit
quit登陆参数
mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1) -P端口号(默认3306)2.2 卸载MySQL
以管理员身份打开命令提示符窗口
敲入net stop mysql回车。
net stop mysql再敲入mysqld -remove mysql回车。
mysqld -remove mysql最后删除MySQL目录及相关的环境变量。
至此MySQL卸载完成
2.3 连接服务器上部署的数据库
mysql -u用户名 -p密码 [-h数据库服务器的IP地址 -P端口号]2.4 数据模型
MySQL是关系型数据库是基于二维表进行数据存储的具体的结构图下:
通过MySQL客户端连接数据库管理系统DBMS然后通过DBMS操作数据库使用MySQL客户端向数据库管理系统发送一条SQL语句由数据库管理系统根据SQL语句指令去操作数据库中的表结构及数据一个数据库服务器中可以创建多个数据库一个数据库中也可以包含多张表而一张表中又可以包含多行记录。 在Mysql数据库服务器当中存储数据需要 先去创建数据库可以创建多个数据库之间是相互独立的在数据库下再去创建数据表一个数据库下可以创建多张表再将数据存放在数据表中一张表可以存储多行数据 2.5 SQL简介
2.5.1 SQL通用语法
SQL语句可以单行或多行书写以分号结尾。SQL语句可以使用空格/缩进来增强语句的可读性。MySQL数据库的SQL语句不区分大小写。注释 单行注释-- 注释内容 或 # 注释内容多行注释 /* 注释内容 */
2.3.2 分类
SQL语句根据其功能被分为四大类DDL、DML、DQL、DCL
分类全称说明DDLData Definition Language数据定义语言用来定义数据库对象(数据库表字段)DMLData Manipulation Language数据操作语言用来对数据库表中的数据进行增删改DQLData Query Language数据查询语言用来查询数据库中表的记录DCLData Control Language数据控制语言用来创建数据库用户、控制数据库的访问权限
3 数据库设计-DDL
3.1 数据库的项目开发流程
在项目开发中针对于数据库来说主要包括三个阶段
数据库设计阶段 参照页面原型以及需求文档设计数据库表结构 数据库操作阶段 根据业务功能的实现编写SQL语句对数据表中的数据进行增删改查操作 数据库优化阶段 通过数据库的优化来提高数据库的访问性能。优化手段索引、SQL优化、分库分表等
3.2 数据库操作
DDL中数据库的常见操作查询、创建、使用、删除。
3.2.1 查询数据库
查询所有数据库
show databases;查询当前数据库
select database();我们要操作某一个数据库必须要切换到对应的数据库中。 通过指令select database() 就可以查询到当前所处的数据库
3.2.2 创建数据库
语法
//这里包括下面的方括号里面的代码都是可选的
create database [ if not exists ] 数据库名;注意在同一个数据库服务器中不能创建两个名称相同的数据库否则将会报错, 故我们在这里假如了盼盼当不存在数据库名的时候才创建对应的数据库
3.2.3 使用数据库
语法
use 数据库名 ;我们要操作某一个数据库下的表时就需要通过该指令切换到对应的数据库下否则不能操作。 2.2.4 删除数据库
语法
drop database [ if exists ] 数据库名 ;如果删除一个不存在的数据库将会报错。 可以加上参数 if exists 如果数据库存在再执行删除否则不执行删除。 3.3 图形化工具
在命令行当中来敲这些SQL语句很不方便主要的原因有以下 3 点
没有任何代码提示。全靠记忆容易敲错字母造成执行报错操作繁琐影响开发效率。所有的功能操作都是通过SQL语句来完成的编写过的SQL代码无法保存。
在项目开发当中通常为了提高开发效率都会借助于现成的图形化管理工具来操作数据库。 目前MySQL主流的图形化界面工具有以下几种
SQLyogNavicatDataGripIDEA
DataGrip是JetBrains旗下的一款数据库管理工具是管理和开发MySQL、Oracle、PostgreSQL的理想解决方案。
官网链接
3.4 表操作
关于表结构的操作也是包含四个部分创建表、查询表、修改表、删除表。工作中一般都是直接基于图形化界面操作。
3.4.1 创建
语法
create table 表名(字段1 字段1类型 [约束] [comment 字段1注释 ],字段2 字段2类型 [约束] [comment 字段2注释 ],......字段n 字段n类型 [约束] [comment 字段n注释 ]
) [ comment 表注释 ] ;注意 [ ] 中的内容为可选参数 最后一个字段后面没有逗号 约束
概念所谓约束就是作用在表中字段上的规则用于限制存储在表中的数据。
作用就是来保证数据库当中数据的正确性、有效性和完整性。后面的学习会验证这些
在MySQL数据库当中提供了以下5种约束
约束描述关键字非空约束限制该字段值不能为nullnot null唯一约束保证字段的所有数据都是唯一、不重复的unique主键约束主键是一行数据的唯一标识要求非空且唯一primary key默认约束保存数据时如果未指定该字段值则采用默认值default外键约束让两张表的数据建立连接保证数据的一致性和完整性foreign key 注意约束是作用于表中字段上的可以在创建表/修改表的时候添加约束。 主键自增auto_increment 每次插入新的行记录时数据库自动生成字段(主键)下的值具有auto_increment的数据列是一个正数序列开始增长(从1开始自增) 数据类型
MySQL中的数据类型有很多主要分为三类数值类型、字符串类型、日期时间类型。
数值类型
类型大小有符号(SIGNED)范围无符号(UNSIGNED)范围描述TINYINT1byte(-128127)(0255)小整数值SMALLINT2bytes(-3276832767)(065535)大整数值MEDIUMINT3bytes(-83886088388607)(016777215)大整数值INT/INTEGER4bytes(-21474836482147483647)(04294967295)大整数值BIGINT8bytes(-263263-1)(02^64-1)极大整数值FLOAT4bytes(-3.402823466 E383.402823466351 E38)0 和 (1.175494351 E-383.402823466 E38)单精度浮点数值DOUBLE8bytes(-1.7976931348623157 E3081.7976931348623157 E308)0 和 (2.2250738585072014 E-3081.7976931348623157 E308)双精度浮点数值DECIMAL依赖于M(精度)和D(标度)的值依赖于M(精度)和D(标度)的值小数值(精确定点数)
字符串类型
类型大小描述CHAR0-255 bytes定长字符串(需要指定长度)VARCHAR0-65535 bytes变长字符串(需要指定长度)TINYBLOB0-255 bytes不超过255个字符的二进制数据TINYTEXT0-255 bytes短文本字符串BLOB0-65 535 bytes二进制形式的长文本数据TEXT0-65 535 bytes长文本数据MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据MEDIUMTEXT0-16 777 215 bytes中等长度文本数据LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据LONGTEXT0-4 294 967 295 bytes极大文本数据
日期时间类型
类型大小范围格式描述DATE31000-01-01 至 9999-12-31YYYY-MM-DD日期值TIME3-838:59:59 至 838:59:59HH:MM:SS时间值或持续时间YEAR11901 至 2155YYYY年份值DATETIME81000-01-01 00:00:00 至 9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值TIMESTAMP41970-01-01 00:00:01 至 2038-01-19 03:14:07YYYY-MM-DD HH:MM:SS混合日期和时间值时间戳
3.4.2 查询
查询当前数据库所有表
show tables;查看指定表结构
desc 表名 ;#可以查看指定表的字段、字段的类型、是否可以为NULL、是否存在默认值等信息查询指定表的建表语句
show create table 表名 ;3.4.3 修改
删除表语法
drop table [ if exists ] 表名;if exists 只有表名存在时才会删除该表表名不存在则不执行删除操作(如果不加该参数项删除一张不存在的表执行将会报错)。 4 数据库操作-DML
DML英文全称是Data Manipulation Language(数据操作语言)用来对数据库中表的数据记录进行增、删、改操作。
添加数据INSERT修改数据UPDATE删除数据DELETE
4.1 增加(insert)
insert语法
向指定字段添加数据 insert into 表名 (字段名1, 字段名2) values (值1, 值2);全部字段添加数据 insert into 表名 values (值1, 值2, ...);批量添加数据指定字段 insert into 表名 (字段名1, 字段名2) values (值1, 值2), (值1, 值2);批量添加数据全部字段 insert into 表名 values (值1, 值2, ...), (值1, 值2, ...);Insert操作的注意事项 插入数据时指定的字段顺序需要与值的顺序是一一对应的。 字符串和日期型数据应该包含在引号中。 插入的数据大小应该在字段的规定范围内。
4.2 修改(update)
update语法
update 表名 set 字段名1 值1 , 字段名2 值2 , .... [where 条件] ;注意事项: 修改语句的条件可以有也可以没有如果没有条件则会修改整张表的所有数据。 在修改数据时一般需要同时修改公共字段update_time将其修改为当前操作时间。 4.3 删除(delete)
delete语法
delete from 表名 [where 条件] ;注意事项: • DELETE 语句的条件可以有也可以没有如果没有条件则会删除整张表的所有数据。 • DELETE 语句不能删除某一个字段的值(可以使用UPDATE将该字段值置为NULL即可)。 • 当进行删除全部数据操作时会提示询问是否确认删除所有数据直接点击Execute即可。 5 数据库操作-DQL
DQL英文全称是Data Query Language(数据查询语言)用来查询数据库表中的记录。
查询关键字SELECT
5.1 语法
DQL查询语句语法结构如下
SELECT字段列表
FROM表名列表
WHERE条件列表
GROUP BY分组字段列表
HAVING分组后条件列表
ORDER BY排序字段列表
LIMIT分页参数5.2 基本查询不带任何条件
在基本查询的DQL语句中不带任何的查询条件语法如下 查询多个字段 select 字段1, 字段2, 字段3 from 表名;查询所有字段通配符 select * from 表名;*号代表查询所有字段在实际开发中尽量少用不直观、影响效率 设置别名 select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ] from 表名;去除重复记录 select distinct 字段列表 from 表名;5.3 条件查询where
语法
select 字段列表 from 表名 where 条件列表 ; -- 条件列表意味着可以有多个条件学习条件查询就是学习条件的构建方式而在SQL语句当中构造条件的运算符分为两类
比较运算符逻辑运算符
常用的比较运算符如下:
比较运算符功能大于大于等于小于小于等于等于 或 !不等于between … and …在某个范围之内(含最小、最大值)in(…)在in之后的列表中的值多选一like 占位符模糊匹配(_匹配单个字符, %匹配任意个字符)is null是null
常用的逻辑运算符如下:
逻辑运算符功能and 或 并且 (多个条件同时成立)or 或 ||或者 (多个条件任意一个成立)not 或 !非 , 不是
5.4 分组查询group by
5.4.1 聚合函数
之前我们做的查询都是横向查询就是根据条件一行一行的进行判断而使用聚合函数查询就是纵向查询它是对一列的值进行计算然后返回一个结果值。将一列数据作为一个整体进行纵向计算
语法
select 聚合函数(字段列表) from 表名 ;注意 : 聚合函数会忽略空值对NULL值不作为统计。 常用聚合函数
函数功能count统计数量max最大值min最小值avg平均值sum求和 count 按照列去统计有多少行数据。 在根据指定的列统计的时候如果这一列中有null的行该行不会被统计在其中。 sum 计算指定列的数值和如果不是数值类型那么计算结果为0 max 计算指定列的最大值 min 计算指定列的最小值 avg 计算指定列的平均值 5.4.2 分组查询
分组 按照某一列或者某几列把相同的数据进行合并输出。 分组其实就是按列进行分类(指定列下相同的数据归为一类)然后可以对分类完的数据进行合并计算。 分组查询通常会使用聚合函数进行计算。 语法
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];5.5 排序查询order by
排序在日常开发中是非常常见的一个操作有升序排序也有降序排序。
语法
select 字段列表
from 表名
[where 条件列表]
[group by 分组字段 ]
order by 字段1 排序方式1 , 字段2 排序方式2 … ;排序方式 ASC 升序默认值 DESC降序
5.6 分页查询limit
分页查询语法
select 字段列表 from 表名 limit 起始索引, 查询记录数 ;6 多表设计
项目开发中在进行数据库表结构设计时会根据业务需求及业务模块之间的关系分析并设计表结构由于业务之间相互关联所以各个表结构之间也存在着各种联系基本上分为三种 一对多(多对一) 多对多 一对一
而在实际开发中基于图形化界面会更加便捷这里就不对如何操作图形化界面做过多赘述
6.1 外键约束
外键约束让两张表的数据建立连接保证数据的一致性和完整性。
对应的关键字foreign key 外键约束的语法
-- 创建表时指定
create table 表名(字段名 数据类型,...[constraint] [外键名称] foreign key (外键字段名) references 主表 (主表列名)
);-- 建完表后添加外键
alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主表列名);当我们添加外键约束时我们得保证当前数据库表中的数据是完整的。
外键约束foreign key保证了数据的完整性和一致性。
物理外键和逻辑外键 物理外键 概念使用foreign key定义外键关联另外一张表。缺点 影响增、删、改的效率需要检查外键关系。仅用于单节点数据库不适用与分布式、集群场景。容易引发数据库的死锁问题消耗性能。 逻辑外键 概念在业务层逻辑中解决外键关联。通过逻辑外键就可以很方便的解决上述问题。 在现在的企业开发中很少会使用物理外键都是使用逻辑外键。 甚至在一些数据库开发规范中会明确指出禁止使用物理外键 foreign key 6.2 一对多 一对多关系实现在数据库表中多的一方添加字段来关联属于一这方的主键。 6.3 一对一
一对一关系表在实际开发中应用起来比较简单通常是用来做单表的拆分也就是将一张大表拆分成两张小表将大表中的一些基础字段放在一张表当中将其他的字段放在另外一张表当中以此来提高数据的操作效率。
应用场景举例 如果在业务系统当中对用户的基本信息查询频率特别的高但是对于用户的身份信息查询频率很低此时出于提高查询效率的考虑我就可以将这张大表拆分成两张小表第一张表存放的是用户的基本信息而第二张表存放的就是用户的身份信息。他们两者之间一对一的关系一个用户只能对应一个身份证而一个身份证也只能关联一个用户。 一对一 在任意一方加入外键关联另外一方的主键并且设置外键为唯一的(UNIQUE)
6.4 多对多
多对多的关系在开发中属于也比较常见的。比如学生和老师的关系一个学生可以有多个授课老师一个授课老师也可以有多个学生。在比如学生和课程的关系一个学生可以选修多门课程一个课程也可以供多个学生选修。
7 多表查询
7.1 分类
多表查询查询时从多张表中获取所需数据 单表查询的SQL语句select 字段列表 from 表名; 那么要执行多表查询只需要使用逗号分隔多张表即可如 select 字段列表 from 表1, 表2; 笛卡尔积笛卡尔乘积是指在数学中两个集合(A集合和B集合)的所有组合情况。 在多表查询时需要消除无效的笛卡尔积只保留表关联部分的数据 在SQL语句中如何去除无效的笛卡尔积呢只需要给多表查询加上连接查询的条件即可。 多表查询可以分为 连接查询 内连接相当于查询A、B交集部分数据 外连接 左外连接查询左表所有数据(包括两张表交集部分数据) 右外连接查询右表所有数据(包括两张表交集部分数据) 子查询
7.2 内连接
内连接查询查询两表或多表中交集部分数据。
内连接从语法上可以分为 隐式内连接 显式内连接
隐式内连接语法
select 字段列表 from 表1 , 表2 where 条件 ... ;显式内连接语法
select 字段列表 from 表1 [ inner ] join 表2 on 连接条件 ... ;多表查询时给表起别名
tableA as 别名1 , tableB as 别名2 ;tableA 别名1 , tableB 别名2 ;注意事项: 一旦为表起了别名就不能再使用表名来指定对应的字段了此时只能够使用别名来指定字段。 7.3 外连接
外连接分为两种左外连接 和 右外连接。
左外连接语法结构
select 字段列表 from 表1 left [ outer ] join 表2 on 连接条件 ... ;左外连接相当于查询表1(左表)的所有数据当然也包含表1和表2交集部分的数据。 右外连接语法结构
select 字段列表 from 表1 right [ outer ] join 表2 on 连接条件 ... ;右外连接相当于查询表2(右表)的所有数据当然也包含表1和表2交集部分的数据。 注意事项
左外连接和右外连接是可以相互替换的只需要调整连接查询时SQL语句中表的先后顺序就可以了。而我们在日常开发使用时更偏向于左外连接。
7.4 子查询
7.4.1 介绍
SQL语句中嵌套select语句称为嵌套查询又称子查询。
SELECT * FROM t1 WHERE column1 ( SELECT column1 FROM t2 ... );子查询外部的语句可以是insert / update / delete / select 的任何一个最常见的是 select。 根据子查询结果的不同分为 标量子查询子查询结果为单个值[一行一列] 列子查询子查询结果为一列但可以是多行 行子查询子查询结果为一行但可以是多列 表子查询子查询结果为多行多列[相当于子查询结果是一张表]
子查询可以书写的位置
where之后from之后select之后
7.4.2 标量子查询
子查询返回的结果是单个值(数字、字符串、日期等)最简单的形式这种子查询称为标量子查询。
常用的操作符
7.4.3 列子查询
子查询返回的结果是一列(可以是多行)这种子查询称为列子查询。
常用的操作符
操作符描述IN在指定的集合范围之内多选一NOT IN不在指定的集合范围之内
7.4.4 行子查询
子查询返回的结果是一行(可以是多列)这种子查询称为行子查询。
常用的操作符 、 、IN 、NOT IN
7.4.5 表子查询
子查询返回的结果是多行多列常作为临时表这种子查询称为表子查询。
7.5 相关案例及代码
-- 部门管理//数据准备
create table tb_dept
(id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not null unique comment 部门名称,create_time datetime not null comment 创建时间,update_time datetime not null comment 修改时间
) comment 部门表;insert into tb_dept (id, name, create_time, update_time)
values (1, 学工部, now(), now()),(2, 教研部, now(), now()),(3, 咨询部, now(), now()),(4, 就业部, now(), now()),(5, 人事部, now(), now());-- 员工管理
create table tb_emp
(id int unsigned primary key auto_increment comment ID,username varchar(20) not null unique comment 用户名,password varchar(32) default 123456 comment 密码,name varchar(10) not null comment 姓名,gender tinyint unsigned not null comment 性别, 说明: 1 男, 2 女,image varchar(300) comment 图像,job tinyint unsigned comment 职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师,entrydate date comment 入职时间,dept_id int unsigned comment 部门ID,create_time datetime not null comment 创建时间,update_time datetime not null comment 修改时间
) comment 员工表;INSERT INTO tb_emp
(id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)
VALUES (1, jinyong, 123456, 金庸, 1, 1.jpg, 4, 2000-01-01, 2, now(), now()),(2, zhangwuji, 123456, 张无忌, 1, 2.jpg, 2, 2015-01-01, 2, now(), now()),(3, yangxiao, 123456, 杨逍, 1, 3.jpg, 2, 2008-05-01, 2, now(), now()),(4, weiyixiao, 123456, 韦一笑, 1, 4.jpg, 2, 2007-01-01, 2, now(), now()),(5, changyuchun, 123456, 常遇春, 1, 5.jpg, 2, 2012-12-05, 2, now(), now()),(6, xiaozhao, 123456, 小昭, 2, 6.jpg, 3, 2013-09-05, 1, now(), now()),(7, jixiaofu, 123456, 纪晓芙, 2, 7.jpg, 1, 2005-08-01, 1, now(), now()),(8, zhouzhiruo, 123456, 周芷若, 2, 8.jpg, 1, 2014-11-09, 1, now(), now()),(9, dingminjun, 123456, 丁敏君, 2, 9.jpg, 1, 2011-03-11, 1, now(), now()),(10, zhaomin, 123456, 赵敏, 2, 10.jpg, 1, 2013-09-05, 1, now(), now()),(11, luzhangke, 123456, 鹿杖客, 1, 11.jpg, 5, 2007-02-01, 3, now(), now()),(12, hebiweng, 123456, 鹤笔翁, 1, 12.jpg, 5, 2008-08-18, 3, now(), now()),(13, fangdongbai, 123456, 方东白, 1, 13.jpg, 5, 2012-11-01, 3, now(), now()),(14, zhangsanfeng, 123456, 张三丰, 1, 14.jpg, 2, 2002-08-01, 2, now(), now()),(15, yulianzhou, 123456, 俞莲舟, 1, 15.jpg, 2, 2011-05-01, 2, now(), now()),(16, songyuanqiao, 123456, 宋远桥, 1, 16.jpg, 2, 2007-01-01, 2, now(), now()),(17, chenyouliang, 123456, 陈友谅, 1, 17.jpg, NULL, 2015-03-21, NULL, now(), now());--
-- 多表查询
select *
from tb_emp,tb_dept
where tb_emp.dept_id tb_dept.id;-- 内连接
-- 查询员工的姓名及所属部门的名称
-- 隐式内连接实现
# select 字段列表 from 表1 表二 where 条件
select tb_emp.name 姓名, tb_dept.name 部门
from tb_emp,tb_dept
where tb_emp.dept_id tb_dept.id;-- 显式内连接实现
# select 字段列表 from 表1 [inner] join 表2 on 连接条件
select tb_emp.name 姓名, tb_dept.name 部门
from tb_deptinner join tb_emp on dept_id tb_dept.id;select tb_emp.name 姓名, tb_dept.name 部门
from tb_deptjoin tb_emp on dept_id tb_dept.id;-- 给表起别名
select e.name 姓名, d.name 部门
from tb_dept d,tb_emp e
where e.dept_id d.id;-- 外连接
-- 查询部门所有员工的姓名和对应的部门名称左外连接
-- select 字段列表 from 表1 left [outer] join 表2 on 连接条件
select e.name 姓名, d.name 部门名称
from tb_emp eleft outer join tb_dept d on e.dept_id d.id;-- 右外连接实现
select e.name 姓名, d.name 部门名称
from tb_dept dright outer join tb_emp e on e.dept_id d.id;-- 查询部门表所有部门所对应的员工名称右外连接
-- select 字段列表 from 表1 right [outer] join 表2 on 连接条件
select e.name 员工姓名, d.name 部门名称
from tb_emp eright outer join tb_dept d on e.dept_id d.id;-- 左外连接实现
select e.name 员工姓名, d.name 部门名称
from tb_dept dleft outer join tb_emp e on e.dept_id d.id;-- 子查询
-- 标量子查询
# 查询 教研部 所有员工的信息
# 1.查询教研部的id
select id
from tb_dept
where name 教研部;# 2.查询员工表的部门id为教研部的所有员工
select *
from tb_emp
where dept_id 2;# 合并在一起
select *
from tb_emp
where dept_id (select id from tb_dept where name 教研部);# 查询 方东白 入职之后的员工信息
# 1.查询 方东白 入职的时间
select entrydate
from tb_emp
where name 方东白;# 2.查询在这时间之后所有的员工的信息
select *
from tb_emp
where entrydate 2012-11-01;# 合并
select *
from tb_emp
where entrydate (select entrydate from tb_emp where name 方东白);-- 列子查询
-- 查询教研部和咨询部的所有员工信息
# 1.查询教研部和咨询部的id
select id
from tb_dept
where name in (教研部, 咨询部);# 2.查询对应id的所有员工的信息
select *
from tb_emp
where dept_id in (2, 3);# 合并
select *
from tb_emp
where dept_id in (select id from tb_dept where name in (教研部, 咨询部));-- 行子查询
# 查询和 韦一笑 入职日期和职位都相同的员工信息
# 1.查询 韦一笑 的入职日期和职位
select entrydate
from tb_emp
where name 韦一笑;
select job
from tb_emp
where name 韦一笑;
select entrydate, job
from tb_emp
where name 韦一笑;# 2.根据韦一笑的入职日期和职位在emp表中查询与其相同的员工的信息
select *
from tb_emp
where entrydate 2007-01-01and job 2;# 合并
select *
from tb_emp
where entrydate (select entrydate from tb_emp where name 韦一笑)and job (select jobfrom tb_empwhere name 韦一笑);# 优化
select *
from tb_emp
where (entrydate, job) (select entrydate, job from tb_emp where name 韦一笑);-- 表子查询
# 查询入职日期在2006-1-1之后的员工信息及其部门名称
# 查询入职日期在2006-1-1之后的所有员工
select *
from tb_emp
where entrydate 2006-1-1;# 根据他们的部门id查询其所对应的部门的名称
select e.*, d.name
from (select *from tb_empwhere entrydate 2006-1-1) eleft join tb_dept don e.dept_id d.id;-- 多表查询案列
-- 数据准备
-- 分类表
create table category
(id int unsigned primary key auto_increment comment 主键ID,name varchar(20) not null unique comment 分类名称,type tinyint unsigned not null comment 类型 1 菜品分类 2 套餐分类,sort tinyint unsigned not null comment 顺序,status tinyint unsigned not null default 0 comment 状态 0 禁用1 启用,create_time datetime not null comment 创建时间,update_time datetime not null comment 更新时间
) comment 分类;-- 菜品表
create table dish
(id int unsigned primary key auto_increment comment 主键ID,name varchar(20) not null unique comment 菜品名称,category_id int unsigned not null comment 菜品分类ID,price decimal(8, 2) not null comment 菜品价格,image varchar(300) not null comment 菜品图片,description varchar(200) comment 描述信息,status tinyint unsigned not null default 0 comment 状态, 0 停售 1 起售,create_time datetime not null comment 创建时间,update_time datetime not null comment 更新时间
) comment 菜品;-- 套餐表
create table setmeal
(id int unsigned primary key auto_increment comment 主键ID,name varchar(20) not null unique comment 套餐名称,category_id int unsigned not null comment 分类id,price decimal(8, 2) not null comment 套餐价格,image varchar(300) not null comment 图片,description varchar(200) comment 描述信息,status tinyint unsigned not null default 0 comment 状态 0:停用 1:启用,create_time datetime not null comment 创建时间,update_time datetime not null comment 更新时间
) comment 套餐;-- 套餐菜品关联表
create table setmeal_dish
(id int unsigned primary key auto_increment comment 主键ID,setmeal_id int unsigned not null comment 套餐id ,dish_id int unsigned not null comment 菜品id,copies tinyint unsigned not null comment 份数
) comment 套餐菜品中间表;-- 导入测试数据
-- category
insert into category (id, type, name, sort, status, create_time, update_time)
values (1, 1, 酒水饮料, 10, 1, 2022-08-09 22:09:18, 2022-08-09 22:09:18);
insert into category (id, type, name, sort, status, create_time, update_time)
values (2, 1, 传统主食, 9, 1, 2022-08-09 22:09:32, 2022-08-09 22:18:53);
insert into category (id, type, name, sort, status, create_time, update_time)
values (3, 2, 人气套餐, 12, 1, 2022-08-09 22:11:38, 2022-08-10 11:04:40);
insert into category (id, type, name, sort, status, create_time, update_time)
values (4, 2, 商务套餐, 13, 1, 2022-08-09 22:14:10, 2022-08-10 11:04:48);
insert into category (id, type, name, sort, status, create_time, update_time)
values (5, 1, 经典川菜, 6, 1, 2022-08-09 22:17:42, 2022-08-09 22:17:42);
insert into category (id, type, name, sort, status, create_time, update_time)
values (6, 1, 新鲜时蔬, 7, 1, 2022-08-09 22:18:12, 2022-08-09 22:18:28);
insert into category (id, type, name, sort, status, create_time, update_time)
values (7, 1, 汤类, 11, 1, 2022-08-10 10:51:47, 2022-08-10 10:51:47);-- dish
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (1, 王老吉, 1, 6.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/41bfcacf-7ad4-4927-8b26-df366553a94c.png, , 1,2022-06-09 22:40:47, 2022-06-09 22:40:47);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (2, 北冰洋, 1, 4.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/4451d4be-89a2-4939-9c69-3a87151cb979.png,还是小时候的味道, 1, 2022-06-10 09:18:49, 2022-06-10 09:18:49);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (3, 雪花啤酒, 1, 4.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/bf8cbfc1-04d2-40e8-9826-061ee41ab87c.png, , 1,2022-06-10 09:22:54, 2022-06-10 09:22:54);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (4, 米饭, 2, 2.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/76752350-2121-44d2-b477-10791c23a8ec.png, 精选五常大米, 1,2022-06-10 09:30:17, 2022-06-10 09:30:17);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (5, 馒头, 2, 1.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/475cc599-8661-4899-8f9e-121dd8ef7d02.png, 优质面粉, 1,2022-06-10 09:34:28, 2022-06-10 09:34:28);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (6, 老坛酸菜鱼, 5, 56.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/4a9cefba-6a74-467e-9fde-6e687ea725d7.png,原料汤草鱼酸菜, 1, 2022-06-10 09:40:51, 2022-06-10 09:40:51);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (7, 经典酸菜鮰鱼, 5, 66.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/5260ff39-986c-4a97-8850-2ec8c7583efc.png,原料酸菜江团鮰鱼, 1, 2022-06-10 09:46:02, 2022-06-10 09:46:02);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (8, 蜀味水煮草鱼, 5, 38.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/a6953d5a-4c18-4b30-9319-4926ee77261f.png, 原料草鱼汤, 1,2022-06-10 09:48:37, 2022-06-10 09:48:37);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (9, 清炒小油菜, 6, 18.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/3613d38e-5614-41c2-90ed-ff175bf50716.png, 原料小油菜, 1,2022-06-10 09:51:46, 2022-06-10 09:51:46);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (10, 蒜蓉娃娃菜, 6, 18.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/4879ed66-3860-4b28-ba14-306ac025fdec.png, 原料蒜娃娃菜,1, 2022-06-10 09:53:37, 2022-06-10 09:53:37);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (11, 清炒西兰花, 6, 18.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/e9ec4ba4-4b22-4fc8-9be0-4946e6aeb937.png, 原料西兰花, 1,2022-06-10 09:55:44, 2022-06-10 09:55:44);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (12, 炝炒圆白菜, 6, 18.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/22f59feb-0d44-430e-a6cd-6a49f27453ca.png, 原料圆白菜, 1,2022-06-10 09:58:35, 2022-06-10 09:58:35);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (13, 清蒸鲈鱼, 5, 98.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/c18b5c67-3b71-466c-a75a-e63c6449f21c.png, 原料鲈鱼, 1,2022-06-10 10:12:28, 2022-06-10 10:12:28);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (14, 东坡肘子, 5, 138.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/a80a4b8c-c93e-4f43-ac8a-856b0d5cc451.png, 原料猪肘棒, 1,2022-06-10 10:24:03, 2022-06-10 10:24:03);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (15, 梅菜扣肉, 5, 58.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/6080b118-e30a-4577-aab4-45042e3f88be.png, 原料猪肉梅菜,1, 2022-06-10 10:26:03, 2022-06-10 10:26:03);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (16, 剁椒鱼头, 5, 66.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/13da832f-ef2c-484d-8370-5934a1045a06.png, 原料鲢鱼剁椒,1, 2022-06-10 10:28:54, 2022-06-10 10:28:54);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (17, 馋嘴牛蛙, 5, 98.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/7a55b845-1f2b-41fa-9486-76d187ee9ee1.png,配料鲜活牛蛙丝瓜黄豆芽, 1, 2022-06-10 10:37:52, 2022-06-10 10:37:52);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (18, 鸡蛋汤, 7, 4.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/c09a0ee8-9d19-428d-81b9-746221824113.png, 配料鸡蛋紫菜,1, 2022-06-10 10:54:25, 2022-06-10 10:54:25);
insert into dish (id, name, category_id, price, image, description, status, create_time, update_time)
values (19, 平菇豆腐汤, 7, 6.00,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/16d0a3d6-2253-4cfc-9b49-bf7bd9eb2ad2.png, 配料豆腐平菇,1, 2022-06-10 10:55:02, 2022-06-10 10:55:02);-- setmeal
insert into setmeal (id, category_id, name, price, status, description, image, create_time, update_time)
values (1, 4, 商务套餐A, 20.00, 1, ,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/21a5ed3a-97f6-447a-af9d-53deabfb5661.png,2022-06-10 10:58:09, 2022-06-10 10:58:09);
insert into setmeal (id, category_id, name, price, status, description, image, create_time, update_time)
values (2, 4, 商务套餐B, 22.00, 1, ,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/8d0075f8-9008-4390-94ca-2ca631440304.png,2022-06-10 11:00:13, 2022-06-10 11:11:37);
insert into setmeal (id, category_id, name, price, status, description, image, create_time, update_time)
values (3, 3, 人气套餐A, 49.00, 1, ,https://reggie-itcast.oss-cn-beijing.aliyuncs.com/8979566b-0e17-462b-81d8-8dbace4138f4.png,2022-06-10 11:11:23, 2022-06-10 11:11:23);-- setmeal_dish
insert into setmeal_dish (id, setmeal_id, dish_id, copies)
values (1, 1, 1, 1);
insert into setmeal_dish (id, setmeal_id, dish_id, copies)
values (2, 1, 4, 1);
insert into setmeal_dish (id, setmeal_id, dish_id, copies)
values (3, 1, 11, 1);
insert into setmeal_dish (id, setmeal_id, dish_id, copies)
values (4, 2, 2, 1);
insert into setmeal_dish (id, setmeal_id, dish_id, copies)
values (5, 2, 4, 1);
insert into setmeal_dish (id, setmeal_id, dish_id, copies)
values (6, 2, 9, 1);
insert into setmeal_dish (id, setmeal_id, dish_id, copies)
values (7, 3, 2, 1);
insert into setmeal_dish (id, setmeal_id, dish_id, copies)
values (8, 3, 6, 1);
insert into setmeal_dish (id, setmeal_id, dish_id, copies)
values (9, 3, 5, 1);-- 需求
-- 1.查询价格低于10元的菜品的名称、价格、及其菜品的分类名称
/*菜品表dish(name, price, category_id) 分类表id, name)*/# a.查询价格低于10元的菜品的名称、价格、及其菜品的分类id
select name, price, category_id
from dish
where price 10;# 根据菜品的分类id得到对应的菜品分类名称
select d.name 菜品, d.price 价格, c.name 菜品分类
from (select name, price, category_id from dish where price 10) d,category c
where d.category_id c.id;select d.name 菜品, d.price 价格, c.name 菜品分类
from dish d,category c
where d.price 10and d.category_id c.id;-- 2.查询所有价格在10元包含到50元包含之间且状态为起售的菜品
-- 展示出菜品的名称、价格、及其菜品的分类名称即使没有菜品分类也要将菜品查询
/*菜品表dish(price, status) 展示name, price, category_id分类表name即使没有菜品分类也要将菜品查询: dish 在左边*/
# a.查询符合条件的所有的菜品
select *
from dish
where price between 10 and 50and status 1;# b.根据菜品的分类id查询对应的分类名称并显示数据
select d.name 菜品, d.price 价格, c.name 菜品分类
from (select * from dish where price between 10 and 50 and status 1) djoin category c on d.category_id c.id;select d.name 菜品, d.price 价格, c.name 菜品分类
from dish dleft join category c on d.category_id c.id
where d.price between 10 and 50and d.status 1;-- 3.查询每个分类下最贵的菜品展示出分类的名称最贵的菜品的价格
/*分类表category(id, name)菜品表dish(price)*/
# a.菜单栏所有的菜品按分类分组
select category_id
from dish
group by category_id;# b.按照菜品分组找到对应分组里面价格最贵的价格
select category_id, max(price) maxPrice
from dish
group by category_id
having max(price);# c.根据菜品id去找到对应的菜品的名称
select c.name 菜品分类, d.maxPrice 最大价格
from (select category_id, max(price) maxPrice from dish group by category_id having max(price)) d,category c
where d.category_id c.id;select c.name 菜品分类, max(d.price) 最大价格
from dish d,category c
where d.category_id c.id
group by c.name;-- 4.查询各个分类下 菜品状态为起售并且该分类下菜品数量大于等于3 的分类名称。
/*品数量大于等于3说明是一个套餐菜品状态为起售套餐的状态*/
# a.查询setmeal中菜品状态为起售的菜品
select *
from setmeal
where status 1;# b.setmeal_dish:分组统计copies
select setmeal_id
from setmeal_dish
group by setmeal_id
having sum(copies) 3;# c.根据对应的id显示分类的名称
select name
from setmeal
where id in (select setmeal_idfrom setmeal_dishgroup by setmeal_idhaving sum(copies) 3)and status 1;select c.name 菜品分类, count(*) 菜品数量
from category c,dish d
where c.id d.category_idand c.status 1
group by c.name
having count(*) 3;-- 5.查询 商务套餐A 中包含了哪些菜品展示出套餐名称价格包含的菜品名称价格份数
# a.在套餐表中找到 商务套餐A 的id
select id, name, price
from setmeal
where name 商务套餐A;# b.在套餐菜品关系表setmeal-dish中找到对应setmeal_id为1的菜品的id,份数
select a.*, copies, dish_id
from setmeal_dish,(select id, name, pricefrom setmealwhere name 商务套餐A) a
where setmeal_id a.id;# 根据对应的dish_id查找对应菜品的名称价格
select b.name 套餐名称, b.price 套餐价格, c.name 菜品名称, c.price 菜品价格, b.copies 菜品份数
from (select a.*, copies, dish_idfrom setmeal_dish,(select id, name, pricefrom setmealwhere name 商务套餐A) awhere setmeal_id a.id) b,dish c
where c.id in (b.dish_id);select s.name 套餐名称, s.price 套餐价格, d.name 菜品名称, d.price 菜品价格, sd.copies 菜品份数
from dish d,setmeal_dish sd,setmeal s
where d.id sd.dish_idand s.id sd.setmeal_idand s.name 商务套餐A;-- 6.查询出低于菜品平均价格的菜品信息展示出菜品名称菜品价格
/*菜品表dish(name, price) avg(pricae)*/
# a.查询出菜品的平均价格
select avg(price)
from dish;# b.查询出低于菜品平均价格的所有的菜品信息并展示
select name, price
from dish
where price (select avg(price) from dish);8 事物
8.1 介绍
在实际的业务开发中有些业务操作要多次访问数据库。一个业务要发送多条SQL语句给数据库执行。需要将多次访问数据库的操作视为一个整体来执行要么所有的SQL语句全部执行成功。如果其中有一条SQL语句失败就进行事务的回滚所有的SQL语句全部执行失败。
简而言之事务是一组操作的集合它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求即这些操作要么同时成功要么同时失败。
事务作用保证在一个事务中多次操作数据库表中数据时要么全都成功,要么全都失败。
8.2 操作
MYSQL中有两种方式进行事务的操作
自动提交事务即执行一条sql语句提交一次事务。默认MySQL的事务是自动提交手动提交事务先开启再提交
事务操作有关的SQL语句
SQL语句描述start transaction; / begin ;开启手动控制事务commit;提交事务rollback;回滚事务 手动提交事务使用步骤 第1种情况开启事务 执行SQL语句 成功 提交事务第2种情况开启事务 执行SQL语句 失败 回滚事务 8.3 四大特性
面试题事务有哪些特性
原子性Atomicity事务是不可分割的最小单元要么全部成功要么全部失败。一致性Consistency事务完成时必须使所有的数据都保持一致状态。隔离性Isolation数据库系统提供的隔离机制保证事务在不受外部并发操作影响的独立环境下运行。持久性Durability事务一旦提交或回滚它对数据库中的数据的改变就是永久的。 事务的四大特性简称为ACID 原子性Atomicity 原子性是指事务包装的一组sql是一个不可分割的工作单元事务中的操作要么全部成功要么全部失败。 一致性Consistency一个事务完成之后数据都必须处于一致性状态。
如果事务成功的完成那么数据库的所有变化将生效。
如果事务执行出现错误那么数据库的所有变化将会被回滚(撤销)返回到原始状态。
隔离性Isolation多个用户并发的访问数据库时一个用户的事务不能被其他用户的事务干扰多个并发的事务之间要相互隔离。
一个事务的成功或者失败对于其他的事务是没有影响。
持久性Durability一个事务一旦被提交或回滚它对数据库的改变将是永久性的哪怕数据库发生异常重启之后数据亦然存在。
9 索引
9.1 介绍
索引(index)是帮助数据库高效获取数据的数据结构 。
简单来讲就是使用索引可以提高查询的效率。
优点
提高数据查询的效率降低数据库的IO成本。通过索引列对数据进行排序降低数据排序的成本降低CPU消耗。
缺点
索引会占用存储空间。索引大大提高了查询效率同时却也降低了insert、update、delete的效率。
9.2 结构
MySQL数据库支持的索引结构有很多如Hash索引、BTree索引、Full-Text索引等。
我们平常所说的索引如果没有特别指明都是指默认的 BTree 结构组织的索引。
BTree结构
每一个节点可以存储多个key有n个key就有n个指针节点分为叶子节点、非叶子节点 叶子节点就是最后一层子节点所有的数据都存储在叶子节点上非叶子节点不是树结构最下面的节点用于索引数据存储的的是key指针 为了提高范围查询效率叶子节点形成了一个双向链表便于数据的排序及区间范围查询 拓展 非叶子节点都是由key指针域组成的一个key占8字节一个指针占6字节而一个节点总共容量是16KB那么可以计算出一个节点可以存储的元素个数16*1024字节 / (86)1170个元素。 查看mysql索引节点大小show global status like ‘innodb_page_size’; – 节点大小16384 当根节点中可以存储1170个元素那么根据每个元素的地址值又会找到下面的子节点每个子节点也会存储1170个元素那么第二层即第二次IO的时候就会找到数据大概是1170*1170135W。也就是说BTree数据结构中只需要经历两次磁盘IO就可以找到135W条数据。 对于第二层每个元素有指针那么会找到第三层第三层由key数据组成假设key数据总大小是1KB而每个节点一共能存储16KB所以一个第三层一个节点大概可以存储16个元素(即16条记录)。那么结合第二层每个元素通过指针域找到第三层的节点第二层一共是135W个元素那么第三层总元素大小就是135W*16结果就是2000W的元素个数。 结合上述分析BTree有如下优点 千万条数据BTree可以控制在小于等于3的高度所有的数据都存储在叶子节点上并且底层已经实现了按照索引进行排序还可以支持范围查询叶子节点是一个双向链表支持从小到大或者从大到小查找 9.3 语法
创建索引
create [ unique ] index 索引名 on 表名 (字段名,... ) ;查看索引
show index from 表名;删除索引
drop index 索引名 on 表名;注意事项 主键字段在建表时会自动创建主键索引 添加唯一约束时数据库实际上会添加唯一索引