MySQL-基础点

目录

MySQL概念

数据库三大范式是什么?

[blob 和 text 有什么区别?](#blob 和 text 有什么区别?)

[DATETIME 和 TIMESTAMP 的异同?](#DATETIME 和 TIMESTAMP 的异同?)

[MySQL 中 in 和 exists 的区别?](#MySQL 中 in 和 exists 的区别?)

[MySQL 里记录货币用什么字段类型比较好?](#MySQL 里记录货币用什么字段类型比较好?)

[MySQL 怎么存储 emoji?](#MySQL 怎么存储 emoji?)

[用过哪些 MySQL 函数](#用过哪些 MySQL 函数)

用过哪些字符串函数来处理文本?

用过哪些数值函数?

用过哪些日期和时间函数?

用过哪些汇总函数?

用过哪些逻辑函数?

用过哪些格式化函数?

用过哪些类型转换函数?

[count(*) 和 count(1) 有什么区别?哪个性能最好?](#count(*) 和 count(1) 有什么区别?哪个性能最好?)

count()遍历顺序

count主键和count非主键结果会不同吗?

Mysql内连接、外连接有什么区别

外连接时on和where过滤条件区别?

[MySQL 第 3-10 条记录怎么查?(补充)](#MySQL 第 3-10 条记录怎么查?(补充))

having和where的区别?

delete、drop、truncate有什么区别?

[联合查询中union和union all 的区别是什么?](#联合查询中union和union all 的区别是什么?)

[一条 SQL 查询语句的执行顺序?](#一条 SQL 查询语句的执行顺序?)


MySQL概念

MySQL 是一个开源的关系型数据库管理系统,现在隶属于 Oracle 旗下,也是我用得最多的一款关系型数据库。

与此同时,MySQL 也是我们国内使用频率最高的一种数据库,我在本地安装的是最新的 8.0 社区版。

数据库三大 范式 是什么?

  • 第一 范式 保证每一列不可再分
  • 第二 范式 前提是满足第一范式,要求数据库表中的每一列都和 主键 直接相关,而不能只与主键的某一部分相关(主要针对联合主键)。
  • 第三 范式 前提是满足第一和第二范式,第三范式需要消除非 主键 列对主键的传递依赖,即 非主键列只依赖于主键列,不依赖于其他非主键列

blob 和 text 有什么区别?

  • blob 用于存储二进制数据,而 text 用于存储大字符串。
  • blob 没有字符集,text 有一个字符集,并且根据字符集的校对规则对值进行排序和比较

DATETIME 和 TIMESTAMP 的异同?

相同点:

  1. 两个数据类型存储时间的表现格式一致。均为 YYYY-MM-DD HH:MM:SS
  2. 两个数据类型都包含「日期」和「时间」部分。
  3. 两个数据类型都可以存储微秒的小数秒(秒后 6 位小数秒)

区别:

DATETIME 和 TIMESTAMP 的区别

  1. 日期范围:DATETIME 的日期范围是 1000-01-01 00:00:00.0000009999-12-31 23:59:59.999999;TIMESTAMP 的时间范围是1970-01-01 00:00:01.000000 UTC 到 ``2038-01-09 03:14:07.999999 UTC
  2. 存储空间:DATETIME 的存储空间为 8 字节;TIMESTAMP 的存储空间为 4 字节
  3. 时区相关:DATETIME 存储时间与时区无关;TIMESTAMP 存储时间与时区有关,显示的值也依赖于时区
  4. 默认值:DATETIME 的默认值为 null;TIMESTAMP 的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP)

MySQL 中 in 和 exists 的区别?

MySQL 中的 in 语句是把外表和内表作 hash 连接 ,而exists 语句是对外表作 loop 循环,每次 loop 循环再对内表进行查询

我们可能认为 exists 比 in 语句的效率要高,这种说法其实是不准确的,要区分情景:

  1. 如果查询的两个表大小相当,那么用 in 和 exists 差别不大。
  2. 如果两个表中一个较小,一个是大表,则子查询表大的用 exists,子查询表小的用 in。
  3. not in 和 not exists:如果查询语句使用了 not in,那么内外表都进行全表扫描,没有用到索引;而 not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用 not exists 都比 not in 要快。

MySQL 里记录货币用什么字段类型比较好?

货币在数据库中 MySQL 常用 Decimal 和 Numric 类型表示,这两种类型被 MySQL 实现为同样的类型。他们被用于保存与货币有关的数据。

例如 salary DECIMAL(9,2),9(precision)代表将被用于存储值的总的小数位数,而 2(scale)代表将被用于存储小数点后的位数。存储在 salary 列中的值的范围是从-9999999.99 到 9999999.99。

DECIMAL 和 NUMERIC 值作为字符串存储,而不是作为二进制 浮点数 ,以便保存那些值的小数精度。

之所以不使用 float 或者 double 的原因:因为 float 和 double 是以二进制存储的,所以有一定的误差。

MySQL 怎么存储 emoji?

MySQL 的 utf8 字符集仅支持最多 3 个字节的 UTF-8 字符,但是 emoji 表情(😊)是 4 个字节的 UTF-8 字符,所以在 MySQL 中存储 emoji 表情时,需要使用 utf8mb4 字符集。

MySQL 8.0 已经默认支持 utf8mb4 字符集,可以通过 SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; 查看。

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

用过哪些 MySQL 函数

MySQL 支持很多内置函数,包括执行计算、格式转换、日期处理等。我说一些自己常用的。

用过哪些字符串函数来处理文本?
  • CONCAT(): 连接两个或多个字符串。
  • LENGTH(): 返回字符串的长度。
  • SUBSTRING(): 从字符串中提取子字符串。
  • REPLACE(): 替换字符串中的某部分。
  • LOWER()UPPER(): 分别将字符串转换为小写或大写。
  • TRIM(): 去除字符串两侧的空格或其他指定字符。
用过哪些数值函数?
  • ABS(): 返回一个数的绝对值。
  • CEILING(): 返回大于或等于给定数值的最小整数。
  • FLOOR(): 返回小于或等于给定数值的最大整数。
  • ROUND(): 四舍五入到指定的小数位数。
  • MOD(): 返回除法操作的余数。
用过哪些日期和时间函数?
  • NOW(): 返回当前的日期和时间。
  • CURDATE(): 返回当前的日期。
  • CURTIME(): 返回当前的时间。
  • DATE_ADD()DATE_SUB(): 在日期上加上或减去指定的时间间隔。
  • DATEDIFF(): 返回两个日期之间的天数。
  • DAY(), MONTH(), YEAR(): 分别返回日期的日、月、年部分。
用过哪些汇总函数?
  • SUM(): 计算数值列的总和。
  • AVG(): 计算数值列的平均值。
  • COUNT(): 计算某列的行数。
  • MAX()MIN(): 分别返回列中的最大值和最小值。
  • GROUP_CONCAT(): 将多个行值连接为一个字符串。
用过哪些逻辑函数?
  • IF(): 如果条件为真,则返回一个值;否则返回另一个值。
  • CASE: 根据一系列条件返回值。
  • COALESCE(): 返回参数列表中的第一个非 NULL 值。
用过哪些格式化函数?
  • FORMAT(): 格式化数字为格式化的字符串,通常用于货币显示。
用过哪些类型转换函数?
  • CAST(): 将一个值转换为指定的数据类型。
  • CONVERT(): 类似于CAST(),用于类型转换。

count(*) 和 count(1) 有什么区别?哪个性能最好?

  • count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为 NULL
  • count(1)包括了所有列,用 1 代表代码行,在统计结果的时候,不会忽略列值为 NULL
  • count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者 0,而是表示 null)的计数,即某个字段值为 NULL 时,不统计。

count()遍历顺序

count(1)、 count(*)、 count( 主键 字段)在执行的时候,如果表里存在二级索引, 优化器 就会选择二级索引进行扫描。

所以,如果要执行 count(1)、 count(*)、 count(主键字段) 时,尽量在数据表上建立二级索引,这样优化器会自动采用 key_len 最小的二级索引进行扫描,相比于扫描主键索引效率会高一些。

再来,就是不要使用 count(字段) 来统计记录个数,因为它的效率是最差的,会采用全表扫描的方式来统计。如果你非要统计表中该字段不为 NULL 的记录个数,建议给这个字段建立一个二级索引。

count 主键 和count非主键结果会不同吗?

主键是不能存NULL值的,所以count主键代表统计表中所有行数据的数量。

而非主键是可以存NULL值的,所以count非主键统计的是表中这个列的非NULL值的数量。

Mysql 内连接、外连接有什么区别

内连接和外连接都是用于连表查询。

内连接是只返回两个表匹配的数据行,外连接可以返回两个表匹配和不匹配的数据行,外连接主要分为左连接和右连接

  • 左连接返回左表中的所有行和右表中匹配的行。如果右表中没有匹配的行,则用 NULL 值填充
  • 右连接返回右表中的所有行和左表中匹配的行,如果左表中没有匹配的行,则用 NULL 值填充

  • 交叉连接(cross join):返回第一个表中的每一行与第二个表中的每一行的组合,这种类型的连接通常用于生成笛卡尔积。
  • 笛卡尔积:数学中的一个概念,例如集合 A={a,b},集合 B={0,1,2},那么 A✖️B={<a,0>,<a,1>,<a,2>,<b,0>,<b,1>,<b,2>,}

外连接时on和where过滤条件区别?

ON条件用于连接的匹配 (在连接操作之前执行),WHERE条件用于对连接后的结果进行筛选

MySQL 第 3-10 条记录怎么查?

在 MySQL 中,要查询第 3 到第 10 条记录,可以使用 limit 语句,结合偏移量 offset 和行数 row_count 来实现。

limit 语句用于限制查询结果的数量,偏移量表示从哪条记录开始,行数表示返回的记录数量。

SELECT * FROM table_name LIMIT 2, 8;
  • 2:偏移量,表示跳过前两条记录,从第三条记录开始。
  • 8:行数,表示从偏移量开始,返回 8 条记录。

偏移量是从 0 开始的,即第一条记录的偏移量是 0;如果想从第 3 条记录开始,偏移量就应该是 2。

having和where的区别?

在GROUP BY 分组查询过程中,Where 是工作在GROUP BY之前Where 是对分组之前的数据进行筛选,无法使用 聚合函数

Having 是工作在GROUP BY之后,Having 主要对分组之后的数据进行筛选,可以使用 聚合函数

delete、drop、truncate有什么区别?

  • delete 是删除表中的数据 ,我们可以选择删除部分数据或者全部数据,delete 删除的数据是可以回滚的, delete 操作并不是真的把数据删除掉了,而是给数据打上删除标记,目的是为了空间复用,所以 delete 删除表数据,磁盘文件的大小是不会缩减的。
  • drop 是删除表结构和表中所有的数据truncate 是只删除表中所有的记录,表结构并不会被删除,drop 和 truncate 删除的数据都是不可以回滚的,并且删除表会立刻释放磁盘空间
  • 从删除表的性能来看,drop>truncate>delete

联合查询中union和union all 的区别是什么?

UNION:在合并结果集后会自动剔除重复的行

UNION ALL: 则会保留所有的重复行,不会进行去重操作

一条 SQL 查询语句的执行顺序?

自己整理,借鉴很多博主,感谢他们

相关推荐
Ai 编码助手2 小时前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
陈燚_重生之又为程序员3 小时前
基于梧桐数据库的实时数据分析解决方案
数据库·数据挖掘·数据分析
caridle3 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
白云如幻3 小时前
MySQL排序查询
数据库·mysql
萧鼎3 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
^velpro^3 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋33 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
荒川之神3 小时前
ORACLE _11G_R2_ASM 常用命令
数据库·oracle
IT培训中心-竺老师3 小时前
Oracle 23AI创建示例库
数据库·oracle
小白学大数据3 小时前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