0


超详细的MySQL基本操作

MySQL

MySQL

1 前言:啥是数据库

数据库,就是一类专门负责管理(增删查改)数据的软件

数据库大体可以分为 关系型数据库非关系型数据库
关系型数据库(RDBMS):
是指采用了关系模型来组织数据的数据库。 简单来说,关系模型指的就是二维表格模型,而一个

  • 关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。 基于标准的SQL,只是内部一些实现有区别。
  • 非关系型数据库: 不规定基于SQL实现。现在更多是指NoSQL数据库。

我们主要学习的是关系型数据库,有很多具体的实现(如MySQL,Oracle,SQL Server,SQLite等)

但不管哪个数据库,其核心的东西都是 SQL(编程语言)

下面我们就正式进入MySQL的学习

2 MySQL的安装

请参考

当我们在开始菜单看到有这两个
image-20220708221726597
并且打开后
image-20220708221200198
看到如上图所示的样子,证明你的MySQL已经安装完成了

3 MySQL的结构

​ MySQL是一个“客户端服务器” 结构的程序

  • 客户端:主动的一方
  • 服务器:被动的一方

一个服务器同一时刻可能要给多个客户端提供服务

因为服务器不确定客户端啥时候有需求,服务器常常要长时间运行,甚至是7*42小时

当我们安装了MySQL,其实是既安装了客户端(客户端也有很多种版本,如命令行,图形化界面等,还可以自己写代码实现客户端),又安装了服务器
image-20220708182042047
上图的就是命令行客户端

image-20220708182444322

我们在设置中看到的这个就说明了MySQL是有服务器的
image-20220708182343538
当然客户端和服务器也可以是在不同主机上

3.1 MySQL的”客户端服务器“结构的说明

存储和管理数据都是有MySQL服务器负责的,因此MySQL服务器要比MySQL客户端复杂很多,甚至可认为MySQL服务器就是MySQL的主体

4 MySQL服务器是如何组织数据的

MySQL服务器程序简图
image-20220708222156570
有几点需要说明

  • 一个MySQL服务器可能包含多个“数据库”
  • 此处的“数据库”其实是==“数据集合”==(逻辑上的),这里面放了一些具有关联关系的数据
  • 每个数据库(数据集合)里面有很多个“数据表”(类似于我们日常看到的表格)- 里面的每一行都称为“一条记录”- 里面的每一列都称为“一个字段“
  • MySQL服务器组织数据的方式可以概括为: 数据库 --> 数据表 --> 行 --> 列

5 MySQL服务器是把数据存储在硬盘上的

5.1 什么是内存和外存

我们都知道一台计算机有以下几部分组成:

  • CPU
  • 存储器
  • 输入设备
  • 输出设备

而存储器:用来存储数据的设备,它分为 内存外存

内存,大家一定都不陌生。外存便是我们常说的”硬盘“,U盘,光盘,软盘等

5.2 内存和外存(硬盘)的区别
  1. 内存存储空间相对较小,硬盘存储空间大
  2. CPU读取内存速度快,读取硬盘速度慢(一般会相差3到4个数量级),当然各类硬盘之间也有区别,如SSD比机械硬盘快
  3. 内存比硬盘价格更高
  4. 内存上的数据断电后会丢失,而硬盘不会丢失

这些都是我们学习数据库的一些先驱知识,掌握了这些知识后,学习的过程中有一些知识会更容易理解

6 关于数据库的操作

这里我们介绍的是MySQL的实际操作(围绕SQL语句展开)

6.1 创建数据库
createdatabase 数据库名;

创建数据库可以指定字符集和校验规则

  • CHARACTER SET: 指定数据库采用的字符集
  • COLLATE: 指定数据库字符集的校验规则

字符集描述了存储的数据支持什么样的字符

校验规则描述了当前字符间该如何进行比较

​ 当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则
是:utf8_ general_ ci

image-20220708224804512

6.2 显示数据库
showdatabases;

可查看当前存在的数据库
image-20220708224940468

6.3 选中数据库

要想针对某个数据库进行具体操作(存入数据/查询数据等)就需要先选中数据库

use 数据库名;

image-20220708231845302

6.4删除数据库
dropdatabase 数据库名;

数据库删除以后,内部看不到对应的数据库,里面的表和数据全部被删除

需要注意的是,删除数据库的操作十分危险

