一. MySQL数据库概述
1.1 基本概念
- 数据库是什么?
- 存储数据的地方
- DB:数据库(Database)
- 为什么要用数据库?
- 因为应用程序产生的数据是在内存中的,如果程序退出或者是断电了,则数据就会消失。使用数据库是为了能够永久保存数据。当然这里指的是非内存数据库。
- 用普通文件存储行不行?
- 把数据写入到硬盘上的文件中,当然可以实现持久化的目标,但是不利于后期的检索和管理等。
- MySQL、Oracle、SqlServer是什么?
- MySQL、Oracle、SqlServer都是数据库管理系统(DBMS,Database Management System)是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。
- SQL是什么?
- SQL是结构化查询语言(Structure Query Language),专门用来操作/访问数据库的通用语言。

- SQL是结构化查询语言(Structure Query Language),专门用来操作/访问数据库的通用语言。

1.2 MySQL数据库管理系统介绍
在互联网行业,MySQL数据库毫无疑问已经是最常用的数据库。MySQL数据库由瑞典MySQL AB公司开发。公司名中的"AB"是瑞典语"aktiebolag"股份公司的首字母缩写。该公司于2008年1月16号被Sun(Stanford University Network)公司收购。然而2009年,SUN公司又被Oracle收购。因此,MySQL数据库现在隶属于Oracle(甲骨文)公司。MySQL中的"My"是其发明者(Michael Widenius,通常称为Monty)根据其女儿的名字来命名的。对这位发明者来说,MySQL数据库就仿佛是他可爱的女儿。
- 什么是关系型数据库和非关系数据库。
- MySQL、Oracle、SqlServer等是关系型数据库管理系统。
- MongoDB、Redis、Elasticsearch等是非关系型数据库管理系统。

