MySQL第三讲·SQL boy的CRUD操作

news2024/11/26 4:37:07

在这里插入图片描述

你好,我是安然无虞。

文章目录

  • 增删查改:如何操作表中的数据?
    • 添加数据
      • 插入数据记录
      • 插入查询结果
    • 删除数据
    • 修改数据
    • 查询数据
      • select|where|group by|having
      • from
      • order by
      • limit

增删查改:如何操作表中的数据?

关于SQL的CRUD操作是很重要的,有些公司面试的时候会要求我们写一些SQL,我上次面试字节的时候就遇到了(手动狗头)。

在我们的超市项目中,我们给用户设计好了一个数据库demo.goodsmaster,定义好了里面的字段以及各种约束,如下:

mysql> desc demo.goodsmaster;
+---------------+--------------+------+-----+---------+--+
| Field         | Type         | Null | Key | Default |Extra        |
+---------------+------------+------+-----+---------+------------+
| itemnumber    | int        | NO   | PRI | NULL    |auto_increment |
| barcode       | text       | NO   |     | NULL    |                |
| goodsname     | text       | NO   |     | NULL    |                |
| specification | text       | YES  |     | NULL    |                |
| unit          | text       | YES  |     | NULL    |                |
| price         | decimal(10,2)| NO   |     | NULL    |              |
+---------------+------------+------+-----+---------+----------------+
6 rows in set (0.02 sec)

OK,下面我们对这张表进行操作。

添加数据

首先添加数据的语法结构如下:

insert into 表名 [(字段名 [,字段名] ...)] values (值的列表);

这里的’[ ]'表示里面的内容可选,也就是说,根据MySQL的语法要求,写不写都可以。

添加数据分为两种情况:插入数据记录和插入查询结果。下面进行分别介绍:

插入数据记录

MySQL支持的数据插入操作十分灵活,你既可以通过给表里面所有的字段赋值,完整的插入一条数据记录,也可以在插入记录的时候,只给部分字段赋值。

还是上面的demo.goodsmaster表,其中包括了itemnumber, barcode, goodsname, specification, unit 和 price共6个字段。

我想要插入一条数据记录,其中包括了所有字段的值,就可以这样操作:

insert into demo.goodsmaster
(itemnumber, barcode, goodsname, specification, unit, price)
values (4, '0003', '尺子', '三角形', '把', 5);

运行这条SQL,然后对数据表进行查询:

mysql> select *
    -> from demo.goodsmaster;
+------------+---------+-----------+---------------+------+-------+
| itemnumber | barcode | goodsname | specification | unit | price |
+------------+---------+-----------+---------------+------+-------+
|          4 | 0003    | 尺子      | 三角型        ||  5.00 |
+------------+---------+-----------+---------------+------+-------+
1 row in set (0.01 sec)

那如果我想插入一条记录,但是只给部分字段赋值,可以不?

比如说,客户有个商品,需要马上上线销售,目前只知道条码、名称和价格,其他的信息暂不录入,等之后再补,可以实现吗?

我们来尝试只给3个字段赋值,看看实际操作可以吗?

insert into demo.goodsmaster
(
-- 这里只给3个字段赋值,itemnumber、specification、unit不赋值
  barcode,
  goodsname,
  price
)
VALUES
(
  '0004',
  '测试',
  10
);

运行这条SQL语句,我们来查询表的数据,就会发现是可以的。

mysql> select *
    -> from demo.goodsmaster;
+------------+---------+-----------+---------------+------+-------+
| itemnumber | barcode | goodsname | specification | unit | price |
+------------+---------+-----------+---------------+------+-------+
|          4 | 0003    | 尺子      | 三角型        ||  5.00 |
|          5 | 0004    | 测试      | NULL          | NULL | 10.00 |
+------------+---------+-----------+---------------+------+-------+
2 rows in set (0.00 sec)

