关系型数据库管理系统
一、什么是数据库数据库就是一个用来存放计算机数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来对数据进行组织和存储的,可以通过数据库提供的方法来管理其中的数据。二、数据库的种类关系型数据库与非关系型数据库三、生产环境常用数据库生产环境主流的关系型数据库有 oracle、Microsoft SQL server、MySQL/mariadb等。生产环境主流的非关系
一、什么是数据库
数据库就是一个用来存放计算机数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来对数据进行组织和存储的,可以通过数据库提供的方法来管理其中的数据。
二、数据库的种类
关系型数据库与非关系型数据库
三、生产环境常用数据库
生产环境主流的关系型数据库有 oracle、Microsoft SQL server、MySQL/mariadb等。
生产环境主流的非关系型数据库有 mongdb memcached redis
四、MySQL编译安装
1、清理安装环境:
# yum erase mariadb mariadb-server mariadb-libs mariadb-devel -y
# userdel -r mysql
# rm -rf /etc/my*
# rm -rf /var/lib/mysql
2、创建mysql用户
[root@mysql-server ~]# useradd -r mysql -M -s /bin/false
3、从官网下载tar包
[root@mysql-server ~]# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.27.tar.gz
4、安装编译工具
# yum -y install ncurses ncurses-devel openssl-devel bison gcc gcc-c++ make
cmake:
# yum -y install cmake
5、创建mysql目录
[root@mysql-server ~]# mkdir -p /usr/local/{data,mysql,log}
6、解压
[root@mysql-server ~]# tar xzvf mysql-boost-5.7.27.tar.gz -C /usr/local/
7、编译安装
cd 解压的mysql目录
[root@mysql-server ~]# cd /usr/local/mysql-5.7.27/
[root@mysql-server mysql-5.7.27]# cmake . \
-DWITH_BOOST=boost/boost_1_59_0/ \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DSYSCONFDIR=/etc \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DINSTALL_MANDIR=/usr/share/man \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1
提示:boost也可以使用如下指令自动下载,如果不下载bost压缩包,把下面的这一条添加到配置中第二行
-DDOWNLOAD_BOOST=1/
参数详解:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ 安装目录
-DSYSCONFDIR=/etc \ 配置文件存放 (默认可以不安装配置文件)
-DMYSQL_DATADIR=/usr/local/mysql/data \ 数据目录 错误日志文件也会在这个目录
-DINSTALL_MANDIR=/usr/share/man \ 帮助文档
-DMYSQL_TCP_PORT=3306 \ 默认端口
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ sock文件位置,用来做网络通信的,客户端连接服务器的时候用
-DDEFAULT_CHARSET=utf8 \ 默认字符集。字符集的支持,可以调
-DEXTRA_CHARSETS=all \ 扩展的字符集支持所有的
-DDEFAULT_COLLATION=utf8_general_ci \ 支持的
-DWITH_READLINE=1 \ 上下翻历史命令
-DWITH_SSL=system \ 使用私钥和证书登陆(公钥) 可以加密。 适用与长连接。坏处:速度慢
-DWITH_EMBEDDED_SERVER=1 \ 嵌入式数据库
-DENABLED_LOCAL_INFILE=1 \ 从本地倒入数据,不是备份和恢复。
-DWITH_INNOBASE_STORAGE_ENGINE=1 默认的存储引擎,支持外键
8、进行make
[root@mysql-server mysql-5.7.27]# make && make install
#如果安装出错,想重新安装:
# 不用重新解压,只需要删除安装目录中的缓存文件CMakeCache.txt
9、初始化
[root@mysql-server mysql-5.7.27]# cd /usr/local/mysql
[root@mysql-server mysql]# chown -R mysql.mysql .
[root@mysql-server mysql]# ./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# ---初始化完成之后,一定要记住提示最后的密码用于登陆或者修改密码
[root@mysql-server ~]# vim /etc/my.cnf ---将文件中所有内容注释掉在添加如下内容
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8
[mysqld]
port = 3306
user = mysql
basedir = /usr/local/mysql #指定安装目录
datadir = /usr/local/mysql/data #指定数据存放目录
socket = /tmp/mysql.sock
character_set_server = utf8
10、启动mysql
[root@mysql-server ~]# cd /usr/local/mysql
[root@mysql-server mysql]# ./bin/mysqld_safe --user=mysql &
[root@mysql-server mysql] netstat -lntp | grep 3306
11、登录mysql与修改mysql密码
[root@mysql-server mysql]# /usr/local/mysql/bin/mysql -uroot -p'2720C+Xa:E+j'
#修改密码
[root@mysql-server mysql]# /usr/local/mysql/bin/mysqladmin -u root -p'2720C+Xa:E+j' password 'Xiaoshuaige@123'
12、添加环境变量
[root@mysql-server mysql]# vim /etc/profile ---添加如下
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
[root@mysql-server mysql]# source /etc/profile
之后就可以在任何地方使用mysql命令登陆Mysql服务器:
[root@mysql-server mysql]# mysql --version
mysql Ver 14.14 Distrib 5.7.27, for Linux (x86_64) using EditLine wrapper
[root@mysql-server mysql]# mysql -uroot -p'Xiaoshuaige@123'
13、配置mysql服务的管理工具:
[root@mysql-server mysql]# cd /usr/local/mysql/support-files/
[root@mysql-server support-files]# cp mysql.server /etc/init.d/mysqld
[root@mysql-server support-files]# chkconfig --add mysqld
[root@mysql-server support-files]# chkconfig mysqld on
#先将原来的进程杀掉
[root@mysql-server ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!
[root@mysql-server ~]# netstat -lntp
[root@mysql-server ~]# /etc/init.d/mysqld stop
编译安装:
# ls
COPYING README bin include mysql-test support-files
COPYING-test README-test docs lib share
1、bin目录
用于放置一些可执行文件,如mysql、mysqld、mysqlbinlog、mysqladmin等。
2、include目录
用于放置一些头文件,如:mysql.h、mysql_ername.h等。
3、lib目录
用于放置一系列库文件。
4、share目录
用于存放字符集、语言等信息。
五、yum安装
关闭防火墙和selinux
1、mysql的官方网站下载
[root@mysql-server ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
2、安装mysql的yum仓库
[root@mysql-server ~]# rpm -ivh mysql80-community-release-el7-3.noarch.rpm
[root@mysql-server ~]# yum -y install yum-utils #安装yum工具包
3、配置yum源
[root@mysql-server ~]# vim /etc/yum.repos.d/mysql-community.repo
4、安装数据库
[root@mysql-server ~]# yum install -y mysql-community-server
启动服务
[root@mysql-server ~]# systemctl start mysqld
设置开机启动
[root@mysql-server ~]# systemctl enable mysqld
5、查找密码
密码保存在日志文件中
[root@mysql-server ~]# grep password /var/log/mysqld.log
2019-08-18T14:03:51.991454Z 1 [Note] A temporary password is generated for root@localhost: woHtkMgau9,w
6、修改密码
[root@mysql-server ~]# vim /etc/my.cnf #在最后添加如下内容
validate_password=off
[root@mysql-server ~]# systemctl restart mysqld #重启mysql生效
#可以用第二种方式修改为简单的密码:
[root@mysql-server ~]# mysqladmin -uroot -p'Xiaoshuaige@123' password 'XSG123'
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
[root@mysql-server ~]# mysql -uroot -pXSG123
yum安装:
/var/lib/mysql #存放数据文件
/usr/share/mysql #用于存放字符集、语言等信息。
六、数据库基本操作
mysql> show engines; #存储引擎查看
ALTER TABLE 表名 ENGINE=引擎; #修改搜索引擎
mysql> show variables like '%storage_engine%'; #看你的mysql当前默认的存储引擎
mysql> select version(); #如何查看Mysql服务器上的版本
mysql> create table t1(id int,manager char(10)) engine =innodb; #创建时候指定引擎
事务要符合四个条件(ACID):原子性、一致性、隔离性、持续性
1、sql语句
SQL(Structured Query Language 即结构化查询语言)
SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。
DDL语句 数据库定义语言:数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
DML语句 数据库操纵语言(对记录的操作): 插入数据INSERT、删除数据DELETE、更新数据UPDATE
DCL语句 数据库控制语言(和权限有关): 例如控制用户的访问权限GRANT、REVOKE
DQL语句 数据库查询语言:查询数据SELECT
1.创建库
mysql> create database 库名;
2.查看数据库
mysql> show databases;
3.进入数据库
mysql> use 库名
4.查看当前所在的库
mysql> select database();
5.查看当前库下所有的表格
mysql> show tables;
1.创建表:
创建表 create table t1(id int,name varchar(20),age int);
字段 类型 字段 类型(长度),字段 类型
mysql> create table t1(id int,name varchar(50),sex enum('m','f'),age int);
2.查看有哪些表
mysql> show tables;
3.查看表结构:
mysql> desc t1;
4.查看表里面的所有记录:
语法: select 内容 from 表名;
mysql> select * from t1;
*:代表所有内容
5.查看表里面的指定字段:
语法:select 字段,字段 from 表名;
mysql> select name,sex from t1;
6.查看表的状态
mysql> show table status like '表名'\G ---每条SQL语句会以分号结尾,想看的清楚一些以\G结尾,一条记录一条记录显示。(把表90度向左反转,第一列显示字段,第二列显示记录)使用的\G就不用添加分号了
7.修改表名称
方式一、语法:rename table 旧表名 to 新表名;
mysql> rename table t1 to t2;
Query OK, 0 rows affected (0.00 sec)
方式二、语法:alter table 旧表名 rename 新表名;
mysql> alter table t2 rename t3;
8.使用edit(\e)编辑------了解
mysql> \e #可以写新的语句,调用的vim编辑器,在里面结尾的时候不加分号,保存退出之后在加“;”
-> ;
9.删除表
mysql> drop table 表名;
10.删除库
mysql> drop database 库名;
七、数据类型
1.整型
作用:用于存储用户的年龄、游戏的Level、经验值等。
分类:tinyint smallint mediumint int bigint
2.浮点数类型 FLOAT DOUBLE
作用:用于存储用户的身高、体重、薪水等
3.字符串类型
作用:用于存储用户的姓名、爱好、电话,邮箱地址,发布的文章等
字符类型 char varchar --存字符串
4.枚举类型 enum
mysql> create table t10(name enum('m','w'));
只能从tom,jim两个里面2选其1
(enumeration)
有限制的时候用枚举
5.日期类型
===时间和日期类型测试:year、date、time、datetime、timestamp
作用:用于存储用户的注册时间,文章的发布时间,文章的更新时间,员工的入职时间等
注意事项:
==插入年份时,尽量使用4位值
==插入两位年份时,<=69,以20开头,比如65, 结果2065
>=70,以19开头,比如82,结果1982
八、完整性约束
约束条件 说明
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录,不可以为空 UNIQUE + NOT NULL
FOREIGN KEY (FK) 标识该字段为该表的外键,实现表与表之间的关联
NULL 标识是否允许为空,默认为NULL。
NOT NULL 标识该字段不能为空,可以修改。
UNIQUE KEY (UK) 标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT 为该字段设置默认值
UNSIGNED 无符号,正数
1.主键
#表存在,添加约束
mysql> alter table t7 add primary key (hostname);
创建表并指定约束
mysql> create table t9(hostname char(20),ip char(150),primary key(hostname));
2.auto_increment自增
mysql> CREATE TABLE department3 (
dept_id INT PRIMARY KEY AUTO_INCREMENT,dept_name VARCHAR(30),comment VARCHAR(50));
3.设置唯一约束 UNIQUE,字段添加唯一约束之后,该字段的值不能重复,也就是说在一列当中不能出现一样的值。
mysql> CREATE TABLE department2 (dept_id INT,dept_name VARCHAR(30) UNIQUE,comment VARCHAR(50));
4.null与not null
1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
sex enum('male','female') not null default 'male' #只能选择male和female,不允许为空,默认是male
unsigned属性:整数类型有可选的unsigned属性,表示不允许负值,大致上可以使用正数的上限提高一倍
九、表操作
1修改字段和类型
1.修改名称、数据类型、类型
alter table 表名 change 旧字段 新字段 类型; #change修改字段名称,类型,约束,顺序
mysql> alter table t3 change max maxs int(15) after id; #修改字段名称与修饰并更换了位置
2.修改字段类型,约束,顺序
alter table 表名 modify 字段 类型; #modify 不能修改字段名称
mysql> alter table t3 modify maxs int(20) after math; #修改类型并更换位置
3.删除字段
mysql> alter table t3 drop maxs; #drop 丢弃的字段。
2、插入数据
mysql> create table t3(id int, name varchar(20), sex enum('m','f'), age int);
字符串必须引号引起来
记录与表头相对应,表头与字段用逗号隔开。
1.添加一条记录
insert into 表名(字段1,字段2,字段3,字段4) values(1,"tom","m",90);
mysql> insert into t3(id,name,sex,age) values(1,"tom","m",18);
Query OK, 1 row affected (0.00 sec)
注:添加的记录与表头要对应,
2.添加多条记录
mysql> insert into t3(id,name,sex,age) values(2,"jack","m",19),(3,"xiaoli","f",20);
Query OK, 2 rows affected (0.34 sec)
3.用set添加记录
mysql> insert into t3 set id=4,name="zhangsan",sex="m",age=21;
Query OK, 1 row affected (0.00 sec)
4.更新记录
update 表名 set 修改的字段 where 给谁修改;
mysql> update t3 set id=6 where name="xiaoli";
5.删除记录
1.删除单条记录
mysql> delete from t3 where id=6; #删除那个记录,等于几会删除那个整条记录
Query OK, 1 row affected (0.35 sec)
2.删除所有记录
mysql> delete from t3;
3、单表查询
语法:
select 字段名称,字段名称2 from 表名 条件
简单查询
mysql> select * from employee5;
多字段查询:
mysql> select id,name,sex from employee5;
有条件查询:where
mysql> select id,name from employee5 where id<=3;
mysql> select id,name,salary from employee5 where salary>2000;
设置别名:as
mysql> select id,name,salary as "salry_num" from employee5 where salary>5000;
给 salary 的值起个别名,显示值的表头会是设置的别名
统计记录数量:count()
mysql> select count(*) from employee5;
统计字段得到数量:
mysql> select count(id) from employee5;
避免重复DISTINCT:表里面的数据有相同的
mysql> select distinct post from employee5;
#字段 表名
表复制:key不会被复制: 主键、外键和索引
复制表
1.复制表结构+记录 (key不会复制: 主键、外键和索引)
语法:create table 新表 select * from 旧表;
mysql> create table new_t1 select * from employee5;
2.复制单个字段和记录:
mysql> create table new_t2(select id,name from employee5);
3.多条件查询: and ----和/与
语法: select 字段,字段2 from 表名 where 条件 and where 条件;
mysql> SELECT name,salary from employee5 where post='hr' AND salary>1000;
mysql> SELECT name,salary from employee5 where post='instructor' AND salary>1000;
4.多条件查询: or ----或者/或
语法: select 字段,字段2 from 表名 where 条件 or 条件;
mysql> select name from employee5 where salary>5000 and salary<10000 or dep_id=102;
mysql> select name from employee5 where salary>2000 and salary<6000 or dep_id=100;
5.关键字 BETWEEN AND 什么和什么之间。
mysql> SELECT name,salary FROM employee5 WHERE salary BETWEEN 5000 AND 15000;
mysql> SELECT name,salary FROM employee5 WHERE salary NOT BETWEEN 5000 AND 15000;
mysql> select name,dep_id,salary from employee5 where not salary>5000;
注:not 给条件取反
6.关键字IS NULL 空的
mysql> SELECT name,job_description FROM employee5 WHERE job_description IS NULL;
mysql> SELECT name,job_description FROM employee5 WHERE job_description IS NOT NULL; #-取反 不是null
mysql> SELECT name,job_description FROM employee5 WHERE job_description=''; #什么都没有==空
NULL说明:
1、等价于没有任何值、是未知数。
2、NULL与0、空字符串、空格都不同,NULL没有分配存储空间。
3、对空值做加、减、乘、除等运算操作,结果仍为空。
4、比较时使用关键字用“is null”和“is not null”。
5、排序时比其他数据都小(索引默认是降序排列,小→大),所以NULL值总是排在最前。
7.关键字IN集合查询
一般查询:
mysql> SELECT name,salary FROM employee5 WHERE salary=4000 OR salary=5000 OR salary=6000 OR salary=9000;
IN集合查询
mysql> SELECT name, salary FROM employee5 WHERE salary IN (4000,5000,6000,9000);
mysql> SELECT name, salary FROM employee5 WHERE salary NOT IN (4000,5000,6000,9000); #取反
8.排序查询 order by :指令,在mysql是排序的意思。
mysql> select name,salary from employee5 order by salary; #-默认从小到大排序。
mysql> select name,salary from employee5 order by salary desc; #降序,从大到小
9.limit 限制
mysql> select * from employee5 limit 5; #只显示前5行
mysql> select name,salary from employee5 order by salary desc limit 0,1; #从第几行开始,打印一行
查找什么内容从那张表里面降序排序只打印第二行。
11.GROUP BY和GROUP_CONCAT()函数一起使用
GROUP_CONCAT()-------组连接
mysql> SELECT dep_id,GROUP_CONCAT(name) FROM employee5 GROUP BY dep_id; #以dep_id分的组,dep_id这个组里面都有谁
mysql> SELECT dep_id,GROUP_CONCAT(name) as emp_members FROM employee5 GROUP BY dep_id; #给组连接设置了一个别名
12.函数
max() 最大值
mysql> select max(salary) from employee5;
查询薪水最高的人的详细信息:
mysql> select name,sex,hire_date,post,salary,dep_id from employee5 where salary = (SELECT MAX(salary) from employee5);
min() 最小值
select min(salary) from employee5;
avg() 平均值
select avg(salary) from employee5;
now() 现在的时间
select now();
sum() 计算和
select sum(salary) from employee5 where post='sale';
4、多表查询
外连接:在做多张表查询时,所需要的数据,除了满足关联条件的数据外,还有不满足关联条件的数据。此时需要使用外连接.外连接分为三种
左外连接:表A left [outer] join 表B on 关联条件,表A是主表,表B是从表
mysql> select emp_id,emp_name,dept_name from employee6 left join department6 on employee6.dept_id = department6.dept_id;
右外连接:表A right [outer] join 表B on 关联条件,表B是主表,表A是从表
mysql> select emp_id,emp_name,dept_name from employee6 right join department6 on employee6.dept_id = department6.dept_id;
全外连接:表A full [outer] join 表B on 关联条件,两张表的数据不管满不满足条件,都做显示。
5破解root密码
root账户没了或者root密码丢失:
关闭Mysql使用下面方式进入Mysql直接修改表权限
5.6/5.7版本:
# mysqld --skip-grant-tables --user=mysql &
# mysql -uroot
mysql> UPDATE mysql.user SET authentication_string=password('QianFeng@123') WHERE user='root' AND host='localhsot';
mysql> FLUSH PRIVILEGES;
#编辑配置文件将skip-grant-tables参数注释
#重启mysql
6、mysql使用索引
1普通数据(index)
2唯一索引(unique)
3主键索引(primary key)
删除索引
1普通索引(index)
# 直接删除
mysql> DROP INDEX nameIndex ON student1;
# 修改表结构删除
mysql> ALTER TABLE student2 DROP INDEX nameIndex;
2唯一索引(unique)
# 直接删除
mysql> DROP INDEX idIndex ON student4;
# 修改表结构删除
mysql> ALTER TABLE student DROP INDEX idIndex;
3主键索引(primary key)
mysql> ALTER TABLE student DROP PRIMARY KEY;
4查看索引
mysql> SHOW INDEX FROM tab_name;
十、权限
权限简介
| 权限 | 权限级别 | 权限说明
| :--------------------- | :--------------------- | :------------------------------------
| CREATE | 数据库、表或索引 | 创建数据库、表或索引权限
| DROP | 数据库或表 | 删除数据库或表权限
| GRANT OPTION | 数据库、表或保存的程序 | 赋予权限选项 #小心给予
| ALTER | 表 | 更改表,比如添加字段、索引等
| DELETE | 表 | 删除数据权限
| INDEX | 表 | 索引权限
| INSERT | 表 | 插入权限
| SELECT | 表 | 查询权限
| UPDATE | 表 | 更新权限
| LOCK TABLES | 服务器管理 | 锁表权限
| CREATE USER | 服务器管理 | 创建用户权限
| REPLICATION SLAVE | 服务器管理 | 复制权限
| SHOW DATABASES | 服务器管理 | 查看数据库权限
更多推荐
所有评论(0)