半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!

Posted Cs 挽周

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!相关的知识,希望对你有一定的参考价值。

  • mysql最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一

MySQL实战文章目录


MySQL必会知识点梳理 (必看)

评论区评论要资料三个字即可获得MySQL全套资料 !


【介绍】

什么是数据库

  • 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
  • 每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。
  • 我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

MySQL数据库

MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

  • MySQL 是开源的,目前隶属于 Oracle 旗下产品。
  • MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
  • MySQL 使用标准的 SQL 数据语言形式。
  • MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、php、Eiffel、Ruby 和 Tcl 等。
  • MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。
  • MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
  • MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。

RDBMS 术语

在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语

  • 数据库: 数据库是一些关联表的集合。
  • 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
  • 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
  • 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
  • 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
  • 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
  • 外键:外键用于关联两个表。
  • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
  • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
  • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

MySQL 为关系型数据库(Relational Database Management System), 这种所谓的关系型可以理解为表格的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格

数据库表的存储位置

MySQL数据表以文件方式存放在磁盘中:

  1. 包括表文件、数据文件以及数据库的选项文件
  2. 位置:MySQL安装目录\\data下存放数据表。目录名对应数据库名,该目录下文件名对应数据表

注:

InnoDB类型数据表只有一个*. frm文件,以及上一级目录的ibdata1文件
MylSAM类型数据表对应三个文件:

  1. *. frm —— 表结构定义文件
  2. *. MYD —— 数据文件
  3. *. MYI —— 索引文件

存储位置:因操作系统而异,可查my.ini


【数据类型】

  • MySQL提供的数据类型包括数值类型(整数类型和小数类型)、字符串类型、日期类型、复合类型(复合类型包括enum类型和set类型)以及二进制类型 。

一. 整数类型

  • 整数类型的数,默认情况下既可以表示正整数又可以表示负整数(此时称为有符号数)。如果只希望表示零和正整数,可以使用无符号关键字“unsigned”对整数类型进行修饰。
  • 各个类别存储空间及取值范围。

二. 小数类型

  • decimal(length, precision)用于表示精度确定(小数点后数字的位数确定)的小数类型,length决定了该小数的最大位数,precision用于设置精度(小数点后数字的位数)。

  • 例如: decimal (5,2)表示小数取值范围:999.99~999.99 decimal (5,0)表示: -99999~99999的整数。

  • 各个类别存储空间及取值范围。

三. 字符串

  • char()与varchar(): 例如对于简体中文字符集gbk的字符串而言,varchar(255)表示可以存储255个汉字,而每个汉字占用两个字节的存储空间。假如这个字符串没有那么多汉字,例如仅仅包含一个‘中’字,那么varchar(255)仅仅占用1个字符(两个字节)的储存空间;而char(255)则必须占用255个字符长度的存储空间,哪怕里面只存储一个汉字。
  • 各个类别存储空间及取值范围。

四. 日期类型

  • date表示日期,默认格式为‘YYYY-MM-DD’; time表示时间,格式为‘HH:ii:ss’; year表示年份; datetime与timestamp是日期和时间的混合类型,格式为’YYYY-MM-DD HH:ii:ss’。
  • datetime与timestamp都是日期和时间的混合类型,区别在于: 表示的取值范围不同,datetime的取值范围远远大于timestamp的取值范围。 将NULL插入timestamp字段后,该字段的值实际上是MySQL服务器当前的日期和时间。 同一个timestamp类型的日期或时间,不同的时区,显示结果不同。
  • 各个类别存储空间及取值范围。

五. 复合类型

  • MySQL 支持两种复合数据类型:enum枚举类型和set集合类型。 enum类型的字段类似于单选按钮的功能,一个enum类型的数据最多可以包含65535个元素。 set 类型的字段类似于复选框的功能,一个set类型的数据最多可以包含64个元素。

六. 二进制类型

  • 二进制类型的字段主要用于存储由‘0’和‘1’组成的字符串,因此从某种意义上将,二进制类型的数据是一种特殊格式的字符串。
  • 二进制类型与字符串类型的区别在于:字符串类型的数据按字符为单位进行存储,因此存在多种字符集、多种字符序;而二进制类型的数据按字节为单位进行存储,仅存在二进制字符集binary。


