MySQL 相关知识笔记

news2024/9/20 13:16:39

一、字符编码


MySQL 默认的编码是 utf8,仅支持三个字节的存储;utf8mb4 支持四个字节的存储。

二、数据库操作

  1. 查询

    • 查询所有数据库:SHOW DATABASES;
    • 查询当前数据库:SELECT DATABASE();
  2. 创建

    • CREATE DATABASE [IF NOT EXISTS] 数据库名 (DEFAULT CHARSET 字符集) [COLLATE 排序规则];
  3. 删除

    • DROP DATABASE [IF EXISTS] 数据库名;
  4. 使用

    • USE 数据库名;

三、表操作

  1. 查询

    • 查询当前数据库所有表:SHOW TABLES;
    • 查询表结构:DESC 表名;
    • 查询指定表的建表语句:SHOW CREATE TABLE 表名;
  2. 创建

    • CREATE TABLE 表名 ( 字段1 字段1类型 [COMMENT 字段1注释], 字段2 字段2类型 [COMMENT 字段2注释], 字段3 字段3类型 [COMMENT 字段3注释], 字段n 字段n类型 [COMMENT 字段n注释] ) [COMMENT 表注释];
    • 注意:若有多个字段,需在每个字段后面添加 “,”,但最后一个字段后面没有 “,”。Java 中的字符串用 String,MySQL 中的字符串用 varchar (50)。
    • MySQL 中的数据类型包括数值类型、引用类型和日期时间类型。
  3. 修改

    • 添加字段:ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
    • 修改数据类型:ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
    • 修改字段名和字段类型:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
    • 删除字段:ALTER TABLE 表名 DROP 字段名;
  4. 删除

    • 删除表:DROP TABLE [IF EXISTS] 表名;
    • 删除指定表,并重新创建该表:TRUNCATE TABLE 表名;

四、聚合函数


MySQL 聚合函数将一列数据作为一个整体进行纵向计算

常见聚合函数:

  1. 统计数量count
  2. 最大值max
  3. 最小值min
  4. 平均值avg
  5. 求和sum

语法:

SELECT 聚合函数(字段列表) FROM 表名;

注意:

使用聚合函数时,所有的 null 值不参与运算。例如,select count(*) from emp;可以查询到所有的数量,而select count(idcard) from emp;若 idcard 中有 null 值则会缺少,因为 null 不参与计算。

五、分组查询


语法:SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];

where 和 having 的区别:

  1. 执行时机不同:where 是分组之前进行过滤,不满足 where 条件的不参与分组;而 having 是分组之后对结果进行过滤。
  2. 判断条件不同:where 不能对聚合函数进行判断,而 having 可以。

注意:

  1. 执行顺序:where > 聚合函数 > having。
  2. 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无意义。

六、排序查询


语法:SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;

排序方式:

  1. ASC:升序(默认值)。
  2. DESC:降序。

注意:

如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。

七、函数


函数是一段可以直接被另一段程序调用的程序或代码。

八、约束


约束作用于表中字段上的规则,用于限制存储在表中的数据,目的是保证数据库中数据的正确、有效性和完整性。

约束分类如下:

  1. 非空约束:限制该字段的数据不能为 null,关键字为NOT NULL
  2. 唯一约束:保证该字段的所有数据都是唯一、不重复的,关键字为UNIQUE
  3. 主键约束:主键是一行数据的唯一标识,要求非空且唯一,关键字为PRIMARY KEY
  4. 默认约束:保存数据时,如果未指定该字段的值,则采用默认值,关键字为DEFAULT
  5. 检查约束(8.0.16 版本之后):保证字段值满足某一个条件,关键字为CHECK
  6. 外键约束:用来让两张表的数据之间建立连接,保证数据的一致性和完整性,关键字为FOREIGN KEY

注意:

  1. 约束是作用于表中字段上的,可以在创建表 / 修改表的时候添加约束。
  2. 多个约束之间使用空格分开。

约束演示:

create table user(
    id int primary key auto_increment comment'主键',
    name varchar(10) not null unique comment'姓名',
    age int check(age > 0 && age <= 120) comment'年龄',
    status char(1) default '1' comment'状态',
    gender char(1) comment'性别'
) comment'用户表';

外键约束:


外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。

  • 删除外键:ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

删除 / 更新行为:

九、索引