千万不要在公司的服务器上进行删除,尤其是不要在生产环境服务器上删除,产生的后果可能十分严重
image-20220708231907111

7 常用数据类型

介绍数据表的操作之前,我们先说说MySQL的数据类型

MySQL是一个关系型数据库,特点是通过表的形式来组织数据

数据类型一方面能方便我们对数据进行处理,一方面也能针对数据进行校验和检查

7.1 数值类型

分为整型和浮点型
数据类型大小说明对应java类型BIT[ (M) ]M指定位 数,默认 为1二进制数,M范围从1到64, 存储数值范围从0到2^M-1常用Boolean对应BIT,此时 默认是1位,即只能存0和1TINYINT1字节ByteSMALLINT2字节ShortINT4字节IntegerBIGINT8字节LongFLOAT(M, D)4字节单精度,M指定长度,D指定 小数位数。会发生精度丢失FloatDOUBLE(M, D)8字节DoubleDECIMAL(M, D)M/D最大 值+2双精度,M指定长度,D表示 小数点位数。精确数值BigDecimalNUMERIC(M, D)M/D最大 值+2和DECIMAL一样BigDecimal
注:DECIMAL相当于通过字符串的方式来表示浮点数。优势就是能够精确表示,精确计算。但是劣势就是计算时候消耗的时间更多,存储空间也更多。所以我们除非是特别需要,才考虑使用DECIMAL。

7.2 字符串类型

数据类型大小说明对应java类型VARCHAR (SIZE)0-65,535字节可变长度字符串StringTEXT0-65,535字节长文本数据StringMEDIUMTEXT0-16 777 215字节中等长度文本数据StringBLOB0-65,535字节二进制形式的长文本数据byte[]
注意:

  • varchar(20),表示这个字段最多存20个字符,注意是字符不是字节
  • 表格中上面三个存的是文本数据,而BLOB存的是二进制数据
7.5 日期类型

数据类型大 小说明对应java类型DATETIME8 字 节范围从1000到9999年,不会进行时区的 检索及转换。java.util.Date、 java.sql.TimestampTIMESTAMP4 字 节范围从1970到2038年,自动检索当前时 区并进行转换。java.util.Date、 java.sql.Timestamp
时间戳:以1970年1月1日0时0分0秒作为基准时刻,计算当前时刻和基准时刻的秒数之差。

这么多数据类型,其实我们最常用的是

  • int
  • bigint
  • double
  • decimal
  • varchar
  • datetime

介绍完了数据类型,下面正式进入数据表的操作吧

8 数据表的操作

8.1 创建表
createtable 表名(列名 类型,列名 类型...)

要想创建表,得先有一个数据库,再选中这个数据库

例如:

createtable student(id int,name varchar(20))