【约束】

  • 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。下面文章就来给大家介绍一下6种mysql常见的约束,希望对大家有所帮助。

一. 非空约束(not null)

  • 非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。

  • Null类型特征:所有的类型的值都可以是null,包括int、float 等数据类型

二. 唯一性约束(unique)

  • 唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。
  • 唯一约束不允许出现重复的值,但是可以为多个null。
  • 同一个表可以有多个唯一约束,多个列组合的约束。
  • 在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同。
  • 唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。

三. 主键约束(primary key) PK

  • 主键约束相当于 唯一约束 + 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。

  • 每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别创建。

  • 当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。

四. 外键约束(foreign key) FK

  • 外键约束是用来加强两个表(主表和从表)的一列或多列数据之间的连接的,可以保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。

  • 创建外键约束的顺序是先定义主表的主键,然后定义从表的外键。也就是说只有主表的主键才能被从表用来作为外键使用,被约束的从表中的列可以不是主键,主表限制了从表更新和插入的操作。

五. 默认值约束 (Default)

  • 若在表中定义了默认值约束,用户在插入新的数据行时,如果该行没有指定数据,那么系统将默认值赋给该列,如果我们不设置默认值,系统默认为NULL。

六. 自增约束(AUTO_INCREMENT)

  • 自增约束(AUTO_INCREMENT)可以约束任何一个字段,该字段不一定是PRIMARY KEY字段,也就是说自增的字段并不等于主键字段。

  • 但是PRIMARY_KEY约束的主键字段,一定是自增字段,即PRIMARY_KEY 要与AUTO_INCREMENT一起作用于同一个字段。

当插入第一条记录时,自增字段没有给定一个具体值,可以写成DEFAULT/NULL,那么以后插入字段的时候,该自增字段就是从1开始,没插入一条记录,该自增字段的值增加1。当插入第一条记录时,给自增字段一个具体值,那么以后插入的记录在此自增字段上的值,就在第一条记录该自增字段的值的基础上每次增加1。也可以在插入记录的时候,不指定自增字段,而是指定其余字段进行插入记录的操作。


【常用命令】

登录数据库相关命令

一. 启动服务

语法:

mysql> net stop mysql

二. 关闭服务

语法:

mysql> net start mysql

三. 链接MySQL

  • 语法:mysql -u用户名 -p密码;
root@243ecf24bd0a:/ mysql -uroot -p123456;
  • 在以上命令行中,mysql 代表客户端命令,-u 后面跟连接的数据库用户,-p 表示需要输入密码。如果数据库设置正常,并输入正确的密码,将看到上面一段欢迎界面和一个 mysql>提示符。

四. 退出数据库

  • 语法:quit
mysql> quit
  • 结果:

DDL(Data Definition Languages)语句:即数据库定义语句

对于数据库而言实际上每一张表都表示是一个数据库的对象,而数据库对象指的就是DDL定义的所有操作,例如:表,视图,索引,序列,约束等等,都属于对象的操作,所以表的建立就是对象的建立,而对象的操作主要分为以下三类语法

  • 创建对象:CREATE 对象名称;
  • 删除对象:DROP 对象名称;
  • 修改对象:ALTER 对象名称;

数据库相关操作

一. 创建数据库

  • 语法:create database 数据库名字;
mysql> create database sqltest;
  • 结果:

二. 查看已经存在的数据库

  • 语法:show databases;
mysql> show databases;
  • 结果:

可以发现,在上面的列表中除了刚刚创建的 mzc-test,sqltest,外,还有另外 4 个数据库,它们都是安装MySQL 时系统自动创建的,其各自功能如下。

  1. information_schema:主要存储了系统中的一些数据库对象信息。比如用户表信息、列信息、权限信息、字符集信息、分区信息等。
  2. cluster:存储了系统的集群信息。
  3. mysql:存储了系统的用户权限信息。
  4. test:系统自动创建的测试数据库,任何用户都可以使用。

三. 选择数据库

  • 语法:use 数据库名;
mysql> use mzc-test;
  • 返回Database changed代表我们已经选择 sqltest 数据库,后续所有操作将在 sqltest 数据库上执行。
  • 有些人可能会问到,连接以后怎么退出。其实,不用退出来,use 数据库后,使用show databases就能查询所有数据库,如果想跳到其他数据库,用use 其他数据库名字。

