mysql 基础

一、字符串使用

VARCHAR用于存储可变长字符串,它比定长类型更节省空间,使用额外1或2个字节存储字符串长度。列长度小于255字节时,使用 1字节表示,否则使用2字节表示。 存储的内容超出设置的长度时,内容会被截断。

CHAR是定长的,根据定义的字符串长度分配足够的空间。 CHAR会根据需要使用空格进行填充方便比较。 CHAR适合存储很短的字符串,或者所有值都接近同一个长度。 CHAR存储的内容超出设置的长度时,内容同样会被截断。

尽量避免使用TEXT/BLOB类型,查询时会使用临时表,导致严重的性能开销。

二、日期类型

若要设置日期字段自动更新,通常是指设置一个TIMESTAMP或DATETIME类型的字段,在记录被创建或每次更新时自动填充当前时间。

1. 设置自动创建时间和自动更新时间

创建时间(CreatTime):

类型:TIMESTAMP 或 DATETIME

默认值:CURRENT_TIMESTAMP

sql 复制代码
-- 创建时设置时间字段 
 CREATE TABLE your_table (
       id INT PRIMARY KEY,
       content VARCHAR(255),
       creat_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
   );

-- 添加或修改创建时间字段
ALTER TABLE your_table
ADD COLUMN creat_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP;

2. 更新时间(UpdateTime)

类型:TIMESTAMP 或 DATETIME

默认值:CURRENT_TIMESTAMP,并开启ON UPDATE CURRENT_TIMESTAMP

sql 复制代码
   CREATE TABLE your_table (
       id INT PRIMARY KEY,
       content VARCHAR(255),
       update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
   );

-- 添加或修改更新时间字段
ALTER TABLE your_table
MODIFY COLUMN update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
   

三、distinct、count

distinct:过滤distinct后面跟着的字段,当每个字段都相同时,才过滤。

cout(*):返回满足条件的总记录数。

count(列):返回满足条件的列,但不统计列为null 的记录。

四、其他总结

1. 复合主键

复合主键的各个列的值组合起来必须是唯一的,不允许有两行记录在所有组成主键的列上具有相同的值组合。
当单个列无法唯一标识表中的记录时,就需要使用复合主键 。组成复合主键的每个列值都不能为NULL,因为NULL值不能参与唯一性判断。

sql 复制代码
     CREATE TABLE ExampleTable (
         column1 datatype,
         column2 datatype,
         PRIMARY KEY (column1, column2)  //设置复合主键
     );
     

复合主键是一种设计选择,用于处理那些单列无法满足唯一性要求的表结构,确保数据完整性的同时适应复杂的业务逻辑需求。

2. not null 与unique

NOT NULL 和 UNIQUE 是数据库表设计中用于约束列值的两个重要属性。

NOT NULL

含义 :NOT NULL 约束指示某列不能存储NULL值 ,即该列必须包含一个具体的值。

目的 :确保数据的完整性,避免遗漏重要信息。对于某些列,如果缺少值就没有意义或者不符合业务逻辑,这时就会使用NOT NULL约束。

应用 :经常用于关键数据如用户ID、订单日期等,这些列通常被认为是必须填写的。
UNIQUE

含义 :UNIQUE 约束要求该列中的所有值都是唯一的 ,不允许有重复的值出现。但是,UNIQUE约束允许有一个NULL值 ,因为NULL不与任何值(包括另一个NULL)相等。

目的防止输入重复数据,保证数据的唯一性, 适用于需要唯一标识但不一定是主键的列。

应用:常用于邮箱地址、用户名等需要确保不重复的字段。

比较

共同点: 两者都是为了提升数据的质量和完整性,限制数据的输入。

区别: N**OT NULL强调的是列不能缺少值,而UNIQUE强调的是列中的值不能重复。**一个列可以同时是NOT NULL和UNIQUE,这意味着它既不能为空,也不能有重复值。

在实际应用中,根据业务需求和数据完整性要求,可以灵活结合使用这两个约束条件。例如,一个用户的电子邮件地址可能需要同时设置为NOT NULL和UNIQUE,以确保每个用户都提供了且提供的邮件地址是唯一的。

3. 设置外键

MySQL中的外键(Foreign Key)是一种约束,用于建立两个表之间的关系,确保一个表中的数据与另一个表中的数据保持参照完整性。

定义与作用:

外键定义在一个表(从表或子表)上,引用另一个表(主表或父表)的主键或唯一键。

作用是维护两个表之间的数据一致性,确保当在从表中插入或更新记录时,相应的记录必须存在于主表中

在创建表时定义:

sql 复制代码
     CREATE TABLE ChildTable (
         child_id INT PRIMARY KEY,
         parent_id INT,
         FOREIGN KEY (parent_id) REFERENCES ParentTable(parent_id)
         -- 可选: ON DELETE CASCADE ON UPDATE CASCADE
     );
     

或者在表创建后添加:

sql 复制代码
     ALTER TABLE ChildTable
     ADD FOREIGN KEY (parent_id) REFERENCES ParentTable(parent_id);
     

级联操作:

ON DELETEON UPDATE 规定当主表中的记录被删除或更新时,从表中的相关记录如何响应。

CASCADE :从表中的相关记录也将被删除或更新。

SET NULL :从表中的外键字段被设置为NULL。

RESTRICT :如果子表中有匹配项,则拒绝删除或更新主表的记录。

NO ACTION :MySQL中与RESTRICT效果相同。

