网站建设平台策划,创建网站得花多少钱,网页设计图片滑动,乐陵网站优化【前言】本文展示的是作者自己学习 MySQL 中学到的知识和学习的过程。内容框架与核心知识点主要参考了网络公开技术文档、主流数据库教程及行业实践资料#xff0c;其中《MySQL 是怎样使用的——快速入门 MySQL》参考较多#xff0c;也比较推荐需要的朋友阅读#xff0c;真的…【前言】本文展示的是作者自己学习 MySQL 中学到的知识和学习的过程。内容框架与核心知识点主要参考了网络公开技术文档、主流数据库教程及行业实践资料其中《MySQL 是怎样使用的——快速入门 MySQL》参考较多也比较推荐需要的朋友阅读真的是国产良心书籍。为帮助读者系统掌握 MySQL 基础我们对分散的知识进行了整合、梳理与优化补充了实操案例与关键说明使内容更具连贯性和实用性。目录一、MySQL 概述与安装1.1 数据库与数据库管理系统1.2 MySQL 的安装二、MySQL 初体验2.1 客户端/服务器架构2.2 SQL 语句介绍2.3 MySQL 语句使用注意事项三、MySQL 数据类型3.1 整数类型3.2 浮点数类型3.3 定点数类型3.4 日期和时间类型3.5 字符串类型3.6 二进制类型四、数据库和表的基本操作4.1 创建数据库4.2 删除数据库4.3 创建表4.4 删除表4.5 查看表的结构4.6 修改表五、列的属性5.1 表的查询和插入语句5.2 列的属性5.3 补充说明六、简单查询6.1 查询列6.2 查询结果去重6.3 限制结果集记录条数6.4 对查询结果排序6.5 带搜索条件的查询一、MySQL 概述与安装1.1 数据库与数据库管理系统数据库DatabaseDB即存储数据的仓库。而数据库管理系统Database Management SystemDBMS则是人们发明用来管理数据库的专门的软件系统。数据库常分为关系型数据库Structured Query LanguageSQL常见的有 MySQL、Oracle、Sql Server、DB2、SQLlite 等通过表和表之间行和列之间的关系进行数据的存储。和非关系型数据库Not Only SQLNoSQL常见的有 Redis、MongoDB 等。数据以对象的形式存储在数据库中而对象之间的关系通过每个对象自身的属性来决定。1.2 MySQL 的安装MySQL 的代码是公开的并且较为稳定因此是大部分数据库初学者的首选系统。以下安装配置教程作者已经自行尝试确保可靠可信。MySQL 安装配置完整教程MySQL密码修改忘记密码方式二、MySQL 初体验2.1 客户端/服务器架构MySQL 的运行过程可以概括为多个客户端程序可以连接到服务器程序。客户端向服务器发送增删改查等请求然后服务器程序对存储的数据进行相应的处理。同我们日常所用的所有软件类似MySQL 的每一个客户端都需要使用用户名和密码才能登陆服务器并且只有在登陆之后才能向服务器发送某些请求操作数据。2.2 SQL 语句介绍SQLStructured Query Language结构化查询语言是一种用来与数据库管理系统进行交互的语言。MySQL 也是一种数据库管理系统支持大部分标准的 SQL 语句不过也有自己独有的语句之后本文将详细讲解如何使用 SQL 语句来管理数据。2.3 MySQL 语句使用注意事项从 2.1 中我们已经知道 MySQL 的基本运行过程是通过客户端程序发送请求这个请求实际上就是一个字符串给服务器程序服务器程序按照接受的语句去操作实际的数据并将响应响应也是一个字符串返回给客户端。在阅读上文中的安装教程并成功启动客户端后界面会一直显示 mysql _ 。这是一个提示符我们可以在它的后面输入语句。本节我们不会详细介绍具体的语句内容但会提供一些例子让大家可以尝试使用 MySQL 语句同时说明一些常见的注意事项。语句结束符号MySQL 语句必须以 ; \g \G 这三种符号中的一种来结尾。例如下图中执行了一个查询当前时间的简单语句mysql SELECT NOW(); --------------------- | NOW() | --------------------- | 2026-02-13 17:13:50 | --------------------- 1 row in set (0.00 sec)mysql SELECT NOW()\g --------------------- | NOW() | --------------------- | 2026-02-13 17:26:13 | --------------------- 1 row in set (0.00 sec)\G 的不同之处在于它以垂直的形式将结果中的每个列都展示在单独的一行中而不是上面的表格的形式mysql SELECT NOW()\G *************************** 1. row *************************** NOW(): 2026-02-13 17:27:40 1 row in set (0.00 sec)语句可以有任意行MySQL 中并不是按下回车键就是将语句发送给服务器了只要在按回车键时语句结尾还没有三种结束符号中的一种该语句就没有结束。mysql SELECT - NOW() - ; --------------------- | NOW() | --------------------- | 2026-02-13 17:34:34 | --------------------- 1 row in set (0.00 sec)可以一次提交多个语句语句之间用结束符分隔即可。并且结束符和下一条语句之间不一定需要空格。mysql SELECT NOW();SELECT NOW(); SELECT NOW(); --------------------- | NOW() | --------------------- | 2026-02-13 17:36:00 | --------------------- 1 row in set (0.00 sec) --------------------- | NOW() | --------------------- | 2026-02-13 17:36:00 | --------------------- 1 row in set (0.00 sec) --------------------- | NOW() | --------------------- | 2026-02-13 17:36:00 | --------------------- 1 row in set (0.00 sec)如果希望放弃本次操作可以在输入的语句后面加上 \c 符号mysql SELECT NOW()\c mysql虽然上面的示例中我们的语句用的都是大写字母但 MySQL 默认对语句的大小写没有限制mysql select now(); --------------------- | now() | --------------------- | 2026-02-13 17:39:53 | --------------------- 1 row in set (0.00 sec)在语句中有时会使用字符串我们可以选择使用单引号或双引号将字符串内容引起来建议习惯用单引号将字符串引起。mysql select apple; ------- | apple | ------- | apple | ------- 1 row in set (0.00 sec)三、MySQL 数据类型数据库中的数据都有着自己的数据类型。本章将介绍 MySQL 数据库提供的包括整数类型、浮点数类型、定点数类型、日期和时间类型、字符串类型、二进制类型等数据类型。3.1 整数类型至于如何区分某个数据类型是有符号还是无符号只需要在数据类型后面加上 UNSIGNED 则表明该类型用于表示无符号数。3.2 浮点数类型如果表中某个列存储的小数在一定范围内就可以使用 FLOAT(M, D) 或者 DOUBLE(M, D) 来限制可以存储到本列中的小数范围。其中 M 表示该小数最多包含的有效数字个数D 表示该小数保留小数点后十进制数字的个数。我们需要知道的是改变 M 和 D 的取值并不影响 FLOAT 和 DOUBLE 类型占用的存储空间大小。同时从 MySQL 8.0.17 开始MySQL 的设计者不推荐使用这种带有 M 和 D 的浮点数类型。3.3 定点数类型众所周知浮点数是不精确的但有时数据要求必须精确这种时候就需要一种新的数据类型也就是定点数类型。这里的 M 和 D 的含义与浮点数中的含义一样。定点数为了精确存储数据采用的策略是将十进制小数用小数点分隔开分别把小数点左右的两个十进制整数存储起来。【补充】这里讨论定点数的存储空间大小如何计算。我们以 DECIMAL(12, 4) 为例这时小数点左边的整数有 8 位右边的整数有 4 位。从小数点开始向左右两侧将每 9 位十进制位划分为一组。而每组所占用的存储空间大小可从上表得到最终相加得到的就是整体所占用空间的大小。这里 DECIMAL(12, 4) 所占用的空间大小为 6 字节。3.4 日期和时间类型MySQL 5.6.4 之后TIMEDATETIMETIMESLEEP 添加了对毫秒、微秒的支持。比如 DATETIME(0) 表示精确到秒DATETIME(3) 表示精确到毫秒DATETIME(5) 表示精确到 10 微秒。这里解释时间戳的概念我们把从 0 号时区北京所在的叫东八区的 1970-01-01 000000 开始到现在所经历的秒数称为时间戳。用时间戳存储时间的好处在于其值可以随时区变化而变化从而更灵活。3.5 字符串类型M 代表该数据类型最多能存储的字符数量L 代表实际向该类型的列中存储的字符串在特定字符集下所占的字节数W 代表在特定字符集下编码一个字符最多需要的字节数。为什么会有 L 1 这样的存储空间要求呢我们以 VARCHAR(M) 为例它所对应的存储空间由两部分组成分别是真正的字符串内容假设真正的字符串在采用特定字符集编码后占用的字节数为 L和占用的字节数假设采用某种字符集编码一个字符最多需要 W 字节那么当 M * W 256 时只需要 1 字节来表示占用的字节数当 M * W 256 时需要 2 字节来表示占用的字节数。有些时候表中某一列的内容虽然是字符串但只能是某些特定的字符串比如说性别列。这时我们采用ENUM 类型ENUM(str1, str2, ......)。该类型列的值只能在给定的字符串列表中选择其中的一个。假如某一列的值可以在给定的字符串列表中挑选多个那么可以使用SET 类型SET(str1, str2, ......)。3.6 二进制类型如果需要存储单个或多个二进制位可以使用 BIT 类型。一般来说对于较大的二进制数据比如说视频等通常不直接存储到数据库管理系统中而是将它们保存到文件系统中然后在数据库中存放一个文件路径即可。四、数据库和表的基本操作4.1 创建数据库我们从一个数据库如何创建开始说起。创建数据库的语句create database 数据库名;具体效果如下语句show databses;可以展示目前的 MySQL 中有哪些数据库可以看到其中有一个名叫 learnmysql 的数据库就是我们新创建的数据库。MySQL 中不允许出现两个名字一模一样的数据库因此如果不清楚某个名字的数据库是否存在可以使用下面的语句来创建数据库create database if not exists 数据库名;这样如果该名字的数据库已经存在那么什么都不会发生只是给出一个警告这是在提醒我们这个名字的数据库已经存在了。我们可以使用语句show warnings;来看警告是什么。创建完成数据库后我们需要了解对于每一个连接到 MySQL 服务器的客户端都有一个默认数据库所有创建的表都会放到默认数据库中。为了之后方便介绍表的操作我们这里需要将默认数据库切换为 learnmysql使用的语句是use 数据库名称;但要注意我们每次重新登录客户端时都需要重新指定默认数据库4.2 删除数据库当数据库不再使用时可以使用语句drop database 数据库名;来删除数据库。当然这是非常非常危险的操作请确保神智清醒的状态下再决定删除数据库。同创建时类似如果重复删除则为报错我们可以用语句drop database if exists 数据库名;来避免报错。4.3 创建表在创建表之前我们还需要将上面一步删除的数据库 learnmysql 重新创建并指定为默认数据库。我们已经知道数据库负责存放表那么我们可以使用语句show tables from 数据库名;来查看该数据库中有哪些表。如果想查看默认数据库中的表那么可以直接使用语句show tables;由于此时我们没有创建表因此 learnmysql 数据库中是空的。现在我们来创建第一个表。在 MySQL 中创建表的基本语法是create table 表名 ( 列名1 数据类型 {列的属性}, 列名2 数据类型 {列的属性}, ... 列名n 数据类型 {列的属性} );举个例子下面的语句就创建了一个由两个列组成的表。第一列数据类型为 int意味着只能存放整数第二列数据类型为 varchar(100) 意味着可存放长度不超过 100 字符的字符串。有时我们想给表增加一点注释方便之后了解这个表的功能那么可以使用语句create table 表名 ( 各列的信息 ) comment 表的注释信息;举个例子下面这个表的注释就是 ‘第二张表’。4.4 删除表如果某个表不再使用那么可以使用语句drop table 表1, 表2, ..., 表n;删除多个表。下面的操作我们就删除了 second_table 这张表。4.5 查看表的结构这里我们创建一张表方便后面的描述。我们可以使用以下五种语句中任意一种查看表格​​​​​​​describe 表名; desc 表名; explain 表名; show columns from 表名; show fields from 表名;举个例子【注意】以上的语句中都是直接使用表名这会让 MySQL 服务器在默认的数据库下查找给定表名的表。如果想使用默认数据库之外的某个数据库下的表可以在表名之前加上数据库名。数据库名和表名之间使用句点.分隔开数据库名.表名例如 describe learnmysql.first_table;4.6 修改表如果需要对已经创建完成的表进行增加或删除一列等操作就需要用到本小节介绍的一些语句。1. 修改表名修改表名有两种方式分别是alter table 旧表名 rename to 新表名; rename table 旧表名1 to 新表名1, 旧表名2 to 新表名2, ... 旧表名n to 新表名n;第二种方式可以一次性修改多个表格的名字。这里没有指明数据库因此还是默认数据库。如果在表名前加上数据库名那么还可以实现将表从一个数据库转移到另一个数据库的功能例如下面就将 first_table 从 learnmysql 转移到了 learnmysqltest 中。2. 增加列可以使用语句alter table 表名 add column 列名 数据类型 [列的属性];举个例子有时我们需要新增列不是默认地添加在最后而是在表中新增列这时可以使用下面的语句添加到第一列alter table 表名 add column 列名 数据类型 [列的属性] first;添加到指定列后面alter table 表名 add column 列名 数据类型 [列的属性] after 指定列名;3. 删除列可以使用语句alter table 表名 drop column 列名;举个例子4. 修改列信息修改列的信息有下面两种语句alter table 表名 modify 列名 新数据类型 [新属性];alter table 表名 change 旧列名 新列名 新数据类型 [新属性];第一种方式与第二种方式的差别在于第二种方式可以同时修改新列名。如果希望修改当前列的顺序可以使用下面几种语句将某一列设为表的第一列alter table 表名 modify 列名 列的类型 列的属性 first;将列放在指定列的后面alter table 表名 modify 列名 列的类型 列的属性 after 指定列名;以上四条语句我们用下面的例子来展示用法为了下面的讲述清楚我们将 first_table 表恢复成原来的样子。五、列的属性上面一章我们实际上只说了创建、删除和修改表的方式现在我们来说明如何向表中存入数据。5.1 表的查询和插入语句如何要查看当前表中存储的数据可以使用语句select * from 表名;此时我们的 first_table 表是空的因此如果运行这条语句应该会返回 Empty set。在 MySQL 中插入数据时是以行为单位的一行数据也称为一条记录。插入语句如下insert into 表名(列1, 列2, ...) values(列1的值, 列2的值, ...);其中列和值需要一一对应我们举例如下从上图可见第一条记录插入完成了。另外如果一条记录中对于某些列没有指定值那么这些列将被设置为 NULL表示此列的值尚不确定。如果希望在一条语句中批量插入记录那么可以使用语句insert into 表名(列1, 列2, ...) values(列1的值, 列2的值, ...), (列1的值, 列2的值, ...), ...;多个记录之前用逗号隔开。5.2 列的属性上节的 first_table 表存放在 learnmysqltest 数据库中现在我们重新在 learnmysql 数据库中创建一个 first_table 表。​​​​​​​1. 默认值在上一节中插入的记录如果没有指定某列的值那么列会默认为 NULL如果希望默认值不是 NULL那么可以在定义列时为该列增加一个 default 属性列名 列的类型 default 默认值从上图可见first_table 表中 second_col 列的默认值为 love。2. NOT NULL有时要求列的值不能是 NULL那么就可以添加属性 NOT NULL列名 列的类型 not null这时这一列的值就不能设置为 NULL如果设置为 NULL会报错也意味着在书写插入语句时这一列的值必须显式地指明不能忽略。3. 主键在表中我们可以通过某个列或是某些列的组合来确定一条唯一的记录我们把这个列或者这些列的列组合称为候选键比如说通过学号可以在学生信息表中确定唯一的一条记录。一个表可能有多个候选键此时可以选择其中一个候选键作为表的主键。一个表最多只能有一个主键组合键整体算一个主键通过主键可以找到唯一的一条记录。如果主键只有单个列的话可以在创建表时该列后声明 primary key。也可以把主键的声明单独放在列定义的最后不过要注意如果将组合键作为主键必须使用这种方式。声明了主键后MySQL 会对插入的记录进行校验如果待插入的记录的主键值已经在表中存在那么会报错。同时主键列的值默认具有 NOT NULL 属性。4. unique 约束除了主键如果还有其它列或者列组合中的值希望是唯一的那么就需要给这些列或者列组合添加 unique 属性也可以成为 unique 属性。与声明主键类似如果想为单个列声明 unique 约束可以直接在该列后填写 unique 或者 unique key。也可以选择将 unique 约束的声明单独提取出来 这里所用的语句格式为unique [key] [约束名称] (列名1, 列名2, ...)其中中括号中的内容表示可有可无。同样如果想给列组合添加 unique 约束必须使用第二种方式。这里解释一下什么是约束名称。约束指的是 MySQL 依照某种规则对插入的数据进行校验。unique 约束要求该列或该列组合中的值不能重复。每个约束都有自己的名字主键约束的名字是 primary这是固定不能更改的其余的 unique 约束我们可以自行定义名字。当然如果我们不取的话MySQL 会自动帮我们起一个名字。这里就不在本机上给大家演示了具体的代码例子可以看这里 create table first_table ( first_col int unique, second_col varchar(10) not null unique ); 或是 create table first_table ( first_col int, second_col varchar(10) not null, unique key key_test (first_col, second_col) );5. 外键如果 A 表中某列或者某些列的内容依赖 B 表中的某个列或者某些列那么就称 A 表是 B 表的子表B 表是 A 表的父表。比如说学生成绩表中的 number 列的值必须在学生信息表的 number 列中找到那么就可以定义外键constraint [外键名称] foreign key(列1列2...) references 父表名(父列1父列2...)这里也不在主机上举例了大家可以看下面的代码示例 create table student_score ( number int, subject varchar(10), score tinyint, primary(number), constraint foreign key(number) references student_info(number) );6. auto_incrementauto_increment 简称为自增可以为整数类型或浮点数类型的列声明该属性这样之后在插入新纪录时可以生成自动增长的唯一值。这里举个例子结合上面的示例我们说明几个注意点对于声明了 auto_increment 属性的列如果显示指明了该列的值那么该列值以我们显示指定的为准否则从 1 开始自增。double 对应的也是从 1 开始的自增一个表最多只有一个具有 auto_increment 属性的列。具有 auto_increment 属性的列必须建立索引且不能再指定 default 属性。一般 auto_increment 属性作为主键的属性来生成唯一标识一条记录的主键值。【注】索引是数据库中一种特殊的数据结构作用类似书的目录不用逐行扫描整张表就能快速定位到目标数据行同时帮助数据库高效维护自增 ID 的唯一性和顺序。数据库要快速找到当前最大的自增值才能生成下一个不重复的 ID索引能高效完成这个查找因此 auto_increment 属性列必须建立索引才能创建。5.3 补充说明本节补充说明一些之前留下的内容。首先是表结构中的列属性从上图可以看到Null 列存储该列是否可以存储 NULLKey 列存储键的信息PRI 是 primary key 的缩写UNI 是 unique 的缩写Default 列代表该列的默认值Extra 列显示一些额外信息比如 auto_increment 属性等。六、简单查询本章讲解如何从表中查询出目标记录。在开始前准备表用作查询的目标6.1 查询列查看表中某一列的数据的通用结构如下select 列名 from 表名;举个例子比如说select number from student_info;有时我们也可以为结果中的列重新定义一个别名格式如下select 列名 [as] 列的别名 from 表名;这里 as 可加可不加比如说select number as 学号 from student_info 和 select number 学号 from student_info 均可。如果希望查询多个列的数据那么可以用select 列名1, 列名2, ... 列名n from 表名;如果希望查询所有列那么就是之前已经提到过的语句select * from 表名;6.2 查询结果去重在上面的第二次查询结果中实际上 sex 只有男或者女但是因为表有 5 列所以结果有 5 行。如果想去除重复结果可以将 distinct 放在查询的列前面select distinct 列名 from 表名;对于多列的情况两条记录重复指的是两条记录中每列的值都相同。这时同样地将 distinct 放在查询列的最前面这样可以只留下不重复的记录。6.3 限制结果集记录条数有时结果集中的记录条数过多我们需要限制结果集中的记录条数这是可以用limit 限制条数;比如select number, name, id_number, major from student_info limit2;这里的限制条数指的是从表的开头开始选取一共选限制条数条记录。如果想不从第一条记录开始可以用limit 偏移量, 限制条数;这里第 1 条记录的偏移量为 0第 2 条记录的偏移量为 1。如果指定的偏移量大于或等于结果集中的行数那么查询结果就是空集。6.4 对查询结果排序上面的查询结果都是没有顺序的如果想让查询结果中的记录按照某种特定的规则排序可以用order by 列名 [ASC | DESC];这里的 ASC 和 DESC 选择一个即可ASC 指的是由小到大排序DESC 指的是由大到小排序如果都不填写则默认升序排序。如果要同时指定多个排序的列多个排序列之间用逗号隔开order by 列1 [ASC | DESC], 列2 [ASC | DESC], ...例如上图的查询就是先按照 subject 升序排序再按照 score 降序排序。6.5 带搜索条件的查询上面的搜索中我们都没有加上对记录的条件。如果想要添加搜索条件可以用 where 语句。这是为了表示条件就需要用到一些比较运算符。举个例子下图中就是搜索学号大于 20260102 的学生信息。不过需要注意要判断某一列的值是否是 NULL不能用 而是要用有时需要查询时指定某一列的值必须在某个列表中比如我们想查询 “操作系统” 的成绩当一个查询中有多个搜索条件时我们就要用到and 和 or 运算符这两个运算符以及和小括号的结合与寻常代码中的逻辑运算符运算方式相同这里就不再赘述了。上面的搜索条件都是比较严谨的有时我们可能需要比较模糊的搜索条件比如说我们指向看看同学的姓是某个固定值但不要求同学的完整名字。这时就要用到模糊查询以及通配符。MySQL 支持一下两个通配符%代表任意数量的字符0个字符也可以_代表任意一个字符。第二次没搜到是因为要求 ‘克’ 之后只能有任意一个字符。另外请注意为了将待匹配的字符串中的普通 % 和 _ 与通配符区分开在待匹配字符串中用 \% 和 \_ 代表普通字符。以上是数据库的前半基础操作我们从下载安装 MySQL 一直聊到了查询的一些简单实现。下一半我们将在现在的基础上进一步说明更多查询的方式方法以及数据库的详细内容。