本次学习目标

第1章 MySQL数据库概述

1.1 基本观点

php写入mysql空白每日一学MySQL SQL年夜揭秘零基本进阶成为数据大师 Node.js

数据库是什么?存储数据的地方DB:数据库(Database)为什么要用数据库?由于运用程序产生的数据是在内存中的,如果程序退出或者是断电了,则数据就会消逝。
利用数据库是为了能够永久保存数据。
当然这里指的是非内存数据库。
用普通文件存储行弗成?把数据写入到硬盘上的文件中,当然可以实现持久化的目标,但是不利于后期的检索和管理等。
MySQL、Oracle、SqlServer是什么?MySQL、Oracle、SqlServer都是数据库管理系统(DBMS,Database Management System)是一种操纵和管理数据库的大型软件,例如建立、利用和掩护数据库。
SQL是什么?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.多对多

该关系中第一个表中的一个行可以与第二个表中的一个或多个行干系。
第二个表中的一个行也可以与第一个表中的一个或多个行干系。
常日两个表的多对多关系会借助第三张表,转换为两个一对多的关系。

例如,选课系统的“学生信息表”和“课程信息表”是多对多关系。
一个学生可以选择多门课,一门课程可以被多个学生选择,即“学生信息表”中一条记录可以与“课程信息表”多条记录对应,反过来“课程信息表”的一条记录也可以与“学生信息表”中多条记录对应。
它们之间借助第三张“选课信息表”实现关联关系,而“学生信息表”与“选课信息表”是一对多关系,“课程信息表”与“选课信息表”也是一对多关系。
“选课信息表”中“学号”字段与“学生信息表”中“学号”字段意义相同。
“课程信息表”中“课程编号”字段与“课程信息表”中“课程编号”字段意义相同。

第2章 MySQL卸载、安装、登录

可以看我前面的文章

第3章 客户端利用演示

3.1 命令行客户端

3.1.1 数据库

1、查看所有的数据库

show databases;

2、创建自己的数据库

create database 数据库名;#创建atguigudb数据库create database atguigudb;

3、删除数据库

drop database 数据库名;

#删除atguigudb数据库drop database atguigudb;

4、利用自己的数据库

use 数据库名;#利用atguigudb数据库use atguigudb;

解释:如果没有利用use语句,后面针对数据库的操作也没有加“数据名”的限定,那么会报“ERROR 1046 (3D000): No database selected”(没有选择数据库)

利用完use语句之后,如果接下来的SQL都是针对一个数据库操作的,那就不用重复use了,如果要针对另一个数据库操作,那么要重新use。

3.1.2 数据表

1、查看某个库的所有表格

show tables; #哀求前面有use语句show tables from 数据库名;

2、创建新的表格

create table 表名称(字段名 数据类型,字段名 数据类型);

解释:如果是末了一个字段,后面就用加逗号,由于逗号的浸染是分割每个字段。

#创建学生表create table student(id int,name varchar(20) #说名字最长不超过20个字符);

3、查看定义好的表构造

desc 表名称;

desc student;

4、添加一条记录

insert into 表名称 values(值列表);#添加两条记录到student表中insert into student values(1,'张三');insert into student values(2,'李四');

5、查看一个表的数据

select from 表名称;

6、删除表

drop table 表名称;

#删除学生表drop table student;

3.1.3 导入数据

在命令行客户端==登录mysql==,利用source指令导入

mysql> source d:\练习脚本.sql

把稳:在利用命令行导入SQL脚本之前,请利用记事本或NotePad++等文本编辑器打开SQL脚本查看SQL脚本中是否有USE语句,如果没有,那么在命令行中须要先利用USE语句指定详细的数据库,否则会报“No database selected”的缺点。

3.1.4 导出数据

在命令行客户端不登录mysql,利用mysqldump命令。

mysqldump -u用戶名 -p密码 数据库名 > 脚本名.sqlmysqldump -u用戶名 -p密码 数据库名 表名 > 脚本名.sql

3.2 可视化客户端

前面先容了通过命令行来创建数据库和数据表,除此之外,还可以借助MySQL图形化工具,而且这种办法更加大略、方便。
下面以SQLyog图形化工具为代表展开先容。

3.2.1 数据库

以查看所有数据库的办法登录连接成功后,进入主界面,接下来正式创建数据库。

步骤1:在主界面左边“数据库工具导航窗口”的空缺处右键单击鼠标弹出快捷菜单,选择“创建数据库”菜单项。

img

步骤2:填写新数据库的基本信息。
一样平常只需填写数据库名称,例如“test”,字符集和排序规则有默认选项。
如果有分外哀求,也可以选择自己须要的字符集和校正规则,然后点击“创建”按钮。

img

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

img

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

img

img

3.2.2 数据表

数据库创建成功之后,就可以在这个数据库下面创建表了。

步骤1:选择“test”数据库下的“表”工具,右键单击鼠标弹出快捷菜单,选择“创建表”菜单项。

img

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

img

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

img

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

img

img

3.2.3 导入数据

各种图形界面临象也都供应导入SQL脚本的功能。
下面利用SQLyog图形界面临象演示SQL脚本导入情形。