索引是帮助 MySQL 高效获取数据的数据结构。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引向(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

  1. 索引的优点

    • 提高数据检索的效率,降低数据库的 IO 成本。
    • 通过索引列对数据进行排序,降低数据排序的成本,降低 CPU 的消耗。
  2. 索引的缺点

    • 索引列也是要占用空间的。
    • 索引大大提高了查询效率,同时也降低了更新表的速度,如对表进行 INSERT、UPDATE、DELETE 时,效率降低。
  3. 索引的结构

    • MySQL 的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,如:
      • B + Tree 索引:最常见的索引类型,大部分引擎都支持 B + 树索引。
      • Hash 索引:底层数据结构是用哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询。
      • R - tree(空间索引):空间索引是 MylSAM 引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少。
      • Full - text(全文索引):是一种通过建立倒排索引快速匹配文档的方式,类似于 Lucene、Solr、ES。

B - Tree(多路平衡查找树):


以一颗最大度数(max - degree)为 5(5 阶)的 b - tree 为例(每个节点最多存储 4 个 key,5 个指针):

数据:10, 15, 18, 20, 23, 25, 28, 30, 34, 56, 58, 62, 64, 78, 88, 89, 92, 96, 98
指针:3, 4, 14, 16, 17, 19
知识小贴士:

树的度数指的是一个节点的子节点个数。

B + Tree:


以一颗最大度数(max - degree)为 4(4 阶)的 b + tree 为例:

数据:38, 55, 58, 67, 90, 94
指针:6, 12, 16, 18, 29, 34, 38, 45, 55, 56, 58, 62, 87, 90, 92, 94, 98
注:
  1. B + 树的所有节点都会出现在叶子节点上,上面的节点只起到一个索引的作用。
  2. B + 树的叶子节点之间有一个单项链表。
  3. MySQL 中的 B + 树是 B + 树的优化版。
  4. MySQL 索引数据结构对经典的 B + Tree 进行了优化。在原 B + Tree 的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的 B + Tree,提高区间访问的性能。

Hash索引:


哈希索引是采用一定的 hash 算法,将键值换算成新的 hash 值,映射到对应的槽位上,然后存储在 hash 表中。

注:


如果两个(或多个)键值,映射到同一个槽位上,它们就产生了 hash 冲突(hash 碰撞),可以通过链表来解决。

Hash 索引的特点:
  1. Hash 索引只能用于对等比较(=,in),不支持范围查询。
  2. 无法利用索引完成排序操作(计算的 hash 值是无序的)。
  3. 查询效率高,通常只需要一次检索就可以了,效率通常要高于 B + tree 索引。

为什么 InnoDB 存储引擎选择使用 B + tree 索引结构?


答:相对于二叉树,层级更少,搜索效率高;对于 B - tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;相较 Hash 索引,B + tree 支持范围匹配及排序操作。

索引分类:

在 InnoDB 存储引擎中,根据索引的存储形式,可以分为以下两种:

聚集索引的选取规则:

  1. 如果存在主键,主键索引就是聚集索引。
  2. 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
  3. 如果表没有主键,或没有合适的唯一索引,InnoDB 会自动生成一个 rowid 作为隐藏的聚集索引。

思考:


以下 SQL 语句,哪个执行效率高?为什么?

select * from user where id = 10;
select * from user where name = 'Arm';

id 为主键,name 字段创建的有索引。

答:select * from user where id = 10;更快。

原因:
select * from user where id = 10;`这个语句中根据 id = 10 可以有以下步骤:
直接找到 id = 10 的整行数据。

`select * from user where name = 'Arm';`这个语句根据 name = 'Arm' 有以下步骤:
先找到 Arm 的 id,然后再根据 id 找到整行数据,涉及到回表,因此效率不高。

索引的语法:

  1. 创建索引CREATE [UNIQUE | FULLTEXT ] INDEX index_name ON table_name (index_col_name,...);
  2. 查看索引SHOW INDEX FROM table_name ;
  3. 删除索引DROP INDEX index_name ON table_name;

十、实际操作示例

  1. 为 name 字段(该字段的值可能会重复)创建索引:CREATE INDEX idx_user_name ON tb_user(name);
  2. 为 phone 手机号字段(该字段的值是非空且唯一的)创建唯一索引:CREATE UNIQUE INDEX idx_user_phone ON tb_user(phone);
  3. 为 profession、age、status 创建联合索引:CREATE INDEX idx_user_pro_age_sta ON tb_user(profession, age, status);
  4. 为 email 建立合适的索引来提升查询效率:CREATE INDEX idx_email ON tb_user(email);

十一、其他命令

  1. 查看服务器状态信息的命令:

    show [session|global] status like 'Com_______';(注:该命令可查询执行频次,一个下划线代表一个字符)
  2. 慢查询:
    • 查看慢查询的开关开启情况:show variables like ’slow_query_log'
    • 在 MySQL 的配置文件(/etc/my.cnf)中配置:
      • #开启 MySQL 慢日志查询开关
      • slow_query_log = 1
      • 设置慢日志的时间为 2 秒,SQL 语句执行时间超过 2 秒,就会视为慢查询,记录慢查询日志
      • long_query_time = 2
    • 配置结束后重启 MySQL 服务器:systemctl restart mysqld
    • 日志文件存放路径:cd /var/lib/mysql
    • 日志文件:localhost - slow.log
  3. 关于 profile:
    • SELECT @@have_profiling; #查看该数据库是否支持
    • SET profiling = 1; #profiling 默认是关闭的,可以开启,可以通过 session/global 设置开启级别
    • show profiles; #查看 SQL 语句的执行情况
    • show profile for query ${id}; #查看指定 query_id 的 SQL 语句各个阶段的耗时情况

十二、总结


以上是根据 B 站黑马课程学习后的 MySQL 笔记,为了日后复习和给别人参考而整理,希望对大家有所帮助。同时,在实际应用中,还需要根据具体情况合理使用索引、约束等功能,以提高数据库的性能和数据的完整性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搜维尔科技:Manus Prime 3 Mocap 数据手套VR手套动作捕捉手套

通过在设置中添加手动捕捉功能&#xff0c;轻松创建动画内容。非常适合独立Mocap、预可视化、现场表演流和V-tubing。即插即用符合行业标准具有无与伦比的易用性。 通过添加精确的手部和手指动作捕捉数据&#xff0c;为您的虚拟角色加入情感和个性。Manus Prime 3 Mocap 数据手…

欧拉函数.

欧拉函数 给定 n个正整数 ai&#xff0c;请你求出每个数的欧拉函数。 欧拉函数的定义 输入格式 第一行包含整数 n。 接下来 n行&#xff0c;每行包含一个正整数 ai。 输出格式 输出共 n行&#xff0c;每行输出一个正整数 ai的欧拉函数。 数据范围 1≤n≤100, 1≤ai≤2109 输入…

【逐行注释】MATLAB下的IMM-EKF代码

IMM-EKF 基于EKF的多模型交互。以CV和CT两个模型进行交互&#xff0c;这里对代码进行逐行注释。 注释较多&#xff0c;个人理解的时候如果有误&#xff0c;欢迎指正。 每一行都有注释&#xff1a; 模型概况 二维平面上的运动模型&#xff0c;由CV和CT构成&#xff0c;基于…

【机器学习-监督学习】支持向量机

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

Linux:Bash中的命令介绍(简单命令、管道以及命令列表)

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 在Bash中&#xff0c;命令执行的方式可以分为简单命令、管道和命令列表组成。这些结构提供了强大的工具&#xff0c;允许用户组合命令并精确控制其执行方式。以下是对这…

分享一个基于文本挖掘的微博舆情分析系统Python网络舆情监控系统Flask爬虫项目大数据(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

Comsol TPMS_Diamond多孔构型吸声性能仿真

TPMS_Diamond多孔构型是一种新型的吸声材料结构&#xff0c;它采用了三维打印技术制备而成。该构型的设计灵感来自于结晶体的晶格结构&#xff0c;通过将正方形的单元堆积并沿着特定方向旋转&#xff0c;形成了一种类似于钻石的多孔结构。 TPMS_Diamond多孔构型具有以下特点&a…

systemback制作Ubuntu自己的系统镜像

systemback制作Ubuntu自己的系统镜像 目录1.安装、制作2.解决镜像大于4GB的问题3.写入镜像到U盘&#xff14;.安装 目录 systemback制作Ubuntu自己的系统镜像 最近需要备份自己的系统&#xff0c;同时制作安装镜像在另一台笔记本上安装&#xff0c;这里找到了一款很不错的软件…

excel表格输入数据生成函数曲线图

1.新建一个excel表格&#xff0c;横向或者纵向输入x轴点的数据 下图以横向数据为例子&#xff0c;两个y轴数据&#xff0c;生成两个函数曲线 2.右键选中上面输入的数据&#xff0c;点击插入&#xff0c;选择你要构造的函数样式 3.选中带平滑散点图即可生成前面数据生成的函数 …

内存管理篇-06Per-CPU页帧缓存

per-CPU缓存是对伙伴系统的完善&#xff0c;也是伙伴系统中的一部分。再回顾一下zone结构体的内容&#xff0c;这里的__percpu *pageset实际上就是Per-CPU的实现机制&#xff0c;所以这里的内存实际上最少有三部分&#xff0c;&#xff08;1&#xff09;free_area管理了大部分的…

数学建模之Matlab快速入门--全

前言&#xff1a; 本文是之前学Matlab时候做的笔记&#xff0c;很适合快速入门数学建模中matlab和python是最常用的两个软件&#xff0c;现在本人更喜欢python去做数学建模 文章目录 界面介绍与操作快捷操作 数据类型数值型整型浮点型复型逻辑型字符型struct数组cell数组函数句…

区块链国赛第六套样题(关于运维)

任务1-2&#xff1a;区块链系统部署与运维 围绕食品安全溯源区块链平台部署与运维需求&#xff0c;进行项目相关系统、节点以及管理工具的部署工作。通过监控工具完成对网络、节点服务的监控。最终利用业务需求规范&#xff0c;完成系统日志、网络参数、节点服务等系统结构的维…

Jetson安装Archiconda3全过程

1. 下载Archiconda3 下载网址&#xff1a; 发布 Archiconda/build-tools --- Releases Archiconda/build-tools (github.com)​​​​​​ 2. 执行命令 bash ./Archiconda3-0.2.2-Linux-aarch64.sh 3. conda换源 conda config --add channels https://mirrors.tuna.tsing…

计算机网络-PIM-SM组播实验

一、概述 目前为止我们学习了组播转发网络中的PIM协议&#xff0c;PIM模型有两种&#xff1a; PIM-DM主要使用在网络规模较小&#xff0c;用户集中的组播网络中。 PIM-SM主要使用在网络规模较大&#xff0c;用户较为分散的组播网络中。PIM-SM基于组播模型又可以分为PIM-SM&…

5.Lab four —— Trap

首先切换traps分支 git checkout traps make clean RISC-V assembly 代码&#xff1a; #include "kernel/param.h" #include "kernel/types.h" #include "kernel/stat.h" #include "user/user.h"int g(int x) {return x3; }int f(…

AI预测体彩排3采取888=3策略+和值012路或胆码测试8月24日升级新模型预测第61弹

经过近60多期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;已到达90%的命中率&#xff0c;这给喜欢打私菜的朋友提供了极高价值的预测结果~当然了&#xff0c;大…

Linux——驱动——自动设备

自动创建设备节点是Linux设备驱动开发中的一个重要环节&#xff0c;它允许设备驱动程序在内核中注册后&#xff0c;自动在/dev目录下创建对应的设备文件&#xff0c;从而使得用户空间程序可以通过标准的文件操作接口&#xff08;如open、read、write等&#xff09;与硬件设备进…

Level3 — PART 4 机器学习算法 — 朴素贝叶斯

目录 贝叶斯定理 朴素贝叶斯模型&#xff08;Naive Bayes Model&#xff09; 估计 离散估计 极大似然估计 案例 朴素贝叶斯扩展 高斯贝叶斯分类器 原理 应用 源码分析 伯努利贝叶斯分类器 原理 源码分析 多项朴素贝叶斯分类器 半朴素贝叶斯分类器 模拟题 CDA…

Linux系统之jobs命令的基本使用

Linux系统之jobs命令的基本使用 一、jobs命令介绍二、jobs命令的使用帮助2.1 jobs命令的help帮助信息2.2 jobs命令的语法解释 三、jobs命令的基本使用3.1 运行一个后台任务3.2 列出后台所有的作业3.3 列出进程ID3.4 只列出进程ID3.5 终止后台任务3.6 只显示运行任务3.7 只显示停…

tcp 网络通信及抓包工具的使用

tcp网络通信 本地回环&#xff08;Loopback&#xff09;的概念 本地回环地址是一个特殊的IP地址&#xff0c;用于指向计算机本身的网络接口。在IPv4中&#xff0c;最常见的本地回环地址是127.0.0.1&#xff0c;而在IPv6中则是::1。这个地址用于测试网络软件&#xff0c;确保网…