【MySql】SQL boy的CRUD操作
文章目录
增删查改:如何操作表中的数据?
关于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关键字的后面会跟上更加复杂的数据表联接。
有一点需要注意的是,数据源不一定是表哦,也可以是一个查询的结果。比如:
红色框里的部分叫做派生表(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)
猜你喜欢
- 【MySql】mysql 将数据库中的所有表结构和数据 导入到另一个库(亲测有效)
- 一、问题描述在本地开发一个功能,需要结合具体数据测试代码是否正确,但服务器上的数据不可随便修改。此时则需要将服务器上某个数据库的表批量导入到本地、而后进行测试。将数据库db1中的所有表及数据(如table1、table2),批量导入到另一个数据库db2中。二、解决方案刚开始自己一直尝试用DataGrip、Navicat的sql/csv格式导入导出,总有错误或者遗漏,比如报错中止、50张表却只导入32张等,可能是操作方式有误或者数据格式有问题。也试过用sql语句,但仍失败。经查阅资料、尝试多次,终
- 【MySQL】索引有哪些优缺点
- 索引是数据库中用于提高查询性能的重要工具,但它也有一些有点和确定,一下是索引的主要优缺点:优点: 1. 加速查询速度最显而易见的有嗲你是加速select查询速度。通过使用索引,数据库引擎能够更快的定位和检索数据,特别是在大型数据集中。 2. 排序性能提升索引可以提高排序操作的性能,因为数据库引擎可以按照索引顺序而不是表中实际物理存储顺序来执行排序。 3. 唯一
- 【MySql】Centos7 安装 MySQL5.7 步骤
- Centos7 安装 MySQL5.7 步骤(一)、使用yum源方式安装4.1 开启mysql的远程访问权限4.2 为firewalld添加开放端口33064.3 远程连接测试3.1 启动mysql并查看状态3.2 获取临时密码3.3 登录mysql3.4 修改登录密码2.1 下载mysql的yum源配置2.2 安装mysql的yum源2.3 使用yum方式安装mysql2.3.1 安装过程中报错解决1、卸载系统自带 mariadb2、下载并安装MySQL官方的 Yum3、使用并设置mysql4
- 【MySQL】 复合查询 | 内外连接
- 文章目录1. 复合查询unionunion all单行子查询多行子查询多列子查询in关键字all关键字any关键字多表笛卡尔积自连接在where子句使用子查询在from子句中使用子查询合并查询2. 内连接3. 外连接左外连接右外连接1. 复合查询多表笛卡尔积显示雇员名、雇员工资以及所在部门的名字由于员工 信息属于 emp表 而所在部门名字属于 dept表 数据来自不同的表,所以需要进行多表查询表示从 emp (员工表) 和dept (部门表)
- 【MySQL】一文带你了解数据库约束
- 文章目录1. 约束类型2.PRIMARY KEY:主键约束3.FOREIGN KEY:外键约束4.NOT NULL:非空约束5.UNIQUE:唯一约束5.DEFAULT:默认值约束6.总结1. 约束类型作用: 数据库约束是用于限制数据输入或数据更新的规则。数据库约束确保在表中只能插入符合规则的数据,以确保数据的完整性和一致性。 常见的数据库约束包括:主键约束:用于唯一标识表中的每一行数据,确保数据唯一性和完整性。外键约束:用于确保表之间数据的关系
- 【MySql】MySql给数据库表添加新字段
- 要在MySQL中添加新字段,您可以使用ALTER TABLE语句。以下是添加新字段的基本语法:ALTER TABLE table_name ADD column_name datatype;其中:table_name 是您要在其中添加新字段的表的名称。column_name 是新字段的名称。datatype 是新字段的数据类型。例如,VARCHAR、INT或DOUBLE等。以下是一个示例ALTER TABLE语句,演示如何向名为user的表添加一
- 【MySql】深入解析数据库索引
- 写在前面 MySQL索引是数据库中一个关键的概念,它可以极大地提高查询性能,加快数据检索速度。但是,要充分发挥索引的作用,需要深入理解它们的工作原理和使用方式。在本文中,我们将深入解析MySQL索引,探讨它们的重要性、类型、创建、维护以及最佳实践。一、基础介绍 1.1 什么是索引?在数据库中,索引是一种数据结构,用于快速查找表中的数据。索引包含表中一列或多列的值,这些值按照一定的顺序进行排序,以便优化数据的检索速度。通过使用索引,数据库可以避免全表扫描,从而提高查询
- 【MySQL】初识数据库
- 第一篇:初识数据库#一、数据库管理软件的由来#基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问一个文件仅仅只能存在于某一台机器上。 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件都运行在一台机器上,那么用文件存取数据,并没有问题。 很不幸,这些假设都是你自己意淫出来的,上诉假设存在以下几个问题:1.程序所有的组件就不可能运行在一台机器上##因为这台机器一旦挂掉则意味着整个软件的崩溃,并且程序的执行效率依赖于承载它的硬件,而一台机器的性能