MySQL表的增删查改

文章目录

  • 前言
  • 一、新增表
    • [1.1 新增表操作](#1.1 新增表操作)
    • [1.2 指定列操作](#1.2 指定列操作)
    • [1.3 新增多行数据](#1.3 新增多行数据)
  • 二、查询表
    • [2.1 全列查询](#2.1 全列查询)
    • [2.2 指定列查询](#2.2 指定列查询)
    • [2.3 查询字段为表达式](#2.3 查询字段为表达式)
    • [2.4 别名](#2.4 别名)
    • [2.5 查询去重](#2.5 查询去重)
    • [2.6 查询的时候排序](#2.6 查询的时候排序)
    • [2.7 条件查询](#2.7 条件查询)
    • [2.8 分页查询](#2.8 分页查询)
  • 三、修改(更新)
  • 四、删除操作

前言

MySQL表的增删查改(CRUD)是数据库中非常基础的部分,也是后端开发日常工作中,最重要的一项工作,这次小编所要讲述的就是MySQL表的增删查改的基础操作。


一、新增表

表的新增有三种操作:新增表(全表),指定列操作,多行插入。

1.1 新增表操作

语法形式:insert into 表名 values (值,值...);

此处的values也是一个关键字,表示后面跟上的就是需要插入的内容

此处的值,要和列进行匹配,列的个数和类型都需要匹配上。

MySQL操作

在这里插入一组表的内容:id为1、姓名为张三、出生日期2003年的6月7号的12点,语文成绩88.5,数学成绩90,英语成绩67。

在这里姓名是字符串类型的,使用单引号或者双引号引起来的都可以表示字符串,SQL没有字符这个类型。引号内的值可以是中文,但是需要在创建数据库的时候指定字符集,因为MySQL默认的是拉丁文,不支持中文。

下一个为出生日期,出生日期肯定为一个时间类型,在MySQL中时间类型为datetime,那么datatime类型如何进行插入呢?这里可以使用两种方法:第一种用一个固定格式的字符串表示时间日期。具体格式可以参考小编所写的LocalDateTime类。第二种就是如果想要填写的时间日期就是当前时刻,sql在datatime类中提供一种方法叫做now(),表示当前时间。如下图,这里小编写完顺便显示出来,显示表的方法后面小编会讲述。select * from + 表名可以查询表中所有的数据。

1.2 指定列操作

指定插入这个表的某几列,其他列不插入。只插入某列,其他列将会被填充为默认值。

语法形式

insert into 表名(列名,列名...) values (值,值...);

在这里后面的值要和前面的列进行匹配上,后面的值的个数、类型都要和前面括号内的列名相匹配。

注意:(列名,列名)这里的括号不能删除。

MySQL操作

在这里只是指定哪一列进行插入数据,此时看到表中数据,赵六这里除了插入的数据,其他没有插入的数据默认为NULL。

1.3 新增多行数据

进行新增表中数据的操作,不仅可以插入一行,还可以同时插入多行。一次插入多行记录相比于一次插入一行分多次插入,效率要快不少。因为从客户端请求给到服务器,服务器需要进行一系列操作返回响应,然后再插入下一行数据。而多行插入则是多条数据同时进行请求,然后服务器处理返回响应,省去了很多中间的时间。

语法形式

insert into 表名 values(值,值...) , (值,值...);

这里每一个括号就是一行数据

MySQL操作

在这里连续假如两行数据分别是韩信和安琪拉。


二、查询表

查询操作是MySQL最复杂的操作,里面涉及多项查询操作,需要多加练习。

2.1 全列查询

全列查询就是把表中的所有行所有列都查询出来。MySQL是一个"客户端-服务器"结构的软件。这里查询出来后,服务器通过网络把这些数据返回给客户端,并且在客户端以表格的形式打印出来。

语法形式

select * from 表名;

*代表通配符,可以代指所有的列

MySQL操作

select*操作,其实也是一个危险操作。

为什么这么说呢?MySQL是一个"客户端-服务器"结构的程序。客户端这里进行的操作就会通过请求发送给服务器,服务器查询的结果也就会通过响应返回给客户端。使用selece*操作就会把所有的数据表全部查询返回打印,如果当前数据库表中数据特别多,就会产生问题。

  1. 读取硬盘,把硬盘的IO跑满,此时程序的其他部分想要访问硬盘,就会特别慢。
  2. 操作网络,也可能把网卡的带宽跑满(这里相信读者也深有体会,假如宿舍装了一个宽带,然后有个人在下大型游戏,于是你打游戏的时候网路就会特别卡顿),此时其他的客户端想通过网络访问服务器,也会非常慢。

这样的拥堵,就可能导致客户端无法顺利访问到数据库,进一步也就对整个系统造成影像,相当于数据库服务器挂了。

2.2 指定列查询

一个表的列数,可能是非常多的,某些场景下的操作,只需要关注其中的几个列,此时就可以使用指定列查询的操作。

语法形式

select 列名,列名... from 表名;

MySQL操作

在这里查询字段只会查询三个字段的数据并且显示出来,而不会显示其他的数据内容。

2.3 查询字段为表达式

在查询的时候,写作由列名构成的表达式,把这一列的所有行都带入表达式中参与运算。

比如:SQL在查询的时候,可以进行一些简单的统计操作。

统计每个人所有科目的总和成绩:slelect 想要显示的字段或者表达式(注意用逗号隔开) from + 表名。

又或者数学的分数减去10分

注意:这里的操作不会修改数据库服务器上的原始数据,只是在最终响应显示的临时结果中做了计算。进行查询的时候,是把服务器这里的数据读出来,返回给客户端,并且以临时表的形式进行展示。

2.4 别名

如果表达式比较复杂,此时查询的结果不容易理解,因此在查询的时候,可以指定一个别名。为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称。

语法形式

select 表达式 as 别名 from 表名;

MySQL操作

2.5 查询去重

语法形式

select distinct + 某列名 from + 表名;

select distinct + 某列名,某列名 from + 表名;

MySQL操作

  1. 首先看到select distinct + 某列名 from + 表名,这个语法形式表示如果在这里列中存在相同的值则只会保留一个。

    在上面赵六在原来数据表中存在两个,此时使用distinct查询name这个列,它会去除相同的值,所以在返回打印出来是数据表当中只存在一个赵六。

  2. select distinct + 某列名,某列名 from + 表名,在这里去重存在多个列,表示要所有的查询的列都相同才会进行去重。

在这里为了验证,小编在这里再加上一个安琪拉的名字,但是生日和成绩等都不同

然后查询名字和出生日期进行查重

在这里显示了一个赵六不见了,但是两个安琪拉还存在,这是因为虽然安琪拉的名字都相同,但是他们的生日是不同的,使用多列查询需要满足索要查询的所有列都相同才会去重。

2.6 查询的时候排序

在这里以行进行排序,也就是根据某一个列的值进行排序后,整一行都进行变动。

在进行排序的时候主要遵守以下两个规则:

  1. 针对哪个列进行比较排序
  2. 排序的时候是升序还是降序。

语法形式

selsect 列名 from 表名order by 列名 asc/desc;

asc代表升序,desc代表降序,如果什么都不写则默认升序

在这里order是排序的意思,order by顾名思义就是根据哪一列进行排序。在这里具体的mysql中,首先客户端把请求发送给服务器,服务器进行查询数据,并且把查询到的数据进行排序,在组织成响应数据返回给客户端。排序依然是针对临时数据来展开的,此处的排序不影响原有数据在mysql服务器上的存储顺序。

MySQL操作

根据数学成绩排名,从上往下。除此之外2、order by还可以针对表达式进行排序。

在这里可以看到两个赵六的总成绩为null,但是在前面的时候赋值语文和英语是存在成绩的,这是为什么为空值呢?这是因为null参与各种运算结果都是null,这一点需要记住。

3、order by 还可以指定多个列进行排序,order by后面可以写多个列使用逗号进行分开,排序的时候从第一个列名开始排序,如果碰到第一个列名值相同的情况下,按照下一个列进行排序。在下列表中首先添加一个赵云学生。

查询的时候排序,先按照语文成绩从小到大排序,语文成绩相同的情况下然后再按照数学成绩从小到大排序。

在这里可以看到韩信和赵云的语文成绩是相同的,但是数学成绩韩信的更低,所以排名韩信在前,赵云在后。

2.7 条件查询

条件查询根据制定具体的条件,按照条件针对数据进行筛选。

语法形式

select 列名 from 表名 where 条件

通过遍历这个表的每一行记录,把每一行的数据分别带入到条件当中。如果条件成立,这个记录会被放入成果集合当中,如果条件不成立,这个记录则会被过滤。进行条件判断则需要条件运算符。

条件运算符主要有一些几种

  1. 比较运算符
运算符 说明
>,>=,<,<= 大于,大于等于,小于,小于等于
= 等于,NULL不安全,例如NULL = NULL结果为NULL
<=> 等于,NULL安全,例如NULL<=>NULL的结果是真
!=,<> 不等于
BETWEEN a0 AND a1 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)
IN (option, ...) 如果是 option 中的任意一个,返回 TRUE(1)
IS NULL 是 NULL
IS NOT NULL 不是 NULL
LIKE 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符
  1. 逻辑运算符
运算符 说明
AND 逻辑与,多个条件必须都为 TRUE(1),结果才是 TRUE(1)
OR 逻辑或,任意一个条件为 TRUE(1), 结果为 TRUE(1)
NOT 逻辑非,条件为 TRUE(1),结果为 FALSE(0)

MySQL操作

  1. 小于操作:所有英语小于60的都算不及格,把不及格的人筛选出来。

    在这里一样的,null参与各种运算结果还是null。

  2. 把所有英语成绩等于NUll的同学筛选出来,这里就需要使用<=>符号而不是=符号了。

  3. 范围匹配:between and,把所有数学成绩在70到90的筛选出来并且按照从小到大成绩进行排序。这里操作符是两个左闭区间,需要注意。

  1. in操作:相比于between and,in操作则是离散值。找出数学成绩为76分的所有学生。
  1. 模糊匹配,其中%表示任意个字符,_表示一个任意字符。具体理解得通过操作理解。在这里首先在添加五个数据,孙悟空,孙行者,者行孙,行者孙,行孙者。

(a)在这里查询以孙开头的名字。

这里like前面需要写上那个列进行查询的模糊查询,%表示多个任意字符,也就是可以存在一个也可以存在两个及以上。而_一条下划线代表一个任意字符,也就是只能筛选两个字的名字且以孙开头的名字。

(b)查询以孙结尾的内容

(c)查询包含孙字的名字。

后面的逻辑或,逻辑与,逻辑非小编不加赘述,学过短期编程的都了解。

注意:

在这里使用别名进行条件查询会出错。报错原因为不知道这个字符总成绩。

而使用所有的成绩相加进行条件查询是可行的。

这是为什么呢?这里就需要理解select条件查询的顺序。

1、首先条件查询先遍历表中每一个数据。

2、把当前记录的值带入条件,根据条件进行筛选

3、如果这个条件成立,就需要保留。最后进行列上表达式的计算。在这里是第三步定义的别名,而条件查询筛选是第二步执行的,执行where的时候,总成绩这个别民还处于未定义的状态,所以查询不到。

那为什么排序查询的时候是可以的呢?

这是因为还有第四步,如果存在order by,会在所有行都获取到之后,表达式也算完了,在针对所有的结果进行排序。

2.8 分页查询

所谓的分页查询就是如果你需要查询的表格内容太多太长了你想把他进行分页的形式显示出来,就需要使用到分页查询。

语法形式

起始下标为 0

  1. 从 0 开始,筛选 n 条结果

select ... from 表名 [WHERE ...] [ORDER BY ...] LIMIT n;

  1. 从 s 开始,筛选 n 条结果

select ... from 表名 [WHERE ...] [ORDER BY ...] LIMIT s, n;

  1. 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用

select ... from 表名 [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;注意offset是偏移量,也就是一个下标,从0开始的

MySQL操作

只显示三条。

使用limit后面加一个数字,数字代表显示多少条,但是存在一个缺陷就是,如果你在查询三条还是这三条显示。

此时如果想要继续后面的显示就得使用到limit 数字1 offset 数字2。数字1代表这次查询查询几条记录,数字二代表从哪开始查,是下标。

使用这种查询的方式就可以进行分页查询,使页面看的更加简洁,更易区分。


三、修改(更新)

语法:

update + 表名 set 列名 = 值 where 条件;

其中where条件就是定位到需要修改的行,set 列名 = 值就是实际需要修改的列。

MySQL操作

  1. 首先选中之前创建的数据库,这里小编自己创建的数据库是java,大家不知道的也可以使用show databases;把你所有的数据库显示出来。
  2. 创建一个学生表,表中含有id、名字、语文成绩、数学成绩、英语成绩。
sql 复制代码
create table student
(
     id int,
     name varchar(20),
     chinese decimal(3,1),
     math decimal(3,1),
     english decimal(3,1) 
);
  1. 表中新增加入数据
sql 复制代码
 insert into student values
    -> (1,'张飞',56,66,78),
    -> (2,'刘备',85,88,76),
    -> (3,'关羽',88,90.5,88);
  1. 来到最关键的步骤也就是我们修改操作的实战。

(a)首先将刘备的语文成绩变更为65分。

sql 复制代码
 update student set chinese = 65 where name = '刘备';

(b)将关羽的语文成绩变更为55,数学成绩变更为80分。

sql 复制代码
 update student set chinese = 55,math = 80 where name = '关羽';

(c)将总成绩倒数第一的同学的数学成绩加10分。

首先涉及到总成绩就要想到小编所说的查询字段为表达式。

然后将总成绩进行从小打到排列这就涉及到了order by

最后只是修改最后一名同学的成绩,只需要拿出它一个人就可以,这时候可以使用limit拿出它一个人。

sql 复制代码
select name,chinese,math,english from student order by chinese+math+english limit 1;

修改成绩

sql 复制代码
 select name,chinese,math,english from student order by chinese+math+english limit 1;

(d)将张飞同学的语文成绩加上0.5,然后再将所有同学的成绩再去变为原来的一半

sql 复制代码
update student set chinese = chinese + 0.5 where name ='张飞' ;
update student set chinese = chinese / 2;

在这里可以看到本来张飞的语文成绩56.5除以2因该等于28.25,但是decimal(3,1)表示最多三位,小数点后一位,此时就会发生截断,这里我们也可以打印出来警告原因。

这里报错信息显示为中文列的数据已发生截断,错误发生在第1行。


四、删除操作

语法

delete from 表名 where 条件

where是筛选需要删除的行的条件,把匹配条件的行删除掉。

如果不写条件,就相当于把整个表里的所有数据都删除了。

MySQL操作

  1. 删除刘备同学的成绩
sql 复制代码
delete from student where name = '刘备';
  1. 删除整张表数据
sql 复制代码
delete from student;

注意:

删除整个表和drop table不一样。drop table是删除了表,也删除了表中的数据,delete 是删除了表里的记录,但是表还在只是它现在是一张空表。在这里显示所有的表的时候可以看出:

此时我们再使用drop table删除整个表,再去查询表就查不到了。

这里的修改和删除表都是持久生效的,都会影响到数据库服务器硬盘上的数据。

相关推荐
Fleshy数模1 天前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
az44yao1 天前
mysql 创建事件 每天17点执行一个存储过程
mysql
秦老师Q1 天前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
橘子131 天前
MySQL用户管理(十三)
数据库·mysql
Dxy12393102161 天前
MySQL如何加唯一索引
android·数据库·mysql
我真的是大笨蛋1 天前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怣501 天前
MySQL数据检索入门:从零开始学SELECT查询
数据库·mysql
人道领域1 天前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
千寻技术帮1 天前
10404_基于Web的校园网络安全防御系统
网络·mysql·安全·web安全·springboot
spencer_tseng1 天前
MySQL table backup
mysql