我们之所以能够在插入一条数据记录的时候,只给部分字段赋值,原因在于我们对字段的定义方式。

那字段是怎么定义的呢,我们来查看一下表的结构,看看各个字段的定义:

mysql> desc demo.goodsmaster;
+---------------+---------------+------+-----+---------+----------------+
| Field         | Type          | Null | Key | Default | Extra          |
+---------------+---------------+------+-----+---------+----------------+
| itemnumber    | int           | NO   | PRI | NULL    | auto_increment |
| barcode       | text          | NO   |     | NULL    |                |
| goodsname     | text          | NO   |     | NULL    |                |
| specification | text          | YES  |     | NULL    |                |
| unit          | text          | YES  |     | NULL    |                |
| price         | decimal(10,2) | NO   |     | NULL    |                |
+---------------+---------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

可以看到,我们刚刚在插入数据的时候没有明确赋值的3个字段,都有着各自的特点。

specification和unit都可以是空值,而itemnumber则定义了自增约束。

我们在插入一条数据记录的时候,必须要考虑字段约束的3种情况。

  • 如果字段允许为空,而我们没有给它赋值,那么MySQL会自动给它赋与空值。在刚刚的代码中,specification和unit字段都允许为空,因此,如果数据插入语句没有指定这几个字段的值,MySQL会自动插入空值;
  • 如果字段是主键,就不能为空,这个时候,MySQL会按照我们添加的约束进行处理。比如字段itemnumber 是主键,不能为空,而我们定义了自增约束,所以MySQL自动在之前的最大值基础上增加1;
  • 如果有一个字段定义不能为空,又不是主键,当你插入一条数据记录的时候,就必须给这个记录赋值。

如果我们违反了字段的约束限制,会出现什么情况呢?

比如说,我们尝试把表demo.goodsmaster的字段specification改为不能为空:

alter table demo.goodsmaster
modify specification text not null;

运行这个 SQL 语句,系统会提示错误,原因就是我们刚才部分插入了一条数据记录,没有给字段“specification”赋值,这跟我们给字段“specification”添加非空约束的操作冲突了。

因此我们需要删除表中spcification值为空的数据记录,然后再修改字段约束:

delete from demo.goodsmaster
where itemnumber=5;

删除数据记录之后,在运行上面的语句,给字段specification添加非空约束,就成功了。

现在我们来验证一下非空约束。我们尝试部分插入一条数据记录,不给字段specification赋值:

insert into demo.goodsmaster
(barcode, goodsname, price)
values ('0004', '测试', 10);

运行这个SQL语句,MySQL会报错,提示字段specification没有默认值。也就是说,这个字段不能为空,如果插入数据时不给它赋值,就必须给它一个默认值。

现在我们清楚了,部分插入一条数据记录是可以的,但前提是,没有赋值的字段,一定要让MySQL知道如何处理,比如可以为空、有默认值,或者是自增约束字段,等等,否则,MySQL会提示错误。

在实际工作中呢,一次只插入一条数据,有时候会不够用。

所以接下来我们来讲解MySQL中的另外一种数据插入操作:把查询结果插入到数据表中。

插入查询结果

MySQL支持把查询的结果插入到数据表中,我们可以指定字段,甚至是数值,插入到数据表中。语法结构如下:

insert into 表名 (字段名)
select 字段名或值
from 表名
where 条件

好了,添加数据的操作就讲完了,现在我们知道了,我们给一张数据表插入一条数据记录的时候,可以给所有的字段赋值,也可以给部分字段赋值,这取决于字段的定义。

如果字段不能为空并且没有默认值,就必须赋值。另外,我们还可以通过把一个查询结果插入数据表中的方式,提高添加数据的效率。

删除数据

数据删除的语法很简答,如下:

delete from 表名
where 条件

如果我们现在想把刚才用过的表 demo.goodsmaster 里的内容清理一下,删除全部数据,可以通过下面的 SQL 语句来实现:

delete from demo.goodsmaster;

这里给出一个建议是:我们要习惯删除数据的时候,添加条件语句where,防止误操作。

假如我们的数据表 demo.goodsmaster 中有如下数据记录:

mysql> select *
    -> from demo.goodsmaster;
+------------+---------+-----------+---------------+------+-------+
| itemnumber | barcode | goodsname | specification | unit | price |
+------------+---------+-----------+---------------+------+-------+
|          4 | 0003    | 尺子      | 三角型        ||  5.00 |
|          5 | 0004    | 测试      | NULL          | NULL | 10.00 |
+------------+---------+-----------+---------------+------+-------+
2 rows in set (0.00 sec)

如果我们要删除表中所有数据,可以这样写:

delete from demo.goodsmaster where itemnumber > 1;

修改数据

MySQL修改数据的语法:

update 表名
set 字段名=where 条件

注意:不要修改主键字段的值,因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。

查询数据

select|where|group by|having

我们来看看查询语句的语法结构:

select *|字段列表
from 数据源
where 条件
group by 字段
having 条件
order by 字段
limit 起始点,行数

在这些字段中,select、where、group by和having 比较好理解,我们只需要知道它们的含义就行了:

  • select:查询关键字,表示我们要做一个查询。“ * ”是一个通配符,表示我们要查询表中的所有字段。当然了,我们也可以将表中要查询的字段罗列出来,这样的话,查询的结果中可以只显示你想要查询的字段内容。
  • where:表示查询条件。我们可以把要查询的数据所满足的条件,放在where关键字之后。
  • group by:作用是告诉MySQL,查询结果要如何分组,经常与MySQL的聚合函数一起使用。
  • having:用于筛选查询结果,跟where类似。

from、order by和 limit相对来说比较复杂,需要注意的地方比较多,请接着看:

from

from关键字标识查询的数据源。我们现在只学习了单个数据库,后面我们在学习关联表的时候,from关键字的后面会跟上更加复杂的数据表联接。

有一点需要注意的是,数据源不一定是表哦,也可以是一个查询的结果。比如:

img

红色框里的部分叫做派生表(derived table),或者子查询(subquery),意思是我们把一个查询结果数据集当做一个虚拟的数据表来看待。

MySQL中规定,必须要用AS关键字给这个派生表起一个别名。也就是上图的‘a’.

order by

ORDER BY 的作用,是告诉 MySQL,查询结果如何排序。ASC 表示升序,DESC 表示降序。

举个简单的小例子,带你看看 ORDER BY 是怎么使用的(这里我们仍然假设字段“specification”和“unit”允许为空)。我们向表 demo.goodsmaster 中插入 2 条数据:

insert into demo.goodsmaster
(
  barcode,
  goodsname,
  price
)
values
(
  '0003',
  '尺子1',
  15
);
insert into demo.goodsmaster
(
  barcode,
  goodsname,
  price
)
values
(
  '0004',
  '测试1',
  20
);

如果我们不控制查询结果的顺序,就会得到这样的结果:

mysql> select *
    -> from demo.goodsmaster;
+------------+---------+-----------+---------------+------+-------+
| itemnumber | barcode | goodsname | specification | unit | price |
+------------+---------+-----------+---------------+------+-------+
|          4 | 0003    | 尺子      | 三角型        ||  5.00 |
|          5 | 0004    | 测试      | NULL          | NULL | 10.00 |
|          6 | 0003    | 尺子1     | NULL          | NULL | 15.00 |
|          7 | 0004    | 测试1     | NULL          | NULL | 20.00 |
+------------+---------+-----------+---------------+------+-------+
4 rows in set (0.00 sec)

如果我们使用 ORDER BY 对查询结果进行控制,结果就不一样了:

mysql> select *
    -> from demo.goodsmaster
    -> order by barcode asc, price desc;
