首页 > 数据库 >《八股文》MySQL核心问题总结(一)

《八股文》MySQL核心问题总结(一)

时间:2022-08-26 09:56:47浏览次数:56  
标签:总结 存储 范式 删除 主键 MySQL 八股文 连接

 

 作为SQL Boy,基础部分不会有人不会吧?面试也不怎么问,基础掌握不错的小伙伴可以跳过这一部分。当然,可能会现场写一些SQL语句,SQ语句可以通过牛客、LeetCode、LintCode之类的网站来练习。

 

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={<a,o>,<a,1>,<a,2>,<b,0>,<b,1>,<b,2>,}。

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的异同?

相同点

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

区别

 

  1. 日期范围: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

  2. 存储空间:DATETIME 的存储空间为 8 字节;TIMESTAMP 的存储空间为 4 字节

  3. 时区相关:DATETIME 存储时间与时区无关;TIMESTAMP 存储时间与时区有关,显示的值也依赖于时区

  4. 默认值:DATETIME 的默认值为 null;TIMESTAMP 的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP)

 

7.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要快。

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,八股文,连接
From: https://www.cnblogs.com/xiaotian0422/p/16626557.html

相关文章

  • arm架构安装mysql5.7
    添加mysql用户组和mysql用户,用于隔离mysql进程groupadd-rmysql&&useradd-r-gmysql-s/sbin/nologin-Mmysql2.安装依赖库yuminstall-ylibaio*下载解压M......
  • 语法总结
    语法总结1.头文件#include<bits/stdc++.h>//万能头#include<cstdio>//标准输入输出库#include<cmath>//数学库#include<iostream>//输入输出流#include<algorithm>//......
  • CDQ分治总结
    分治是什么分治(DivideandConquer),是一种把大规模数据分为更小规模数据单独处理然后合并的思想。如果连分治都不会的话建议看看LuoguP1177:快速排序,然后尝试用快排......
  • Debian 11 安装 MySQL 8.0.30
    阿里云轻量级服务器Debian11安装MySQL8.0.30一、从官网下载MySQL8.0.30的64位压缩包sudowgethttps://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.30-......
  • Mysql和Redis数据如何保持一致
    先阐明一下Mysql和Redis的关系:Mysql是数据库,用来持久化数据,一定程度上保证数据的可靠性;Redis是用来当缓存,用来提升数据访问的性能。关于如何保证Mysql和Redis中的数据一致......
  • java中的字符流知识点总结
    java中字符流字符流:对文本的读取,速度比字节流快常见的字符流:Reader和WriterReader是InputStreamReader的父类,InputStreamReader是FileReader的父类FileReader的相......
  • Python——pymysql(连接mysql数据库)
    基本设置(包括预防SQL注入):SQL注入问题,在写入sql语言时,可能会有利用mysql语句来进行正常输入的规避。importpymysqlconn=pymysql.connect(host='127.0.0.1',user......
  • mysql主从复制
    主配置[mysqld]#主数据库端ID号server_id=1#开启二进制日志log-bin=mysql-bin#需要复制的数据库名,如果复制多个数据库,重复设置这......
  • 消息队列常见问题总结
    消息队列常见问题总结作者:Grey原文地址:博客园:消息队列常见问题总结CSDN:消息队列常见问题总结说明本文是极客时间消息队列高手课的学习笔记消息队列的主要作用解......
  • Mysql——运维
    慢日志可以进行对数据库系统查询方面大于设定值进行的日志记录。慢日志-执行时间>10-未命中索引-日志文件路径配置:-内存showvariablesli......