前言
虽然在大一下学期,就已经接触到了MySQL,但是那个时候只是会用MySQL进行增删改查,在大三上学期,尝试投简历寻找实习时,对方公司对于程序员的MySQL水平有很高的要求,所以我开始系统化的学习MySQL。顺便将整理出的笔记逐步写入博客中,日积月累,准备发表一篇长篇博客。
本篇博客的特点
本篇博客,我会以一个学过的人的身份给大家来讲,所以里面很多部分我会以教师与学生的视角来书写。这可能也会让大家比较可以接受。
MySQL的重要性
MySQL的重要性-SQL写的好,工作随便找。
可以看出其实在现在的工作中,很多的软件app都选择了MySQL作为数据存储的工具。但是光学语法有用么?固然学会了语法非常重要,但是实际上,MySQL在使用时的提速也非常的重要。大量的数据在处理的时候,都需要用一些算法对搜索等过程进行优化。
举个栗子,假设有100万条数据,现在让你进行查询操作,如果不用任何的技巧,我们的思路就是直接一个循环,对内部数据进行遍历,这样的速度可想而知。那么如果使用算法进行优化,那么速度就会有所提升。这也是很多大厂目前数据库操作中最为常见的现象。数据量大,需求响应时间短。
数据模型
下图是MySQL的数据模型,我们就是客户端,通过DBMS创建数据库,再从数据库中创建数据表。当然一个数据库可以创建多个数据表。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cW6qwk4X-1667577677143)(https://note.youdao.com/yws/res/1/WEBRESOURCE0301c28c7ad0bceb41f8ffc984f66111)]
SQL通用语句
- 首先SQL语句可以单行书写,同时也支持多行书写,以分号作为结尾。
- SQL语句可以使用空格/锁进来增强语句的可读性。
- MySQL数据库的SQL语句不区分大小写,但是关键字一般建议大写。
- 注释:
- 单行注释: # 注释内容 或者 – 注释内容
- 多行注释: /* 注释内容 */
SQL分类
数据库操作
查询
查询所有数据库
我们在服务器或者本地搭建数据库服务之后,我们可以创建很多的数据库,但是数据库有很多了之后我们需要实时的知道都有哪些,因为他们的数据库名称不同,所以我们要使用下面的语句。
SHOW DATABASES;
可以看到在写好这个语句之后,我们所有的数据库都会显示出来。
查询当前数据库
SELECT DATABASE();
创建
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLIATE 排序规则]
我们通过上面这句话可以创建一个新的数据库。当然IF NOT EXISTS可以帮我们判断是否存在这个数据库。当存在此数据库时,将不会产生任何操作,在不存在此数据库时,才会创建一个全新的。同时我们MySQL的编码格式不建议使用utf8的格式,我建议使用utf8mb4.
删除
DROP DATABASE [IF EXISTS] 数据库名;
通过上面的语句也可以达成删除的效果。
删除并重新创建表
TRUNCATE TABLE 表名;
使用
USE 数据库名
数据表操作——查询
查询当前数据库中所有的表
SHOW TABLES
上面的代码操作时对数据库中表数据的遍历显示,在运行后,可以显示出当前数据库内,所有的数据表。
查询表结构
DESC 表名
在对表数据的结构进行查询之后,可以看到表中存在一个name的列名,同时数据类型是varchar类型。可以为NULL等等信息。
查询指定表的建表语句
SHOW CREATE TABLE 表名
然后我们可以通过上面的语法,了解如何创建一个表,使新的表的结构,字符完全一致。
数据表操作——创建
创建表
CREATE TABLE 表名 ( 字段1 类型 COMMENT '注释', 字段2 类型 COMMENT '注释', 字段3 类型 COMMENT '注释', 字段4 类型 COMMENT '注释' )
我们通过上面的语法变化我们想要的数据结构来进行创建,可以看到在执行之后,一个符合我们预期效果的表数据就出现了。
数据表操作——数据类型
MySQL中主要支持三大类型,数值类型,字符串类型,时间日期类型。
数值类型
- TINYINT 就是1个字节的整型数据。
- SMALLINT 就是2个字节的整型。
- MEDIUMINT 就是3个字节。
- INT 正常大小的整型,占用4个字节。
- BIGINT 就是很大的整型,占用8个字节。
- FLOAT 单精度浮点数值
- DOUBLE 双精度浮点数值
- DECIMAL 小数值
举个例子,我们在存储某个人年龄时,因为人分的年龄不会超过255,所以可以使用TINYINT类型,同时又因为人的年龄不存在负数,所以使用unsigned,也就是无符号类型。
字符串类型
这里我们需要区分的就是text和blob,首先text就是存储文本,这个大家应该并不陌生,但是blob是用来存储二进制文件的,很多时候,人们将图像传输到数据库,就是使用的blob,同样一些软件安装包也是这种效果,因为这样效率不高,也不好管理。
然后我们区分一下char和varchar。首先char使是定长,也就是说,假设我想存储一个1,那么用char的化,占用10字节,其余九个位置用空格来占用。如果是varchar那就只占用1个字节。
日期时间类型
这里没有太多要解释的,我们一般不使用最后一种类型。
数据表操作——修改
添加字段
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
可以看到我们向demo2中添加一个nickname的列信息,执行后就出现了nickname。
修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
在输入上述语句后,我们成功将nickname字段的数据类型修改为char类型。长度是10个字符。
修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型(长度) [COMMENT 注释] [约束];
在经过上面的操作之后,我们的nickname成功的更改为new_nickname,并且转换为了50字符长度的varchar类型
删除字段
ALTER TABLE 表名 DROP 字段;
在上面的语句执行后,我们就可以删除掉new_nickname字段。
修改表名
ALTER TABLE 表名 RENAME TO 新表名;
这样我们就可以表demo2转化为demo3
数据表操作——插入
给指定字段添加数据
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);
那么我们可以先来看一下这个语句,首先字段1,字段2就是想要操作的位置,那么和C语言中的格式化很像,我们要将值1和值2对号入座,放入对应的字段中,实现插入的效果。那么我们来看一下实际操作。
这里我们要注意数据类型中,字符类型就要用单引号,那么数值类型的话,就不可以使用单引号。
给全部字段添加数据
当我们明确要给所有字段添加数值时,其实就是添加一整条新的数据,那么我们可以简化我们之前的SQL语句。因为我们不需要去考虑那些要添加,哪些不添加了,所以我们只需要按照数据库中字段顺序进行书写就可以了。
INSERT INTO 表名 VALUES (值1, 值2, ...);
现在我们可以看到这样语句更加简单,也很容易理解。
批量添加数据
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...),(值1, 值2, ...); INSERT INTO 表名 VALUES (值1, 值2, ...),(值1, 值2, ...);
上面就是批量添加数据的操作,我们可以理解为,批量添加数据就是,在添加一条数据的后面再加上一组或更多组。这个语句就不在展示范例了。
注意
- 插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
- 字符串和日期类型要用单引号括起来。
- 插入的数据大小,应该在字段的范围内。
数据表操作——修改
修改数据
UPDATE 表名 SET 字段名1=值1, 字段名2=值2,.....[WHERE 条件];
我们可以发现更新数据时,set后面不需要括号,只需要用逗号隔开就好。当然后面的WHERE条件也不是必要的,当我们不加入条件时,我们的更改就会覆盖整个表。下面我们来看一下样例。
可以看到我们的loading名字被修改成了wow。这个就是我们的更改方法。
删除数据
DELETE FROM 表名 [WHERE 条件]
这个就是我们删除数据的一个语句,我们只需要将数据进行一个限定就可以做到精确删除摸一个值的位置,那么那一整行就被我们删除掉了。下面我们来看一下样例。
不难看出create的数据被我们删除了。
数据表操作——查询
首先我们要知道,在我们平时生活中,数据库中业务量最高的操作就是查询操作,也就是我们的SELECT操作。当然再MySQL中查询也有很多的方式,我们这一次都要学习,但是我就不像之前一样给大家写一个大的总结了,我们直接来分块学习。
基本查询
查询单个字段或多个字段
其实基本查询就是我以前最为常用的,简单粗暴的方式啊,直接查询整个数据表。我们有两种写法,第一种就是分字段,只搜索我想要的字段,还有一种就是全部搜索,不管是什么字段,我全都进行搜索。
SELECT 字段1, 字段2, ... FROM 表名; SELECT * FROM 表名;
这就是我说的两种写法的规范方式,第一个我们输入我们想要查询的字段,然后说明要在那个数据表中进行操作,就可以得到结果。第二个就是我要表明我要查询的表名,然后就可以获取表中所有字段的所有数据。下面我们来看一个示例。
我们可以看到再搜索了一个姓名的字段之后,我们的数据库给我们返回了一个字段下的所有的数值。
上面就是完全查询的写法。可以发现它可以自动返回所有字段的所有数据。