关系型数据库,采用关系模型来组织数据,简单来说,关系模型指的就是二维表格模型 。类似于Excel工作表。非关系型数据库,可看成传统关系型数据库的功能阉割版本,基于键值对存储数据,通过减少很少用的功能,来提高性能。
以下是2021年《DB-Engines Ranking》对各数据库受欢迎程度进行调查后的统计结果(查看数据库最新排名:https://db-engines.com/en/ranking)

MySQL的优点有很多,其中主要的优势有如下几点:
- 可移植性:MySQL数据库几乎支持所有的操作系统,如Linux、Solaris、FreeBSD、Mac和Windows。
- 免费:MySQL的社区版完全免费,一般中小型网站的开发都选择 MySQL 作为网站数据库。
- 开源:2000 年,MySQL公布了自己的源代码,并采用GPL(GNU General Public License)许可协议,正式进入开源的世界。开源意味着可以让更多人审阅和贡献源代码,可以吸纳更多优秀人才的代码成果。
- 关系型数据库:MySQL可以利用标准SQL语法进行查询和操作。
- 速度快、体积小、容易使用:与其他大型数据库的设置和管理相比,其复杂程度较低,易于学习。MySQL的早期版本(主要使用的是MyISAM引擎)在高并发下显得有些力不从心,随着版本的升级优化(主要使用的是InnoDB引擎),在实践中也证明了高压力下的可用性。从2009年开始,阿里的"去IOE"备受关注,淘宝DBA团队再次从Oracle转向MySQL,其他使用MySQL数据库的公司还有Facebook、Twitter、YouTube、百度、腾讯、去哪儿、魅族等等,自此,MySQL在市场上占据了很大的份额。
- 安全性和连接性:十分灵活和安全的权限和密码系统,允许基于主机的验证。连接到服务器时,所有的密码传输均采用加密形式,从而保证了密码安全。由于MySQL是网络化的,因此可以在因特网上的任何地方访问,提高数据共享的效率。
- 丰富的接口:提供了用于C、C++、Java、PHP、Python、Ruby和Eiffel、Perl等语言的API。
- 灵活:MySQL并不完美,但是却足够灵活,能够适应高要求的环境。同时,MySQL既可以嵌入到应用程序中,也可以支持数据仓库、内容索引和部署软件、高可用的冗余系统、在线事务处理系统等各种应用类型。
- MySQL最重要、最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理(Query Processing)及其他系统任务(Server Task)和数据的存储/提取相分离。这种处理和存储分离的设计可以在使用时根据性能、特性,以及其他需求来选择数据存储的方式。MySQL中同一个数据库,不同的表格可以选择不同的存储引擎。其中使用最多的是InnoDB 和MyISAM,MySQL5.5之后InnoDB是默认的存储引擎。
针对不同用户,MySQL提供三个不同的版本。
(1)MySQL Enterprise Server(企业版):能够以更高的性价比为企业提供数据仓库应用,该版本需要付费使用,官方提供电话技术支持。
(2)MySQL Cluster(集群版):MySQL 集群是 MySQL 适合于分布式计算环境的高可用、高冗余版本。它采用了 NDB Cluster 存储引擎,允许在 1 个集群中运行多个 MySQL 服务器。它不能单独使用,需要在社区版或企业版基础上使用。
(3)MySQL Community Server(社区版):在开源GPL许可证之下可以自由的使用。该版本完全免费,但是官方不提供技术支持。本书是基于社区版讲解和演示的。在MySQL 社区版开发过程中,同时存在多个发布系列,每个发布处在不同的成熟阶段。
- MySQL5.7(RC)是当前稳定的发布系列。RC(Release Candidate候选版本)版只针对严重漏洞修复和安全修复重新发布,没有增加会影响该系列的重要功能。从MySQL 5.0、5.1、5.5、5.6直到5.7都基于5这个大版本,升级的小版本。5.0版本中加入了存储过程、服务器端游标、触发器、视图、分布式事务、查询优化器的显著改进以及其他的一些特性。这也为MySQL 5.0之后的版本迈向高性能数据库的发展奠定了基础。
- MySQL8.0.26(GA)是最新开发的稳定发布系列。GA(General Availability正式发布的版本)是包含新功能的正式发布版本。这个版本是MySQL数据库又一个开拓时代的开始。
1.3 表的关系
在关系数据库管理系统中,很多表之间是有关系的,表之间的关系分为一对一关系、一对多关系和多对多关系。
1.一对一
该关系中第一个表中的一个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关。
例如,"员工基本信息表"和"员工紧急情况联系信息表"。"员工基本信息表"中存储的是频繁使用的信息,"员工紧急情况联系信息表"中存储的是不常用的信息,这两个表中的一条记录都代表一个员工的信息。"员工基本信息表"中的一条记录在"员工紧急情况联系信息表"中只能找到唯一的一条对应记录,反过来也一样,即它们是一一对应关系。这两个表存在相同意义的"员工编号"字段,使它们建立了一对一关系。

2.一对多
第一个表中的一个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关。
例如,"部门表"和"员工基本信息表"。"部门表"中的一条记录,在"员工基本信息表"中可以找到一条或多条记录对应,但反过来"员工基本信息表"中的一条记录在"部门表"中只能找到一条记录对应,即一个部门可以有多个员工,但是一个员工只能属于一个部门。这两个表存在相同意义的"部门编号"字段,使它们建立了一对多关系。

3.多对多
该关系中第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。通常两个表的多对多关系会借助第三张表,转换为两个一对多的关系。
例如,选课系统的"学生信息表"和"课程信息表"是多对多关系。一个学生可以选择多门课,一门课程可以被多个学生选择,即"学生信息表"中一条记录可以与"课程信息表"多条记录对应,反过来"课程信息表"的一条记录也可以与"学生信息表"中多条记录对应。它们之间借助第三张"选课信息表"实现关联关系,而"学生信息表"与"选课信息表"是一对多关系,"课程信息表"与"选课信息表"也是一对多关系。"选课信息表"中"学号"字段与"学生信息表"中"学号"字段意义相同。"课程信息表"中"课程编号"字段与"课程信息表"中"课程编号"字段意义相同。

二.MySQL卸载、安装、登录
注意:如果需要在当前电脑的任何位置使用MySQL,这里需要配置环境变量
没配置之前:

如何配置:
将mysql安装路径下服务目录bin一层放到path内
先找到MySQL安装文件里的mysql.exe的路径,




将路径粘贴到里面就可以了

重新打开dos窗口,可以成功登录即可

三.客户端使用演示
3.1 命令行客户端
3.1.1 数据库
1、查看所有的数据库
mysql
show databases;
2、创建自己的数据库
mysql
create database 数据库名;
#创建atguigudb数据库
create database atguigudb;
3、删除数据库
mysql
drop database 数据库名;
mysql
#删除text数据库
drop database text;
4、使用自己的数据库
mysql
use 数据库名;
#使用text数据库
use text;
说明:如果没有使用use语句,后面针对数据库的操作也没有加"数据名"的限定,那么会报"ERROR 1046 (3D000): No database selected"(没有选择数据库)
使用完use语句之后,如果接下来的SQL都是针对一个数据库操作的,那就不用重复use了,如果要针对另一个数据库操作,那么要重新use。
3.1.2 数据表
1、查看某个库的所有表格
mysql
show tables; #要求前面有use语句
show tables from 数据库名;
2、创建新的表格
mysql
create table 表名称(
字段名 数据类型,
字段名 数据类型
);
说明:如果是最后一个字段,后面就用加逗号,因为逗号的作用是分割每个字段。
mysql
#创建学生表
create table student(
id int,
name varchar(20) #意思是名字最长不超过20个字符
);
3、查看定义好的表结构
mysql
desc 表名称;
mysql
desc student;
4、添加一条记录
mysql
insert into 表名称 values(值列表);
#添加两条记录到student表中
insert into student values(1,'张三');
insert into student values(2,'李四');
5、查看一个表的数据
mysql
select * from 表名称;
6、删除表
mysql
drop table 表名称;
mysql
#删除学生表
drop table student;
3.1.3 导入数据
在命令行客户端登录mysql,使用source指令导入
mysql
mysql> source d:\练习脚本.sql
注意:在使用命令行导入SQL脚本之前,请使用记事本或NotePad++等文本编辑器打开SQL脚本查看SQL脚本中是否有USE语句,如果没有,那么在命令行中需要先使用USE语句指定具体的数据库,否则会报"No database selected"的错误。

3.1.4 导出数据
在命令行客户端不登录mysql,使用mysqldump命令。
cmd
mysqldump -u用戶名 -p密码 数据库名 > 脚本名.sql
mysqldump -u用戶名 -p密码 数据库名 表名 > 脚本名.sql

3.2 可视化客户端
前面介绍了通过命令行来创建数据库和数据表,除此之外,还可以借助MySQL图形化工具,而且这种方式更加简单、方便。下面以SQLyog图形化工具为代表展开介绍。
3.2.1 数据库
以查看所有数据库的方式登录连接成功后,进入主界面,接下来正式创建数据库。
步骤1:在主界面左边"数据库对象导航窗口"的空白处右键单击鼠标弹出快捷菜单,选择"创建数据库"菜单项。

步骤2:填写新数据库的基本信息。一般只需填写数据库名称,例如"test",字符集和排序规则有默认选项。如果有特殊要求,也可以选择自己需要的字符集和校对规则,然后点击"创建"按钮。

步骤3:此时数据库创建成功。

步骤4:数据库创建成功之后,可以查看或修改数据库属性。选择"test"数据库,右键单击鼠标弹出快捷菜单,选择"改变数据库"菜单选项,就可以查看或修改数据库属性。


3.2.2 数据表
数据库创建成功之后,就可以在这个数据库下面创建表了。
步骤1:选择"test"数据库下的"表"对象,右键单击鼠标弹出快捷菜单,选择"创建表"菜单项。

步骤2:点击"创建表"后,在新表的创建页面填写表名称和表的字段等属性信息。例如表名称为"tb_student",并添加两个字段,一个是int类型的sid,一个是varchar(20)类型的sname,分别表示学生编号和学生姓名。表的存储引擎、字符集和校对规则如果不选择,则默认和当前数据库一致。字段信息需要填写字段名和数据类型等基本信息,关于字段其他信息的含义请看后续章节讲解。

步骤3:填写表信息完成后,点击"保存"按钮,提示表创建成功,并询问是否继续创建新表。

步骤4:表创建成功之后,也可以查看数据表的定义信息或修改数据表的定义。在表名称(例如"tb_student")上右键单击弹出的快捷菜单中选择"改变表",就可以查看表结构的详细信息,也可以修改表的定义。


3.2.3 导入数据
各种图形界面工具也都提供导入SQL脚本的功能。下面使用SQLyog图形界面工具演示SQL脚本导入情况。
注意:在使用命令行导入SQL脚本之前,请使用记事本或NotePad++等文本编辑器打开SQL脚本查看SQL脚本中是否有USE语句。如果没有USE语句,在SQL图形界面工具中,需要先选中数据库,如果有USE语句,则自动导入对应的数据库。
第1步,选中数据库,"例如atguigu_chapter5",然后单击鼠标右键,在弹出的快捷菜单菜单中选择"导入"→"执行导入SQL脚本"的菜单选项。

第2步,弹出选择SQL脚本的"从一个文件执行查询"对话框,找到已经下载到本地的SQL脚本文件,然后选中"执行"按钮。

第3步,确认要执行SQL脚本的数据库是否正确的数据库,如果正确就选择"是",否则选择"否".

第4步,导入成功。

第5步,查看导入的表。SQLyog的数据库对象导航区的空白处,右键单击选择"刷新",可以在"atguigu_chapter5"数据库下看到新导入的"t_staff"员工表。

3.2.4 导出数据
第一步:选择要导出的数据库


四. SQL语句
SQL:结构化查询语言,(Structure Query Language),专门用来操作/访问数据库的通用语言。
4.1 SQL的分类
DDL语句:数据定义语句(Data Define Language),例如:创建(create),修改(alter),删除(drop)等
DML语句:数据操作语句(Data Manipulation Language),例如:增(insert),删(delete),改(update),查(select)
因为查询语句使用的非常的频繁,所以很多人把查询语句单拎出来一类,DQL(数据查询语言)
DCL语句:数据控制语句(Data Control Language),例如:grant,commit,rollback等
其他语句:USE语句,SHOW语句,SET语句等。这类的官方文档中一般称为命令。
4.2 SQL语法规范
Ø MySQL的SQL语法不区分大小写。
Ø 命名时尽量使用26个英文字母大小写,数字0-9,下划线,不要使用其他符号。
Ø 建议不要使用MySQL的关键字等来作为表名、字段名、数据库名等,如果不小心使用,请在SQL语句中使用`(飘号)引起来。
Ø 数据库和表名、字段名等对象名中间不要包含空格。
Ø 同一个MySQL软件中,数据库不能同名,同一个库中,表不能重名,同一个表中,字段不能重名。
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| atguigudb |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> create database atguigudb;
ERROR 1007 (HY000): Can't create database 'atguigudb'; database exists
sql
mysql> show tables;
+---------------------+
| Tables_in_atguigudb |
+---------------------+
| student |
| temp |
+---------------------+
2 rows in set (0.00 sec)
mysql> create table temp(id int);
ERROR 1050 (42S01): Table 'temp' already exists
sql
mysql> create table tt(
-> id int,
-> id int
-> );
ERROR 1060 (42S21): Duplicate(重复) column name 'id'
4.3 SQL脚本中如何加注释
SQL脚本中如何加注释
-
单行注释:#注释内容(mysql特有的)
-
单行注释:--空格注释内容 其中--后面的空格必须有
-
多行注释:/* 注释内容 */
sql
create table tt(
id int, #编号
`name` varchar(20), -- 姓名
gender enum('男','女')
/*
性别只能从男或女中选择一个,
不能两个都选,或者选择男和女之外的
*/
);
4.4 mysql脚本中的标点符号
mysql脚本中标点符号的要求如下:
-
本身成对的标点符号必须成对,例如:(),'',""。
-
所有标点符号必须英文状态下半角输入方式下输入。
几个特殊的标点符号:
-
小括号():在创建表、添加数据、函数使用、子查询、计算表达式等等会用()表示某个部分是一个整体结构。
-
单引号'':字符串和日期类型的数据值使用单引号''引起来,数值类型的不需要加标点符号。
-
双引号"":列的别名可以使用双引号"",给表名取别名不要使用双引号。
sql
create table tt(
id int
;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 2
sql
create table temp(
c char
);
insert into temp values('尚) ; #缺一半单引号
insert into temp values('尚') ; #标点符号是中文
sql
create table temp(
c char
);
insert into temp values('尚) ; #缺一半单引号
insert into temp values('尚') ; #标点符号是中文
五.DQL
因为查询语句使用的非常的频繁,所以很多人把查询语句单拎出来一类,DQL(数据查询语言)。
5.1 SELECT语句
SELECT语句是用于查看计算结果、或者查看从数据表中筛选出的数据的。
SELECT语句的基本语法:
SELECT 常量;
SELECT 表达式;
SELECT 函数;
例如:
sql
SELECT 1;
SELECT 9/2;
SELECT NOW();
如果要从数据表中筛选数据,需要加FROM子句。FROM指定数据来源。字段列表筛选列。
sql
SELECT 字段列表 FROM 表名称;
如果要从数据表中根据条件筛选数据,需要加FROM和WHERE子句。WHERE筛选行。
sql
SELECT 字段列表 FROM 表名称 WHERE 条件;
完整的SELECT语句后面可以跟7个子句,后面会逐一讲解。
5.2 使用别名
在当前select语句中给某个字段或表达式计算结果,或表等取个临时名称,便于当前select语句的编写和理解。这个临时名称称为别名。
mysql
select 字段名1 as "别名1", 字段名2 as "别名2" from 表名称 as 别名;
- 列的别名有空格时,请加双引号。列的别名中没有空格时,双引号可以加也可以不加。
- 表的别名不能加双引号,表的别名中间不能包含空格。
- as大小写都可以,as也完全可以省略。
java
mysql> select * from student;
+------+------+
| id | name |
+------+------+
| 1 | 张三 |
| 2 | 李四 |
+------+------+
2 rows in set (0.00 sec)
mysql> select id "学号",name "姓名" from student;
+------+------+
| 学号 | 姓名 |
+------+------+
| 1 | 张三 |
| 2 | 李四 |
+------+------+
2 rows in set (0.00 sec)
mysql> select id 学号,name 姓名 from student;
+------+------+
| 学号 | 姓名 |
+------+------+
| 1 | 张三 |
| 2 | 李四 |
+------+------+
2 rows in set (0.00 sec)
mysql> select id 学 号,name 姓 名 from student;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use n
ear '号,name 姓 名 from student' at line 1
5.3 结果去重
mysql可以在查询结果中使用distinct关键字去重。
mysql
select distinct 字段列表 from 表名称 【where 条件】;
mysql
select distinct did from t_employee;