四. 查看数据库中的表

  • 语法:show tables;
mysql> show tables;
  • 结果:

五. 删除数据库

  • 语法:drop database 数据库名称;
mysql> drop database mzc-test;
  • 结果:
  • 注意:删除时,最好用 `` 符号把表明括起来

六. 设置表的类型

  • MySQL的数据表类型:MyISAMInnoDB、HEAP、 BOB、CSV等


语法:

CREATE TABLE 表名(
	#省略代码ENGINE= InnoDB;

适用场景:

1. 使用MyISAM:节约空间及响应速度快;不需事务,空间小,以查询访问为主
2. 使用InnoDB:安全性,事务处理及多用户操作数据表;多删除、更新操作,安全性高,事务处理及并发控制
1. 查看mysql所支持的引擎类型

语法:

SHOW ENGINES

结果:

2. 查看默认引擎

语法:

SHOW VARIABLES LIKE 'storage_engine';

结果:


数据库表相关操作

一. 创建表

语法:create table 表名 {列名,数据类型,约束条件};

CREATE TABLE `Student`(
	`s_id` VARCHAR(20),
	`s_name` VARCHAR(20) NOT NULL DEFAULT '',
	`s_birth` VARCHAR(20) NOT NULL DEFAULT '',
	`s_sex` VARCHAR(10) NOT NULL DEFAULT '',
	PRIMARY KEY(`s_id`)
);
  • 结果

注意:表名还请遵守数据库的命名规则,这条数据后面要进行删除,所以首字母为大写。

二. 查看表定义

  • 语法:desc 表名
mysql> desc Student;
  • 结果:
  • 虽然 desc 命令可以查看表定义,但是其输出的信息还是不够全面,为了查看更全面的表定义信息,有时就需要通过查看创建表的 SQL 语句来得到,可以使用如下命令实现
  • 语法:show create table 表名 \\G;
mysql> show create table Student \\G;
  • 结果:
  • 从上面表的创建 SQL 语句中,除了可以看到表定义以外,还可以看到表的engine(存储引擎)和charset(字符集)等信息。\\G选项的含义是使得记录能够按照字段竖着排列,对于内容比较长的记录更易于显示。

三. 删除表

  • 语法:drop table 表名
mysql> drop table Student;
  • 结果:

四. 修改表 (重要)

  • 对于已经创建好的表,尤其是已经有大量数据的表,如果需要对表做一些结构上的改变,我们可以先将表删除(drop),然后再按照新的表定义重建表。这样做没有问题,但是必然要做一些额外的工作,比如数据的重新加载。而且,如果有服务在访问表,也会对服务产生影响。因此,在大多数情况下,表结构的更改一般都使用 alter table语句,以下是一些常用的命令。
1. 修改表类型
  • 语法:ALTER TABLE 表名 MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
  • 例如,修改表 student 的 s_name 字段定义,将 varchar(20)改为 varchar(30)
mysql> alter table Student modify s_name varchar(30);
  • 结果:
2. 增加表字段
  • 语法:ALTER TABLE 表名 ADD [COLUMN] [FIRST | AFTER col_name];
  • 例如,表 student 上新增加字段 s_test,类型为 int(3)
mysql> alter table student add column s_test int(3);
  • 结果:
3. 删除表字段
  • 语法:ALTER TABLE 表名 DROP [COLUMN] col_name
  • 例如,将字段 s_test 删除掉
mysql> alter table Student drop column s_test;
  • 结果:
4. 字段改名
  • 语法:ALTER TABLE 表名 CHANGE [COLUMN] old_col_name column_definition [FIRST|AFTER col_name]
  • 例如,将 s_sex 改名为 s_sex1,同时修改字段类型为 int(4)
mysql> alter table Student change s_sex s_sex1 int(4);
  • 结果:

注意:change 和 modify 都可以修改表的定义,不同的是 change 后面需要写两次列名,不方便。但是 change 的优点是可以修改列名称,modify 则不能。

5. 修改字段排列顺序
  • 前面介绍的的字段增加和修改语法(ADD/CNAHGE/MODIFY)中,都有一个可选项first|after column_name,这个选项可以用来修改字段在表中的位置,默认 ADD 增加的新字段是加在表的最后位置,而 CHANGE/MODIFY 默认都不会改变字段的位置。

  • 例如,将新增的字段 s_test 加在 s_id 之后

  • 语法:alter table 表名 add 列名 数据类型 after 列名;

mysql> alter table Student add s_test date after s_id;
  • 结果:
  • 修改已有字段 s_name,将它放在最前面
mysql> alter table Student modify s_name varchar(30) default '' first;
  • 结果:

注意:CHANGE/FIRST|AFTER COLUMN 这些关键字都属于 MySQL 在标准 SQL 上的扩展,在其他数据库上不一定适用。

6.表名修改
  • 语法:ALTER TABLE 表名 RENAME [TO] new_tablename
  • 例如,将表 Student 改名为 student
mysql> alter table Student rename student;
  • 结果:

DML(Data Manipulation Language)语句:即数据操纵语句

  • 用于操作数据库对象中所包含的数据

一. 添加数据:INSERT

Insert 语句用于向数据库中插入数据

1. 插入单条数据(常用)

语法:insert into 表名(列名1,列名2,...) values(值1,值2,...)

特点:

  • 插入值的类型要与列的类型一致或兼容。插入NULL可实现为列插入NULL值。列的顺序可以调换。列数和值的个数必须一致。可省略列名,默认所有列,并且列的顺序和表中列的顺序一致。

案例:

-- 插入学生表测试数据
insert into Student(s_id,s_name,s_birth,s_sex) values('01' , '赵信' , '1990-01-01' , '男');

2. 插入单条数据

语法:INSERT INTO 表名 SET 列名 = 值,列名 = 值

  • 这种方式每次只能插入一行数据,每列的值通过赋值列表制定。

案例:

INSERT INTO student SET s_id='02',s_name='德莱厄斯',s_birth='1990-01-01',s_sex='男'

3. 插入多条数据

语法:insert into 表名 values(值1,值2,值3),(值4,值5,值6),(值7,值8,值9);

案例:

INSERT INTO student VALUES('03','艾希','1990-01-01','女'),('04','德莱文','1990-08-06','男'),('05','俄洛依','1991-12-01','女');

上面的例子中,值1,值2,值3),(值4,值5,值6),(值7,值8,值9) 即为 Value List,其中每个括号内部的数据表示一行数据,这个例子中插入了三行数据。Insert 语句也可以只给部分列插入数据,这种情况下,需要在 Value List 之前加上 ColumnName List,

