MySQL
写在前面:兜兜转转一学期,从攻防到取证再到大数据,最终也逃不过MySQL。这位熟悉又陌生的朋友,我们终于又又又见面了。这次没有muxin老师带领了,只能靠自己了,希望多多指教。 ------来自muxin的好学生k7_k7;
MySQL简介
MySQL是一个小型的开源的关系型数据库管理系统,与其他大型数据库管理系统例如Oracle、DB2、SQL Server等相比,MySQL规模小,功能有限,但是它体积小、速度快、成本低,且它提供的功能对稍微复杂的应用已经够用,这些特性使得MySQL成为世界上最受欢迎的开放源代码数据库。
数据库是一个以某种有组织的方式存储的数据集合,它是一个按数据结构来存储和管理数据的计算机软件系统。理解数据库的一种最简单的办法是将其想象为一个文件柜,这个文件柜只是一个存储数据的空间,而数据库就是这么一个空间。
MySQL概述
MySQL数据库软件,也是使用最常用的数据库管理语言:结构化查询语言(SQL),进行数据库管理和操作。
MySQL是开放源代码的数据库,任何人都可以获得该数据库的源代码。
MySQL能够实现跨平台操作,可以在Windows、UNIX、Linux和Mac OS等操作系统上运行。
对咱们的MySQL有一定了解之后,我们就要开始进入学习一些基本命令了:
安装配置MySQL
- 进入software目录,解压安装包mysql5.7.25
cd /root/software
tar -xvf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar
2. 安装组件rpm -ivh
rpm -ivh mysql-community-common-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.25-1.el7.x86_64.rpm
3. 初始化mysql数据库
# 不使用root用户,密码为空
/usr/sbin/mysqld --initialize-insecure --user=mysql
4. 后台启动服务
/usr/sbin/mysqld --user=mysql &
更改MySQL密码
1.免密登录
mysql -uroot
2. 修改mysql登陆密码(教学改为:123456)
use mysql
update mysql.user set authentication_string=password('123456') where user='root';
flush privileges;
简单使用MySQL
1.使用新密码进入MySQL
mysql -u root -p
2.创建用户
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
3.执行flush privileges命令立即生效
flush privileges;
4.查询数据库的用户
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
5.关闭MySQL
quit
数据库的创建和管理
第一,数据库名必须唯一,如果数据库名重复,我们放入的数据就不知道放到哪,查询起来就麻烦了。
第二,名称内不能含有“/”及“.”等非法字符,这是开发数据库人员做的死规定。
第三,最大不能超过64字节。试想如果名字非常长的话,使用起来是不是非常麻烦,大大降低概率。
1.创建数据库
1.进入mysql环境,然后输入create database book;
2.查看全部数据库
show databases;
3.查看指定的数据库
Show create database 数据库名;
4.修改数据库
用户必须具有数据库修改的权限才可以使用命令
alter database 数据库名称 character set 新的字符cre集的名称;
ep: alter database test1 character set gbk;
5.删除数据库
drop database db_name;
查看字符集
方式一
MySQL支持30多种字符集的70多种校对规则。在同一台服务器、同一个数据库或甚至在同一个表中使用不同字符集或校对规则来混合字符串。
查看MySQL支持的字符集有两种方式,我们先来看第一种方式,用SHOW CHARACTER SET命令查看。需要注意的是:
两个不同的字符集不能有相同的校对规则。
每个字符集有一个默认的校对规则。
从图中第一列看到的就是MySQL支持的字符集。
方式二
方式二首先要切换数据库,information_schema库下存储了MySQL支持的字符集,就要首先使用“use information_schema;”语句切换到该库下。之后使用select语句(该语句为MySQL查询的基本语句,后面课程会学到)进行查询。同样在左边的第一列可以看到支持的字符集。
1.选择数据库
use 数据库名;
2.查看MySQL字符集——方式一
show character set;
3.查看MySQL字符集——方式二
use information_schema;
select * from character_sets;
4.where语句
SHOW CHARACTER SET WHERE Charset="utf8";
5.like语句
SHOW CHARACTER SET LIKE "utf8%";
数据表的创建
数据表的内容和高中学的excel和access差不多
数据库与表之之间的关系是数据库由各种数据表组成的,数据表是数据库中最重要的对象,用来存储和操作数据的逻辑结构。表由列和行组成,列是表数据的描述,行是表数据的实例。一个表包含若干个字段或记录。表的基本操作包括创建新表,修改表和删除表。这些操作都是数据库管理中最基本,最重要的操作。
建表原则
为了减少数据传输错误,并能使用数据库的高效工作,表设计应按照一定原则对信息进行分类,同时为确保表结构设计的合理性,通常还要对表进行规范化设计,以消除表中存在的冗余,保证一个表只围绕一个主题,并使得表容易维护。
数据库表的信息存储分类原则
每个表应该包含关于一个主题的信息。当每个表只包含关于一个主题的信息时,就可以独立与其他主题来维护该主题的信息。例如,应将教师基本信息保存在‘教师’表中。如果将这些基本信息保存在‘授课’表中,则在删除某教师的授课信息,就会将其基本信息一同删除。
表中不应该包含重要信息,表间也不应有重复信息。每条信息只保存在一个表中,需要时只在一处进行更新,效率更高。例如,每个学生的学号,姓名,性别等信息只在‘学生’表中保存,而‘成绩’表中不保存这些信息。
删除表
表的删除操作会将表中的数据一并删除,所以在进行删除操作时需要慎重。在删除表时需要注意的是,要删除的表是否与其他表存在关联,如果存在,那么被关联的表的删除操作比较复杂,就不可随意的进行删除操作,否则会影响所有关联表之间的结构;如果不存在,也就是说,要删除的是一张独立的表,那么操作比较简单
创建数据库表
语法:
create table 表名(
字段名1 数据类型1 [完整性约束条件],
字段名2 数据类型2 [完整性约束条件],
字段名3 数据类型3 [完整性约束条件],
···
字段名n 数据类型n [完整性约束条件]
);
完整性约束条件为可选项,指的是对字段的某些特殊约束。
不同字段之间用,隔开,最后一个字段没有。
Ep:
create table student(
id INT(8),
name VARCHAR(20),
gender VARCHAR(1),
age INT(2)
);
查看数据库表
语法:
describe table_name;或desc table_name;
查看表的详细结构
使用show create table语句不仅可以查看表的字段、数据类型及长度、是否允许空值、键的设置信息、默认值等,还可以查看数据库的存储引擎以及字符集等信息。
语法:show create table table_name;
修改表名
语法:alter table old_table_name rename [to] new_table_name; (to可有可无)
修改字段的数据类型
1. 修改一个字段
在修改字段的数据类型时,需要明确指出要修改的是哪张表的哪个字段,要修改成哪种数据类型。
语法:alter table table_name modify column_name new_data_type;(column_name是字段名)
2.同时修改多个字段
语法:alter table table_name modify column1_name new_data_type1,modify column2_name new_data_type2,...,modify columnn_name new_data_typen;
修改字段名
1.只修改字段名
alter table table_name change old_column_name new_column_name old_data_type;
2.同时修改字段名和数据类型
alter table table_name change old_column_name new_column_name new_data_type;
增加字段
从修改字段的SQL语句中不难发现,一个字段包括两个基本部分:字段名和字段的数据类型。增加字段需要指定字段名和字段的数据类型,也可以指定要添加字段的约束条件、添加的位置。
语法:alter table table_name add column_name1 data_type [完整性约束条件] [first|after column_name2];
修改字段的排列位置
语法:alter table table_name modify column_name1 data_type first|after column_name2;
删除字段
语法:alter table table_name drop column_name;
删除表
语法:drop table table_name;
完整性约束(主键)
引言:为了防止不符合规范的数据存入数据库,在用户对数据进行插入、修改、删除等操作时,MySQL数据库管理系统提供了一种机制来检查数据库中的数据是否满足规定的条件,以保证数据库中数据的准确性和一致性,这种机制就是约束。
完整性约束
MySQL中主要支持6种完整性约束,如下表所示:
约束条件 | 约束描述 |
Primary Key | 主键约束,约束字段的值可以唯一地表示对应的记录 |
Unique Key | 唯一约束,约束字段的值是唯一的 |
Notnull Key | 非空约束,约束字段的值不能为空 |
Default Key | 默认值约束,约束字段的默认值 |
Auto_Increment | 自动增加约束,约束字段的值自动递增 |
Foreign Key | 外键约束,约束表与表之间的关系 |
主键约束
主键约束,是数据库中最重要的一种约束,其作用是约束表中的某个字段,以唯一地标识一条记录。(我觉得这就和access非常像了)因此,使用主键约束可以快速查找表中的记录,就如人的身份证、学生的学号一样,设置为主键的字段取值不能重复,也不能为空,否则无法唯一标识一条记录。
唯一约束
唯一约束,它规定了一张表中指定的某个字段的值不能重复,即这一字段的每个值都是唯一的。如果想要某个字段的值不重复,那么就可以为该字段添加为唯一约束。
无论是单个字段还是多个字段,唯一约束的添加均可以使用列级约束和表级约束,但是表示的含义略有不同。
非空约束
规定了一张表中指定的某个字段的值不能为空(Null)。设置了非空约束的字段,在插入的数据为空时,数据库会提示错误,导致数据无法插入。
无论是单个字段还是多个字段,非空约束的添加只能使用列级约束(非空约束无表级约束)。
注意:空字符串“ ”不是Null;0也不是Null。
1.创建表时添加主键约束
1)为单个字段添加主键约束(列级约束)
语法:create table table_name(
column_name1 data_type primary key,
column_name2 data_type,
...
);
当然我们也可以采用表级约束
语法:create table table_name(
column_name1 data_type,
column_name2 data_type,
...,
[constraint pk_name] primary key(column_name)
);
2)为多个字段添加主键约束
create table table_name(
column_name1 data_type,
column_name2 data_type,
...,
[constraint pk_name] primary key(column_name1,column_name2, ...)
);
2.在已存在的表中添加主键约束
在学习中有时会遇到这种情况:表已经创建完成,并且存入了大量的数据,但是表中缺少主键约束。此时就可以使用在已存在的表中添加主键约束的SQL语句。
语法:alter table table_name add [constraint pk_name] primary key(column_name1,column_name2, ...);
constraint pk_name为可选项,表示可以为主键设置标识符。
3.删除主键约束
语法:alter table table_name drop primary key;
唯一约束
1. 创建表时添加唯一约束
1) 使用列级约束添加唯一约束
使用列级约束添加唯一约束时,可以使用unique关键字,同时为一个或多个字段添加唯一约束。
语法:create table table_name(
column_name data_type unique,
...
);
2)使用表级约束添加唯一约束
语法:create table table_name(
column_name1 data_type,
column_name2 data_type,
...,
[constraint uk_name] unique(column_name1,column_name2, ...)
);
2.在已存在的表中添加唯一约束
语法:alter table table_name add [constraint uk_name] unique(column_name1, column_name2, ···);
3.删除唯一约束
语法:alter table table_name drop index uk_name;
注意:
- 单字段为唯一约束时,如果没有指定uk_name,那么默认uk_name是字段名。
- 多字段组合为唯一约束时,如果没有指定uk_name,那么默认uk_name是组合中第一个字段的名称。
- 如果指定了uk_name,那么删除时必须使用指定的uk_name。
非空约束
1. 创建表时添加非空约束
语法:create table table_name(
column_name data_type not null,
...
);
- 在已存在的表中添加非空约束
语法:alter table table_name modify column_name data_type not null;
3. 删除非空约束
语法:alter table table_name modify column_name data_type [null];
默认值约束
默认值约束用来规定字段的默认值。如果某个被设置为默认值约束的字段没有插入具体的值,那么该字段的值将会被默认值填充。
默认值约束的设置与非空约束一样,也只能使用列级约束
注意:对于使用默认值约束的字段,如果插入的数据是Null,则不会使用默认值填充,只有不插入数据时,才会使用默认值填充。
- 创建表时添加默认值约束
语法:create table table_name(
column_name data_type default value,
...
);
- 在已存在的表中添加默认值约束
语法:alter table table_name modify column_name data_type default value;
3. 删除默认值约束
语法:alter table table_name modify column_name data_type;
自增约束
自增约束可以使表中某个字段的值自动增加。一张表中只能有一个自增长字段,并且该字段必须定义了约束(该约束可以是主键约束、唯一约束或外键约束),如果自增字段没有定义约束,数据库则会出现Incorrect table definition; there can be only one auto column and it must be defined as a key的错误。
由于自增约束会自动生成唯一的id,因此自增约束通常会配合主键使用,并且只适用于整数类型。在一般情况下,设置为自增约束字段的值会从1开始,每增加一条记录,该字段的值加1。
- 创建表时添加自增约束
语法:create table table_name(
column_name data_type auto_increment,
...
);
- 在已存在的表中添加自增约束
语法:alter table table_name modify column_name data_type auto_increment;
- 删除自增约束
语法:alter table table_name modify column_name data_type;
外键约束
外键约束是用来实现数据库表的参照完整性的。外键约束可以使两张表紧密地结合起来,特别是在进行修改或者删除的级联操作时,会保证数据的完整性。
外键是指表中某个字段的值依赖于另一张表中某个字段的值,而被依赖的字段必须具有主键约束或者唯一约束。被依赖的表通常称之为父表或者主表,设置外键约束的表称为子表或者从表。
1.创建表时添加外键约束
虽然MySQL支持使用列级约束的语法来添加外键约束,但这种列级的约束语法添加的外键约束不会生效,MySQL提供这种列级约束语法仅仅是和标准SQL保持良好的兼容性。因此,如果需要使MySQL中的外键约束生效,应使用表级约束。
语法:create table child_table_name(
column_name1 data_type,
column_name2 data_type,
···
[constraint fk_name] foreign key(child_column_name) references parent_table_name (parent_column_name)
);
child_table_name为新建表的名称(该表为从表)。
constraint fk_name为可选项。
fk_name为外键约束名,用来标识外键约束。
foreign key用来指定表的外键字段。
child_column_name为外键字段。
references用来指定外键字段参照的表。
parent_table_name为被参照的主表名称。
parent_column_name为主表中被参照的字段。
2.在已存在的表中添加外键约束
语法:alter table child_table_name add [constraint fk_name] foreign key(child_column_name) references
parent_table_name (parent_column_name);
3.删除外键约束
语法:alter table child_table_name drop foreign key fk_name;