+------------+---------+-----------+---------------+------+-------+
| itemnumber | barcode | goodsname | specification | unit | price |
+------------+---------+-----------+---------------+------+-------+
|          6 | 0003    | 尺子1     | NULL          | NULL | 15.00 |
|          4 | 0003    | 尺子      | 三角型        ||  5.00 |
|          7 | 0004    | 测试1     | NULL          | NULL | 20.00 |
|          5 | 0004    | 测试      | NULL          | NULL | 10.00 |
+------------+---------+-----------+---------------+------+-------+
4 rows in set (0.00 sec)

可以看到,查询结果会先按照字段 barcode 的升序排序,相同 barcode 里面的字段,按照 price 的降序排序。

limit

LIMIT 的作用是告诉 MySQL 只显示部分查询的结果。比如,现在我们的数据表 demo.goodsmaster 中有 4 条数据,我们只想要显示第 2、3 条数据,就可以用 LIMIT 关键字来实现:

mysql> select *
    -> from demo.goodsmaster
    -> limit 1,2;
+------------+---------+-----------+---------------+------+-------+
| itemnumber | barcode | goodsname | specification | unit | price |
+------------+---------+-----------+---------------+------+-------+
|          5 | 0004    | 测试      | NULL          | NULL | 10.00 |
|          6 | 0003    | 尺子1     | NULL          | NULL | 15.00 |
+------------+---------+-----------+---------------+------+-------+
2 rows in set (0.00 sec)

这里的“LIMIT 1,2”中,“1”表示起始位置,MySQL 中,起始位置的起点是 0,1 表示从第 2 条记录开始;“2”表示 2 条数据。因此,“LIMIT 1,2”就表示从第 2 条数据开始,显示 2 条数据,也就是显示了第 2、3 条数据。

最后再补充一点,如果我们把查询的结果插入到表中时,导致主键约束或者唯一性约束被破坏了,就可以用“on duplicate”关键字进行处理。这个关键字的作用是,告诉 MySQL,如果遇到重复的数据,该如何处理。

举个例子: 假设用户有 2 个各自独立的门店,分别有自己的系统。现在需要引入连锁经营的模式,把 2 个店用一套系统统一管理。那么首先遇到的问题就是,需要进行数据整合。下面我们就以商品信息表为例,来说明如何通过使用“on duplicate”关键字,把两个门店的商品信息数据整合到一起。

假设门店 A 的商品信息表是“demo.goodsmaster”,代码如下:

mysql> select *
    -> from demo.goodsmaster;
+------------+---------+-----------+---------------+------+------------+
| itemnumber | barcode | goodsname | specification | unit | salesprice |
+------------+---------+-----------+---------------+------+------------+
|          1 | 0001    || 16||      89.00 |
|          2 | 0002    || 10支装        ||       5.00 |
|          3 | 0003    | 橡皮      | NULL          ||       3.00 |
+------------+---------+-----------+---------------+------+------------+
3 rows in set (0.00 sec)

门店 B 的商品信息表是“demo.goodsmaster1”:

mysql> select *
    -> from demo.goodsmaster1;
+------------+---------+-----------+---------------+------+------------+
| itemnumber | barcode | goodsname | specification | unit | salesprice |
+------------+---------+-----------+---------------+------+------------+
|          1 | 0001    | 教科书    | NULL          | NULL |      89.00 |
|          4 | 0004    | 馒头      |               |      |       1.50 |
+------------+---------+-----------+---------------+------+------------+
2 rows in set (0.00 sec)

假设我们要把门店 B 的商品数据,插入到门店 A 的商品表中去,如果有重复的商品编号,就用门店 B 的条码,替换门店 A 的条码,用门店 B 的商品名称,替换门店 A 的商品名称;如果没有重复的编号,就直接把门店 B 的商品数据插入到门店 A 的商品表中。这个操作,就可以用下面的 SQL 语句实现:

insert into demo.goodsmaster
select * from demo.goodsmaster as a
on duplicate key update barcode = a.barcode, goodsname = a.goodsname;

