type
status
date
slug
summary
tags
category
icon
password
数据库相关概念
数据库:Database,简称DB。按照一定的数据结构来组织、存储和管理数据的仓库。
数据库管理系统:Database Management System,一种操纵和管理数据库的大型软件,用于创建、使用和维护数据库,简称DBMS。
- 关系型数据库(RDBMS)
- 使用表存储数据,格式统一,便于维护
- 使用SQL语句操作,标准统一,使用方便
- 数据存储在磁盘中,安全
关系型数据库,是建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
特点:
- 非关系型数据库(NoSQL)
- 数据结构灵活
- 伸缩性强
概念:Not-Only SQL,泛指非关系型数据库,是对关系型数据库的补充。
特点:
SQL:
- 结构化查询语言(Structured Query Language),简称SQL。
- 是一种操作关系型数据库的编程语言,定义了一套操作关系型数据库统一SQL标准 。
数据模型:
SQL基础
SQL通用语法
- SQL语句可以单行或多行书写,以分号结尾。
- SQL语句可以使用空格/缩进来增强语句的可读性。
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
- 注释: • 单行注释:-- 注释内容 或 # 注释内容(MySQL特有) • 多行注释: /* 注释内容 */
SQL分类
DDL
DDL-数据库操作(方括号框起来表示可选)
DDL-表操作-查询
前提是先通过use 数据库名;切换到对应的数据库下。
DDL-表操作-创建
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。
数值类型
类型 | 大小 | 有符号(SIGNED)范围 | 无符号(UNSIGNED)范围 | 描述 |
TINYINT | 1 byte | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 bytes | (-32768,32767) | (0,65535) | 大整数值 |
MEDIUMINT | 3 bytes | (-8388608,8388607) | (0,16777215) | 大整数值 |
INT或INTEGER | 4 bytes | (-2147483648,2147483647) | (0,4294967295) | 大整数值 |
BIGINT | 8 bytes | (-2^63,2^63-1) | (0,2^64-1) | 极大整数值 |
FLOAT | 4 bytes | (-3.402823466 E+38,3.402823466351 E+38) | 0 和 (1.175494351 E-38,3.402823466 E+38) | 单精度浮点数值 |
DOUBLE | 8 bytes | (-1.7976931348623157 E+308,1.7976931348623157 E+308) | 0 和 (2.2250738585072014 E-308,1.7976931348623157 E+308) | 双精度浮点数值 |
DECIMAL | 例如123.45 M是5,D是2 | 依赖于M(精度)和D(标度)的值 | 依赖于M(精度)和D(标度)的值 | 小数值(精确定点数) |
字符串类型
blob描述二进制数据(一般不用),text描述文本数据
类型 | 大小 | 描述 |
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过255个字符的二进制数据 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
在MySQL中,
CHAR
和VARCHAR
都是用来存储文本数据的数据类型,但它们之间有一些重要的区别:- 存储方式:
CHAR
:CHAR
类型以固定长度存储字符数据,无论实际数据长度是多少,它会占据指定的固定空间。例如,如果定义一个CHAR(10)
字段,并且存储的数据只有5个字符,MySQL仍会分配10个字符的存储空间。VARCHAR
:VARCHAR
类型以可变长度存储字符数据,只会占据实际数据长度所需的空间,不会浪费空间。因此,如果存储的数据只有5个字符,那么VARCHAR(10)
将只占用5个字符的存储空间。
- 存储效率:
CHAR
类型在存储固定长度的数据时可能会浪费存储空间,但在某些情况下,它可以比VARCHAR
更快,因为MySQL无需记录每个值的实际长度。VARCHAR
类型在存储可变长度的数据时更节省存储空间,但在某些情况下,由于需要额外的长度信息,可能会稍微慢一些。
最佳实践:
- 选择
CHAR
或VARCHAR
取决于你要存储的数据类型和使用场景。
- 使用
CHAR
: - 当你知道数据长度几乎是固定的,且很少变化时,使用
CHAR
可以提高存储效率。 - 例如,存储邮政编码、国家/地区代码等固定长度的标识符时,
CHAR
可能是一个不错的选择。
- 使用
VARCHAR
: - 当你的数据长度变化较大或者不确定时,使用
VARCHAR
可以节省存储空间。 - 例如,存储用户姓名、评论或文章内容等可变长度的文本数据时,
VARCHAR
通常更合适。
总之,选择
CHAR
还是VARCHAR
应该根据你的具体需求和数据特点来决定,权衡存储效率和空间节省的需求。日期类型
一般是DATE或者DATETIME用的比较多
类型 | 大小 | 范围 | 格式 | 描述 |
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:01 至 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值,时间戳 |
在创建数据库表时,有一些最佳实践和需要注意的地方可以帮助确保表的设计和性能都符合预期:
- 选择适当的数据类型:
- 使用最小的数据类型,以节省存储空间,例如使用
INT
而不是BIGINT
,如果数据范围允许。 - 使用合适的字符集和校对规则,确保支持所需的字符和语言。
- 使用主键:
- 为每个表定义一个主键,以确保数据的唯一性和快速检索。
- 考虑使用自增主键(如
AUTO_INCREMENT
)来简化主键管理。
- 创建索引:
- 对于经常用于查询条件的列,创建索引以提高检索性能。
- 注意不要过度索引,因为过多的索引可能会降低插入和更新性能。
- 避免NULL约束:
- 谨慎使用
NULL
,尽量避免在列上使用过多的NULL
约束。如果某列不需要存储空值,最好使用NOT NULL
约束。
- 规范化数据库:
- 使用规范化技术,将数据分解为多个相关表,以减少数据冗余,并维护数据的一致性。
- 但要注意,不要过度规范化,因为这可能导致复杂的查询和性能下降。
- 考虑表的命名规范:
- 使用有意义的、描述性的表名和列名,以便更容易理解和维护数据库结构。
- 遵循一致的命名约定,例如使用下划线或驼峰命名法。
- 设定默认值:
- 为列设置适当的默认值,以便在插入新行时提供默认数据。
- 这有助于确保数据的完整性,并简化插入操作。
- 审慎使用触发器和存储过程:
- 触发器和存储过程可以用于实现复杂的业务逻辑,但应慎重使用,因为它们可能会增加数据库复杂性。
- 定期维护和备份:
- 定期备份数据库以防止数据丢失,并定期执行数据库维护任务,如优化查询和清理无用数据。
- 安全性考虑:
- 谨慎处理敏感数据,使用适当的权限管理来保护数据。
- 避免在应用程序中直接构建SQL查询,以防止SQL注入攻击。
- 性能监控和调优:
- 定期监控数据库性能,识别潜在的性能问题,并进行必要的调优,如优化查询、添加索引等。
- 版本控制:
- 将数据库模式纳入版本控制系统,以便跟踪和管理表结构的变化。
DDL-表操作-修改
添加字段
修改字段
删除字段
修改表名
删除表
小结
DML
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增删改操作。
添加数据(INSERT)
修改数据(UPDATE)
删除数据(DELETE)
小结
DQL(重要)
DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。
查询关键字:SELECT
语法结构
基本查询
条件查询
聚合函数
- 将一列数据作为一个整体,进行纵向计算 。
- 常见的聚合函数:
- 语法:
分组查询
- 语法
- where和和having的区别
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
- 注意
- 执行顺序: where > 聚合函数 > having 。
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。 所以在分组之后一般查询字段列表是聚合函数,会对各个分组进行聚合函数处理
- 案例
排序查询
分页查询
- 语法
- 注意
- 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
- 第一页索引是0
执行顺序
可以通过别名去验证这个执行顺序,因为只有我在你执行之前定义了别名你才能使用
总结
DCL
DCL英文全称是data control language (数据控制语言),用来管理数据库数据库服务器用户 、控制数据库的访问权限。 有哪些用户、用户有哪些权限。
管理用户
权限控制
总结
函数
函数 是指一段可以直接被另一段程序调用的程序或代码。
字符串函数
MySQL中内置了很多字符串函数,常用的几个如下:
substring的索引值是从1开始的
数值函数
日期函数
日期 = “2021-10-11” 时间 = “23:22:11” 日期和时间 = “2021-10-11 23:22:11”
流程函数
案例
值判断和表达式判断两种写法形式不一样
小结
约束
唯一约束:表中任意两行在 指定列上都不允许有相同的值,允许空(NULL).一个表上可以放置多个唯一性约束
案例
外键约束
外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性
小结
多表查询
多表关系
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所
以各个表结构之间也存在着各种联系,基本上分为三种:
- 一对多(多对一)
- 多对多
- 一对一
多表查询
概述: 指从多张表中查询数据
笛卡尔积
笛卡尔乘积是指在数学中,两个集合A集合和B集合的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)
多表查询分类
连接查询
- 内连接:相当于查询A、B交集部分数据
inner这个关键词是可以省略的
- 外连接:
- 左外连接:查询左表所有数据,以及两张表交集部分数据
- 右外连接:查询右表所有数据,以及两张表交集部分数据
- 左外会用的比较多,因为无论是左外还是右外都是可以通过替换表名来交换使用的。
- 自连接:当前表与自身的连接查询,自连接必须使用表别名
联合查询
子查询
标量子查询
列子查询
行子查询
表子查询
总结
事务
事务的简介
事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。
事务操作
事务的四大特性(ACID)
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
并发事务问题
事务隔离级别
注意:事务隔离级别越高,数据越安全,但是性能越低。
总结
- 作者:coderma4k
- 链接:https://coderma4k.com//article/915be5dc-e74d-43cf-86a0-0d8df6f37d3a
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。