嗨嗨嗨,又来了┗|`O′|┛ 嗷~,这次是经过七天遗忘之后基本全忘完了的MySQL入门教学,只供0基础和康复训练人员酌情使用。了解了以上这些之后仍然知傻不退,那么我们就该进入正题了。
什么是MySQL?
MuSQL是目前市面上最常用的的应用于企业级项目的数据库,支持部署在包括Windows、Linux、Mac在内的主流操作系统,可以通过java、PHP、Python等多种主流编程语言进行操作。 常见版本分为免费供个人用户使用的社区版、付费供企业用户使用的企业版,操作简单、功能强大、应用广泛、上手简单,在可以预见的短期未来中仍将占据企业级项目的主流位置。
简单了解一下MySQL的机制和组成部分
MySQL服务:MySQL的本体,负责存储数据,执行传入的SQL语句
MySQL客户端:接收用户输入的SQL语句,以及展示SQL语句的执行结果
MySQL数据库默认端口号:3306(视情况可变)
默认的MySQL客户端对于SQL语句执行和结果查看非常不方便,我们在绝大多数使用情况下都应当使用数据库编辑工具更好完成对于数据库的数据进行操作。
常用数据库编辑工具:DBeaver(后文使用),navicat(更常见、更好用)
MySQL使用入门
使用工具:DBeaver
特点:开源免费 作用:可视化界面,直观地展现我们执行的SQL命令和结果,便于查看和管理数据库
连接准备:服务器ip地址(此处使用虚拟机),MySQL的端口号(默认3306),MySQL的用户名和密码
错误点
对象服务器IP地址变更时,可在工具中修改连接ip地址重新连接
服务器未开机,无法连接数据库
1.构建具体使用场景:测试工作开始前准备需要在测试中使用的数据(格式严格按照后端或产品给出的文档)
1.1创建数据库
在我们成功连接DBeaver后,左侧视图中应该会显示我们当前连接的服务器(名称为自定义),我们左键选中这个服务器,右键新建一个数据库(请根据自己所使用的工具自行摸索),也可以使用如下命令创建一个编码格式为utf8的数据库(utf8是常见的支持中文的编码方式,实际请严格按照项目需求选择编码方式)
create database if not exists 数据库名 default charset utf8 collate utf8_general_ci;
1.2创建数据表
在我们创建好的数据库中,右键单击该数据库可以选择创建一张数据表,可以手动编辑列名、类型、约束等一系列选项,也可以通过sql命令来进行创建,命令如下
create table if not exists 表名(
列名1 类型 约束,
列名2 类型 约束,
列名3 类型 约束,
...
);
常见的字段类型有整型(int)、字符型(varchar)、小数(decimal)、日期时间(datetime)四种,约束则有主键(PK)、外键(FK)、唯一(UNIQUE)、非空(NOT NULL)、默认值(DEFAULT)六种。 我们通常将第一列设为“ID”作为这张表的主键,当表中数据本身存在一个不重复的列时,可以将该列作为第一列,常写做“xx_ID”或“xx_NO”。表中应有且只有一个主键约束,其他种类约束可以复数存在。
2.数据准备
2.1添加数据
在大多数数据库连接工具中都可以通过可视化页面进行手动的数据插入,而当有需要进行批量插入时可以使用如下命令
①insert into 表名 values
(字段1,字段2,字段3,...),
(字段1,字段2,字段3,...),
(字段1,字段2,字段3,...)
...;
这种插入方式也被称为全量插入,其中插入的数据必须与表中全部字段数量、顺序、格式都匹配,多组数据之间通过“,”分割。
②insert into 表名(字段1,字段2) values
(字段1,字段2),
(字段1,字段2),
(字段1,字段2),
...;
这种插入方式被称为部分插入,其中插入的数据与表名后括号内规定的字段数量、顺序、格式匹配,多组数据之间也通过“,”分割。
2.2删除数据
通常我们可以使用工具直接在可视化界面中将数据表删除,而当我们使用命令进行删除时有以下三种选择:
① delete from 表名 (where 筛选条件);
这种方式会删除指定表中符合筛选条件的所有行中的数据,如果不使用筛选则会删除表中所有行的数据。
以此种方式进行删除时表本身的结构不会受到改变,所有约束仍然存在,已设置为自增的字段会从被删除的尾端继续自增(删除部分为1000,继续自增为1001)。
②truncate from 表名;
这种方式会删除指定表中所有行的数据且不可进行筛选,与delete一样,truncate不会破坏表本身的结构和约束,但自增长字段会重新计数(删除部分为1000,自增重新从1开始)。
③drop table if exists 表名;
这是一种针对于表本身而非行的删除方式,它会清除包括表结构和约束在内的所有数据(在数据库中找不到此表),因为这个方式可能会影响到其他表的外键约束,所以在使用时请多次确认。
2.3修改数据
同样的,表中的数据也可以通过数据库连接软件的可视化界面进行非常直观的手动更改,但是这样的更改方式只适用于少量数据的变更,而对于大量数据的修改我们可以通过以下命令执行:
update 表名 set 字段1=值1,字段2=值2,字段3=值3... (where 筛选条件);
通过update方式更改的数据值的格式必须与字段要求格式一致,前后顺序不做要求,使用筛选可以指定修改的行数,如果不使用筛选则会改变表中所有行的数据。
2.4简单查询
作为sql中最为常用、重要的功能,查询语句的复杂性和多样性也是最高的,本小节中仅展示最为简单的基础查询,详细的查询语句将在之后的段落中讨论,命令如下:
select 字段1,字段2... from 表名;
此处的“字段”必须是存在于指定表名中的字段,多个字段间使用“,”进行分割,也可以使用“*”作用是展示全部字段的结果。
3.基础查询详解
3.1 别名
在select语句中可以对字段和表名取别名,这既可以方便我们适当减少字段和表名过长时带来的视觉压力,也可以使我们在后续的“联表查询”小节中进行多个数据表的字段区分。
select 字段1 as 别名1,字段2 as 别名2 from 表名 as 表别名;
一般我们将表名或字段名的前两个或三个字母作为别名,或是在多个单词组合的情况下取各自的首字母作为别名,需要注意的是字段别名和表别名不允许重复。
3.2结果去重
很多情况下我们查询到的结果中有某些字段是大量重复的,我们可以通过“去重”来使这些结果合并展示,特别需要注意的是去重只能合并指定字段的重复结果,如果查询结果存在其他字段则会导致展示结果混乱,这种情况请参阅“聚合函数-分组”章节。
select distinct(字段名) from 表名;
请尽可能单独使用去重。
3.3运算符
3.3.1比较运算符
大于 >
小于 <
等于 =
大于等于 >=
小于等于 <=
不等于 != 或 <>(不常用)
select 字段 from 表名 where 条件1 比较运算符 条件2;
请注意两个条件必须是可以比较的类型,如整型、小数,等于 = 和不等于 != 较为特殊,可以比较两个字符型数据。
3.3.2逻辑运算符
逻辑运算符用于比较运算符之间的连接和处理,并非单独使用
与 and (通过and连接的条件必须全部符合才通过)
或 or (通过or连接的条件只需符合其中一个就通过)
非 not (不符合not后的条件才通过)
select 字段 from 表名 where (仅not) 条件1(含比较运算符) 逻辑运算符(仅and\or) 条件2(含比较运算符);
逻辑运算符的数量没有限制,格式较为复杂,使用时需要谨慎斟酌。
3.3模糊匹配
sql中存在着针对字符型的查询方式,使用关键字like
匹配任意个字符 %
匹配一个字符 _
select 字段 from 表名 where 字段(字符型) like '需要匹配的字段'(格式类似于 %x,_x,%x%,x_);
对于 % 会匹配任意个字符,包含0个,对于 _ 只会匹配一个字符,在需要指定字数时使用复数个 _ 格式类似于 x__。
3.4范围查询
位于连续范围中 between and
位于非连续范围中 in
select 字段 from 表名 where 条件1 between 条件2 and 条件3;
通常用于一个指定的数值范围,如[1,100],也可指按顺序排列的字母,如[A,Z]。
select 字段 from 表名 where 条件1 in (条件2,条件3,条件4...);
通常用于在指定几个关键字之间查找,如地区('北京','上海','广东');
3.5空判断
对于sql中的空判断,我们通常讨论两种情况:空字符、为空。在可视化界面中空字符表现为'',即一片空白,实际存在字符,该字符值=空。为空表现为 null ,即无数据,表示该位置没有任何类型的数据存在,是判定上的“空”。
对于非字符型的判断
select 字段 from 表名 where 条件 is not null;
对于字符型的判断
select 字段 from 表名 where 条件 is not null and 条件 != '';
3.6结果排序
排序使用"order by"关键词,默认排序方式为值从小到大,只能对可以进行排序的类型进行处理(整型、小数、仅数字字符、日期)
升序排列 asc
降序排列 desc
select 字段 from 表名 order by 字段1 asc/desc,字段2 asc/desc ...;
可对多个字段使用不同顺序进行排序,各字段间通过","分割。
order by 在查询语句中位置较为靠后,仅在 limit 前,使用时需要注意格式是否正确。
3.7聚合函数
sql中存在一种对查询结果进行处理的方式,称之为聚合函数
总数 count()
最大值 max()
最小值 min()
数值求和 sum()
数值平均值 avg()
select 聚合函数(字段) from 表名;
对结果进行处理意味着可以使用筛选、分组、排序的方式先对原始数据进行处理,处理结果再由聚合函数进行二次处理。
聚合函数在结果展示时作为一个单独的字段进行处理,可以和普通字段一样使用“,”分割,也可以取别名。
3.8分组查询
对于表中某个字段存在多种重复情况时,可以进行分组查询group by,分组查询的条件应当在查询结果中得到体现(建议)
select 字段1,字段2,聚合函数 from 表名 group by 字段1,字段2...;
对于分组查询的结果,只展示分组条件被合并后的行(如“所在地”字段中存在3行“北京”,则结果中只会展示第一行),但是聚合函数的使用则不受影响,所以分组查询通常和聚合函数一起出现。
对于分组查询的结果仍然可以进行筛选,这时需要使用关键字 having 进行筛选
select 字段1,字段2,聚合函数 from 表名 group by 字段1,字段2 having 条件;
having的使用方法与where基本一致,区别点在于位置和having支持使用聚合函数作为条件,而where不能使用聚合函数作为条件。
having和where可以共存,where在分组前进行筛选,而having在分组后进行筛选。
3.9结果分页
对于任何查询语句,其结果都可进行分页,使用关键词 limit。
select 字段 from 表名 limit(m,n);
对应limit关键字,它的参数m指的是展示数据的起始行数(从0开始计数),n指的是展示几行数据,即展示的数据行数为m-1到m-1+n行。
4.联表查询
对于数据库操作来说,单表查询是较为简单的部分,但在实际生产环境而言一组数据的各个组成部分可能分别储存在多个表中,这些表通过外键约束维护各自之间的联系,而联表查询就是通过各表之间的联系来从某个表独有的数据中插叙与其相关的表中数据的方式。
4.1联表方式
联表查询,顾名思义,将复数个表进行连接再进行查询,而表之间联系的方式主要有三种,连接时可以使用关键字 on 来指定连接所使用的字段
内连接 inner join
左连接 left join
右连接 right join
这里不方便使用抽象的表达,那么我们用一个例子来解释
select * from 表1
联表方式 表2 on 表1.外键 = 表2.主键;
从上面这个语句可以明显看出,连接的表之间存在一个先后关系,先出现的表(即表1)在连接时位于左侧,后出现的表(即表2)连接时位于右侧。
只有当表与表之间存在至少一个字段关联时才可以进行有效的联表,当不满足这一条件时,表与表之间将采取穷举的方式进行拼接。
内连接指的是,两个表中都存在相应的数据,即“表1.外键 = 表2.主键”,对应的行将进行拼接,不满足条件的行都将被消除。
左连接指的是,左表中存在数据就进行拼接,右表中不存在对应数据时就使用'null'进行填充,仅右表存在的数据将被舍弃。
右连接指的是,右表中存在数据就进行拼接,左表中不存在对应数据时就使用'null'进行填充,仅左表存在的数据将被舍弃。
4.2自关联
当表中某个字段存在明显的上下级关系(如'省'、'市'、'区')时,可以使用自关联的方式来对数据进行查询。
自关联即将一张表通过内连接的方式与自身连接,当做多张表来进行查询的方式,需要注意的是自关联中所使用的表必须要指定不同的别名。
create table areas(aid int primary key, atitle varchar(20),pid int);
-- 插入数据:
insert into areas values
('130000', '河北省', NULL), ('130100', '石家庄市', '130000'),
('130400', '邯郸市', '130000'), ('130600', '保定市', '130000'),('130700', '张家口市', '130000'),
('130800', '承德市', '130000'),('410000', '河南省', NULL), ('410100', '郑州市', '410000'),
('410300', '洛阳市', '410000'),('410500', '安阳市', '410000'),('410700', '新乡市', '410000'),
('410800', '焦作市', '410000'),('410101', '中原区', '410100'),('410102', '二七区', '410100'),
('410301', '洛龙区', '410300');
可以明显发现对应存在上下级关系的地区之间“pid”和“aid”字段是一致的,此时我们就可以使用自关联。
具体格式如
select * from areas as a1
inner join areas as a2 on a1.aid = a2.pid
where 条件;
4.3子查询
在sql查询语句中,筛选的条件、使用到的表都可以是另一个查询的结果,这样的情况被称为子查询。子查询的标志是(),具体应用场景十分多样,格式变化很多,这里只展示两种。
作为筛选条件
select * from 表名1 where 条件 in (select 字段 from 表名2 where 条件);
作为数据源
select 字段 from (select * from 表名 where 条件) where 条件;
结语
MySQL是最常用的关系型数据库,而大多数关系型数据库(如SQLite、oracle)的操作语句格式大同小异,从其中任意一种切入都可以有效地掌握基础。 本文章中展示的所有sql语句都只是最基础的款式,只能满足最基本的数据库操作需求,如果你在工作学习中遇到任何本文没有提及的语句或是困难,请求助于各搜索引擎或技术论坛,恕本人才疏学浅,无法提供任何帮助或解答~~(也可以发出来试试,说不定评论区有大佬回答呢)~~。