当前位置:网站首页>Super detailed MySQL basic operations

Super detailed MySQL basic operations

2022-08-09 09:39:00 Living_Amethyst

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 创建数据库
create database 数据库名;

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

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

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

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

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

image-20220708224804512
6.2 显示数据库
show databases;

可查看当前存在的数据库

image-20220708224940468
6.3 选中数据库

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

use 数据库名;
image-20220708231845302
6.4删除数据库
drop database 数据库名;

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

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

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

image-20220708231907111

7 常用数据类型

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

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

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

7.1 数值类型

分为整型和浮点型

数据类型大小说明对应java类型
BIT[ (M) ]M指定位 数,默认 为1二进制数,M范围从1到64, 存储数值范围从0到2^M-1常用Boolean对应BIT,此时 默认是1位,即只能存0和1
TINYINT1字节Byte
SMALLINT2字节Short
INT4字节Integer
BIGINT8字节Long
FLOAT(M, D)4字节单精度,M指定长度,D指定 小数位数.会发生精度丢失Float
DOUBLE(M, D)8字节Double
DECIMAL(M, D)M/D最大 值+2双精度,M指定长度,D表示 小数点位数.精确数值BigDecimal
NUMERIC(M, D)M/D最大 值+2和DECIMAL一样BigDecimal

注:DECIMAL相当于通过字符串的方式来表示浮点数.优势就是能够精确表示,精确计算.但是劣势就是计算时候消耗的时间更多,存储空间也更多.所以我们除非是特别需要,才考虑使用DECIMAL.

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

注意:

  • varchar(20),表示这个字段最多存20个字符,注意是字符不是字节
  • 表格中上面三个存的是文本数据,而BLOB存的是二进制数据
7.5 日期类型
数据类型大 小说明对应java类型
DATETIME8 字 节范围从1000到9999年,不会进行时区的 检索及转换.java.util.Date、 java.sql.Timestamp
TIMESTAMP4 字 节范围从1970到2038年,自动检索当前时 区并进行转换.java.util.Date、 java.sql.Timestamp

时间戳:以1970年1月1日0时0分0秒作为基准时刻,计算当前时刻和基准时刻的秒数之差.

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

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

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

8 数据表的操作

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

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

例如:

create table student(id int,name varchar(20))

这样我们就创建了这样的表

image-20220708232218588

我们看一下怎么操作

image-20220708232259623

注:

  1. 同一数据库中,不能有两个名字相同的表
image-20220708232351950
  1. 创建表的时候,表名或者列名不能取SQL中的关键字(如果非用不可,需要加反引号==`==)
  2. 有时候,建表语句可能比较复杂比较长,这时候就可以分成多行来写(在没有 ; 的时候按回车就可以),但多行编辑一旦写错就回不去了,解决办法:可在其他编辑器把SQL写好再复制过去
拓展:MySQL中的注释

image-20220710220838456

8.2 查看表

再选中数据库的前提下

show tables;
image-20220708233346123
8.3 查看表结构

可以查看表里的列和类型

desc 表名;

desc是describe的缩写

image-20220708233454391

8.4 删除表
drop 表名;

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

9 MySQL表的增删查改

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

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

9.1 新增元素(create)
insert into 表名 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来查看警告内容

show warnings
image-20220710200113284

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

9.2.4 查询的时候可以起别名
image-20220710200352884
9.2.5 去重查询
select distinct 列名 from 表名;

这样能把查询结果相同的行,合并成一个

image-20220710200933633

distinct后面也能指定多个列,但必须是多个列中每个列的值都相同才会视为相同(才会去重)

9.2.6 排序查询

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

select 列名 from 表名 order by 列名;
image-20220710202947573

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

select 列名 from 表名 order by 列名 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是 NULL
IS NOT NULL不是 NULL
LIKE模糊匹配.% 表示任意多个(包括 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 > 80 and english > 80;
-- 查询语文成绩大于80分,或英语成绩大于80分的同学
SELECT * FROM exam_result WHERE chinese > 80 or english > 80;
-- 观察AND 和 OR 的优先级:(先算 and 后算 or)
SELECT * FROM exam_result WHERE chinese > 80 or math>70 and english > 70;
SELECT * FROM exam_result WHERE (chinese > 80 or math>70) and english > 70;
image-20220710223237451image-20220711071023899
  • 范围查询:

    1.BETWEEN … AND …

-- 查询语文成绩在 [80, 90] 分的同学及语文成绩(闭区间)
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;
-- 使用 AND 也可以实现
SELECT name, chinese FROM exam_result WHERE chinese >= 80 AND 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 = 58 OR math = 59 OR math = 98 OR 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 IS NOT NULL;
-- 查询 qq_mail 未知的同学姓名
SELECT name, qq_mail FROM student WHERE qq_mail IS NULL;
SELECT name, qq_mail FROM student WHERE qq_mail <=> NULL;  -- 也可以
9.2.8 分页查询:LIMIT

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

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

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

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

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

 select name,chinese + english + math as total from exam_result order by total desc limit 3;
image-20220711075558960

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

-- 第 1 页
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3
OFFSET 0;
-- 第 2 页
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3
OFFSET 3;
-- 第 3 页,如果结果不足 3 个,不会有影响
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3
OFFSET 6;

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

10 修改(Update)

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

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

update 表名 set 列名 =,列名 =...[WHERE ...] [ORDER BY ...] [LIMIT ...]

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

案例:

-- 将孙悟空同学的数学成绩变更为 80 分
UPDATE exam_result SET math = 80 WHERE name = '孙悟空';
-- 将曹孟德同学的数学成绩变更为 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)
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]

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

案例:

-- 删除孙悟空同学的考试成绩
DELETE FROM exam_result WHERE name = '孙悟空';
-- 删除整张表数据
-- 准备测试表
DROP TABLE IF EXISTS for_delete;
CREATE TABLE for_delete (
id INT,
name VARCHAR(20)
);
-- 插入测试数据
INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');
-- 删除整表数据
DELETE FROM 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是把表连带数据一起删除

案例:

-- 删除孙悟空同学的考试成绩
DELETE FROM exam_result WHERE name = '孙悟空';
-- 删除整张表数据
-- 准备测试表
DROP TABLE IF EXISTS for_delete;
CREATE TABLE for_delete (
id INT,
name VARCHAR(20)
);
-- 插入测试数据
INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');
-- 删除整表数据
DELETE FROM for_delete;
原网站

版权声明
本文为[Living_Amethyst]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/221/202208090934331342.html