当前位置: 首页 > news >正文

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

原因;

相关文章:

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

目录 一 . 存储:一个完整的数据存储过程是怎样的? 1.1 数据存储过程 1.1.1 创建MySQl 数据库 1.1.1.1 为什么我们要先创建一个数据库,而不是直接创建数据表? 1.1.1.2基本操作部分 1.2 选择索引问题 二 . 字段:这么多的…...

linux启动jar 缺失lib

linux启动jar包时,找不到报错 [rootebs-141185 xl-admin]# java -Djava.library.path/home/kabangke/xl-admin/lib -jar /home/kabangke/xl-admin/xl-admin.jar Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/web/se…...

【Bash】常用命令总结

文章目录 1. 文件查询1.1 查看文件夹内(包含子文件夹)文件数量1.2 查看文件夹大小 任务简介: 对bash常用命令进行总结。 任务说明: 对平时工作中使用bash的相关命令做一个记录和说明,方便以后查阅。 1. 文件查询 1.…...

小研究 - Java虚拟机性能及关键技术分析

利用specJVM98和Java Grande Forum Benchmark suite Benchmark集合对SJVM、IntelORP,Kaffe3种Java虚拟机进行系统测试。在对测试结果进行系统分析的基础上,比较了不同JVM实现对性能的影响和JVM中关键模块对JVM性能的影响,并提出了提高JVM性能的一些展望。…...

Repo manifests默认default.xml清单文件中的各个标签详解

Repo简介 “Repo” 是一个用于管理多个Git存储库的工具,通常与Google的Android开发项目一起使用。它允许您在一个命令下轻松地进行多个Git存储库的同步、下载和管理。 repo下载安装 从清华镜像源下载 mkdir ~/bin PATH~/bin:$PATH curl https://mirrors.tun…...

javacv基础02-调用本机摄像头并预览摄像头图像画面视频

引入架包&#xff1a; <dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.5.5-1</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId…...

【Nginx21】Nginx学习:FastCGI模块(三)缓冲区与响应头

Nginx学习&#xff1a;FastCGI模块&#xff08;三&#xff09;缓冲区与响应头 缓存相关的内容占了 FastCGI 模块将近一小半的内容&#xff0c;当然&#xff0c;用过的人可能不多。而今天的内容说实话&#xff0c;我平常也没怎么用过。第一个是缓冲区相关的知识&#xff0c;其实…...

正则表达式(常用字符简单版)

量词 字符类 边界匹配 分组和捕获 特殊字符 字符匹配 普通字符&#xff1a;普通字符按照字面意义进行匹配&#xff0c;例如匹配字母 "a" 将匹配到文本中的 "a" 字符。元字符&#xff1a;元字符具有特殊的含义&#xff0c;例如 \d 匹配任意数字字符&#xf…...

从零开始学习Python爬虫:详细指南

导言&#xff1a; 随着互联网的迅速发展&#xff0c;大量的数据可供我们利用。而Python作为一种简单易学且功能强大的编程语言&#xff0c;被广泛应用于数据分析和处理。学习Python爬虫技术&#xff0c;能够帮助我们从互联网上获取数据&#xff0c;并进行有效地分析和利用。本文…...

分布式计算框架:Spark、Dask、Ray

目录 什么是分布式计算 分布式计算哪家强&#xff1a;Spark、Dask、Ray 2 选择正确的框架 2.1 Spark 2.2 Dask 2.3 Ray 什么是分布式计算 分布式计算是一种计算方法&#xff0c;和集中式计算是相对的。 随着计算技术的发展&#xff0c;有些应用需要非常巨大的计算能力才…...

什么是伪类链(Pseudo-class Chaining)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Pseudo-class Chaining⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚…...

每日一题:leetcode 57 插入区间

给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。 示例 1&#xff1a; 输入&#xff1a;intervals [[1,3…...

第五节:实现自己的第一个environment

本专栏是强化学习运用在买卖股票之上的入门学习内容。 主要解决强化学习代码落地和代码实践,不需要学习相关数学原理,直观简单的带领读者入门强化学习炒股。 查看本专栏完整内容,请访问:https://blog.csdn.net/windanchaos/category_12391143.html 本文发布地址:https://b…...

无套路,财务数据分析-多组织损益表分析分享

在报表众多的财务数据分析中&#xff0c;损益表是老板们最关注的报表&#xff0c;特别是当有多组织时&#xff0c;损益表的分析就变得更加重要了。以前受限于数据分析工具&#xff0c;做损益表分析时很难做到多维度灵活分析&#xff0c;但随着BI数据可视化工具的发展&#xff0…...

Java并发编程第6讲——线程池(万字详解)

Java中的线程池是运用场景最多的并发框架&#xff0c;几乎所有需要异步或并发执行任务的程序都可以使用线程池&#xff0c;本篇文章就详细介绍一下。 一、什么是线程池 定义&#xff1a;线程池是一种用于管理和重用线程的技术&#xff08;池化技术&#xff09;&#xff0c;它主…...

AI + Milvus:将时尚应用搭建进行到底

在上一篇文章中&#xff0c;我们学习了如何利用人工智能技术&#xff08;例如开源 AI 向量数据库 Milvus 和 Hugging Face 模型&#xff09;寻找与自己穿搭风格相似的明星。在这篇文章中&#xff0c;我们将进一步介绍如何通过对上篇文章中的项目代码稍作修改&#xff0c;获得更…...

归并排序(Java 实例代码)

目录 归并排序 一、概念及其介绍 二、适用说明 三、过程图示 四、Java 实例代码 MergeSort.java 文件代码&#xff1a; 归并排序 一、概念及其介绍 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效、稳定的排序算法&#xff0c;该算法是采用分…...

【VUE】数字动态变化到目标值-vue-count-to

vue-count-to是一个Vue组件&#xff0c;用于实现数字动画效果。它可以用于显示从一个数字到另一个数字的过渡动画。 插件名&#xff1a;vue-count-to 官方仓库地址&#xff1a;GitHub - PanJiaChen/vue-countTo: Its a vue component that will count to a target number at a…...

Mysql /etc/my.cnf参数详解(二)

#buffer相关 #buffer pool根据实际内存大小调整,标准为物理内存的50% innodb_buffer_pool_size15996M //默认值128M&#xff0c;innodb_buffer_pool_size | 134217728 key_buffer_size 33554432 #根据物理内存大小设置 确保每个instance内的内存2G左右 <5000 1,>5000 &…...

AUTOSAR规范与ECU软件开发(实践篇)6.10AUTOSAR操作系统概念与配置方法介绍(下)

目录 2、 RTA-OS工程创建 3、 AUTOSAR操作系统配置方法 (1) 描述文件导入 (2) Counter配置...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...