注意事项:

在设计数据库时,合理使用外键可以增强数据的一致性,但也可能影响插入、更新和删除操作的性能。

在一些高性能应用场景下,为了追求速度,可能会选择不使用外键约束,而是通过应用程序层面来维护这种关系。

4. 枚举

MySQL中的枚举类型(ENUM )是一种特殊的字符串数据类型,它允许你为一列定义预设的固定值集合,从而限制该列的输入只能是这些预设值之一。

定义枚举:gender列只能接受'male'、'female'或'other'这三个值。

sql 复制代码
   CREATE TABLE Users (
       id INT PRIMARY KEY,
       name VARCHAR(100),
       gender ENUM('male', 'female', 'other')
   );
   

插入数据:直接使用枚举列表中的字符串即可

sql 复制代码
   INSERT INTO Users (name, gender) VALUES ('Alice', 'female');
   

如果需要向枚举中添加或删除值 ,需要使用ALTER TABLE 命令,但要注意这可能会影响到已有的数据。如果删除了一个枚举选项,而表中已经有该值的记录,那么这些记录的该字段值会被自动置为空字符串('')。

注意事项:

枚举列表中的值按照定义顺序排列,并且每个值都有一个索引,第一个值索引为1,依此类推。这在使用ORDER BY时会有所体现。

更改枚举选项可能需要重新评估表中的数据,以避免非法值的问题。

枚举类型的修改可能会影响存储空间和查询性能,特别是在大型表中。

枚举不适合那些可能频繁变动的值集合。

5. 自增长 AUTO_INCREMENT

为表的某个字段设置自增长(AUTO_INCREMENT)属性可以让数据库自动为其生成唯一的数字标识符,通常用于作为主键。

sql 复制代码
   CREATE TABLE Orders (
       orderId INT AUTO_INCREMENT PRIMARY KEY,
       orderDate DATE,
       AUTO_INCREMENT = 1001; -- 设置起始值为1001
   );
   

默认情况下,自增长的起始值是1 ,并且每次增加1。也可以自定义起始值和增量。插入新记录后,可以使用**LAST_INSERT_ID()**函数获取最后自动生成的ID值。例如:

sql 复制代码
   INSERT INTO Users (username) VALUES ('Alice');
   SELECT LAST_INSERT_ID();
   

自增长特性主要由MySQL的存储引擎支持,如InnoDB和MyISAM。InnoDB 引擎从MySQL 5.1开始成为默认引擎,它支持事务处理和行级锁定,同时也支持自增长

注意事项:

自增长字段应尽量定义为整数类型,如INT、BIGINT等。

如果表中已有数据,且自增长字段不是最大值,新插入的记录可能会导致ID不连续。

在复制环境中,自增长ID的管理需要特别注意,以避免ID冲突。

五、索引

MySQL中的索引是用于加速数据检索的一种数据结构,它们通过减少必须检查的行数来提高查询性能。

1. 主键索引(Primary Key Index)

作用 :用于唯一标识表中的每一行记录,不允许有重复值和NULL值。

使用场景 :作为表的主键,确保数据的唯一性和组织数据的物理顺序(InnoDB引擎中为聚集索引 )。
2. 唯一索引(Unique Index)

作用 :保证索引列的值唯一,允许有一个NULL值

使用场景 :适合用于需要确保数据唯一性但不作为主键的列 ,如邮箱地址。
3. 普通索引(Index)

作用: 加快查询速度,无唯一性要求

使用场景: 适用于经常出现在WHERE子句中的列 ,以加速查询。
4. 全文索引(Full-text Index)

作用 :用于全文搜索,支持复杂的文本搜索操作,如模糊匹配、相关性排序。

使用场景 :适用于文本内容较多的列,如文章内容、评论等,进行全文搜索时。
5. 组合索引(Composite Index)或多列索引

作用 :基于多个列创建的索引,可以加速涉及这些列的查询。

使用场景: 当查询条件经常同时包含多个列时,可以显著提高查询效率。
6. 空间索引(Spatial Index)

作用 :针对空间数据类型 (如POINT、LINESTRING、POLYGON等)的索引,加速地理空间数据的查询。

使用场景 :地图应用、地理信息系统(GIS)等,需要进行空间位置查询或范围查询。
7. 覆盖索引(Covering Index)

概念:并非独立的索引类型,而是一种索引策略, 指查询所需的所有列都包含在索引中,无需回表查询。

作用: 进一步提升查询速度,减少磁盘I/O。

**使用场景:**当查询的字段全部位于索引中时,数据库可以直接从索引中读取数据,无需访问实际的数据行。

作用总结:

加速查询 :通过索引快速定位到数据,减少扫描全表的时间。

排序和分组 :索引可以辅助数据库进行排序和分组操作,提高效率。

确保唯一性: 主键和唯一索引可以防止插入重复数据。

选择使用场景时,需要根据数据的特性和查询模式来决定最适合的索引类型,同时也要注意索引会占用额外的存储空间,并可能影响插入、删除和更新操作的性能。因此,索引的设计需要权衡查询性能和维护成本。

相关推荐
云和数据.ChenGuang4 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys5 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi5 小时前
SQL注入的那些面试题总结
数据库·sql
建投数据6 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi7 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀7 小时前
Redis梳理
数据库·redis·缓存
独行soc7 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天7 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺7 小时前
分布式系统架构:服务容错
数据库·架构
独行soc8 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