![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fcf08bb030c3c9ad305321c8091a2fed.png#pic_center)
一.基本概念
1.数据(Data)
描述事物的符号记录
包括数字,文字、图形、图像、声音、档案记录等
以“记录”形式按统一的格式进行存储
2.表
将不同的记录组织在一起
用来存储具体数据
数据库
表的集合,是存储数据的仓库
以一定的组织方式存储的相互有关的数据组合
数据库管理系统(DBMS)
是实现对数据库资源有效组织、管理和存取的系统软件
3.数据库系统
是一个人机系统,田便件、U、效伯)牛、uUMo、/I1Ntt -数据库用户组成
用户可以通过DBMS或应用程序操作数据库
DBMS数据库管理系统
- Database:数据库是数据的汇集,它以一定的组织形式存于存储介质上
- DBMS:是管理数据库的系统软件,它实现数据库系统的各种功能。是数据库系统的核心
- DBA:负责数据库的规划、设计、协调、维护和管理等工作
- 应用程序:指以数据库为基础的应用程序
4.数据库管理系统的优点
- 相互关联的数据的集合
- 较少的数据冗余
- 程序与数据相互独立
- 保证数据的安全、可靠
- 最大限度地保证数据的正确性
- 数据可以并发使用并能同时保证一致性
5.数据库管理系统的基本功能
- 数据定义
- 数据处理
- 数据安全
- 数据备份
6.数据库系统的架构
- 单机架构
- 大型主机/终端架构
- 主从式架构(C/S)
- 分布式架构
二.关系型数据库和非关系型数据库
1.关系型数据库:
Mysql(Oracle公司) 、 SQL server(微软) 、access(微软公司office产品)
Oracle 、DB2(IBM公司),sybase(sybase) 等等
2.关系型数据库和非关系型数据库的区别
关系数据库:
关系数据库结构是二维数据库表,二维表当中每个字段(列)用来描述对象的一个属性,
每个记录(行)用来描述一个对象的信息(完整信息),关系数据库写到哪里也就是存储在硬盘当中
读写系统就会受到的IO限制或者瓶颈
其他
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
缓存加速软件
非关系型数据库(NoSQL):
MongoDB 、 Redis(内存数据库/缓存数据库)K-V键值对、与之类似的Memcache,K-V键值对
redis-memecache对比:
相同点:存储高热数据(在内存中高速运行)
不同点:redis可以做持久化保存,可以存储对象
3.非关系型数据库
严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。
优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、
图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。
三.安装mariadb
[root@localhost ~]# yum install mariadb-server -y
[root@localhost ~]# systemctl start mariadb.service
[root@localhost ~]# mysql
[root@localhost ~]# mysql_secure_installation
输入密码后#一路回车
[root@localhost ~]# tee /etc/yum.repos.d/mysql.repo <<EOF
> [mysql]
> name=mysql5.7
> baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/
> gpgcheck=0
> EOF
[root@localhost ~]# yum -y install mysql-community-server
启动并查看状态
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# ss -ntap |grep 3306
LISTEN 0 80 :::3306 :::* users:(("mysqld",pid=3475,fd=13))
[root@localhost ~]# mysql -u root -p
可以在
[root@localhost ~]# vim /etc/my.cnf
[mysql]
prompt=(\\u@\\h) [\\d]>\\_
auto-rehash
[root@localhost ~]# systemctl restart mysqld.service
第一行是可以显示目前哪个数据库
后一行是自动补全命令,但是必须先打过完整一边命令后,第二次才能补全
PS1:安装MySQL8.0版tar安装方法
可以去官网下载最新版的安装包 本次用的是最新版的8.0.27
mysql官网下载链接:https://dev.mysql.com/downloads/mysql/
[root@localhost ~]# tar -zxvf /root/mysql-8.0.27-el7-x86_64.tar.gz -C /usr/local/
[root@localhost ~]# mv /usr/local/mysql-8.0.27-el7-x86_64 /usr/local/mysql 改名
[root@localhost ~]# cd /usr/local/mysql/ 进入目录
[root@localhost mysql]# ls
bin docs include lib LICENSE man README share support-files
[root@localhost mysql]# mkdir /usr/local/mysql/mysqldb 创建数据库数据目录
[root@localhost mysql]# chmod -R 777 /usr/local/mysql 赋权
[root@localhost mysql]# chmod -R 777 /usr/local/mysql/mysqldb/
[root@localhost mysql]# groupadd mysql 加组
[root@localhost mysql]# useradd -r -g mysql -s /bin/false mysql 创建MySQL用户,但该用户不能登录(-s/bin/false参数指定mysql用户仅拥有所有权,而没有登录权限)*/
[root@localhost mysql]# chown -R mysql:mysql ./ 设定文件属主和属组
[root@localhost mysql]# vim /etc/my.cnf
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/mysqldb
# 允许最大连接数
max_connections=10000
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
[root@localhost mysql]# cd /usr/local/mysql/bin
[root@localhost bin]# ./mysqld --initialize --console 初始化数据库
[root@localhost bin]# cd ../support-files
[root@localhost support-files]# chmod -R 777 /usr/local/mysql 重新授权
[root@localhost support-files]# ./mysql.server start 启动数据库
Starting MySQL.Logging to '/usr/local/mysql/mysqldb/localhost.localdomain.err'.
. SUCCESS!
[root@localhost support-files]# cd ../bin
[root@localhost support-files]#./mysql -uroot -p刚刚初始化安装时的密码 /*登录mysql*/
登录数据库后改密码
mysq> alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; /*修改密码为新密码*/
PS1:YUM安装MySQL8.0版安装方法
[root@localhost ~]# wget https://repo.mysql.com/mysql80-community-release-el7.rpm 下载yum源
[root@localhost ~]# yum -y install mysql80-community-release-el7.rpm 安装
[root@localhost ~]# yum -y install mysql-community-server 安装服务器
[root@localhost ~]# vim /etc/my.cnf 配置文件
[root@localhost mysql]# mkdir data 按配置文件建立文件夹
[root@localhost ~]# systemctl start mysqld 启动服务
[root@localhost ~]# grep "password is generated" /var/log/mysqld.log | awk '{print $NF}'
,&,n1E0i=p_O 找到初始密码
[root@localhost ~]# mysql -uroot -p
Enter password: 用初始密码登录
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY ',&,n1E0i=p_O'; 先改密码为初始密码登进去
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password.policy=0; # 关闭密码复杂性策略
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password.length=1; # 设置密码最低长度为1
Query OK, 0 rows affected (0.00 sec)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'zy44123'; 再重设新密码
Query OK, 0 rows affected (0.01 sec)
这是查密码设置规范的
mysql> show global variables like '%validate_password%';
退出后就能用新密码进入数据库了
四.基本操作
1.设置密码和改密
第一次登录不知道密码
查看密码
[root@centos7 ~]#cat /var/log/mysqld.log |grep password
[root@localhost yum.repos.d]# mysql -u root -p'+8saq%5+ljzG'
#特殊符号用单引号引起来
表明多线程
改密码可能会报错
mysql> alter user root@'localhost' identified by 'zy44123';
ERROR 3009 (HY000): Column count of mysql.user is wrong. Expected 45, found 42. Created with MySQL 50568, now running 50736. Please use mysql_upgrade to fix this error.
需要退出数据库
[root@localhost ~]# mysql_upgrade -u root -p
mysql> alter user root@'localhost' identified by 'zy44123';
Query OK, 0 rows affected (0.00 sec)
2.检测数据库是否在线
[root@localhost ~]# mysqladmin -uroot -pzy44123 ping
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqld is alive
3.查看支持的字符集
mysql> show charset;
4.查看表
mysql> show databases;
5.使用表
mysql> use mysql;
6.创建数据库
mysql> create database zy;
Query OK, 1 row affected (0.00 sec)
mysql> show create database zy;
mysql> create database zy2 charset=utf8;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
7.修改数据库
mysql> ALTER DATABASE zy character set utf8;
Query OK, 1 row affected (0.00 sec)
8.删除数据库 (慎用)
mysql> drop database zy;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> show databases;
五.多实例应用
1.什么是数据库多实例
多实例类似微信双开,端口号类比微信账号,数据库类比聊天窗口,表类比聊天记录
MySQL多实例就是在一台服务器上同时开启多个不同的服务端口(如:3306、3307等),同时运
行多个MySQL服务进程,这些服务进程通过不同的Socket监听不同的服务端口来提供服务。
多实例可能是MySQL的不同版本,也可能是MySQL的同一版本实现
2.多实例的好处
可有效利用服务器资源。当单个服务器资源有剩余时,可以充分利用剩余资源提供更多的服务,且
可以实现资源的逻辑隔离节约服务器资源。例如公司服务器资源紧张,但是数据库又需要各自尽量
独立的提供服务,并且还需要到主从复制等技术,多实例就是最佳选择
3.多实例弊端
存在资源互相抢占的问题。比如:当某个数据库实例并发很高或者SQL查询慢时,整个实例会消耗
大量的CPU、磁盘I/O等资源,导致服务器上面其他的数据库实例在提供服务的质量也会下降,所以
具体的需求要根据自己的实际情况而定。
4.实际操作
[root@localhost ~]# yum -y install mariadb-server 安装
[root@localhost ~]# mkdir -pv /mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid}
建立实例文件夹
[root@localhost ~]# id mysql
uid=27(mysql) gid=27(mysql) groups=27(mysql)
[root@localhost ~]# chown -R mysql.mysql /mysql
[root@localhost ~]# tree -d /mysql/
[root@localhost ~]#mysql_install_db --user=mysql --datadir=/mysql/3306/data
#生成数据库文件重复三次
[root@localhost ~]#mysql_install_db --user=mysql --datadir=/mysql/3307/data
[root@localhost ~]#mysql_install_db --user=mysql --datadir=/mysql/3308/data
[root@localhost ~]# vim /mysql/3306/etc/my.cnf
[mysqld]
port=3306
datadir=/mysql/3306/data
socket=/mysql/3306/socket/mysql.sock
log-error=/mysql/3306/log/mysql.log
pid-file=/mysql/3306/pid/mysql.pid
[root@localhost ~]# sed 's/3306/3307/' /mysql/3306/etc/my.cnf > /mysql/3307/etc/my.cnf
[root@localhost ~]# sed 's/3306/3308/' /mysql/3306/etc/my.cnf > /mysql/3308/etc/my.cnf
[root@localhost ~]# paste /mysql/3307/etc/my.cnf /mysql/3308/etc/my.cnf
[root@localhost ~]# vim /mysql/3306/bin/mysqld
#!/bin/bash
port=3306
mysql_user="root"
mysql_pwd=""
cmd_path="/usr/bin"
mysql_basedir="/mysql"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"
function_start_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL...\n"
${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &> /dev/null &
else
printf "MySQL is running...\n"
exit
fi
}
function_stop_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit
else
printf "Stoping MySQL...\n"
${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
fi
}
function_restart_mysql()
{
printf "Restarting MySQL...\n"
function_stop_mysql
sleep 2
function_start_mysql
}
case $1 in
start)
function_start_mysql
;;
stop)
function_stop_mysql
;;
restart)
function_restart_mysql
;;
*)
printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac
[root@localhost ~]# sed 's/3306/3307/' /mysql/3306/bin/mysqld >/mysql/3307/bin/mysqld
[root@localhost ~]# sed 's/3306/3307/' /mysql/3306/bin/mysqld >/mysql/3308/bin/mysqld
给文件加权限
[root@localhost ~]# chmod +x /mysql/3306/bin/mysqld
[root@localhost ~]# chmod +x /mysql/3307/bin/mysqld
[root@localhost ~]# chmod +x /mysql/3308/bin/mysqld
启动mysql
[root@localhost ~]# /mysql/3306/bin/mysqld start
Starting MySQL...
[root@localhost ~]# /mysql/3307/bin/mysqld start
Starting MySQL...
[root@localhost ~]# /mysql/3308/bin/mysqld start
Starting MySQL...
[root@localhost ~]# ss -natp |grep 330
[root@localhost ~]# mysql -h127.0.0.1 -P3308
六.安装mycli插件 (补全命令)不建议用
[root@localhost ~]# yum install -y libffi-devel
[root@localhost ~]# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
把软件拖入系统里
[root@localhost opt]# rz -E
[root@localhost opt]# tar zxvf Python-3.7.7_.tgz
[root@localhost opt]# cd Python-3.7.7/
[root@localhost Python-3.7.7]# ./configure --prefix=/usr/local/Python-3.7.7/
[root@localhost Python-3.7.7]# make
[root@localhost Python-3.7.7]# make install
[root@localhost Python-3.7.7]# ln -s /usr/local/Python-3.7.7/bin/python3.7 /usr/bin/python37
[root@localhost Python-3.7.7]# ln -s /usr/local/Python-3.7.7/bin/pip3.7 /usr/bin/pip37
[root@localhost Python-3.7.7]# pip37 install mycli -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
[root@localhost Python-3.7.7]# ln -s /usr/local/Python-3.7.7/bin/mycli /usr/bin/mycli
[root@localhost Python-3.7.7]# mycli -u root -p 123123
密码要输入你数据库的密码
七.数据类型
1.MySQL支持多种内置数据类型
数值类型
日期/时间类型
字符串(字符)类型
2.选择正确的数据类型对于获得高性能至关重要,三大原则:
- 更小的通常更好,尽量使用可正确存储数据的最小数据类型
- 简单就好,简单数据类型的操作通常需要更少的CPU周期
- 尽量避免NULL,包含为NULL的列,对MySQL更难优化
3.常用的数据类型:
int:整型 用于定义整数类型的数据
int(m) 4个字节 范围(-2147483648~2147483647)
float:单精度浮点4字节32位 准确表示到小数点后六位
float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位, 注意: 小数点不占用总个数
double:双精度浮点8字节64位
char:固定长度的字符类型 用于定义字符类型数据。
char(n) 固定长度,最多255个字符,注意不是字节
varchar(n) 可变长度,最多65535个字符
varchar:可变长度的字符类型
text:文本
image:图片
decimal(5,2):5个有效长度数字,小数点后面有2位 指定长度数组
#Char如果存入数据的实际长度比指定长度要小,会补空格至指定长度,
#如果存入的数据的实际长度大于指定长度,低版本会被截取,高版本会报错
4.SQL语言分类:
DDL:数据定义语言,用于创建数据库对象,如库、表、索引等。(create )
DML:数据操纵语言,用于对表中的数据进行管理,用来插入、删除和修改数据库中的数据(insert drop delete update )
DQL:数据查询语言,用于从数据表中查找符合条件的数据记录(select )
DCL:数据控制语言,用于设置或者更改数据库用户或角色权限(grant )
(数据控制语句,用于控制不通数据段直接的许可和访问级别的语句,这些语句定义了数据库、表、字段、用户的访问权限和安全级别,如COMMIT、ROLLBACK、GRANT、REVOKE)
八.实际操作
1.查
1).查看数据库结构
SHOW DATABASES; #大小写不区分,分号“;”表示结束
mysql> show databases;
2).查看数据库中包含的表
use 数据库名
选择数据库,切换库类似于cd
mysql> use class15;
Database changed
mysql> show tables;
3).查看表结构(字段)
格式:describe [数据库名.]表名;
可简写 desc
mysql> desc info;
也可以加\G,这样就是纵向显示
mysql> desc info\G;
在未进入任何数据库前查看表结构可以
mysql> desc class15.info;
2.增加
1)增加新的表
mysql> use class15;
Database changed
mysql> create table info (id int(4) not null PRIMARY KEY,name char(10) not null,age int(3),tel bigint(11)); 因为int最大10位,而电话号码已经11位了,所以要改成bigint
Query OK, 0 rows affected, 3 warnings (0.01 sec)
mysql> show tables;
mysql> desc info;
2)管理表中的数据
1.向数据表中插入新的数据记录
insert into 表名(字段1,字段2,字段3) values(字段1的值,字段2的值,字段3的值);
mysql> insert into info (id,name,age,tel) values(1,'zy',24,13812312345);
Query OK, 1 row affected (0.00 sec)
mysql> select * from class15.info;
mysql> select * from class15.info\G
第二种方法
mysql> insert into info VALUES(2,'wwd',21,12378456734);
Query OK, 1 row affected (0.01 sec)
mysql> select * from class15.info\G
3.查询数据记录
查看指定字段字段
格式 select 字段1,字段2 from 表名 [where 条件表达式]
mysql> SELECT * FROM info WHERE id < 3;
只显示id是3以下的
mysql> select * from info where age=18; 只招年龄是18岁的
mysql> select * from info limit 2; 加上limit选项可以看前几行
mysql> select * from info limit 1,2; 看第1行后的2行
4 修改、更新数据表中的数据记录
update 表名 set 字段名1=修改字段值1 ,字段名2=修改的字段值2 [where 条件表达式]
mysql> update info set age=19 where name='zrc';
Query OK, 1 row affected (0.01 sec)
mysql> select * from info;
注意一定后面得跟where,指定目标,否则整个一列都被更改了
4 在数据表中删除指定的数据记录
delete from 表名 [where 条件表达式]
删除前一定要确认,而且后面要跟where表达式,否则就是删除数据表了
mysql> delete from info where age=21;
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
5.修改表名和表结构
1)修改表名
alter table 旧表名 rename 新表名;
mysql> alter table info rename zy;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
2)扩展表结构(增加字段)
alter table 表名 add 字段 数据类型
default 字段 表示没有设置时会自动匹配
mysql> alter table zy add guojia varchar(50) default 'china';
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc class15.zy;
mysql> select * from zy;
3) 修改字段(列)名,添加唯一键
alter table 表名 change 旧列名 新列名 数据类型 [unique key];
unique key 唯一键,可以为多个
mysql> alter table zy change test 性别 char(50) unique key;
Query OK, 4 rows affected (0.02 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from zy;
4)删除字段
alter table 表名 drop 字段名;
mysql> alter table zy drop 性别;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from zy;
九.高级操作
1.自动填充
#if not exists:表示检测要创建的表是否已存在,如果不存在就继续创建
#int(4) zerofill:表示若数值不满4位数,则前面用"0"填充,例0001
#auto_increment:表示此字段为自增长字段,即每条记录自动递增1,默认从1开始递增;
自增长字段数据不可以重复;自增长字段必须是主键;如添加的记录数据没有指定此字段的值且
添加失败也会自动递增一次
#unique key:表示此字段唯一键约束,此字段数据不可以重复:一张表中只能有一个主键,但是一张表中可以有多个唯一键
#not null:表示此字段不允许为NULL
新建一个数据库
mysql> create database zhongbo;
Query OK, 1 row affected (0.01 sec)
mysql> use zhongbo;
Database changed
mysql> create table if not exists info (id int(4) zerofill primary key auto_increment, name varchar(10) not null,cardid int(18) not null unique key,hobby varchar(50));
Query OK, 0 rows affected, 3 warnings (0.01 sec)
mysql> desc zhongbo.info;
mysql> insert into info (name,cardid) values('zy','0234');
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
mysql> insert into info (name,cardid) values('wwd','00678');
Query OK, 1 row affected (0.00 sec)
mysql> select * from info;
没有添加ID号,但是ID号是自动添加并且会自动增加
2.数据克隆
格式
create table yyy2 like yyy; #复制格式,通过LIKE方法,复制yyy表结构生成yyy2表
insert into yyy2 select * from yyy; #备份内容
例如把info 表复制到info2表
MySQL root@localhost:ky15> create table info2 like info;
Query OK, 0 rows affected
Time: 0.004s
MySQL root@localhost:ky15> insert into info2 select * from info;
Query OK, 2 rows affected
Time: 0.001s
MySQL root@localhost:ky15> select * from info2;