【MySQL — 数据库增删改查操作】深入解析MySQL的create insert 操作

  


 数据库CRUD操作 


 1 CRUD简介


CURD是对数据库中的记录进行基本的增删改查操作:



2. Create 新增


语法


INSERT [INTO] table_name[(column [,column] ...)]
VALUES(value_list)[,(value_list)] ...  # value 后面的列的个数和类型,要和表结构匹配value_list: value,[,value] ...

示例



(1) 单行数据全列插入

插入记录时,值的数量必须与表定义的列数量及顺序一致,类型匹配;

mysql> create table student(id int , name varchar(20));
Query OK, 0 rows affected (0.09 sec)mysql> insert into student value(1, '小雷');
Query OK, 1 row affected (0.02 sec)mysql> select*from student;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 小雷   |
+------+--------+
1 row in set (0.00 sec)

    注意:  

  • 按向上的方向键可以查看之前输入的 SQL 指令;
  • 需要确保,创建数据库的时候,指定了字符集是utf8 / gbk 等能支持中文的字符集,比如 mysql 5,默认的字符集是拉丁文;因此,如果发现插入的中文数据出现报错,大概率是创建数据库的时候没有正确指定字符集。

  •  值的数量必须与表定义的列数量及顺序不一致:
mysql> insert into student value(2);
ERROR 1136 (21S01): Column count doesn't match value count at row 1

  •  插入的类型与表结构不匹配:
mysql> insert into student value('小美', 2);
ERROR 1366 (HY000): Incorrect integer value: '小美' for column 'id' at row 1

mysql> insert into student value('100',200);
Query OK, 1 row affected (0.01 sec)mysql> select*from student;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 小雷   |
|  100 | 200    |
+------+--------+
2 rows in set (0.00 sec)

之前定义的列 list (int ,varchar),为什么此时可以成功插入 value('100' , 200) 呢? 


   解析:隐式类型转换    

SQL 中的类型系统,和 Java 差异很大,上述插入数据的时候,value :

  • 第一列写的是字符串类型 '100' ,但是会尝试自动转成 int,'100' => 100
  • 第二列写的是整数类型 200 ,会尝试自动转成字符串,200 => '200'
  • 之前插入 value('小美' , 2) 插入失败的原因是把' 小美 ' 尝试转成 int ,转换失败,就无法完成插入;

隐式类型转换在 Java 中是非常排斥的,但是 SQL 支持;

  • 比较支持隐式类型转换,称为"弱类型系统”
  • 不太支持隐式类型转换,称为"强类型系统”

拓展:关于类型转换,这里引入了 "弱类型系统” 和 "强类型系统” 两个新名词,除此之外,两个类型系统,动态类型和静态类型,但是这两组类型其实是互不相关的概念:

  • 动态类型:程序运行过程中,一个变量的类型,是可以改变的:Python, js, Ruby, PHP.....
  • 静态类型:程序运行过程中,变量的类型不能改变:C,C++,Java

如果 ' 0 ' 通过隐式类型转换,转换的是 0,而不是ASCII码值,因为'0'是一个字符串,而不是一个字符;

mysql> insert into student value('000',200);
Query OK, 1 row affected (0.00 sec)mysql> select*from student;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 小雷   |
|    0 | 200    |
+------+--------+
3 rows in set (0.00 sec)

value 后面插入的是整数/浮点数,直接插入即可,如果是字符串,需要使用" "或者' '引起来 


(2) 单行数据指定列插入

mysql> insert into student(name) value('小美');
Query OK, 1 row affected (0.01 sec)mysql> select*from student;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 小雷   |
| NULL | 小美   |
+------+--------+
4 rows in set (0.00 sec)

NULL 在 sql 中表示 “空”,这个单元格里啥都没写;


插入记录时,值的数量必须与指定列数量及顺序一致:

mysql> insert into student(name, id) value('小雷',666);
Query OK, 1 row affected (0.00 sec)mysql> select*from student;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 小雷   |
| NULL | 小美   |
|  666 | 小雷   |
+------+--------+
5 rows in set (0.00 sec)


(3) 多行数据指定列插入

