数据库
为什么学习数据库?
进行数据存储。我们以Mysql数据库。
我们需要学习sql 语句,按照语法的规则。在mysql进行操作。
Mysql 基本概念
数据库服务器:
就是一台计算机,运行数据库管理软件的计算机
数据库服务器
数据库管理软件:
Mysql oracle db2
库:
数据库就是一个文件夹
表:
将记录存储的地方。我们就需要用表来存储。就是一个文件
记录:
事物一些列典型的特征。
数据:
描述事物特征的符号
Mysql :是一个关系型的数据库管理系统,由瑞典公司开发,目前属于Oracle旗下的公司。Mysql是最流行的关系行的数据库系统。在web方面应用方面mysql是最好的RDBMS(关系型数据库关系系统)应用之一。
mysq就是一个基于socket 编写的C/S架构的软件。
客户端软件:
mysql 自带的:如mysql 命令,mysqldump命令等
python 模块:如pymysql
数据库的分类;
关系型数据库管理软件
非关系型数据库管理软件
Mysql 数据库下载
去官网下载mysql文件 + 配置系统的环境变量
登录命令:
mysql -u root -p
进入mysql环境。输入对应的密码即可,mysql 管理员账号
设置密码:
mysqladmin -uroot -p password "输入新的密码"
修改密码:
mysql> use mysql;
Database changed
mysql> update user set password=PASSWORD("")
sql 语句
使用sql语句来管理数据库管理系统
库的操作 :
新增一个数据库:
create database db1 charset utf8;
创建好数据库之后,会在data文件夹下看到这个文件。
库的查看命令:show databases;
查看所有的数据库
查看所创建的数据库:
show create database db1;
库的修改:
修改的数据库,改变数据库字符编码
alter database db1 charset gbk;
库的删除:
drop database db1
db1数据库已经删除
对表的操作。表在结构中可以看出是文件。对文件的操作。
切换文件夹操作(切换数据库操作。)
use db1;
select database();查看当前使用的库信息
增操作:
create table t1(id int,name char,sex char,score int)
查操作 :
show tables;
show create table t1;
改操作:
新增一个字段
alter table t1 modify name char(6);
show create table t1;
alter table t1 change name NAME char(7);
describe/desc t1;
删操作:
drop table t1;
数据的操作,内容的操作
增:
insert t1(id,name,sex,score) values(1,'Bob','男',100),(2,'Alex','男',98),(3,'Jek','女',140),(3,'Jek','男',149);
查:
select * from t1;
查看其中的记录:
改:
update db1.t1 set NAME='SSH' where id =2;
删:
delete from t1 全部删除
delete fom t1 where id =2; 仅仅删除id号为2的数据
DDL 数据库定义语言
information_schema系统数据库:虚拟库,不占用磁盘空间,存储是数据启动的与一些参数,例如用户表信息,列信息,权限信息,字符信息。在MySQL 数据库中还有几个自带的数据库。
mysql:授权库,主要存储系统用户的权限信息
test:Mysql数据库管理系统自动创建的测试数据库
创建数据库:语法:
CREATE DATABASE 数据库名称 charset utf8;
数据库的命名规则:
可以由字母数字下划线组成,区分大小写
不能使用关键字:例如:create charset
不可以单独使用数字作为数据库的名称
最长的是128位。
存储引擎
在mysql 数据库中的数据库对应的文件夹,数据库中的表对应的文件,数据引擎就是如何存储数据怎么存储,存储就是表的类型。数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。
因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(Table Type,即存储和操作此表的类型)。
MySQL给开发者提供了查询存储引擎的功能,执行以下sql即可查询到mysql中的存储引擎。
show engines
经常使用InnoDB搜索引擎。支持事务,外键。
表的增删改查
表的介绍:表相当于文件。表中的文件的记录就是存储在表的数据。不同的是,表中的每一条记录都有相应的内容。
创建表:
语法:
create table 表的名称(
字段1 类型【约束条件】,
字段2 类型【约束条件】,
字段3 类型【约束条件】
)
#注意:
在同一张表里字段名称不能重复
字段名和类型是必须的
例子:
create database db2 charset utf8;
use db2;
create table t1(
id int,
name char,
sex char
);
show tables; #查看当前数据库下的所有表
show create table t1; #查看当前所创建的表
修改表的结构:
语法:
修改表名:
alter table 表名 rename 新的表名;
增加字段:
alter table 表名 add 字段名 数据类型【完整的约束条件】,
add 字段名 数据类型【完整的约束条件】;
alter table 表名 add 字段名 数据类型【完整的约束条件】 first;#添加到第一个字段。
alter table 表名 add 字段名 数据类型【完整的约束条件】 after;#添加到哪个字段之后。
删除字段:
alter table 表名 drop 字段名;
修改字段:
alter table 表名 modify 字段名 数据类型【完整的约束条件】;
修改表名
alter table 表名 change 旧的字段名 新的字段名 旧的数据类型【完整的约束条件】;
修改表名和数据类型
alter table 表名 change 旧的字段名 新的字段名 新的数据类型【完整的约束条件】;
复制表:
create table table1 select host,user from mysql.user;
将后面的结果直接复制给table1
Mysql中的数据类型
数据类型是数据的一种属性,其可以决定数据的存储格式、有效范围和相应的限制。MySQL的数据类型包括整数类型、浮点数类型、定点数类型、日期和时间类型、字符串类型和二进制数据类型。
整数类型、浮点数类型和定点数类型
日期与时间类型
字符串类型
二进制类型
整数类型:
日期与时间类型
日期与时间类型是为了方便在数据库中存储日期和时间而设计的。MySQL中有多种表示日期和时间的数据类型。其中,YEAR类型表示年份;DATE类型表示日期;TIME类型表示时间;DATETIME和TIMESTAMP表示日期和时间。
YEAR类型
TIME类型
DATE类型
DATETIME类型
TIMESTAMP类型
create table student(
id int,
name char(6),
birth_year year,
birth_date time,
register_time datetime,
phone varchar(20)
);
insert into student values
(1,'Alex',now(),now(),now(),'18656119090');
datetime 和timestamp 的区别:
时间的范围不一样。datetime 时间范围是1001-9999年
datestamp 时间范围是1970年-2038年;
datetime存储时间与时区无关,而datestamp 和时区有关。
datetime 使用8字节的存储空间,timestamp使用4字节存储空间
datetime 默认值是null,timestamp 默认值不为空(not null)。
字符串类型:
char是一种固定长度的类型,varchar则是一种可变长度的类型,它们的区别是:
char如果不指定(M)则表示长度默认是1个字符。varchar必须指定(M)。
char(M)类型的数据列里,每个值都占用M个字符,如果某个长度小于M,MySQL就会在它的右边用空格字符补足(在检索操作中那些填补出来的空格字符将被去掉;如果存入时右边本身就带空格,检索时也会被去掉);
在varchar(M)类型的数据列里,每个值只占用刚好够用的字符再加上一个到两个用来记录其长度的字节(即总长度为L字符+1/2字字节)。
由于某种原因char 固定长度,所以在处理速度上要比varchar快速很多,但相对费存储空间,所以对存储不大,但在速度上有要求的可以使用char类型,反之可以用varchar类型来实例。
text文本类型,可以存比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用char,varchar来代替。还有text类型不用加默认值,加了也没用。
哪些情况使用char更好。
字符类型存储一些描述性的数据,比如邮箱,地址,等等。我们类型设置为字符类型。
length 查看字节数
char_length 查看字符数
一,存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的现在得不偿失。
二,固定长度的。比如使用uuid作为主键,那用char应该更合适。因为它固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。
三,十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。
MyISAM和MEMORY存储引擎中无论使用char还是varchar其实都是作为char类型处理的。
除此之外,建议使用varchar类型。特别是InnoDB存储引擎。
#创建一张表:
create table t3(
number int,
job_id int,
address char(20),
phone_number varchar(20),
email char(20)
);
还有一些其他的数据类型,二进制类型,集合类型,枚举类型。
create table customer(
id int,
name char(16),
sex enum('male','female','gay'),
level enum('vip1','vip2','vip3'),
hobbies set('play','swimming','read','running','music','dance')
);
insert into customer values(2018,'Alex','male','music,read,swimming');
约束条件
约束条件not null 和default
create table t1(
id int (11) unsigned zerofill
)
create table t2(
id int,
name char(11),
sex enum('nale','female') not null default 'male' #性别不能为空,不然sex 默认为male
);
约束条件的unique key
加入该约束防止在真实的存储数据的时候出现重复的名称
#单列唯一
create table department(
id int unique,
name chatr(10) unique
);
insert into department values
(100,"IT部门"),
(101,“IT部门”);
不加约束条件就会出现,在一个组织中出现两个相同的部门。我们就需要加入unique key
创建unique 的方式二:
create table department
id int ,
name chatr(10)
unique(id),
unique(name)
);
#联合唯一:
create table services(
id int,
ip char(18),
port int,
unique(id),#单列唯一
unique(ip,port)#联合唯一
);
desc services;#查看表的结构
select * from services;
约束条件的primary key
从约束的角度来说:
不为空,而且唯一
创建主键
主键和唯一键的区别:
唯一键是可以为多个,唯一键可以联合唯一,而且唯一键可以没有。
但是设置了主键。主键必须唯一,而且不可以为空。
创建主键;
create table store(
id int,
weight char(18),
place varchar(18),
);
存储引擎:innodb:
对于innodb存储引擎来说一张表之中必须有一个主键。
create table t1(
id int primary key,
job_id char(18),
name char(15),
sex char(8),
partment char(20)
);
复合型主键:
create table t3(
ip char(15),
port int,
primary key (ip,port)
);
约束条件的auto_increment
create table t4(
id int primary key auto_increment,
name char(16)
);
mysql> insert into t4(name) values
-> ("alex"),
-> ("Helen"),
-> ("egon"),
-> ("smith"),
-> ("student"),
-> ("teacher");
#注意:从当前的索引进行增长
步长和起始位置偏移量:
设置步长:
set session auto_increment_increment=5;
设置全局:
set global auto_increment_increment=5;
设置偏移量:
set glaobal auto_increment_offset=5;
起始偏移量小于或者等于步长
清空表应使用truncate
使用delete 删除会删不干净,索引会从一开始的删除之前的开始。
约束条件的foreign key
外键:用来建立表之间的关系
例如员工和部门,一个部门可以有多个员工,员工表的关联着部门表:
在员工表的dep_id 字段关联着部门表的id字段。
我们需要先建立部门表,再建立员工表,
#被关联的表必须先建立:
create table dep(
id int primary key,
name char(16),
comment char(25)
);
create table emp(
id int,
name char(10),
sex enum('male','female'),
dep_id int,
foreign key(dep_id) references dep(id)
on delete cascade
on update cascade
#目的是对被关联表进行操作的时候,关联表的数据也会修改,不会出现需要先对关联表进行删除,再对被关联表进行删除。
);
插入数据
先插入被关联的表
insert into dep values
(1, "IT", "IT部门"),
(2, "销售", '销售部'),
(3, "财务", "财务部门");
insert into emp values
(1,"alex","male",1),
(2,"helen","female",1),
(3,"elgn","male",2),
(4,"bob","male",3),
(5,"jenkins","female",3);
表关系的多对一关系
比如一个部门可以有多个员工
一个出本社可以出版多本书
我们需要找到两张表的之间的关联关系。
多张表的建立就是寻找外键关系。
案例:
例如出版社 和书之间 多对一
一个出版社可以出版很多本书
对于
book(foreign key(press_id))reference press(id)
on delete cascade
on update cascade
create table press (
id int primary key auto_increment,
name varchar(20)
);
create table book(
id int primary key auto_increment,
name char(20),
press_id int not null,
foreign key (press_id) references press(id)
on delete cascade
on update cascade
);
insert into press(name) values
('北京人民教育出版社'),
('上海人民教育出版社'),
('安徽人民教育出版社'),
('江苏人民教育出版社');
insert into book(name,press_id) values
('三国演义',1),
('水浒传',2),
('红楼梦',3),
('西游记',1),
('唐诗三百首',2),
('老人与海',4),
('股神巴菲特',3),
('创业日志',4),
('追风筝的人',4),
('伊索寓言',3);
centos安装MySQL
[wei@qwei mysql8]$ ls
mysql-8.0.33-1.el7.x86_64.rpm-bundle mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar
[wei@qwei mysql8]$ cd mysql-8.0.33-1.el7.x86_64.rpm-bundle/
[wei@qwei mysql-8.0.33-1.el7.x86_64.rpm-bundle]$ ll
总用量 1003883
删除centos自带的mariadb 数据库文件按
查询有没有这个文件。
[wei@qwei mysql-8.0.33-1.el7.x86_64.rpm-bundle]$ rpm -qa|grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
强制删除这个文件
[root@qwei mysql-8.0.33-1.el7.x86_64.rpm-bundle]# rpm -e --nodeps mariadb-libs
再次查看系统是否有这个文件
[root@qwei mysql-8.0.33-1.el7.x86_64.rpm-bundle]# rpm -qa|grep mariadb
[root@qwei mysql-8.0.33-1.el7.x86_64.rpm-bundle]#
安装的顺序:
[root@qwei mysql-8.0.33-1.el7.x86_64.rpm-bundle]# rpm -ivh mysql-community-common-8.0.33-1.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:mysql-community-common-8.0.33-1.e################################# [100%]
[root@qwei mysql-8.0.33-1.el7.x86_64.rpm-bundle]# rpm -ivh mysql-community-client-plugins-8.0.33-1.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:mysql-community-client-plugins-8.################################# [100%]
[root@qwei mysql-8.0.33-1.el7.x86_64.rpm-bundle]# rpm -ivh mysql-community-libs-8.0.33-1.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:mysql-community-libs-8.0.33-1.el7################################# [100%]
[root@qwei mysql-8.0.33-1.el7.x86_64.rpm-bundle]# rpm -ivh mysql-community-client-8.0.33-1.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:mysql-community-client-8.0.33-1.e################################# [100%]
[root@qwei mysql-8.0.33-1.el7.x86_64.rpm-bundle]# rpm -ivh mysql-community-icu-data-files-8.0.33-1.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:mysql-community-icu-data-files-8.################################# [100%]
[root@qwei mysql-8.0.33-1.el7.x86_64.rpm-bundle]# rpm -ivh mysql-community-server-8.0.33-1.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:mysql-community-server-8.0.33-1.e################################# [100%]
[root@qwei mysql-8.0.33-1.el7.x86_64.rpm-bundle]#
初始化修改权限:
mysqld --initialize --console
修改权限,方便mysql用户直接使用
chown -R mysql:mysql /var/lib/mysql
第一步:初始化
mysqld --initialize --console
第二步:修改用户以及用户组权限
chown -R mysql:mysql /var/lib/mysql/
第三步:启动MySQL服务
systemctl start mysqld
第四步:进入目录,使用管道符查看系统临时创建的密码
cat /var/log/mysqld.log|grep localhost
第五步:登录数据库
mysql -u root -p
输入密码:输入的是临时密码
第六步:
修改密码:
alter user 'root'@'localhost' identified by '新的密码';
第七步:
exit 退出
第八步:
mysql -u root -p 再次进入,此时密码已经修改好了。