前言
此文章旨在为需要掌握快速开发和复习MySQL的同学所准备,您完全可以把此文章当作参考文档来使用,本文将尽量精简,使您快速的理解和掌握语法。
关于MySQL
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
如果您在阅读此文档前,还未掌握MySQL的安装与配置,请您务必观看此文章:MySQL下载安装详细配置--超详细保姆级,附常见问题解决方法。_神兽汤姆猫的博客-CSDN博客
MySQL数据库的构成
系统数据库 | sys数据库 | 包含了一系列的存储过程、自定义函数及视图,帮助用户快速了解系统的元数据信息 |
---|---|---|
information——schema数据库 | 类似“数据字典”,提供了访问数据库元数据的方式。元数据:如数据库名、数据表名、列的数据类型及访问权限等 | |
performance_schema数据库 | 用于收集数据库服务器性能参数。 | |
mysql数据库 | 为MySQL的核心数据库,记录用户及其访问权限等MySQL所需的控制和管理信息 | |
示例数据库 | 系统为了让用户学习和理解MySQL所设计的示例数据库 | |
用户数据库 | 用户根据数据库设计创建的数据库,如“图书数据库”,“学生数据库”等 |
数据库对象
表 | MySQL中最基本、最重要的对象,是关系模型中实体的表示方式,用于组织和存储具有行列结构的数据对象。 |
视图 | 一种常见的数据库对象,为用户提供了一种查看数据库中数据的方式,内容由查询的需求所定义。它是基于表存在的。 |
索引 | 为提高数据检索的性能所建立,利用它可快速的确定指定的信息。 |
存储过程和触发器 | 存储过程和触发器是两个特殊的数据库对象。存储过程的存在独立于表,触发器则于表紧密结合。 |
用户和角色 | 用户是对数据库拥有存储权限的使用者,角色则是值一组数据库用户的集合。 |
MySQL的连接
此处博主发现大部分教程都使用了“全世界最棒的语言PHP”进行教学,但对于本文的初衷来讲,并不符合本文的初衷,本文将使用行业热门软件Navicat Premium为基础进行教学和快速入门。如果您未拥有此软件可以联系博主。
创建和管理数据库
创建数据库
创建用户数据库需要使用到SQL语句CREATE DATABASE语句。
CREATE DATABASE [IF NOT EXISTS] <数据库名>
[选项];
注:本例中的[ ]为可选项 | |
SQL语句中的[IF NOT EXISTS]为可选项。其意为:在创建数据库前加一个判断,如该数据库不存在则执行创建数据库操作,存在则不执行。 | |
选项则用于描述字符集与校对规则等选项,规则的语法格式如右所示: | [DEFAULT]CHARACTER SET[=]字符集 |
|[DEFAULT]COLLATE[=]校对规则名 |
例:创建名称为Book的数据库,语句及实现效果如下:
CREATE DATABASE IF NOT EXISTS Book;
查看已有的数据库
对于已经存在的数据库,我们使用SHOW DATABASE 命令来显示服务器中所有可使用数据库的信息。
SHOW DATABASES;
例:我们查询所有可使用数据库的信息,代码和效果如下所示:
SHOW DATABASES;
打开数据库
一个MySQL服务器中有多个数据库,对于用户来讲需要指定连接其中一个的数据库,或数据库1切换到数据库2,就需要利用SQL语句中的USE命令来实现。
USE <需要打开\指定\切换的数据库>;
例:我们打开数据库Book,代码和效果如下:
USE book;
注:对于SQL语句来讲,大小写效果等同,按自己习惯即可。
修改数据库
此操作我们主要是修改数据库的参数。
ALTER DATABASE [数据库名]
[选项];
数据库名为可选项,不选择数据库文件名时,则修改当前数据库。 |
修改数据库的选项和创建数据库的选项相同。 |
例:如果需要练习此语法,可使用如下例子:
ALTER DATABASE book
DEFAULT CHARACTER SET =gbk
DEFAULT COLLATE =gbk_chinese_ci;
删除数据库
无用的数据库会占用我们的磁盘空间和系统资源,此时我们需要删除数据库语句。
DROP DATABASE [IF EXISTS] <数据库名>;
IF EXISTS子句为可选项,用来避免删除不存在的数据库出现的报错信息 |
例:我们删除创建的book数据库:
DROP DATABASE IF EXISTS book;
数据库备份与恢复
备份与恢复是MySQL的重要组成部分,是为了防止数据库因意外而损坏。
我们需要注意的是备份是十分耗费时间与资源的操作,不可频繁操作,所以我们应根据使用情况确定适当的备份周期。
备份类型
完整备份 |
增量备份 |
差异备份 |
备份数据
因本文是快速入门,故使用软件进行备份:
表的数据类型
数据类型 | 系统数据类型 | |||||
---|---|---|---|---|---|---|
整数型 | TINYINT(1 字节,用于小整数值) | SMALLINT(2 字节,用于大整数值) | MEDIUMINT(3 字节,用于大整数值) | INT或INTEGER(4 字节,用于大整数值) | BIGINT(8 字节,用于极大整数值) | |
精确数值型 | DECIMAL(M,D)如果M>D,为M+2否则为D+2(用于小数值) | |||||
浮点型 | FLOAT(4 字节,用于单精度 浮点数值) | DOUBLE(8 字节,用于双精度 浮点数值) | REAL | |||
字符型 | CHAR(0-255字节,用于定长字符串) | VARCHAR(0-255字节,变长字符串) | BLOB | TEXT | SET | ENUM |
BLOB类型 | TINYBLOB(0-255字节,用于不超过 255 个字符的二进制字符串) | BLOB(0-65 535字节,用于二进制形式的长文本数据,可以容纳可变数量的数据) | MEDIUMBLOB(0-16 777 215字节,用于二进制形式的中等长度文本数据) | LOGNGBLOB(0-4 294 967 295字节,用于二进制形式的极大文本数据) | ||
文本(TEXT)型 | TINYTEXT(0-255字节,用于短文本字符串) | TEXT(0-65 535字节,用于长文本数据) | MEDIUMTEXT(0-16 777 215字节,用于中等长度文本数据) | LONGTEXT(0-4 294 967 295字节,用于极大文本数据) | ||
二进制型 | BINARY | VARBINARY | ||||
Unicode字符型 | NCHAR | NVARCHAR | ||||
位型 | BIT(BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。) | |||||
由于日期时间类型的重点较多,故下列表将展示日期时间类型 |
日期时间数据类型 | 所占字节 | 所属范围 | 规定格式 | 实际用途 |
---|---|---|---|---|
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIMESTAMP | 8 | 1970-01-01 00:00:00/2037 年某时 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
注意:
- 如数据超出数据类型允许的取值范围,将会报错。
- 在使用过程中,如计算量过大考虑将数据对象设为FLOAT或REAL数据类型,否则会产生误差。
- 如使用字符数据,其中的值超过规定的长度,会自动截取。
表
数据表用于存储数据库中的所有数据,是数据库中最重要的对象。是组成数据库的基本元素,用于存储实体集和实体间联系的数据。
一个表即为一个关系,表看作为我们的办公软件Excel,就是行与列的组合,行代表一条记录,列代表记录的一个字段。
表的特点:
- 一个表即为一个实体,该实体具有唯一的名字
- 表由行于列组合而成,每一行为一条记录也代表该表中的一个实例,每一列(字段/域)代表具有相同属性的列值
- 行值在同表中具有唯一性,由主键约束决定。
- 列值名在同表中具有唯一性
- 行列顺序可任意排列,最多定义1024列。
创建和管理数据表基本操作
创建表
使用CREATE TABLE语句创建表
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] <表名>
[(<字段名即列名> <数据类型> [完整性约束条件][,....])]
[表选项];
其中[ ]中内容为可选项 |
TEMPORARY意为新建的表为临时表 |
IF NOT EXISTS意为该表不存在时则创建表,存在则不创建 |
其中表选项则用于描述存储引擎,字符集等选项:
ENGINE = 存储引擎类型 |
DEFAULT CHARSET = 字符集类型 |
例:我们创建一个学生表Student:
CREATE DATABASE Educational;
USE Educational;
CREATE TABLE student
(
# 学号
ID CHAR(9) PRIMARY KEY,
# 姓名
name VARCHAR(10),
# 性别
gender CHAR(6),
# 出生日期
birthdate date
);
效果如下所示:
此时我们还需创建课程表course:
CREATE TABLE course
(
# 课程号
courseID CHAR(5) PRIMARY key,
# 课程名
coursename VARCHAR(36),
# 课程简介
Syllabus text,
# 课时
hours INT,
# 学分
credit TINYINT,
# 开课学期
semester VARCHAR(8)
);
如下所示:
我们还需要创建一个成绩表Score,将学生表Student与课程表course相关联,如下
CREATE TABLE Score
(
# 学号
ID CHAR(9) REFERENCES student(ID),
# 课程号
courseID CHAR(5) REFERENCES course(courseID),
# 成绩
Results DECIMAL(4,1) CHECK(results BETWEEN 0 AND 100)
);
效果如下:
查看表信息
查看数据库中所有表信息
SHOW TABLES;
查看表结构
DESC <表名> [字段/列名];
[ ]内容为可选项 |
例:
DESC Score;
修改表结构
我们在创建完后表之后,后期可能根据需要改变表本身定义的结构。故需要ALTER TABLE 语句修改表结构
ALTER TABLE <表名>
{
# 为指定的表添加一个新的字段/列,数据类型由用户指定,添加不需要关键字COLUME,添加需要数据类型和长度。
[ADD <新字段/列名> <数据类型>[<完整性约束条件>][,...]]
# 为指定的字段添加索引。
[ADD INDEX[索引名](索引字段,...)]
# 对指定表中字段/列的数据类型或者完整性约束条件进行修改。如该列定义了约束,在修改时会进行限制,如需必须修改,则需先删除该列的约束在进行修改。
[MODIEF COLUMN <字段/列名> <新数据类型>[<完整性约束条件>]]
# 删除表中不需要的字段/列或者完整性约束名,删除列需要添加关键字COLUME,因默认情况下为删除约束。删除不需数据类型和长度,只需指定列名即可。
[DROP COLUMN <字段/列名>[<完整性约束名>][,...]]
# 删除表中不需要的索引。
[DROP INDEX <索引名>]
# 对表进行更名操作,表名更改后原名称不存在
[RENAME[AS] <新的表名>]
};
如需实操,请看此例:
# 例1:在student表添加爱好(hobby)字段/列,数据类型为TEXT
alter table student
add hobby text;
# 例2:将course表中的学分(credit)字段/列的数据类型修改为smalint
alter table coures
modify credit smalint;
# 例3:删除student表中爱好(hobby)字段/列
alter table student
dorp column hobby;
# 例4:将course表名修改为cs
alter table coures
rename as cs;
删除表
DROP [TEMPORARY] TABLE [IF EXISTS] <表名> [,<表名> .....];
# TEMPORARY意为暂时
如需实操请看此例:
# 删除student表
drop table student;
对表数据的基本操作
我们前面只是创建了表,但表中却没有数据,此时我们就需要进行添加数据,更新数据,删除数据的操作。需要注意的是在添加数据时,对于不同的数据类型我们插入的数据格式也不一样。
添加数据
INSERT INTO <表名> [<字段名>[,...]]
VALUES( <常量> [,...]);
例:对student表添加数据
INSERT INTO student VALUES('202201001','汤姆猫','男','2000-01-01');
INSERT INTO student VALUES('202201002','风火轮','男','1998-11-03');
INSERT INTO student VALUES('202201003','闪光弹','女','2000-08-21');
INSERT INTO student VALUES('202201004','降世拳','女','2010-04-11');
INSERT INTO student VALUES('202201005','流星腿','女','2010-09-23');
INSERT INTO student VALUES('202201006','闪闪光','女','2010-02-02');
INSERT INTO student VALUES('202201007','汤汤水','女','1999-03-29');
效果如下:
其他表添加数据同理。
更新数据
UPDATE <表名>
SET <字段/列名> = <表达式> [,...]
[WHERE <条件>];
如需实操请看此例:
# 将student表中的汤姆猫的出生日期改为:2001-02-03
update student
set birthdate ='2001-02-03'
where name = '汤姆猫';
删除数据
DELETE FROM <表名>
[WHERE <条件>];
如需实操请看此例:
# 删除student表汤姆猫的记录
delete from student
where name = '汤姆猫'
如果需要删除表中所有的记录,请执行下列语句
TRUNCATE TABLE <表名>;
如需实操请看此例:
# 删除student表
truncate table student;
创建与管理索引基础操作*
数据查询是操作数据库最麻烦的操作。如果表中的数据很多,我们搜索数据需要极长的时间,这会造成服务器的资源浪费,故为了提高查询数据的能力,我们就需要索引。
关于索引
索引是一个列表,它包含了某一个表中一列或若干列的集合及其记录在数据表中存储位置的物理地址。
索引是依赖表而建立的,提供了数据库中编排表数据的内部方法。
表的存储由两部分组成:
- 表的数据页面
- 表的索引页面,索引则存在于此页面
索引页面比数据页面小很多。可以理解为索引就是目录。实际步骤如下:
搜索索引页---->找到所需数据的指针----->通过此指针从数据页面读取数据 |
索引只是提供了一种快速访问指定记录的方法而已。索引可以极大的提高系统的性能,具体则体现在如下几点:
- 加快了数据的检索速度
- 通过创建唯一性索引可以确保每一行数据的唯一性
- 加速了表与表之间的连接
- 使用分组和排序子句检索查询数据时,减少了查询过程中排序与分组的时间
对于建立一个索引我们也是有一定的原则的,具体如下:
- 对表中的主键字段/列建立索引
- 对表中的外键字段/列建立索引
- 对常用来查询数据记录的字段建立索引
- 对常用来作为排序基准的字段建立索引
- 对在查询中用来连接表的字段建立索引
- 对查询中极少涉及的字段/列与重复值较多的字段/列不建立索引
索引的分类:
分类 | 说明 | 创建索引关键字 |
---|---|---|
普通索引 | 最基本的索引类型,索引字段可以有重复的值 | IDNEX |
唯一索引 | 保证索引字段不包含重复的值 | UNIQUE |
主键索引 | 一般在创建表时指定主键,也可以后期修改表的方法加入主键,一个表只能有一个主键 | PRIMARY KEY |
全文索引 | 只可创建在CHAR、VARCHAR、TEXT类型的字段/列中,且只可在MyISAM表中创建。 对于查询量大的字符串类型的字段/列时,建议使用全文索引提高查询的速度。 | FULLTEXT |
空间索引 | 只可创建在空间数据类型中,用来提高系统获取空间数据的效率,且其字段不能为空值。仅MyISAM表支持。 | SPATIAL |
哈希索引 | 基于哈希表实现,其将所有哈希码存储在索引之中,同时在哈希表中保存执行每个数据行的指针。仅MEMORY表支持。 | HASH |
创建索引
有三种语句方法进行创建
CREATE INDEX | ALTER TABLE | CREATE TABLE |
# CREATE INDEX语句,在一个已存在的表上创建索引
#
# UNIQUE、FULLTEXT、SPATIAL选项指定其创建索引的类型。如为填写则默认创建的为普通索引
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX <索引名>
[USING index_type]
# ASC | DESC指定索引列的排序方式升序还是降序,默认为ASC升序
ON <表名> (索引字段[ASC | DESC][,....]);
如需实操请看此例:
# 为student表中的学号ID创建唯一索引,排序降序
USE Educational;
create unique index istudent
on student(ID desc);
# 为成绩表Score中的学号ID与课程号courseID创建复合索引
# 此处使用ALTER TABLE语句
alter table score
add index iscore(ID,courseID);
# 新建表Book,并为其内容摘要synopsis创建全文索引
create table book
(
isbn char(13) primary key,
bookname char(80) not null,
# 内容摘要
synopsis text not null,
# 单价
univalent decimal(6,2),
# 出版日期
publicationDate date not null,
fulltext index ibook(synopsis)
)engine = myisam;
# 创建表library,并为其的作者author字段创建哈希索引
create table library
(
author varchar(30) not null,
# 出版社
press varchar(30) not null,
key using hash(author)
)engine = memory;
查看索引
SHOW CREATE TABLE <表名>;
如需实操请看此例:
# 查看表book的索引信息
show create table book;
删除索引
索引不需要时请将其删除。
# DROP INDEX语句
DROP INDEX <索引名> ON <表名>;
#DROP INDEX语句实操:删除book表的ibook索引
drop index ibook on book;
# ALTER TABLE语句
# ALTER TABLE语句实操:删除表score中的iscore索引
alter create score
drop index iscore;
约束待更新ing....
数据查询
查询是数据库中最常用最重要的功能。
简单查询
简单查询是按照一定的条件在单一的表上进行数据查询,包括查询结果的排序和利用查询结果生成新表。
SELECT语句结构
此语句十分难以理解。
# SELECT子句指定查询结果中需要返回的值
SELECT <子句1>
# FROM 子句指定从其中检索行的表或视图
FROM <子句2>
# WHERE表达式指定查询的搜索条件
[WHERE <表达式1>]
# GROUP BY子句指定查询结果的分组条件
[GROUP BY <子句3>]
# HAVING表达式指定分组或者集合的查询条件
[HAVING <表达式2>]
# ORDER BY子句指定查询结果的排序方法
[ORDER BY <子句4>]
# LIMIT子句限制被select语句返回的行数
[LIMIT <子句5>]
# UNION操作符将多个select语句查询结果组合为一个结果集,该结果集包含联合查询中所有查询的全部行
[UNION <操作符>]
SELECT子语句
# 默认选项为ALL,用于指定表示结果集的所有行,可显示重复行
# DISTINCT指定在结果集显示唯一行,空值被认为相等,用于消除取值重复的行
# ALL与DISTINCT不可同时使用
SELECT[ ALL | DISTINCT] <目标表达式> [,<目标表达式>][,...]
FROM <表或视图名> [,<表或视图名>][,...][LIMIT n1[,n2]];
# LIMIT n1表示返回最前面的n1行数据,n1表示返回的行数
# LIMIT n1,n2表示从n1行开始,返回n2行数据,从0行开始,n1,n2必须是非负的整型常量才可以
#
#目标表达式为结果集选择的要查询的特定表中的例,它可以是星号(*)、表达式、变量、列表等。星号(*)用于返回表或视图的所有列,列表用“表名”“列名”表示。
持续更新...
如果您认真阅读至此,您现在已经掌握了MySQL的语法与使用,且随着您认真练习使用次数的增加,您对MySQL的掌握我相信不止于此,如果您对此语言或其他有进阶的要求,请移步至我的博客进行其余的修炼计划。
感谢您认真观看完毕此文章,如果此文章对您有帮助的话,还请您点赞、收藏、评论,这对我有很大的帮助。