MySQL数据库基本操作详解(数据库概述、基本操作、增删改查等)

目录

MySQL数据库概述

MySQL数据库的基本操作

MySQL数据库的表的操作

MySQL数据库的增删查改(CRUD)

MySQL数据库概述:

初来乍到,什么是数据库?数据库就是存储数据的仓库,我们用户可以对数据库中的数据进行增加,修改,删除以及查询的工作(CRUD)。下面列出一些常用的数据库:

关系型数据库:指的是对于存储的数据,格式上有严格的要求,类似于以execl表格的方式来存储的。

1.MySQL数据库:开源的免费数据库,所谓开源,就是指软件的源代码是开放的,可以供用户们修改或者查看。是个人学习中最常用的小型数据库。已经被Oracle收购。

2.Oracle数据库:收费的大型数据库,Oracle公司的产品,安全性高,大型公司或者是银行需要用Oracle来进行存储。

3.SQLServer:Microsoft公司的收费的中型数据库。在高校中常常用于教学。

4.SQLite:嵌入式的小型数据库,常常应用于Android系统。

非关系型数据库:相比关系型数据库,存储方式比较灵活,但是功能更少,优势是性能更快,同时也可以更好的适应分布式环境。例如Redis MongoDB  HBase等等。

MySQL数据库是一个客户端(client) 服务器(server)结构的软件。一个服务器,是可以给多个客户端提供服务的。主动发送数据的这一方,叫客户端;被动接受数据的这一方,叫服务器;客户端给服务器发送的数据叫做请求(request);服务器给客户端返回的数据叫做响应(response)。客户端和服务器之间是通过网络之间来进行通信的。逻辑上,每个数据库是用来存储数据的集合。例如,教务系统上有很多种数据,例如教务相关的数据、公司相关的数据、论坛相关的数据等等,这几种数据逻辑上互不相关,就可以把这些放在不同的数据集合中,也就是放到不同的数据库中。每个数据集合中,又有一些数据表,例如教务数据中学生信息中每个学生的学号、姓名、班级、性别、学校等,每一行是一条数据,称为是一条记录,一行里还有很多列,每一列称为一个字段。对于MySQL以及其他的关系型数据库,是要求同一个表里面的这些数据的列数和列的类型都是要匹配的。

 客户端是和用户交互的部分,通过命令行来输入sql语句。还可以通过图形化界面来进行操作,但对于初学者来说,还是建议用命令行,因为图形化界面的优势是入门容易,但是学习过程中会错过很多知识,命令行才是生产力工具。

以上介绍的是数据库相关的概况,下面的文章会介绍MySQL数据库的一些基本操作。

紧接着数据库的概述,接下来我们就需要对数据库进行一系列操作了。对于学习数据库的基本操作,其实就是学习SQL的写法。首先,我们打开一个MySQL的客户端:

然后进行对数据库的操作。


 

MySQL数据库的基本操作:

一.创建数据库

我们使用关键字create来创建数据库:create database 数据库名;如图所示:

 

出现上述字样说明创建数据库成功。若出现如下字样:

 说明已经存在相同名字的数据库,我们需要更名。但是,如果不想让它报错,我们可以使用if not exists语句来避免报错。如下图所示:

这种会报出warning警告,但是不会真的创建数据库!!

若出现如下字样:

则说明在你的SQL语句中存在语法错误,应该重新检查你的SQL语句。

创建数据库的时候,还可以指定数据库的字符集,例如我们了解的ASCII,utf-8。如图所示:

 二.查看数据库

既然我们创建出了数据库,那么我们就需要查看数据库到底有没有。

使用关键字show来展示数据库:show databases;注意database后面一定要加s,如图所示:

 

 我们会发现,这里的库不仅仅只有我们创建的,MySQL还会自带一些系统数据库。默认的MySQL是装在C盘中。

三.选中指定的数据库

一个MySQL服务器上,数据库可以有很多个,要进行操作,需要先确定要针对哪一个数据库进行。我们用use关键字:use 数据库名;后续的操作都是针对这个数据库所展开的。如图所示: 

​​​​​​​ 

 四.删除数据库

我们使用关键字drop来删除数据库:drop databse 数据库名;如图所示:

