一、数据库的相关概念
1.数据库的分类
- 关系型数据库 mysql oracle
- 非关系型数据库 redis
2.数据库的概念
database:用来组织、存储、管理数据的仓库
数据库的管理系统:DBMS 实现对数据的有效组织、管理和存储的系统软件
市面上常见的DBMS:mysql;oracle;sql-server(windows研发);postgresql(大象数据库);influsdb等。
(1)关系型数据库的核心
是一张表格,数据存储在表格当中,表有行和列。
列:又叫字段,是描述对象的属性
行:描述对象的信息
数据是保存在表里面的,关系型数据库的表与表之间是有关联的,数据之间也是有关联的。一个关系型数据库可以有多个库,库里面保存的是表,表里面有数据。但是,每个库是独立的。数据库当中,多张表存储在库中,通过表与表之间的字段进行关联。
(2)非关系型数据库
库里面保存的是键值对,以 key=value 的形式保存。
常见的有:es (elasttic search) 索引型非关系型数据库;redis 缓存型非关系数据库;prometheus 时序性的非关系数据库;monggoDB 文档型非关系数据库 等等。
(3)区别
关系型数据库:并发量很低,一旦访问大量集中,数据库会很快崩溃
非关系型数据库:redis---->用户第一次访问数据库--->redis上生成一个缓存的键值对---->访问缓存键值对。可以高并发读写,对海量的并发依旧可以保持高效的存储和访问。而且也可以实现高可用的构架。
3.关系型数据库的常见数据类型
int(n)
数据类型是整数,n表示数据的长度限制(范围在-2147483648到2147483647之间)
char(n)
是保存字符串类型的数据,保存固定长度的字符。
varchar(n)
也是保存字符串类型的数据,保存可变长度的字符。
char和varchar的区别
char的字段,无论是否有值,char都会占据4字节(硬盘空间)。
varchar是按照实际的字符长度进行记录,但是在结尾会多加一个字符,多一个字节。
varchar比char节省磁盘空间
读写速度,char比varchar要快的多。
char的存储方式是连续磁盘空间;varchar多次查询之后,会产生一些磁盘文件的碎片。
text 存储大文本数据
date:用来存储日期
格式:YYYY-MM-DD
datetime 用来存储时间
格式:YYYY-MM-DD HH:MM:SS
timestamp 可以自动存储当前的时间戳
float(n,m)
单精度浮点数,带小数点的值。n是总位数,m是小数点后几位
double(n,m) 双精度浮点数
image:存储图片或者多媒体文件
4.数据库的存储引擎和事务
mysql:innoDB 支持事务,支持行级锁定,支持外键的存储引擎。
事务:插入数据、更新数据、删除数据。
事务的四个特性
(1)原子性
事务是整个数据库工作的最小单位,不可分割,要么全部执行成功,要么全部失败。只要有一个出错,所有已成功的都会被失败。
(2)一致性
事务执行前后,数据的完整性约束是不能被破坏的,满足所有条件约束的情况下,事务才能被提交。
(3)隔离性
事务之间的执行是隔离的,一个事务的执行不能受到其他事务的干扰。
(4)数据的持久性
事务一旦被提交,将永久性的保存到数据库,保证数据不会丢失。
mysql支持事务的四种隔离级别
(1)未提交读
允许脏读,可以看到未提交的修改,read uncommitted
(2)提交读
read committed,只允许看到修改提交之后的数据。
(3)可重复读
mysql的默认隔离级别,一个事务,在执行两次select语句,保证得到相同的结果
(4)串行读
后一个事务必须等待前一个事务完成之后才能继续,在这个过程中,表会完全锁住,读写都会阻塞。
可能出现的问题
(1)脏读
A事务在访问数据并且修改了数据,但是修改的结果没有提交到数据库,B事务也访问了这条数据,而且看到了未提交的结果。
(2)不可重复读
在一个事务之内,多次读同一数据。在A事务没有结束时,另一个B事务也访问该数据,由于在A事务中两次读取数据,在中间B事务修改了数据,导致A事务两次查询的结果是不一致的,这就是不可重复读,不能读到相同的数据。
(3)幻读
A事务对数据进行了修改,B事务也对数据进行了修改,A事务发现数据还是有没有修改的数据,产生了幻觉。
二、mysql
1.数据库的常见名词
名词 | 意思 |
database | 数据库 |
table | 表 |
row | 行 |
column | 列 |
index | 索引 |
view | 视图 |
user | 用户 |
privilege | 权限 |
procedure | 存储过程 |
2.sql语句的规范
- sql语句不区分大小写,但是建议用大写,sql可以是单行也可以是多行,默认是以“;”结尾。如果是多行表示一个sql语句,关键词必须要在一行。
- 库名、表名、列名和行的值,是 严格区分大小写的。表、库都必须以字母为开头,不要使用sql的保留字段(如table select show database等),表名和库名尽量不要使用特殊字符。
3.sql语句的分类
(1)DDL
数据库定义语言,创建数据库,表示、索引等的语法 。
create 创建
drop 删除
ALTER 修改---->只能对表修改
(2)DML
数据库操作语言,对表里的数据进行管理。
select 查
update 更新数据
insert 插入
delete 删除数据
(3)DQL
查询语句,查询数据表中的符合条件的数据。
select
(4)DCL
数据库控制语言,对数据库用户的权限进行控制。
GRANT 赋权
REVOKE 取消权限
(5)TCL
事务控制语句。
commit 提交
rollback 回滚
save 回滚
savepoint 保存点,用来回滚的
4.null和空值
- null就是什么都没有,什么都不存在
- 空值也是有数据的,也是值
三、mysql实际操作
依赖软件:navicat
1.新建一个库,在库里新建一个表
打开navicat,双击mysql1即可连接,双击mysql,点击查询,点击新建,输入
create database test1; #鼠标框住右键第一行执行
点击mysql1按F5刷新
create table stars (
id int(3) not null,
#声明表中的字段的名称和字段的类型,not null表示一定要写入数据
name char(10) not null,
#字段的名称是name,长度是10个字符,这一列不能为空,值一定要有
address char(20) default'地址不详’
#default默认的给这一列数据生成一个值,不写入数据,默认就是地址不详
)
select * from stars;
#select 查;*所有列;from 表名 确定哪个表
#查询stars表中的所有列
2.查看表的结构
desc 表名; #查看表的结构
key: 键 主键或者外键
default:表示插入数据时没有写数据,自动添加字段
extra:提供一些附加的信息
3.删除表和库
drop table stars; #删除表
drop database test1; #删除库
4. 插入数据
法一:
insert into 表名 (字段1,字段2,字段3,.......) values(字段1的值,字段2的值,字段3的值,......)
#表名后面的字段可以省略
法二:
5.修改:更新表的数据
update 更新表的数据
update 表名 set ... where ...
#通过where定义要更新的地方
6.删除数据行
delete 删除表中的数据行
delete from 表名 where ...
7. select查询语句
显示固定范围的行
显示第3行到第五行
SELECT * FROM stars LIMIT 2,3;
去重显示
SELECT DISTINCT address from stars;
模糊查询
SELECT * FROM stars WHERE name like '%3%'; #name的列中包含3
SELECT * FROM stars WHERE name like '%3'; #name的列中以3结尾
SELECT * FROM stars WHERE address LIKE '北%'; #以北开头
8.对表的结构进行修改
修改表名
alter table 旧表名 rename 新表名;
增加字段
alter table 表名 ADD 字段名 类型;
修改字段的类型
ALTER TABLE 表名 MODIFY COLUMN 字段名 要修改的类型;
修改列的名称
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型;
删除字段
alter table 表名 drop 字段名;
四、mysql当中的六个约束
1.六个约束
主键约束(primary key)
用来标识表中的每一行,主键的字段必须是唯一的,且不能为空。
外键约束(foreign key)
用来建立表与表之间的关系。一张表的外键和另一张表的主键的值要匹配,确保数据的引用完整性。
非空约束(not null)
插入或者是更新的操作这个字段必要有值。
唯一性约束(unique key)
类似于主键的唯一性,但是一个表可以有多个唯一性约束。
默认值约束(default)
不输入内容时,默认是default的值。
自增约束(auto_increment)
一般都是和主键一起使用,唯一性和数据类型都有要求。
2.创建主从表
#创建主表
CREATE TABLE student (
crad_id INT(11) PRIMARY KEY,
stu_name CHAR(10) NOT NULL,
stu_email VARCHAR(50) UNIQUE KEY
);
INSERT INTO student VALUES(3204,'栗子','123@123.com');
SELECT * FROM student;#创建从表
CREATE TABLE class (
stu_id INT(4) PRIMARY KEY auto_increment,
address VARCHAR(50) DEFAULT'地址不详',
crad_id INT(11) NOT NULL,
FOREIGN KEY (crad_id) REFERENCES student(crad_id)
);
INSERT INTO class VALUES(1,DEFAULT,3204);
SELECT * FROM class;
#两张表靠外键进行关联
列的名称最好一致,值最好一致
多表联合查询时,表与表之间的关联不要超过三张表,超过之后速度会下降。