例如:

INSERT INTO student(s_name,s_sex) VALUES('艾希','女'),('德莱文','男');
  • 每行数据只指定了 s_name 和 s_sex 这两列的值,其他列的值会设为 Null。

4. 表数据复制

语法:INSERT INTO 表名 SELECT * from 表名;

案例:

INSERT INTO student SELECT * from student1;

注意:

  • 两个表的字段需要一直,并尽量保证要新增的表中没有数据

二. 更新数据:UPDATE

Update 语句一共有两种语法,分别用于更新单表数据和多表数据。

  • 注意:没有 WHERE 条件的 UPDATE 会更新所有值!

1. 修改一条数据的某个字段

语法:UPDATE 表名 SET 字段名 =值 where 字段名=值

案例:

UPDATE student SET s_name ='张三' WHERE s_id ='01'

2. 修改多个字段为同一的值

语法:UPDATE 表名 SET 字段名= 值 WHERE 字段名 in ('值1','值2','值3');

案例:

UPDATE student SET s_name = '李四' WHERE s_id in ('01','02','03');

3. 使用case when实现批量更新

语法:update 表名 set 字段名 = case 字段名 when 值1 then '值' when 值2 then '值' when 值3 then '值' end where s_id in (值1,值2,值3)

案例:

update student set s_name = case s_id when 01 then '小王' when 02 then '小周' when 03 then '老周' end where s_id in (01,02,03)

webpack配置这一篇就够

关于HX711A/D转换模块的一个小小的注意事项

开始写游戏 --- 第十一篇

同事半个月都没搞懂selenium,我半个小时就给他整明白!顺手秀了一波爬淘宝的操作

同事半个月都没搞懂selenium,我半个小时就给他整明白!顺手秀了一波爬淘宝的操作

急诊科。。。