需要特意说明的是,删除数据库,其实是非常危险的操作!!在以后的工作中,如果不小心删除了数据库,造成的损失可能非常大 ,在公司的测试环境,生产环境中,都可能有数据库,如果删除的是测试环境的数据库,你的同事可能就要喷你了,如果删除的是生产环境的数据库,这个系统的用户都会发现出了问题,事儿就大了!!不过对于我们日常的学习,删除数据库就没什么损失。


MySQL数据库的表的操作

一.创建表

我们使用create关键字来创建表:create table 表名(列名 类型,列名 类型,列名 类型......);

同样,我们若想进行表操作,必须先选中数据库,也就是use某个数据库名。如图所示:

我们需要注意的是:SQL语句不像C语言或者JAVA的类型在前,而是把类型放在后面的,例如Python,Go。同一个数据库中不能有两个相同名字的表,创建相同的表的时候,会出现如下错误提示:

 表名和列名,也不能和SQL的关键字重复,例如:

 如果我们实在是想用和SQL关键字相同的名字来创建表,那么我们可以给表名加上反引号,这样就可以创建了。反引号在键盘esc的下面,用英文输出。如图所示:

​​​​​​​

 在建表过程中我们可以使用coment来注释,要注意这个注释只能在建表的时候使用,其他时候用不了。如图所示:

二.查看表

接下来我们来查看指定数据库下的所有表,首先我们一定要选中一个数据库。然后我们使用show+表名来查看表。如图:

 

三.查看表的结构

查看表的结构,也就是看表里面有啥。我们使用关键字desc来查看:desc 表名。如图:

 Filed指的是所存储的变量,Type指的是所存储变量的类型,NULL指的是 是否允许为空,Key和列的约束有关,Default是默认值,这里默认为空,Extra指的是额外的描述,后续学习中可以看到。

 四.删除表

删除表,我们使用drop关键字:drop table 表名;如图所示:

​​​​​​​ 

我们要记住,删除表操作和删除库操作一样,都是非常危险的!!一个数据库里,有很多的表,如果我们全删了,在工作环境中是可以第一时间发现问题的,可以第一时间进行处理。但是如果只删一个表,第一时间往往发现不了,问题可能就被隐藏起来了,系统带着问题运行,大量数据可能都会出错。所以,删除一个表往往比删除所有表更危险!!

以上是数据库的表操作。
 

接着数据库的表操作,我们需要对数据库的表内容进行修改。


MySQL数据库的增删查改(CRUD):

一.新增.SQL使用insert关键字来进行新增操作:insert into 表名 values(列,列,列......);如图:

在SQL中,“ 和 ’  都可以表示为字符串。values后面的内容,个数和类型都要和表的结构匹配,否则无法创建成功。例如我所创建的学生表中就有两个列,所以values里也需要有两列!创建字符串的时候,我们是可以手动指定字符集的,我们未指定时,默认的字符是拉丁文,不支持中文!如果输入中文,会显示如下错误:

 正确的做法是,可以删掉现在这个库,重新创建一个创建数据库,把字符串设置成utf8或者utf8mb4,就可以使用中文了,如图:

删掉重新设置,是最简单的方法。但是,一定不要在数据库建好之后再改字符集,会造成很严重的后果!

此外,insert除了可以插入完整的一行数据之外,还可以指定列插入。如图:

图中的select*from stu是展示表内容的意思,接下来会写到,这里为了展示表内容所以先用一下。我们可以发现,当我们插入一列的时候,未被指定的列是按照默认值NULL填充的。如果我们想要指定多个列,在表名后后面的括号中使用逗号,再加上想修改的列名即可:insert into 表名(列名,列名,列名......)values(值,值,值......)。如图:

还可以指定插入多行,也就是说,insert语句,以及value后面的()可以有多组,每一组对应到一行(一条记录),借助这个功能,就可以一个SQL语句插入多条数据:insert into 表名 values(值,值,值......),(值,值,值......),(值,值,值.....).....;如图:

