• mysql基础知识篇(一)


    1. 什么是内连接、外连接、交叉连接、笛卡尔积呢?

    内连接(inner join):取得两张表中满足存在连接匹配关系的记录。
    外连接(outer join):不只取得两张表中满足存在连接匹配关系的记录,还包括某张表(或两张表)中不满足匹配关系的记录。
    交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,它是笛卡尔积在 SQL 中的实现,如果 A 表有 m 行,B 表有 n 行,那么 A 和 B 交叉连接的结果就有 m*n 行。
    笛卡尔积:是数学中的一个概念,例如集合 A={a,b},集合 B={1,2,3},那么 A✖️B={,,,,,,}。

    2. 那 MySQL 的内连接、左连接、右连接有有什么区别?

    MySQL 的连接主要分为内连接和外连接,外连接常用的有左连接、右连接。
    在这里插入图片描述

    • inner join 内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集
    • left join 在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。
    • right join 在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。

    3.说一下数据库的三大范式?

    在这里插入图片描述

    • 第一范式:数据表中的每一列(每个字段)都不可以再拆分。例如用户表,用户地址还可以拆分成国家、省份、市,这样才是符合第一范式的。
    • 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。例如订单表里,存储了商品信息(商品价格、商品类型),那就需要把商品 ID 和订单 ID 作为联合主键,才满足第二范式。
    • 第三范式:在满足第二范式的基础上,表中的非主键只依赖于主键,而不依赖于其他非主键。例如订单表,就不能存储用户信息(姓名、地址)。

    三大范式的作用是为了控制数据库的冗余,是对空间的节省,实际上,一般互联网公司的设计都是反范式的,通过冗余一些数据,避免跨表跨库,利用空间换时间,提高性能。

    **

    4.varchar 与 char 的区别?

    **
    在这里插入图片描述
    char:

    • char 表示定长字符串,长度是固定的;
    • 如果插入数据的长度小于 char 的固定长度时,则用空格填充;
    • 因为长度固定,所以存取速度要比 varchar 快很多,甚至能快 50%,但正因为其长度固定,所以会占据多余的空间,是空间换时间的做法;
    • 对于 char 来说,最多能存放的字符个数为 255,和编码无关

    varchar:

    • varchar 表示可变长字符串,长度是可变的;
    • 插入的数据是多长,就按照多长来存储;
    • varchar 在存取方面与 char 相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间,是时间换空间的做法;
    • 对于 varchar 来说,最多能存放的字符个数为 65532

    日常的设计,对于长度相对固定的字符串,可以使用 char,对于长度不确定的,使用 varchar 更合适一些。

    **

    5.blob 和 text 有什么区别?

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

    6.DATETIME 和 TIMESTAMP 的异同?

    相同点:

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

    区别:
    在这里插入图片描述
    DATETIME 和 TIMESTAMP 的区别

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

    7.MySQL 中 in 和 exists 的区别?

    MySQL 中的 in 语句是把外表和内表作 hash 连接,而 exists 语句是对外表作 loop 循环,每次 loop 循环再对内表进行查询。我们可能认为 exists 比 in 语句的效率要高,这种说法其实是不准确的,要区分情景:

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

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

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

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

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

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

    9.MySQL 怎么存储 emoji😊?

    MySQL 可以直接使用字符串存储 emoji。

    但是需要注意的,utf8 编码是不行的,MySQL 中的 utf8 是阉割版的 utf8,它最多只用 3 个字节存储字符,所以存储不了表情。那该怎么办?

    需要使用 utf8mb4 编码。

    alter table blogs modify content text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci not null;
    
    
    • 1
    • 2

    10.drop、delete 与 truncate 的区别?

    三者都表示删除,但是三者有一些差别:
    在这里插入图片描述
    因此,在不再需要一张表的时候,用 drop;在想删除部分数据行时候,用 delete;在保留表而删除所有数据的时候用 truncate。

    参考书籍(访问密码: 6798):

    深入浅出MySQL++数据库开发、优化与管理维护+第2版+唐汉明.pdf: https://url31.ctfile.com/f/40632231-735785515-c1ff5b?

    高性能MySQL(第3版).pdf: https://url31.ctfile.com/f/40632231-735785459-780d3e?

    SQL查询的艺术.pdf: https://url31.ctfile.com/f/40632231-735785297-8c1d65?

    MySQL技术内幕 InnoDB存储引擎 第2版.pdf:https://url31.ctfile.com/f/40632231-735784839-1a2df2?

    SQLite 权威指南.pdf: https://url31.ctfile.com/f/40632231-735784840-d76185?

    MySQL必知必会.pdf:https://url31.ctfile.com/f/40632231-735784664-7f7ca8?

    MongoDB权威指南.pdf:https://url31.ctfile.com/f/40632231-735784624-2dafdf?

  • 相关阅读:
    Domino未来三年的版本
    HJ6 质数因子
    【个人学习笔记】概率论与数理统计知识梳理【六】
    K8S(4)DaemonSet
    Spring5之IOC容器的底层原理简单理解
    java中的instanceof 的用法
    Linux停止Java服务
    echarts 多toolti同时触发图表实现
    【开源】基于Vue.js的教学过程管理系统
    代码随想录训练营第47天休息日|210.课程表II
  • 原文地址:https://blog.csdn.net/zch981964/article/details/128096958