2023年MySQL核心技术面试第一篇

 

目录

一 . 存储:一个完整的数据存储过程是怎样的?

1.1 数据存储过程

 1.1.1 创建MySQl 数据库

1.1.1.1 为什么我们要先创建一个数据库,而不是直接创建数据表?

1.1.1.2基本操作部分

1.2 选择索引问题

二 . 字段:这么多的字段类型,应该如何定义

2.1 简介

2.1.1 例子:

2.1.1.1解释:

2.2 整数类型

2.2.1 如何选择合适的整数类型

2.3 浮点数类型和定点类型

2.3.1 为什么浮点数类型的无符号只有有符号的一半取值范围?

2.3.2 浮点数的精度问题

2.3.2.1 建表:

2.3.2.2 然后插入数据

2.3.2.3 查看表里面的数据

2.3.2.4 利用SQl语句进行价格相加:

2.3.2.4.1 sum:


一 . 存储:一个完整的数据存储过程是怎样的?

1.1 数据存储过程

 MySQL是怎么进行数据存储的。

存储数据是处理数据的第一步,对各种繁杂的数据,进行有序和高效地存储起来。

在MySQL中,完整的数据存储过程共有4步,分别是 创建数据库,确认字段,创建数据表,插入数据。

 1.1.1 创建MySQl 数据库

数据存储的第一步就是创建数据库。

1.1.1.1 为什么我们要先创建一个数据库,而不是直接创建数据表?

数据库是MySQL里面最大的存储单元,系统架构层次上看,MySQL数据库系统,从小到大依次是数据库服务器,数据库,数据表,数据表的行与列。

没有数据库,数据表就没有载体,就无法存储数据。

1.1.1.2基本操作部分

创建数据库

create database demo;

删除数据库

drop database demo;

查看数据库

show databases;

创建数据表:

create table demo.test

(

barcode text,

goodsname text,

price int

);

查看表结构

describe  demo.test;

查看所有表

show tables;

添加主键

alter table demo.test

add column itemnumber int primary key auto_increment

向表添加数据

insert into demo.test

(barcode,goodsname,price)

values('0001','本',3);

1.2 选择索引问题

select count(*) from t; t中有id(主键),name,age,sex4个字段。假设数据10条,对sex添加索引。用explain 查看执行计划发现用了sex索引,为什么不是主键索引呢?主键索引应该更快的.

解答:

MySQL Innodb的主键索引是一个B+树,数据存储在叶子节点上,10条数据,就有10个叶子节点。
1. sex索引是辅助索引,也是一个B+树,不同之处在于,叶子节点存储的是主键值,由于sex只有2个
可能的值:男和女,因此,这个B+树只有2个叶子节点,比主键索引的B+树小的多
2. 这个表有主键,因此不存在所有字段都为空的记录,所以COUNT(*)只要统计所有主键的值就可以
了,不需要回表读取数据
3. SELECT COUNT(*) FROM t,使用sex索引,只需要访问辅助索引的小B+树,而使用主键索引,要
访问主键索引的那个大B+树,明细工作量大,这就是为什么,优化器使用辅助索引的原因

二 . 字段:这么多的字段类型,应该如何定义

2.1 简介

 MySQl中有很多字段类型,比如整数,文本,浮点数。

2.1.1 例子:

在销售流水表中,需要定义商品销售的数量。由于有称重
商品,不能用整数,想当然地用了浮点数,为了确保精度,还用了 DOUBLE 类型。
结果却造成了在没有找零的情况下,客人无法结账的重大错误,DOUBLE 类型是不精准的,不能使用。

2.1.1.1解释:

浮点数在计算机中的内部表示是二进制的,而不是十进制的。对于某些常见的十进制小数(如0.1),其在二进制表示中是一个无限循环的小数。这样就存在一些十进制小数无法准确转换为浮点数的二进制表示。

当进行浮点数计算时,舍入误差会逐渐累积。即使看似简单的计算,例如0.1 + 0.1 + 0.1,也可能产生一个微小的舍入误差。这意味着在处理货币或计量单位时,通过浮点数计算得到的结果可能与预期的结果有细微差异。

在结账场景中,如果使用浮点数(DOUBLE)存储商品销售的数量和金额,并进行计算,那么可能会出现舍入误差。例如,如果商品价格是0.1元,数量是3个,正确的总金额应该是0.3元。但由于浮点数的舍入误差,实际计算时可能得到一个接近0.30000000000000004的结果。这样就导致无法准确匹配预期的金额,客人无法正确结账。

因此,在处理与货币或计量单位相关的数据时,浮点数(DOUBLE)类型不是一个理想的选择,因为它可能引发舍入误差和精度问题。更好的选择是使用固定点数类型(如DECIMAL),它可以提供更高的精确度和准确性来处理这些情况,避免结账错误的发生。

2.2 整数类型

整数类型一共5种:tinyint ,smallint,mediumint,int(integer),bigint。

2.2.1 如何选择合适的整数类型

需要考虑存储空间和可靠性的平衡问题:

1.占用字节数少的整数类型可以节省出存储空间,如果太小了,可能会出现超出取值范围的情况,引发系统问题。

例子:

在我们的项目中,商品编号采用的数据类型是 INT。
我们之所以没有采用占用字节更少的 SMALLINT 类型整数,原因就在于,客户门店中流通的
商品种类较多,而且,每天都有旧商品下架,新商品上架,这样不断迭代,日积月累。如果使
用 SMALLINT 类型,虽然占用字节数比 INT 类型的整数少,但是却不能保证数据不会超出范
围 65535。相反,使用 INT,就能确保有足够大的取值范围,不用担心数据超出范围影响可
靠性的问题。

注意:实际工作中,系统故障产生的成本远远超过增加几个字段存储空间所产生的成本,我们应该首先确保数据不会超过取值范围,在这个前提下考虑如何节省存储空间。

2.3 浮点数类型和定点类型

浮点数和定点数的特点是可以处理小数,将整数看成小数的特例。

浮点数类型:float,double,real 

float 表示单精度浮点数;4字节

double 表示 双精度浮点数   8字节

real 默认 double,

如果要float:set sql_mode = " real_as_float";

2.3.1 为什么浮点数类型的无符号只有有符号的一半取值范围?

原因是,MySQL 是按照这个格式存储浮点数的:符号(S)、尾数(M)和阶
码(E)。因此,无论有没有符号,MySQL 的浮点数都会存储表示符号的部分。因此,所谓
的无符号数取值范围,其实就是有符号数取值范围大于等于零的部分。

2.3.2 浮点数的精度问题

2.3.2.1 建表:

CREATE TABLE demo.goodsmaster
(
barcode TEXT,
goodsname TEXT,
price DOUBLE,
itemnumber INT PRIMARY KEY AUTO_INCREMENT
);

2.3.2.2 然后插入数据

-- 第一条
INSERT INTO demo.goodsmaster
(
barcode,
goodsname,
price
)
VALUES
(
'0001',
'书',
0.47
);
-- 第二条
INSERT INTO demo.goodsmaster
(
barcode,
goodsname,
price
)
VALUES
(
'0002',
'笔',
0.44
);
-- 第三条
INSERT INTO demo.goodsmaster
(
barcode,
goodsname,
price
)
VALUES
(
'0002',
'胶水',
0.19
);

2.3.2.3 查看表里面的数据

SELECT * from demo.goodsmaster;

结果:

mysql> SELECT *
-> FROM demo.goodsmaster;
+---------+-----------+-------+------------+
| barcode | goodsname | price | itemnumber |
+---------+-----------+-------+------------+
| 0001 | 书 | 0.47 | 1 |
| 0002 | 笔 | 0.44 | 2 |
| 0002 | 胶水 | 0.19 | 3 |
+---------+-----------+-------+------------+
3 rows in set (0.00 sec)

2.3.2.4 利用SQl语句进行价格相加:

SELECT SUM(price)
FROM demo.goodsmaster;
2.3.2.4.1 sum:

关键字sum,MySQL的求和函数,MySQL聚合函数的一种,知道这个函数表述计算字段值的和就可以了。

我们应该理想的值,0.47+0.44+0.19 =1.1

结果:

mysql> SELECT SUM(price)
-> FROM demo.goodsmaster;
+--------------------+
| SUM(price) |查询结果是 1.0999999999999999

 将类型改成float,输出的值为1.0999999940395355,误差更大。

当我们需要进行值对比作为条件进行查询的时候,就会发生误差。

比如:

SELECT *
FROM demo.goodsmaster
WHERE SUM(price)=1.1

原因;

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

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

相关文章

【算法与数据结构】513、LeetCode找树左下角的值

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:这道题用层序遍历来做比较简单,最底层最左边节点就是层序遍历当中最底层元素容器的第一个值…

Nacos基础(2)——nacos的服务器和命名空间 springBoot整合nacos 多个nacos配置的情况

目录 引出nacos服务器和命名空间Nacos服务器命名空间 springBoot整合nacosspringcloud Alibaba 版本与springcloud对应关系引包配置maincontroller 报错以及解决【报错】错误:缺少服务名称报错:9848端口未开放 启动测试引入多个nacos配置多个配置的情况没…

【MCU】SD NAND芯片之国产新选择

文章目录 前言传统SD卡和可贴片SD卡传统SD卡可贴片SD卡 实际使用总结 前言 随着目前时代的快速发展,即使是使用MCU的项目上也经常有大数据存储的需求。可以看到经常有小伙伴这样提问: 大家好,请问有没有SD卡芯片,可以直接焊接到P…

排序算法:快速排序

快速排序算法由 C. A. R. Hoare 在 1960 年提出。它的时间复杂度也是 O(nlogn),但它在时间复杂度为 O(nlogn) 级的几种排序算法中,大多数情况下效率更高,所以快速排序的应用非常广泛。再加上快速排序所采用的分治思想非常实用,使得…

香港服务器怎么打开SSH