把稳:在利用命令行导入SQL脚本之前,请利用记事本或NotePad++等文本编辑器打开SQL脚本查看SQL脚本中是否有USE语句。
如果没有USE语句,在SQL图形界面临象中,须要先选中数据库,如果有USE语句,则自动导入对应的数据库。

第1步,选中数据库,“例如atguigu_chapter5”,然后单击鼠标右键,在弹出的快捷菜单菜单中选择“导入”→“实行导入SQL脚本”的菜单选项。

img

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

img

第3步,确认要实行SQL脚本的数据库是否精确的数据库,如果精确就选择“是”,否则选择“否”。

img

第4步,导入成功。

img

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

img

img

3.2.4 导出数据

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

第4章 SQL语句

SQL:构造化查询措辞,(Structure Query Language),专门用来操作/访问数据库的通用措辞。

4.1 SQL的分类

DDL语句:数据定义语句(Data Define Language),例如:创建(create),修正(alter),删除(drop)等

DML语句:数据操作语句,例如:增(insert),删(delete),改(update),查(select)

由于查询语句利用的非常的频繁,以是很多人把查询语句单拎出来一类,DQL(数据查询措辞),DR(获取)L

DCL语句:数据掌握语句,例如:grant,commit,rollback等

其他语句:USE语句,SHOW语句,SET语句等。
这类的官方文档中一样平常称为命令。

4.2 SQL语法规范

(1)mysql的sql语法不区分大小写

A:数据库的表中的数据是否区分大小写。
这个的话要看表格的字段的数据类型、编码办法以及校正规则。

ci(大小写不敏感),cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与language无关,区分大小写)

B:sql中的关键字,比如:create,insert等,不区分大小写。
但是大家习气上把关键字都“大写”。

(2)命名时:只管即便利用26个英笔墨母大小写,数字0-9,下划线,不要利用其他符号

(3)建议不要利用mysql的关键字等来作为表名、字段名、数据库名等,如果欠妥心利用,请在SQL语句中利用`(飘号)引起来

(4)数据库和表名、字段名等工具名中间不要包含空格

create database my atguigu;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 'atguigu' at line 1

(5)同一个mysql软件中,数据库不能同名,同一个库中,表不能重名,同一个表中,字段不能重名

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

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

mysql> create table tt(-> id int,-> id int-> );ERROR 1060 (42S21): Duplicate(重复) column name 'id'

4.3 SQL脚本中如何加注释

SQL脚本中如何加注释

单行注释:#注释内容(mysql特有的)单行注释:–空格注释内容 个中–后面的空格必须有多行注释:/ 注释内容 /

create table tt(id int, #编号`name` varchar(20), -- 姓名gender enum('男','女')/性别只能从男或女中选择一个,不能两个都选,或者选择男和女之外的/);

4.4 mysql脚本中的标点符号

mysql脚本中标点符号的哀求如下:

本身成对的标点符号必须成对,例如:(),’’,““。
所有标点符号必须英文状态下半角输入办法下输入。

几个分外的标点符号:

小括号():在创建表、添加数据、函数利用、子查询、打算表达式等等会用()表示某个部分是一个整体构造。
单引号’‘:字符串和日期类型的数据值利用单引号’’引起来,数值类型的不须要加标点符号。
双引号”“:列的别名可以利用双引号”“,给表名取别名==不要利用==双引号。

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

create table temp(c char);insert into temp values('尚) ; #缺一半单引号insert into temp values(‘尚’) ; #标点符号是中文

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)

第5章 DQL

由于查询语句利用的非常的频繁,以是很多人把查询语句单拎出来一类,DQL(数据查询措辞),DR(获取)L。

5.1 SELECT语句

SELECT语句是用于查看打算结果、或者查看从数据表中筛选出的数据的。

SELECT语句的基本语法:

SELECT 常量;SELECT 表达式;SELECT 函数;

例如:

SELECT 1; SELECT 9/2;SELECT NOW();

如果要从数据表中筛选数据,须要加FROM子句。
FROM指天命据来源。
字段列表筛选列。

SELECT 字段列表 FROM 表名称;

如果要从数据表中根据条件筛选数据,须要加FROM和WHERE子句。
WHERE筛选行。

SELECT 字段列表 FROM 表名称 WHERE 条件;

完全的SELECT语句后面可以跟7个子句,后面会逐一讲解。

5.2 利用别名

在当前select语句中给某个字段或表达式打算结果,或表等取个临时名称,便于当前select语句的编写和理解。
这个临时名称称为别名。

select 字段名1 as "别名1", 字段名2 as "别名2" from 表名称 as 别名;

列的别名有空格时,请加双引号。
==列的别名==中没有空格时,双引号可以加也可以不加。
==表的别名不能加双引号==,表的别名中间不能包含空格。
as大小写都可以,as也完备可以省略。

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 near '号,name 姓 名 from student' at line 1

5.3 结果去重

mysql可以在查询结果中利用distinct关键字去重。

select distinct 字段列表 from 表名称 【where 条件】;

select distinct did from t_employee;