这样我们就创建了这样的表
image-20220708232218588
我们看一下怎么操作
image-20220708232259623
注:

  1. 同一数据库中,不能有两个名字相同的表
    image-20220708232351950

  2. 创建表的时候,表名或者列名不能取SQL中的关键字(如果非用不可,需要加反引号==`==)

  3. 有时候,建表语句可能比较复杂比较长,这时候就可以分成多行来写(在没有 ; 的时候按回车就可以),但多行编辑一旦写错就回不去了,解决办法:可在其他编辑器把SQL写好再复制过去

拓展:MySQL中的注释

image-20220710220838456

8.2 查看表

再选中数据库的前提下

showtables;

image-20220708233346123

8.3 查看表结构

可以查看表里的列和类型

desc 表名;

desc是describe的缩写

image-20220708233454391

8.4 删除表
drop 表名;

删除表的操作也是十分危险的,甚至危害比删除库更大!

9 MySQL表的增删查改

MySQL的工作就是组织管理数据,先保存,保存好了后续就方便我们进行增删查改

增删查改的前提是:已经把数据库创建完成,并且选中了,表也准备就绪

9.1 新增元素(create)
insertinto 表名 values(值,值,值...)

注意

此处的值的个数要和表的列数匹配,值的类型也要和列的类型匹配
image-20220710184038130
注意:在SQL中表示字符串(SQL中没有”字符类型“),可以使用单引号==’ ',也可以使用双引号" "==,它们是等价的关系

我们的值的个数与表的列数不匹配,就会报错,如图
image-20220710184525297

9.1.1 关于插入中文数据

数据库中,如果要表示中文,需要先明确字符编码(字符集)

MySQL默认的字符集,叫做拉丁文,它是不支持中文的

为了能够存储中文,我们需要把字符集改成UTF-8

而修改MySQL字符集的方法有很多种,这里介绍一种一劳永逸的方法 ——修改MySQL的配置文件

9.1.2 如何修改MySQL的配置文件

第一步、我们需要先确认当前数据库的字符集

show variables like'character%';

image-20220710185349444
第二步、找到配置文件 my.ini

这个文件不好找,我们介绍一种方法

a、打开开始菜单中的文件位置

b、右键,点击属性,找到”目标“
image-20220710185744379image-20220710185800151
c、把”目标“中的内容拷贝下来,这里就是MySQL的可执行程序路径和配置文件路径

image-20220710190033839

我们只需要拷贝这句话

image-20220710190109881

d、按照这个路径,就找到了配置文件 my.ini

第三步、修改配置文件

a、为了防止我们修改配置文件操作失败,我们要先进行备份,(备份是一个很好的习惯!!)
image-20220710190313612
b、编辑 **ini ** 文件(使用记事本打开即可)
image-20220710190556463image-20220710190722381
我们只需要找到两处

第一处:
image-20220710190843000
第二处:
image-20220710190927788
注意两侧不要有空格

第四步、配置文件不是改了就立即生效的,还需要做一些额外工作

a、重启MySQL服务器,不重启肯定不会生效!

在开始菜单找到服务,然后找到MySQL,右键,重启

重启之后看到 显示 正在运行,说明修改成功
image-20220710191248298
如果是其它内容,如 启动中…,则说明重启失败

失败的最大原因就是配置文件修改错了

b、修改配置文件对于已经创建好的数据库是不会生效的

​ 必须删除旧的,重新建库建表

9.1.3 insert其他用法

1、insert插入的时候可以指定行插入,不一定非得把这一行的所有列都插入数据
image-20220710191749364
制定了name这一列插入,其它未被指定的列,填入的值就是这一列的默认值,默认的默认值就是啥都不填也就是null

2、insert语句还可以一次插入多条记录

在values后面,带有多个 ( ),每个 ( )之间 用逗号, 来分割
image-20220710192115249
如果要插入多条记录,我们更推荐一次插入多条,而不是一次一条多次插入,因为更快

9.2 查询(Retrieve)
9.2.1 全列查询

直接把整个表里的数据都查询出来

select*from 表名;
  • 是通配符,表示匹配任意的列(所有列)

我们看到的只是一个呈现在客户端上的==”临时表“==,而不是服务器上数据的本体

如果数据量特别大,采取这样的操作,就极有可能把磁盘IO吃满,或者把网络带宽吃满,导致”卡了“

这会影响用户的体验,假设我们感觉”卡了“,可以按

ctrl+c

来终止操作

9.2.2 指定列查询

当我们省略掉一些不必要的列时,就可以节省大量的磁盘IO和网络带宽了

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


我们需要在强调一便!

我们看到的只是一个呈现在客户端上的==”临时表“==,而不是服务器上数据的本体

所以虽然我们只看到了一列,但并不代表只有一列!

9.2.3 带有表达式的查询

比如这样的表
image-20220710194659005
我们可以创建一个新的表方便计算,也就是 带有表达式的查询
image-20220710195551015
我们又要回到刚刚那个老生常谈的重点知识

我们看到的只是一个呈现在客户端上的==”临时表“==,而不是服务器上数据的本体

也就是,这个表上的数据即使超过了我们定义的有效数字的范围,也没关系,只要服务器本体不超过就可以

我们证明一下这个结论
image-20220710195900992
但是我们尽量不要把不同类型的数据相加减,如字符串和数值,会报警告
image-20220710200026306
我们使用show warnings来查看警告内容

showwarnings

image-20220710200113284
还有一个小细节:SQL中,如果拿NULL和其他类型进行混合运算,结果仍是NULL

9.2.4 查询的时候可以起别名

image-20220710200352884

9.2.5 去重查询
selectdistinct 列名 from 表名;

这样能把查询结果相同的行,合并成一个
image-20220710200933633
distinct后面也能指定多个列,但必须是多个列中每个列的值都相同才会视为相同(才会去重)

9.2.6 排序查询

查询过程中,对于查询到的结果进行排序(针对临时表排序,对于数据库上原来存的数据没有影响)

select 列名 from 表名 orderby 列名;

image-20220710202947573
默认是升序排序(asc),我们也可以进行降序排序

select 列名 from 表名 orderby 列名 desc;

我们也可以对别名排序
image-20220710205214974
order by 进行排序的时候,还可以指定多个列来进行排序

当指定多个列进行排序的时候,就相当于,先以第一个列为标准进行比较。如果第一列不分胜负,再按照第二列进行比较
image-20220710211854543
select操作中,如果没有使用order by,那么查询结果的顺序是不可以依赖的(不确定的)

9.2.7 条件查询

指定条件,对于查询结果进行筛选

在进行查询的时候

select*from 表名 where 条件;

我们引入了where字句,针对查询结果进行筛选

筛选可以理解成,对于查询结果进行依次遍历,把对应的查询结果带入到条件中,

若条件成立,则把这个记录放到最终查询结果中,条件不成立,则直接舍弃掉,不作为最终结果

(此处的条件其实就和 if 里的语句差不多)

1.比较运算符
运算符说明>, >=, <, <=大于,大于等于,小于,小于等于=等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL<=>等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)!=, <>不等于BETWEEN a0 AND a1范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)IN (option, …)如果是 option 中的任意一个,返回 TRUE(1)IS NULL是 NULLIS NOT NULL不是 NULLLIKE模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字 符
注意:SQL中 ‘ = ’ 号可不是赋值了,就是等于

2.逻辑运算符
运算符说明AND多个条件必须都为 TRUE(1),结果才是 TRUE(1)OR任意一个条件为 TRUE(1), 结果为 TRUE(1)NOT条件为 TRUE(1),结果为 FALSE(0)
我们进行条件查询时,就是通过将上述运算符组合完成的
image-20220710220231392
小细节:在这里,别名并不能作为筛选条件使用

image-20220710221102322

注:

  1. WHERE条件可以使用表达式,但不能使用别名。
  2. AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分

案例:

  • AND与OR:
-- 查询语文成绩大于80分,且英语成绩大于80分的同学SELECT*FROM exam_result WHERE chinese >80and english >80;-- 查询语文成绩大于80分,或英语成绩大于80分的同学SELECT*FROM exam_result WHERE chinese >80or english >80;-- 观察AND 和 OR 的优先级:(先算 and 后算 or)SELECT*FROM exam_result WHERE chinese >80or math>70and english >70;SELECT*FROM exam_result WHERE(chinese >80or math>70)and english >70;

image-20220710223237451image-20220711071023899

  • 范围查询:1.BETWEEN … AND …
-- 查询语文成绩在 [80, 90] 分的同学及语文成绩(闭区间)SELECT name, chinese FROM exam_result WHERE chinese BETWEEN80AND90;-- 使用 AND 也可以实现SELECT name, chinese FROM exam_result WHERE chinese >=80AND chinese <=90;-- 时间信息也是可以用between...and...的。select*from article where create_date between'2019-01-01 10:30:00'and'2019-11-10 16:02:00';

​ 2.IN

-- 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩SELECT name, math FROM exam_result WHERE math IN(58,59,98,99);-- 使用 OR 也可以实现SELECT name, math FROM exam_result WHERE math =58OR math =59OR math =98OR math =99;
  • 模糊查询:LIKE (不一定完全相等)
-- % 匹配任意多个(包括 0 个)字符SELECT name FROM exam_result WHERE name LIKE'孙%';-- 匹配到孙悟空、孙权-- _ 匹配严格的一个任意字符SELECT name FROM exam_result WHERE name LIKE'孙_';-- 匹配到孙权SELECT name FROM exam_result WHERE name LIKE'孙__';-- 匹配到孙悟空

模糊查询需要用到通配符,**% 可以用来代替任意个任意字符,_** 可以用来代替一个任意字符

image-20220711072224255
类似的

%孙 匹配以 孙 结尾的数据

%孙% 匹配包含孙的数据

% 匹配任意数据

  • NULL 的查询:IS [NOT] NULL (和NULL比较)
-- 查询 qq_mail 已知的同学姓名SELECT name, qq_mail FROM student WHERE qq_mail ISNOTNULL;-- 查询 qq_mail 未知的同学姓名SELECT name, qq_mail FROM student WHERE qq_mail ISNULL;SELECT name, qq_mail FROM student WHERE qq_mail <=>NULL;-- 也可以
9.2.8 分页查询:LIMIT

让查询结果,只取出其中的一个部分,从而能够降低开销,加快查询速度

比如论坛类的网站,展示帖子的时候往往会有分页展示的效果

一个论坛可能有几千/几万的帖子,打开页面的时候,其实只能先看到其中的一小部分(比如只显示前20条记录)

-- 起始下标为 0-- 从 0 开始,筛选 n 条结果SELECT...FROM table_name [WHERE...][ORDERBY...]LIMIT n;-- 从 s 开始,筛选 n 条结果SELECT...FROM table_name [WHERE...][ORDERBY...]LIMIT s, n;-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用SELECT...FROM table_name [WHERE...][ORDERBY...]LIMIT n OFFSET s;

image-20220711075405597
案例一:显示前三名的成绩

select name,chinese + english + math as total from exam_result orderby total desclimit3;

image-20220711075558960
案例二:按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页

-- 第 1 页SELECT id, name, math, english, chinese FROM exam_result ORDERBY id LIMIT3OFFSET0;-- 第 2 页SELECT id, name, math, english, chinese FROM exam_result ORDERBY id LIMIT3OFFSET3;-- 第 3 页,如果结果不足 3 个,不会有影响SELECT id, name, math, english, chinese FROM exam_result ORDERBY id LIMIT3OFFSET6;

后续如果要针对生产环境的数据库进行查询,记得最好都加上limit,防止出现意外导致服务器挂了~~

10 修改(Update)

此处的修改时针对数据库服务器进行的!

这样的修改是持续有效的。

update 表名 set 列名 = 值,列名 = 值...[WHERE...][ORDERBY...][LIMIT...]

核心信息:针对哪个表,表里的哪些行,哪些列,改成啥样的值

案例:

-- 将孙悟空同学的数学成绩变更为 80 分UPDATE exam_result SET math =80WHERE name ='孙悟空';-- 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分UPDATE exam_result SET math =60, chinese =70WHERE name ='曹孟德';-- 将总成绩倒数前三的 3 位同学的数学成绩减去 30 分UPDATE exam_result SET math = math -30ORDERBY chinese + math + english LIMIT3;-- 将所有同学的语文成绩更新为原来的 2 倍UPDATE exam_result SET chinese = chinese *2;

修改操作,是针对条件筛选之后剩下的数据进行的修改

如果没写条件,意味着就是针对所有的行都修改!

11 删除(Delete)
DELETEFROM table_name [WHERE...][ORDERBY...][LIMIT...]

delete 只是把表的内容清空但是表还在,但是drop是把表连带数据一起删除

案例:

-- 删除孙悟空同学的考试成绩DELETEFROM exam_result WHERE name ='孙悟空';-- 删除整张表数据-- 准备测试表DROPTABLEIFEXISTS for_delete;CREATETABLE for_delete (
id INT,
name VARCHAR(20));-- 插入测试数据INSERTINTO for_delete (name)VALUES('A'),('B'),('C');-- 删除整表数据DELETEFROM for_delete;

‘孙悟空’;
– 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
UPDATE exam_result SET math = 60, chinese = 70 WHERE name = ‘曹孟德’;
– 将总成绩倒数前三的 3 位同学的数学成绩减去 30 分
UPDATE exam_result SET math = math - 30 ORDER BY chinese + math + english LIMIT 3;
– 将所有同学的语文成绩更新为原来的 2 倍
UPDATE exam_result SET chinese = chinese * 2;


修改操作,是针对条件筛选之后**剩下的数据**进行的修改

如果没写条件,意味着就是针对所有的行都修改!

##### 11 删除(Delete)  

```sql
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]

delete 只是把表的内容清空但是表还在,但是drop是把表连带数据一起删除

案例:

-- 删除孙悟空同学的考试成绩DELETEFROM exam_result WHERE name ='孙悟空';-- 删除整张表数据-- 准备测试表DROPTABLEIFEXISTS for_delete;CREATETABLE for_delete (
id INT,
name VARCHAR(20));-- 插入测试数据INSERTINTO for_delete (name)VALUES('A'),('B'),('C');-- 删除整表数据DELETEFROM for_delete;

本文转载自: https://blog.csdn.net/Living_Amethyst/article/details/125824250
版权归原作者 Living_Amethyst 所有, 如有侵权,请联系我们删除。

“超详细的MySQL基本操作”的评论:

还没有评论