1. 数据库介绍
以一定的组织形式存在于存储介质里;
DBMS(Datebase Mannagement System):这是一款管理数据库的系统软件;
DBA(Datebase Administrator):数据库管理员。
-----------------------------------------------------------------------------------------------------------------
基本功能:
数据定义、数据处理、数据安全、数据备份。
-----------------------------------------------------------------------------------------------------------------
目前市场使用的一般都是关系型数据库(RDBMS),主要有以下几种:
MySQL、MariaDB、Percona Server、Oracle、MSSQL、DB2、PostgreSQL;
其中“关系”就是二维表的表现形式:
row(行):每行为一条记录;
column(列):表示每一种属性;
在每一种属性上可加入主键(primary key):确保被设为主键的属性不重复记录,保证唯一性。
-------------------------------------------------------------------------------------------------------------------------------------
数据库的正规化分析
数据库设计时都需要遵从不同的规范要求,这些不同的规范要求被称为不同范式,并且是呈递次规范,越高则数据库的冗余越小,目前来说,只需要满足 第三范式(3NF)即可。(NF:Normal Form)
(注意3NF是建立在满足1NF和2NF的情况下)
-----------------------------------------------------------------------------------------------------------------------------------
MySQL和MariaDB数据库
两者隶属于同一作者开发,因而无大变化,并且在Linux中两者基本通用
官方文档:https://dev.mysql.com/doc/
---------------------------------------------------------------------------------------------------------------------------------
2. 安装MySQL
服务器包:MariaDB-server(注意大小写)
客户端工具包:mariadb
方法一:yum源安装
官方提供:https://downloads.mariadb.org/mariadb/repositories/
点开此网站,可以查询到具体的yum源地址
清华大学提供的具体的yum源地址如下:
https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/10.2/
---------------------------------------------------------------------------------------------------------------------
方法二:安装二进制格式程序包
建议安装在逻辑卷上,这样可以保证后期数据库增大后,可以随时进行增加容量。
步骤如下:
第一步:从相应的网站下载对应的mysql二进制安装包
https://downloads.mariadb.org/
第二步:在原有硬盘增加逻辑卷,并进行挂载
fdisk /dev/sda 增加分区并指定类型为LVM
pvcreate “LVM分区” 创建物理卷
vgcreate “卷组名” “物理卷” 创建卷组
lvcreate -n “逻辑卷名”-l 100%FREE “卷组名” 全部设逻辑卷
mkfs.xfs /dev/“卷组名”/“逻辑卷名” 创建文件系统
在此可专门建立文件夹为挂载点,假设为 /data 目录
为保证开机即可挂载,可将其写入/etc/fstab文件中
第三步:创建系统用户mysql信息
useradd -r -d /data/mysql -m mysql -s /sbin/nologin
第四步:二进制程序的准备
tar xvf “二进制文件” -C /usr/local 解压缩致/usr/local/中,进入到/usr/local/中,创建解压缩后二进制文件的软连接:
ln -sv “解压缩后二进制文件” mysql
并修改软连接mysql的属性:
chown -R root.mysql /usr/local/mysql
第五步:创建数据库文件
进入到/usr/local/mysql/目录中,执行如下命令:
./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
第六步:在/etc/下,创建配置文件,为了方便管理,可以专门创建指定目录:
mkdir /etc/mysql
cp /usr/local/mysql/support-files/my-huge.cnf /etc/mysql/my.cnf
(注意配置文件名必须为my.cnf)
此时还需要修改配置文件里的部分内容:
datadir=/data/mysql
第七步:准备启动脚本
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
systemctl start mysqld
systemctl enable mysqld(可设为开机启动)
第八步:对数据库进行安全加固
mysql_secure_installation
-----------------------------------------------------------------
方法三:源码编译安装
后续操作和二进制安装一样,进行数据库文件的生成、配置文件准备、启动脚本设置。
------------------------------------------------------------------------------------------------------------------------------------------------
补充:因为需要经常使用mysql二进制程序,所以建议将路径加入到PATH变量中,并且为确保每次开机都有效,则可写入配置文件中:
vim /etc/profile.d/mysql.sh
PATH=/usr/local/mysql/bin:$PATH
. /etc/profile.d/mysql.sh
--------------------------------------------------------------------------------------------------------------------------
Mysql多实例的创建(这里假设建立3个,并以端口号作为区分)
(是已安装mariadb-server已经安装的情况下)
第一步:创建需要多线程对应的文件夹,并修改对应权限
mkdir /mysqldb/{3306,3307,3308}/{etc,bin,data,pid,socket,log} -pv
chown -R mysql.mysql /mysqldb/
第二步:数据库初始化的建立
mysql_install_db --datadir=/mysqldb/3306/data --user=mysql
(其中3307和3308以同样方式修改)
第三步:准备配置文件
cp /etc/my.cnf /mysqldb/3306/etc/ (拷贝原配置文件)
vim /mysqldb/3306/etc/my.cnf (修改如下配置)
[mysqld]
port=3306
datadir= /mysqldb/3306/data
socket=/mysqldb/3306/socket/mysql.sock
[mysqld_safe]
log-error=/mysqldb/3306/log/mariadb.log
pid-file=/mysqldb/3306/pid/mariadb.pid
(其中3307和3308以同样方式修改)
第四步:创建启动脚本
cp mysqld /mysqldb/3306/bin/ (拷贝服务脚本)
vim /mysqldb/3306/bin/mysqld
cmd_path="/usr/bin"
chmod +x /mysqldb/3306/bin/mysqld (加上执行权限)
(其中3307和3308以同样方式修改)
(在这里需要注意的是cmd_path的路径,在yum安装、编译安装或者二进制安装时如果设置不同的话,需要修改成对应的路径)
第五步:为保证安全,可给root修改口令
mysqladmin -S /mysqldb/3306/socket/mysql.sock password '密码'
此步骤需要在服务启动的情况下修改
(其中3307和3308以同样方式修改)
注意,若要打开连接指定的mysql时,则需要指定对应的socket文件,命令如下:
mysql -S /mysqldb/3306/socket/mysql.sock -p
---------------------------------------------------------------------------------------
3.SQL语言(关系数据库使用的国际标准语言)
(Structure Query Language)
大小写不敏感,语句可以单行或多行,以“;”结尾
数据库对象的名称有以下几个重要要求:
必须以字母开头、不与数据库资源同名、同一数据库下不重名
SQL语句的分类如下:
第一种:DDL (Data Defination Language)数据定义语言
CREATE 用来创建数据库
DROP 删除数据库
ALTER 修改数据库
create|drop|alter database|scheme “数据库名”
第二种:DML (Data Manipulation Language)数据库操纵语言
INSERT 增加数据库里的内容
DELETE 删除数据库里的内容
UPDATE 修改数据库里的记录内容
第三种:DCL (Data Control Language)数据控制语言
GRANT :授权、REVOKE :取消授权
COMMIT:提交、ROLLBACK:取消提交
第四种:DQL (Data Query Language)数据库的查询语言
SELECT 例:select * from “数据库表名”
4. 数据库中的一些查看命令
(注意结尾都需要“;”,以下省略)
show databases 显示已有的数据库列表
show warnings 查看警告信息(只显示上一条信息)
use “数据库名” 可切换数据库
show tables 显示数据库中的表信息
desc “表名” 查看表的结构内容
5. 数据库表的建立
create table “表名”(字段1,字段2,字段3)
表中的字段:字段名、字段数据类型、修饰符(类似于awk中修饰)
数据类型的三大原则:
尽量使用正确存储数据的最小数据类型
使用简单的数据类型方便CPU处理
尽量避免NULL
字符串:
char(n)指定字符长度为n,固定不变,不够会用空格补齐
varchar(n)根据输入字符串长度变化,但不超过
ENUM 枚举 表示只能选其中一个
修饰符:
PRIMARY KEY 主键(每个表只能有一个,且所属字段内容不为空)
UNIQUE KEY 唯一键(每个表中可有多个)
AUTO_INCREMENT 自动递增是配合主键、唯一键一起使用的,并且适用于整数类型
数据表中内容的填写:
insert into “表”(字段名)value(对应字段的内容),(对应字段的内容);
select * from “表” 将表中的内容显示一遍
truncate table “表” 清空表
update “表”set “字段”where “条件” 表示在指定条件下修改
delete from “表” where “条件” 删除指定条件的内容
为了防止在进行数据库表中内容修改时避免误操作,可在mysql-clients.cnf这个配置文件中的[mysql]中加入“safe-updates”,或者可在执行mysql命令时,加入选项“-U | --safe-updates”
---------------------------------------------------------------------------------------------------------------
可另行编辑SQL语句文件,并在命令行将其导入到数据库中:
mysql < “编写的SQl语句文件”
也可执行如下命令,直接查看数据库列表和某个数据库中的表单:
mysql -e ‘show databases’
mysql -e ‘show tables’“数据库名”
--------------------------------------------------------------------------------------------------------------------
6. 运用较多的DQL语句
可显示别名:
select “字段名”as “别名” from “表”
可增加过滤条件:
select * from “表” where “条件”
where 条件包括:
算数运算符(+、-、*、/、%)、比较运算符(<、=、>)
between *** and ***
like ‘***%’(这里%相当于正则里的*)表示模糊查询
‘_’表示任意单一字符
rlike 可以运用正则表达式
is null (这个语法特殊)
in (对象1、对象2)
去除重复:
select distinc “字段1”from “表”
若是需要按照指定字段排序,则在语句最后加入 :
order by “字段” 正序
order by “字段”desc 倒序
可根据指定条件将查询结果分组用于聚合函数运算:
有avg()、max()、min()、count()、sum()
例如:select gender,avg(age) from students group by gender 表示以gender字段分类,求各分类段平均年龄
也支持多个分组一起 group by 字段1,字段2;也可对指定组进行过滤条件,如下:
group by 字段 having 条件
7. 数据库中多表的使用
join 横向合并使用
交叉连接(笛卡尔乘积):(总行数=表1行数*表2行数)
select * from “表1”cross join “表2”
内连接,需要有指定条件:
select * from “表1”,“表2”where“条件”(老方法)
select * from “表1”inner join “表2” on “条件”
这里需要注意的是“*”中的字段名可根据需要填写,若是表1和表2有冲突,则需要进行划分,可通过设置表的别名的方式来区分
外连接分为以下:
左、右外连接:
包括交集:
select * from “表1”left|right join “表2” on “条件”
不包括交集:
select * from “表1”left|right join “表2” on “条件”where “条件中表2|1的字段” is null
完全外连接:(注意此语法mysql不支持)
包括交集:
select * from “表1”full join “表2” on “条件”
此语法可通过左右外连接包括交集,并使用union结合
不包括交集:
select * from “表1” full join “表2” on “条件”where “条件中表1的字段” is null or “条件中表2的字段” is null
可在完全外连接后,并在 where条件下“条件中表1的字段” is null or “条件中表2的字段” is null执行select语句
自连接:
当在一张表中需要取出两个字段作为对应关系,则可以对一张表进行多次别名设置,然后利用连接方法,得出内容
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
union 纵向合并使用
在使用union时,则需要保证合并的表的字段数对等,操作如下:
select * from “表1”union select * from “表2”
若需要对合并之后的表单在进行条件查询,则需要指定别名来进行辨别,否则不会识别具体对哪个表的字段进行查询,称为子查询,操作如下:
select * from (合并后的表内容)as A where “A.字段 符合的条件”
8. 视图
建立虚表,此时虚表无数据,数据是从实表查询到,格式如下:
create view “虚表名”as select “部分字段”from “表”
如果对虚表进行增加数据内容,会直接写入实表中, mysql数据库中设置变量的方法:select set@a=10
9. 自定义函数
除了mysql自带的函数外,还可以进行自定义函数,为了避免设定函数时,因为“;”结尾导致退出,所以可以先修改结尾符,格式如下:
delimiter //
create function fun_name(定义不同字段)returns 字符类型
begin
需要执行的语句命令;
return (需要执行的语句);
end //
delimiter ; (此步骤是还原结尾符“;”)
函数的调用:select fun_name(参数值)
10. 用户的管理和权限
create user ‘用户名’@‘主机地址’identified by ‘密码’
此时会因为授权的问题,只能够查阅部分数据库;
通过 show processlist 可查看已连接至数据库的用户信息,
删除用户如下:
drop user ‘用户名’@‘主机地址’
若是需要修改密码,则可以使用如下命令:
方法一:立即生效
set password for ‘用户名’@‘主机地址’= password(‘新密码’)
方法二:
因为用户信息也是属于数据库mysql里的表,所以可以进入到mysql数据库中使用update语句
update user set password=password(‘新密码’)where “条件”
除此之外还需要执行:flush privileges 指令,才会生效。
方法三:
mysqladmin -u用户 -p旧密码 password ‘新密码’
------------------------------------------------------------------------------------------
权限的一些设定:
授权指令如下:
grant “操作指令”on “某数据库或某表”to 用户名@‘主机地址’
也可在后面加入 identified by‘密码’,若是没有此用户,则会自动创建
也可取消授权:
revoke “操作指令”on “某数据库或某表”from 用户名@‘主机地址’
----------------------------------------------------------------------------------------------------------
show grants for用户名@‘主机地址’ 可查看指定用户授权
show grants for current_user() 可查看当前用户授权
11. 体系架构
存储引擎是用来将在数据库中的增、删、改、查操作内容写入到磁盘中
show engines 可查看支持的存储引擎
show variables like ‘%storage_engine%’ 查看默认的存储引擎
目前主流的是MyISAM和InnoDB,两者的区别在于:
MyISAM支持表级锁,InnoDB支持行级锁;
只有InnoDB支持事务性,MVCC(高并发)
在存储方式上:
MyISAM文件分为三种:表格式定义(.frm)、数据文件(.MYD)、索引文件(.MYI)
InnoDB文件分为两种:表格式定义(.frm)、数据和索引文件放在一起(.ibd)
(在MySQL 5.5版本以后数据库默认使用InnoDB引擎,并且会将每个数据库的数据索引文件都分别存放,不会集中放入一个文件中)