​  SSH是一种远程登录协议,可以通过加密方式在网络上安全地传输数据。它允许用户在远程服务器上执行命令,管理文件和目录,并进行其他系统管理任务。 如何打开SSH服务? 1.确认已安装OpenSSH服务器: 你可以通过命令sudoapt-geti…

Excel显示此值与此单元格定义的数据验证限制不匹配怎么办?

总结:1、在编辑excel文档的时候,弹出此时预测单元格定义的数据验证,限制不匹配的提示。2、这是我们点击菜单来的数据菜单。3、然后点击数据工具栏的数据验证下拉按钮。4、在弹出的菜单中选择数据验证的菜单项。5、然后在打开的窗口中点击左下…

Jmeter(二十七):BeanShell PostProcessor跨线程全局变量使用

在性能测试中,两个相关联的接口不一定都在同一个线程组,遇见这种情况时,我们要进行跨线程组传参,此处用登录和查询配送单两个请求举例; 1、登录请求中配置json提取器,将接口返回的token保存在变量中&#…

Python爬虫异常处理实践:处理被封禁和网站升级问题

在这篇文章中,我们将一起探讨Python爬虫异常处理实践,特别关注处理被封禁和网站升级问题。让我们一起来看看如何解决这些问题,提高我们爬虫程序的稳定性和可靠性。   首先,我们要了解为什么会遇到这些问题。网站封禁爬虫的原因主…

从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题

目录 1. 可变参数模板 1.1 展开参数包 1.1.1 递归函数方式展开 1.1.2 逗号表达式展开 1.2 emplace相关接口 2. lambda表达式(匿名函数) 2.1 C11之前函数的缺陷 2.2 lambda表达式语法 2.3 函数对象与lambda表达式 3. 包装器 3.1 function包装器…

不同子网络中的通信过程

从输入www.baidu.com经历了什么 一、DNS(网址->IP) 二、ARP(IP->MAC) A->B:有数据发送,数据封装ip之后发现没有主机B的mac地址。然后ARP在本网段广播:检查目标地址和源地址是否在同一…

【程序猿书籍大放送:第二期】《强化学习:原理与Python实战》

🌹欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 爱书不爱输的程序猿:送书第二期 一、搞懂大模型的智能基因,RLHF系统设计关键问答1.RLHF是什么?2.RLHF适用于哪些任务?3…

MySQL日志管理 备份和恢复

备份的主要目的是灾难恢复,备份还可以测试应用、回滚数据修改、查询历史数据、审计等。 而备份、恢复中,日志起到了很重要的作用 #######前言:日志⭐⭐ MySQL 的日志默认保存位置为 /usr/local/mysql/data ##配置文件 vim /etc/my.cnf [mys…

c++23中的新功能之十三Ranges的as系列

一、介绍 在前面反复提到过,c编程的语法也越来越向着自然语言方向发展,今天这个as_函数就是如此,一般学习过英文的都知道as是啥意思。非常容易理解,所以c23中用这个词来描述函数,其实也是非常走心了。 二、as_const …

Git仓库简介

1、工作区、暂存区、仓库 工作区:电脑里能看到的目录。 暂存区:工作区有一个隐藏目录.git,是Git的版本库,Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区&#xf…

vue数字输入框

目录 1.emitter.JS function broadcast (componentName, eventName, params) {this.$children.forEach(child > {var name child.$options.componentNameif (name componentName) {child.$emit.apply(child, [eventName].concat(params))} else {broadcast.apply(child, …

基于Spring Boot的软件缺陷追踪系统的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频: 基于Spring Boot的软件缺陷追踪系统的设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java spri…

GNS3 在 Linux 上的安装指南

文章目录 GNS3 在 Linux 上的安装指南1. 基于 Ubuntu 的发行版安装 GNS32. 基于 Debian 的安装3. 基于 ArchLinux 的安装4. 从 Pypi 安装 GNS35. 启动 GNS3 服务端GNS3 在 Linux 上的安装指南 大家好,今天我们来聊聊如何在 Linux 上安装 GNS3。GNS3 是一个非常受欢迎的网络模…

服务器数据恢复-reiserfs文件系统损坏如何恢复数据?

服务器数据恢复环境: 一台IBM X系列服务器,4块SAS硬盘组建一组RAID5阵列,采用的reiserfs文件系统。服务器操作系统分区结构:boot分区LVM卷swap分区(按照前后顺序)。LVM卷中直接划分了一个reiserfs文件系统&…

文心一言接入Promptulate,开发复杂LLM应用程序

简介 最近在尝试将文心一言的LLM能力接入Promptulate,故写了一篇博客记录一下,Promptulate 是 Promptulate AI 旗下的大语言模型自动化与应用开发框架,旨在帮助开发者通过更小的成本构建行业级的大模型应用,其包含了LLM领域应用层…

FusionAD:用于自动驾驶预测和规划任务的多模态融合

论文背景 自动驾驶(AD)任务通常分为感知、预测和规划。在传统范式中,AD中的每个学习模块分别使用自己的主干,独立地学习任务。 以前,基于端到端学习的方法通常基于透视视图相机和激光雷达信息直接输出控制命令或轨迹…