聊聊对Mysql的理解

目录

1、Sql介绍

1.1、SQL的分类

1.2、数据库的三大范式

1.3、数据表的约束

1.4、约束的添加与删除

2、核心特性

3、主要组件

4、数据结构原理

5、索引失效

6、常用问题

7、优势与局限


前言

MySQL是一个开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,现属于Oracle旗下产品。


1、Sql介绍

Structure Query Language(结构化查询语言)简称SQL。

1.1、SQL的分类

1、DDL(Data Definition Language) 数据定义语言

用来操作数据库、表、列等; 常用语句:CREATE、 ALTER、DROP。

2、DML(Data Manipulation Language) 数据操作语言

用来操作数据库中表里的数据;常用语句:INSERT、 UPDATE、 DELETE。

3、DCL(Data Control Language) 数据控制语言

用来操作访问权限和安全级别; 常用语句:GRANT、DENY。

4、DQL(Data Query Language) 数据查询语言

用来查询数据 常用语句:SELECT。''

1.2、数据库的三大范式

1、第一范式(1NF)

数据库表的每一列都是不可分割的基本数据线(每列的值具有原子性,不可再分割)。

2、第二范式(2NF)

在第一范式(1NF)的基础上,如果表是单主键,那么主键以外的列必须完全依赖于主键;如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分。

3、第三范式(3NF)

在第二范式的基础上建立起来的,即满足第三范式必须要先满足第二范式。第三范式(3NF)要求:表中的非主键列必须和主键直接相关而不能间接相关;(非主键列之间不能相关依赖)。

1.3、数据表的约束

  1. 主键约束 (PRIMARY KEY)
  • 唯一标识表中的每一行记录

  • 不允许 NULL 值

  • 一个表只能有一个主键

sql 复制代码
CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50)
);

-- 复合主键
CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id)
);
  1. 外键约束 (FOREIGN KEY)
  • 建立表与表之间的关系

  • 确保引用完整性

  • 被引用的列必须是主键或唯一键

sql 复制代码
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    user_id INT,
    order_date DATE,
    FOREIGN KEY (user_id) REFERENCES users(id)
);
  1. 唯一约束 (UNIQUE)
  • 确保列中的所有值都是唯一的

  • 允许 NULL 值(但只能有一个 NULL)

  • 一个表可以有多个 UNIQUE 约束

sql 复制代码
CREATE TABLE employees (
    id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE,
    phone VARCHAR(20) UNIQUE
);
  1. 非空约束 (NOT NULL)
  • 强制列不接受 NULL 值

  • 必须包含值

sql 复制代码
CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10,2) NOT NULL
);
  1. 默认约束 (DEFAULT)
  • 当插入数据时,如果没有提供值,则使用默认值
sql 复制代码
CREATE TABLE orders (
    id INT PRIMARY KEY,
    order_date DATE DEFAULT CURRENT_DATE,
    status VARCHAR(20) DEFAULT 'pending'
);
  1. 检查约束 (CHECK) - MySQL 8.0+
  • 限制列中值的范围

  • 确保数据满足特定条件

sql 复制代码
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INT CHECK (age >= 18),
    salary DECIMAL(10,2) CHECK (salary > 0)
);

1.4、约束的添加与删除

1.添加约束

sql 复制代码
-- 添加主键
ALTER TABLE students ADD PRIMARY KEY (id);

-- 添加外键
ALTER TABLE orders ADD CONSTRAINT fk_user
FOREIGN KEY (user_id) REFERENCES users(id);

-- 添加唯一约束
ALTER TABLE products ADD UNIQUE (product_code);

2.删除约束

sql 复制代码
-- 删除主键
ALTER TABLE students DROP PRIMARY KEY;

-- 删除外键
ALTER TABLE orders DROP FOREIGN KEY fk_user;

-- 删除唯一约束
ALTER TABLE products DROP INDEX product_code;

合理使用约束可以确保数据库数据的完整性和一致性,是数据库设计中的重要环节。


2、核心特性

  1. 开源免费:社区版可免费使用,有活跃的开源社区支持

  2. 跨平台:支持Windows、Linux、macOS等多种操作系统

  3. 高性能:优化过的存储引擎(InnoDB等)提供良好的读写性能

  4. 可扩展性:支持主从复制、分片等扩展方案

  5. 关系型数据库:基于表结构存储数据,支持SQL(结构化查询语言)

3、主要组件

  • 存储引擎:InnoDB(默认)、MyISAM、Memory等,各有适用场景

  • 查询优化器:分析SQL语句并生成高效执行计划

  • 连接池:管理数据库连接,提高并发性能

  • 日志系统:包括二进制日志、错误日志、慢查询日志等

4、数据结构原理

5、索引失效

持续更新

6、常用问题

1、count(*)和count(1)和count(列)区别

  1. COUNT(*)COUNT(1)在实际结果上完全相同。

  2. 它们的执行计划也完全一致。

  3. 在复杂查询和性能测试中表现相同。

  4. COUNT(列名)有明显区别,count(列)会忽略NULL值。

2、Delete和Truncate区别

TRUNCATE和DETELE都能实现删除表中的所有数据的功能。

但两者也是有区别的:

1、DELETE语句后可跟WHERE子句,可通过指定WHERE子句中的条件表达式只删除满足条件的部分记录;但是,TRUNCATE语句只能用于删除表中的所有记录。

2、使用TRUNCATE语句删除表中的数据后,再次向表中添加记录时自动增加字段的默认初始值重新由1开始;使用DELETE语句删除表中所有记录后,再次向表中添加记录时自动增加字段的值为删除时该字段的最大值加1。

3、DELETE语句是DML语句,TRUNCATE语句通常被认为是DDL语句。

7、优势与局限

优势

  • 成熟稳定,社区支持完善

  • 易于安装和使用

  • 良好的兼容性和工具生态

  • 支持事务处理(ACID特性)

局限

  • 在大数据量(如PB级)场景下不如NoSQL高效

  • 水平扩展能力相对有限

  • 复杂查询性能可能不如专用分析型数据库

参考文章:

1、MySQL 有这一篇就够(呕心狂敲37k字,只为博君一点赞!!!)_mysql有这一篇幅就够了-CSDN博客

相关推荐
陆少枫4 小时前
MySQL基础关键_007_DQL 练习
数据库·mysql
千月落6 小时前
ClickHouse副本集群
服务器·数据库·clickhouse
jjkkzzzz6 小时前
Mysql常用语句汇总
数据库·mysql
kngines6 小时前
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.2 数据类型转换(CAST函数/自定义函数)
数据库·postgresql·数据分析·filter·自定义函数·cte
半桶水专家8 小时前
使用frpc链接内网的mysql
数据库·mysql·adb
264玫瑰资源库8 小时前
网狐旗舰大联盟组件源码私测笔记:结构分层、UI重构与本地实操全流程
java·前端·数据库·笔记·ui·重构
KaiwuDB9 小时前
KaiwuDB X 遨博智能 | 构建智能产线监测管理新系统
大数据·数据库·kaiwudb·分布式多模数据库
程序猿不脱发29 小时前
mysql中int(1) 和 int(10) 有什么区别?
数据库·mysql
Themberfue9 小时前
Redis ⑨-Jedis | Spring Redis
java·数据库·redis·sql·spring·缓存