下面看一下刚刚的反馈结果:

 第一行说明的是你的数据库有几行受到了影响,第二行的从左至右分别代表记录的数据数、相同的数据数、警告数。注意:在MySQL当中,当前的一次一次插入数据的效率,是低于把这几个数据记录一起插入的效率的!原因有三点:1.是由于网络请求和响应的时间开销引起的。2.数据库服务器是把数据保存在硬盘上的。3.对于MySQL关系型数据库,每次进行一个SQL操作,内部都会开启一个事务,每次开启事务也有一定的开销。所以在以后的工作中,在面对大量的数据的时候,尽量一次操作就插入完全。说句题外话,不知道你们有没有在输入语句的时候会不会有这种困扰:每次输入完中文的时候,都要切换成英文去输入标点符号,很容易出错而且还很不方便,这里教大家一个方法。打开我们常用的输入法的设置,在里面找到”中文输入时使用英文标点“这个选项,打开此选项,就可以在输入中文的时候不用频繁切换输入法了。

 二.查询

查询是SQL中最复杂的操作。我们这里先说一些最基本的查询操作。

1.全列查询

全列查询也就是查询表里的所有列,初学阶段最常见的一个操作就是select*from表名;*这个符号我们叫做通配符,代表了所有的列。也就是说,无论表是什么样子的,里面有几列都没关系,*可以代表所有。如图:

 对于我们现在的查询操作,是没有什么危险的,但是在工作中是千万不敢在公司的生产环境中去进行select*操作的。因为工作中的生产环境服务器中是存了很多很多的数据的,此处我们进行查询操作,就会遍历所有数据,把数据从硬盘上读取,再通过网卡进行发送,很容易把硬盘或者网络带宽吃满。这时候,外面很多的用户通过带宽来访问服务器的时候,就会崩溃了!!!!!所以,在某些场景中,把某个资源给用尽了,就很容易导致程序出现严重的问题.

2.指定列查询

select 列名 from 表名;如图:

通过指定列查询,相比于全列查询,查询是会精简不少的。

3.查询列为表达式

在查询的过程中,列和列之间进行一个简单的计算。我们创建了一个英语成绩表,如图:

接下来,我们想把每个人的英语成绩都加10,应该怎么做呢? 应该使用表达式, 如图所示:

 这样我们就可以查询加分之后的成绩了。在这里要说明的一点是,进行表达式查询的时候,查询结果是一个临时表!这个临时表,并不是写入硬盘中的,而且临时表的类型也并不是和原始的表完全一致。所以,select操作只是查询,无论如何都不会修改硬盘上的数据!!用一张图来解释一下:

 4.给查询结果的列指定别名

首先我们创建一个学生成绩表,如图:

我们可以把语文,数学,英语三个科目的总和算出来并且展示出来。如图:

 此处的as可以省略,但是为了大家不容易看错,还是建议大家加上。

5.查询的时候,针对列来进行去重

去重,也就是把有重复的记录给合并成一个。在刚刚的学生表中,我们再加入一个学生,他的英语成绩和某一个同学的英语成绩是一样的,如图:

 我们使用distint关键词来去重,如图:

 我们会发现,相同的数据合并成为了一个。同样,distinct也可以指定多个列,当指定多个列的时候,则是要求所有的列都相同,才算重复。

6.针对查询结果进行排序

对于排序,我们使用order by 关键字。我们想在刚刚的学生表中将每名学生的英语成绩排序。如图:

 排序默认是升序排序,如果我们想使用降序排序,在后面加desc关键字即可,如图:

 注意,这里的desc和查看表结构的desc是不一样的。扩写分别是descend和describe。平时我们写代码,还是要注意缩写的问题!下面讲一下关于排序的注意事项:1.如果SQL中没有显式的写order by,那么我们认为查询结果的顺序,是不可预期的!不能依赖自带的顺序。2.如果是要排序的列中有NULL,则NULL视为最小值。如图:

7.条件查询

条件查询,就是针对查询结果,按照一定的条件进行筛选!我们使用where关键字,根据查询的结果按行进行筛选。通过where指定一个条件,把查询到的每一行,都带入到条件中去,看条件是真还是假,把条件为真的行作为临时表的结果,条件为假的舍弃。如果想描述条件,就需要使用一些关系运算符和逻辑运算符。关系运算符如图:

逻辑运算符如图:

 例如,我们查询语言不及格的同学及英语成绩:

 where后的语句的执行顺序是:先把数据库中保存的数据进行查询,查询的时候每次得到一行,就带入到条件中进行判断。此时的英语成绩中没有NULL。因为NULL和任何数据进行计算都是NULL,NULL<60的结果还是NULL,当成了false。此时再加个条件来or一下就可以带上空值了。如图:

 接下来查询语文成绩好于英语成绩的同学:

 再比如查询总分在200分以下的同学:

 注意:where后面的子句不能使用刚刚设置的列的别名来比较,如图:

 这取决于MySQL内部的实现方式。MySQL进行查询操作时,是先针对每一行的记录计算条件,并按照条件筛选。满足条件的记录,才会取出对应的列,并且计算列里面的表达式。

查询语文成绩大于80,且英语成绩大于80分的同学:

 如果条件中同时有and和or,先计算and然后再计算or,死记硬背容易记错,所以最好的办法是加上括号。

查询语文成绩在80,90之间的同学及语文成绩:

 这种做法我们不推荐,我们推荐如下做法:

下面我们查询数学成绩是58或者59或者98或者99分的同学及其数学成绩,我们可能首先想到这种写法:

 我们可以用关键字in来化简写法:

下面插入几个姓孙的人物,并查询姓孙的同学的成绩:

%表示任意字符,以孙开头的内容都可以表达出来,同样,%孙 代表以孙结尾。我们还可以使用下划线_ 来匹配任意一个字符,如图:

 加入两个下划线则代表有两个任意字符:

 注意,null任何数据比较最终结果还是null,会被当成false而查询不到。对于null的比较,我们使用<=>运算符。如图:

 条件查询很关键也很重要,不仅仅是搭配select使用,update/delete也会搭配where子句,对应的条件的用法,也是完全相同的。select*之所以危险,就是因为不确定查询结果有多少,如果查询结果太多就会把硬盘/带宽给吃满。保证查询操作不危险的关键,就在于控制一次查询查出来的结果的数量!就是靠where子句,通过条件来针对结果集合进行限制。说到限制,查询操作中引入了一个limit,通过这个关键字来限制查询结果的数量,如图:

 5代表此次查询的最大结果的数量。无论前面的条件是怎么写的,最后的结果都不会超过5条。

8.分页查询

在数据库中,针对分页查询操作的支持,主要就是通过limit来实现的。直接limit N,查到的是前N条的东西,我们搭配offset就可以指定从第几条开始进行筛选了。(offset的值从0开始计算的)。

 我们也可以这么写,但是容易记混,不推荐:

 上述是一些基础的查询操作,后面还会讲到一些更复杂的查询。

 三.修改

update 表名 set 列名=值 where 条件;比如我们将上述表中 孙悟空的数学成绩变更为80分:

 set后面加上你要描述的哪些列,where后描述了哪些行需要修改,仍然要把每一行带入条件,条件为真的就是需要修改的,为假的就是pass。注意:修改操作就是在服务器修改硬盘数据了,修改完之后不会像临时表一样,这个是持久生效的!

修改操作,还可以使用表达式来进行修改,比如,我们把表中所有同学的语文成绩-5,前后对比图如下:

 这个语句中没有写where子句,那么就是匹配所有行,把12行的NULL也匹配到了,有的行的语文成绩是空值,上面也说过,空值是没法进行算术运算的。注意不要像JAVA一样写成chinese-=5,SQL是不支持这种写法的。

update还可以去同时修改多个列,多个列之间用逗号来分隔开:

update还可以搭配order by/limit等子句来进行使用,比如,给总成绩倒数四名的同学的数学成绩设置成10分:应该先加和得到总分,然后按照总分的升序排序,然后取结果:

通过子句设置筛选结果,筛选完成之后,就可以把匹配的结果设置上对应的值了。update这里的体条件是至关重要的,务必保证筛选条件正确。update操作也是一个危险操作!

四.删除

delete from  表名 where 条件; 比如我们要删除孙悟空同学的考试成绩:

 这个删除操作也是在修改数据库服务器的硬盘,也是持久化删除,删了就没了!所以,delete也是危险操作。后面的条件也和update一样,支持where/order by/limit等。

上述这些基本操作以及增删改查,就是日常开发中最常用的SQL。增删改查中最复杂的是查询,下面还会深入介绍更多操作。

  • 11
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚报大街-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值