运行结果如下:

-- 运行结果如下
mysql> select *
    -> from demo.goodsmaster;
+------------+---------+-----------+---------------+------+------------+
| itemnumber | barcode | goodsname | specification | unit | salesprice |
+------------+---------+-----------+---------------+------+------------+
|          1 | 0001    | 教科书    | 16||      89.00 |
|          2 | 0002    || 10支装        ||       5.00 |
|          3 | 0003    | 橡皮      | NULL          ||       3.00 |
|          4 | 0004    | 馒头      |               |      |       1.50 |
+------------+---------+-----------+---------------+------+------------+
4 rows in set (0.00 sec)

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

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

相关文章

C++标准模板(STL)- 类型支持 (类型属性,is_literal_type,is_polymorphic,is_empty)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

uniapp小程序刮刮乐抽奖

使用canvas画布画出刮刮乐要被刮的图片&#xff0c;使用移动清除画布。 当前代码封装为刮刮乐的组件&#xff1b; vue代码&#xff1a; <template><view class"page" v-if"merchantInfo.cdn_static"><image class"bg" :src&q…

强化学习的动态规划二

一、典型示例 考虑如下所示的44网格。 图1 非终端状态为S {1, 2, . . . , 14}。在每个状态下有四种可能的行为&#xff0c;A {up, down, right, left}&#xff0c;这些行为除了会将代理从网格上移走外&#xff0c;其他都会确定性地引起相应的状态转换。因此&#xff0c;例如&…

VMware产品收集日志方法汇总

概述 vCenter日志是一个用于存储与vSphere环境相关的各种活动、事件和警告的日志系统。通过收集并分析vCenter日志&#xff0c;管理员可以获得有关其虚拟化环境的重要洞察和故障排除信息。 vCenter日志由多个组件组成&#xff0c;包括vCenter Server、ESXi主机和其他vSphere组…

软件测试面试题:Web 端测试和 App 端测试有何不同

Web 端测试和 App 端测试是针对不同平台的上的应用进行测试&#xff0c;Web应用和App端的应用实现方式不同&#xff0c;测试时的侧重点也不一样。 今天这篇文章就来介绍下两者的不同之处以及测试时的侧重点。 Web 端应用和 App 端应用的区别 平台兼容性 Web 端应用可以在任何…

C#开源的一个能利用Windows通知栏背单词的软件 - ToastFish

前言 今天给大家推荐一个C#开源且免费的能利用Windows通知栏背单词的软件&#xff0c;可以让你在上班、上课等恶劣环境下安全隐蔽地背单词&#xff08;利用摸鱼时间背单词的软件&#xff09;&#xff1a;ToastFish。 操作系统要求 目前该软件只支持Windows10及以上系统&…

【C语言】C语言⻘蛙跳台阶问题--递归问题

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 本期专栏&#x1f525;&#xff1a;本期将分享一些猜数字小游戏怎么一步一步实现的 &#x1f308;作者寄语 &#x1f308;&#xff1a; 小菜鸟的力量不在于它的体型&#xff0c;而在于它内心…

Fourier分析导论——第3章——Fourier级数的收敛性(E.M. Stein R. Shakarchi)

第 3 章 Fourier级数的收敛性(Convergence of Fourier Series) The sine and cosine series, by which one can represent an arbitrary function in a given interval, enjoy among other remarkable properties that of being convergent. This property did not escape…

nodejs+vue网上商城系统系统-毕业设计

网上商城系统的架构设计通常分为三层&#xff1a;客户端层、应用层和数据层。 客户端层&#xff1a;客户端层是用户与系统交互的界面&#xff0c;包括Web页面、移动App等。用户可以通过客户端层进行商品浏览、下单、支付等操作。应用层&#xff1a;应用层是业务逻辑处理的中心&…

一个 不用氪金 也能让你变强的 VSCode 插件 Ai