mysql> insert into student(id, name) values (4, '小帅'), (5, '小明');
Query OK, 2 rows affected (0.13 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> select*from student;
+------+--------+
| id   | name   |
+------+--------+
|    4 | 小帅   |
|    5 | 小明   |
+------+--------+
7 rows in set (0.01 sec)

mysql 是一个"客户端-服务器"结构的程序;

现在我们要插入三条记录,可以一次插入一行,分三个 SQL 完成,也可以一次插入三行,一个 SQL 完成;这两种做法的差别是非常明显的:

如果插入一行,分三次SQL完成,就会涉及到三次客户端和服务器的交互过程;


一次插入三行,一次SQL完成,则只需要进行一次客户端服务器交互即可;


一个 sql 包含的数据多少,不是主要矛盾;除非数据差异太大了,可能有明显影响,如果只是差了几条,区别是不大的;所以客户端-服务器交互过程中,交互的次数越多,整体的开销就越大,花的时间就越长。

上述讨论的,一次插入多行,一次指定列插入,是可以配合使用的:

mysql> insert into student (name) values ('小雷'),('小美'),('小花');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql> select*from student;
+------+--------+
| id   | name   |
+------+--------+
| NULL | 小雷   |
| NULL | 小美   |
| NULL | 小花   |
+------+--------+
10 rows in set (0.00 sec)

(4) 插入时间日期 

mysql> create table mytime(time datetime);
Query OK, 0 rows affected (0.17 sec)mysql>  insert into mytime values('2025-01-23 11:34:00'); #注意插入的时间格式
Query OK, 1 row affected (0.02 sec)mysql> select*from mytime;
+---------------------+
| time                |
+---------------------+
| 2025-01-23 11:34:00 |
+---------------------+
1 row in set (0.00 sec)

有的时候插入的时间日期,希望就是"当前时刻";SQL 作为一个编程语言,也支持一些库函数

mysql> insert into mytime values(now());  # now() -> 获取到当前的时间日期.
Query OK, 1 row affected (0.01 sec)mysql> select*from mytime;
+---------------------+
| time                |
+---------------------+
| 2025-01-23 11:40:08 |
+---------------------+
2 rows in set (0.00 sec)

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

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

相关文章

VSCode下EIDE插件开发STM32

VSCode下STM32开发环境搭建 本STM32教程使用vscode的EIDE插件的开发环境,完全免费,有管理代码文件的界面,不需要其它IDE。 视频教程见本人的 VSCodeEIDE开发STM32 安装EIDE插件 Embedded IDE 嵌入式IDE 这个插件可以帮我们管理代码文件&am…

electron打包客户端在rk3588上支持h265硬解

目录 前言 chromium是如何支持h265硬解 electron/chromium第一次编译 electron/chromium第二次编译 前言 我们的客户端程序是用electron打包的前端程序,其在rk3588主机上的linux环境运行。之前使用客户端查看h264编码的视频直播是没有问题的,但视频源…

An OpenGL Toolbox

3.An OpenGL Toolbox 声明:该代码来自:Computer Graphics Through OpenGL From Theory to Experiments,仅用作学习参考 3.1 Vertex Arrays and Their Drawing Commands 顶点数组及其绘制命令:将几何数据存储在一个位置&#xff0c…

Three城市引擎地图插件Geo-3d

一、简介 基于Three开发,为Three 3D场景提供GIS能力和城市底座渲染能力。支持Web墨卡托、WGS84、GCJ02等坐标系,支持坐标转换,支持影像、地形、geojson建筑、道路,植被等渲染。支持自定义主题。 二、效果 三、代码 //插件初始化…

侧边导航(Semi Design)

根据前几次的导航栏设计,从最简单的三行导航栏到后面响应式的导航栏,其实可以在这个的基础上慢慢优化,就可以得到一个日常使用设计的导航栏。设计步骤也和之前的类似。 一、实现步骤 1、先下载安装好npm install douyinfe/semi-icons 2、引…

【中间件快速入门】什么是Redis

现在后端开发会用到各种中间件,一不留神项目可能在哪天就要用到一个我们之前可能听过但是从来没接触过的中间件,这个时候对于开发人员来说,如果你不知道这个中间件的设计逻辑和使用方法,那在后面的开发和维护工作中可能就会比较吃…

将 OneLake 数据索引到 Elasticsearch - 第二部分

作者:来自 Elastic Gustavo Llermaly 及 Jeffrey Rengifo 本文分为两部分,第二部分介绍如何使用自定义连接器将 OneLake 数据索引并搜索到 Elastic 中。 在本文中,我们将利用第 1 部分中学到的知识来创建 OneLake 自定义 Elasticsearch 连接器…

“AI教学实训系统:打造未来教育的超级引擎

嘿,各位教育界的伙伴们,今天我要跟你们聊聊一个绝对能让你们眼前一亮的教学神器——AI教学实训系统。作为资深产品经理,我可是亲眼见证了这款系统如何颠覆传统教学,成为未来教育的超级引擎。 一、什么是AI教学实训系统&#xff1f…

Linux下php8安装phpredis扩展的方法

Linux下php8安装phpredis扩展的方法 下载redis扩展执行安装编辑php.ini文件重启php-fpmphpinfo 查看 下载redis扩展 前提是已经安装好redis服务了 php-redis下载地址 https://github.com/phpredis/phpredis 执行命令 git clone https://github.com/phpredis/phpredis.git执行…

基于SMPL的三维人体重建-深度学习经典方法之VIBE

本文以开源项目VIBE[1-2]为例,介绍下采用深度学习和SMPL模板的从图片进行三维人体重建算法的整体流程。如有错误,欢迎评论指正。 一.算法流程 包含生成器模块和判别器模块,核心贡献就在于引入了GRU模块,使得当前帧包含了先前帧的先…

2.1.3 第一个工程,点灯!

新建工程 点击菜单栏左上角,新建工程或者选择“文件”-“新建工程”,选择工程类型“标准工程”选择设备类型和编程语言,并指定工程文件名及保存路径,如下图所示: 选择工程类型为“标准工程” 选择主模块机型&#x…

CVE-2025-0411 7-zip 漏洞复现

文章目录 免责申明漏洞描述影响版本漏洞poc漏洞复现修复建议 免责申明 本文章仅供学习与交流,请勿用于非法用途,均由使用者本人负责,文章作者不为此承担任何责任 漏洞描述 此漏洞 (CVSS SCORE 7.0) 允许远程攻击者绕…

mysql 学习6 DML语句,对数据库中的表进行 增 删 改 操作

添加数据 我们对 testdatabase 数据中 的 qqemp 这张表进行 增加数据,在这张表 下 打开 命令行 query console 在 软件中就是打开命令行的意思 可以先执行 desc qqemp; 查看一下当前表的结构。 插入一条数据 到qqemp 表,插入时要每个字段都有值 insert…

[特殊字符]【计算机视觉】r=2 采样滤波器全解析 ✨

Hey小伙伴们!今天来给大家分享一个在 计算机视觉 领域中非常有趣但又超级重要的概念——r2 采样滤波器(Sampling Filter with r2)。通过这种滤波器,我们可以在图像降采样的过程中有效地减少混叠效应,提升图像质量。 如…

数据库SQLite和SCADA DIAView应用教程

课程简介 此系列课程大纲主要包含七个课时。主要使用到的开发工具有:SQLite studio 和 SCADA DIAView。详细的可成内容大概如下: 1、SQLite 可视化管理工具SQLite Studio :打开数据库和查询数据;查看视频 2、创建6个变量&#x…

【开源免费】基于Vue和SpringBoot的景区民宿预约系统(附论文)

本文项目编号 T 162 ,文末自助获取源码 \color{red}{T162,文末自助获取源码} T162,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

[Spring] Gateway详解

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

Pandas基础02(DataFrame创建/索引/切片/属性/方法/层次化索引)

DataFrame数据结构 DataFrame 是一个二维表格的数据结构,类似于数据库中的表格或 Excel 工作表。它由多个 Series 组成,每个 Series 共享相同的索引。DataFrame 可以看作是具有列名和行索引的二维数组。设计初衷是将Series的使用场景从一维拓展到多维。…

矩阵快速幂

矩阵快速幂: 高效计算矩阵的幂次(如A^n)的一种算法,只适用于计算某一项,而不是全部项。 递推公式 如果 n为偶数,则: A^nA^(n/2)A^(n/2) 如果 nnn 为奇数,则: A^nA^(n-1…

复位信号的同步与释放(同步复位、异步复位、异步复位同步释放)

文章目录 背景前言一、复位信号的同步与释放1.1 同步复位1.1.1 综述1.1.2 优缺点 1.2 recovery time和removal time1.3 异步复位1.3.1 综述1.3.2 优缺点 1.4 同步复位 与 异步复位1.5 异步复位、同步释放1.5.1 总述1.5.2 机理1.5.3 复位网络 二、思考与补充2.1 复…