Posted m0_67393295

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了!相关的知识,希望对你有一定的参考价值。

  • 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)

  • 这句sql的意思是,更新 s_name 字段,如果 s_id 的值为 01 则 s_name 的值为 小王,s_id = 02 则 s_name = 小周,如果s_id =03 则 s_name 的值为 老周。
  • 这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。

案例 2:

UPDATE student SET s_birth = CASE s_name
	WHEN '小王' THEN
		'2019-01-20'
	WHEN '小周' THEN
		'2019-01-22'
END WHERE s_name IN ('小王','小周');

三. 删除数据:DELETE

  • 数据库一旦删除数据,它就会永远消失。 因此,在执行DELETE语句之前,应该先备份数据库,以防万一要找回删除过的数据。

1. 删除指定数据

语法:DELETE FROM 表名 WHERE 列名=值

  • 注意:删除的时候如果不指定where条件,则保留数据表结构,删除全部数据行,有主外键关系的都删不了

案例:

DELETE FROM student WHERE s_id='09'

与 SELECT 语句不同的是,DELETE 语句中不能使用 GROUP BY、 HAVING 和 ORDER BY 三类子句,而只能使用WHERE 子句。原因很简单, GROUP BY 和 HAVING 是从表中选取数据时用来改变抽取数据形式的, 而 ORDER BY 是用来指定取得结果显示顺序的。因此,在删除表中数据 时它们都起不到什么作用。`

2. 删除表中全部数据

语法:TRUNCATE 表名;

  • 注意:全部删除,内存无痕迹,如果有自增会重新开始编号。

  • 与 DELETE 不同的是,TRUNCATE 只能删除表中的全部数据,而不能通过 WHERE 子句指定条件来删除部分数据。也正是因为它不能具体地控制删除对象, 所以其处理速度比 DELETE 要快得多。实际上,DELETE 语句在 DML 语句中也 属于处理时间比较长的,因此需要删除全部数据行时,使用 TRUNCATE 可以缩短 执行时间。

案例:

TRUNCATE student1;


DQL(Data Query Language)语句:即数据查询语句

  • 查询数据库中的记录,关键字 SELECT,这块内容非常重要!

一. wherer 条件语句

语法:select 列名 from 表名 where 列名 =值

where的作用:

  1. 用于检索数据表中符合条件的记录
  2. 搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假

搜索条件的组成:

  • 算数运算符

  • 逻辑操作符(操作符有两种写法)
  • 比较运算符

注意:数值数据类型的记录之间才能进行算术运算,相同数据类型的数据之间才能进行比较。

表数据

案例 1(AND):

SELECT  * FROM student WHERE s_name ='小王' AND s_sex='男'


案例 2(OR):

SELECT  * FROM student WHERE s_name ='崔丝塔娜' OR s_sex='男'

案例 3(NOT):

SELECT  * FROM student WHERE NOT s_name ='崔丝塔娜' 


案例 4(IS NULL):

SELECT * FROM student WHERE s_name IS NULL;


案例 5(IS NOT NULL):

SELECT * FROM student WHERE s_name IS NOT NULL;


案例 6(BETWEEN):

SELECT * FROM student WHERE s_birth BETWEEN '2019-01-20' AND '2019-01-22'

案例 7(LINK):

SELECT * FROM student WHERE s_name LIKE '小%'

案例 8(IN):

SELECT * FROM student WHERE s_name IN ('小王','小周')

二. as 取别名

  • 表里的名字没有变,只影响了查询出来的结果

案例:

SELECT s_name as `name` FROM student 

  • 使用as也可以为表取别名 (作用:单表查询意义不大,但是当多个表的时候取别名就好操作,当不同的表里有相同名字的列的时候区分就会好区分)

三. distinct 去除重复记录

  • 注意:当查询结果中所有字段全都相同时 才算重复的记录

案例

SELECT DISTINCT * FROM student

指定字段

  1. 星号表示所有字段

  2. 手动指定需要查询的字段

    SELECT DISTINCT s_name,s_birth FROM student

  1. 还可也是四则运算
  2. 聚合函数

四. group by 分组

  • group by的意思是根据by对数据按照哪个字段进行分组,或者是哪几个字段进行分组。

语法:

select 字段名 from 表名 group by 字段名称;

1. 单个字段分组

SELECT COUNT(*)FROM student GROUP BY s_sex;

2. 多个字段分组

SELECT s_name,s_sex,COUNT(*) FROM student GROUP BY s_name,s_sex;

以上是关于!的主要内容,如果未能解决你的问题,请参考以下文章

[BZOJ5055]膜法师

灰魔法师

Vim法师的tricks

爬虫爬取《全职法师》并保存到本地

CODEVS1995 || TYVJ1863 黑魔法师之门

大法师广泛的