哈喽,大家好 我是 彩色之外&#x1f468;&#x1f3fb;‍&#x1f4bb;。今天给大家推荐一款不用充钱也能让你变强的 vscode 插件 通义灵码&#xff08;TONGYI Lingma&#xff09;&#xff0c;可以称之为 Copilot 的替代甜品 &#x1f4aa; &#x1f440; 前期回顾 NPM- 滚动进…

BIOS开发笔记 – 显示

UEFI启动流程跑完前三阶段,UEFI环境的准备基本完成,到BDS阶段的任务就是准备引导OS。在此之前还需要使一些必要的硬件工作起来,比如键盘设备,屏幕等,怎么让屏幕工作呢?简单的说就是执行其相关的UEFI驱动。要注意一下的是,这里所说的驱动并不是屏幕的驱动,而是GPU的驱动…

Proteus仿真--1602LCD随机模拟显示乘法口诀(仿真文件+程序)

本文主要介绍基于51单片机的1602LCD随机模拟显示乘法口诀实验&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中上方主要是1602LCD液晶显示&#xff0c;使用方法点击左下方的按键开关实现不同的乘数切换&#xff0c;按照乘法表进行 仿真运行视频 Prot…

Android Studio的Java项目种运行main()的方法

首先随便在项目里面建一个类 public class TestSocket {public static void main(String[] args) {System.out.println("hahah");}}直接运行时会直接报错的 在项目的 .idea 添加代码 <option name"delegatedBuild" value"false"/> 再…

Centos7安装Elasticsearch和Kibana 记录(无坑版)

说明&#xff1a; 本文命令全部标红 elasticsearch使用版本是7.17.5 ik分词器也是7.17.5 虚拟机配置&#xff1a;2核4g centos版本&#xff1a;7 1、获取elasticsearch的安装包 下载&#xff1a;wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17…

《网络协议》01. 基本概念

title: 《网络协议》01. 基本概念 date: 2022-08-30 09:50:52 updated: 2023-11-04 07:28:52 categories: 学习记录&#xff1a;网络协议 excerpt: 互联网、网络互连模型&#xff08;OSI&#xff0c;TCP/IP&#xff09;、计算机通信基础。 comments: false tags: top_image: /i…

k-means算法c++实现

计算数据集中的元素与各个簇的中心的距离&#xff0c;将它赋给最近的簇&#xff0c;然后重新计算每个簇的平均值&#xff0c;再将元素按离平均值点最近的原则重新分配直到没有出现重新分配 该算法要事先给出k的值&#xff0c;即划分为几个簇。 vector<int> datoclu(dat…

JDBC数据库连接---附通用的CRUD类

文章目录 JDBC数据库连接1 导包2 编写配置文件3 编写连接数据库代码4 测试工具类5 附加1 通用的CRUD类2 测试CURD类3 测试 JDBC数据库连接 本篇文章以 MySQL 数据库为例&#xff0c;若要切换其他数据库&#xff0c;只需修改 resource文件夹中的 jdbc.properties 配置文件即可。…

《实战:如何搭建一个完整的 Vue2.0 项目》- 7、Vue2.x 项目 webpack 4 升级 5(半自动升级)

1.自动升级 先全局安装升级插件 npm i npm-check npm-check-updates -g检查依赖 npm-check更新检查后的依赖并展示版本号&#xff0c;此时 package.json还没有更新 npm-check-updates升级 package.json&#xff0c;下图显示更新版本&#xff0c;此时 package.json文件已变更…

客服管理者如何调动客服人员的积极性?

客户是企业的财富&#xff0c;良好的客户服务体验可以有效地促进企业的销售和声誉&#xff0c;因此&#xff0c;客服工作显得尤为重要。而客服人员的积极性直接影响了整个客服部门的质量和效率。如何调动客服人员的积极性&#xff0c;成为了每个客服管理者都需要面对的难题。本…