版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24499745/article/details/88652626
数据库的基础知识
数据分类
结构化数据
能够使用统一的结构表示的数据,如数字,字符等
半结构化数据
介于完全结构化和完全无结构化之间,如xml和html等
非机构化数据
长度可变,不能使用统一的结构表示的数据,如图像,音频
数据库的分类
关系型数据库:
使用二维表格存储结构化数据
非关系型数据库
存放半结构化和非结构化数据
三范式
# 第一范式
列不可拆分
# 第二范式
唯一标识,都和主键有关,每个表都只描述一件事情,间接依赖主键
# 第三范式
引用主键,除了主键以外的其他列,直接依赖该主键
mysql常用的命令
# 连接数据库
mysql -u用户名 -p密码
# 连接远程数据库(-h后边写要连接的主机ip地址)
mysql -hip 地址 -u用户 -p密码
# 显示所有的数据库
show databases
# 使用某一个数据库
use 数据库名字
# 修改数据库的密码
在dos中:mysqladmin -u数据库名字 -p 密码 password 新密码
直接在mysql中: set password for用户名@localhost = password('新密码')
DCL 数据控制语言
# 创建用户:
create user '用户名'@'host' identified by '密码'
# 授权:
grant 权限(insert,delete,update,select,create | all)on 数据库名.数据表 to 用户名@‘host’
# 收回权限
revoke 权限 on 数据库名.数据表 from 用户名@‘host’
DDL 数据库的定义语言
对于数据库操作
# 创建数据库
create database 数据库名字 charset = utf8;
# 删除数据库
drop database
# 切换数据库
use 数据库名
# 查看当前选择的数据库
select database()
对于表进行操作
# 查看表信息
# 查看当前数据库中所有的表
show tables
# 查看表结构
desc 表名
# 查看创建表的数据
show create table ‘表名’
#创建表
#创建表语法
create table 表名(
列名 类型(大小) 其他的,
列名 类型(大小) 其他的
)
# 创建表创建的修饰
NOT NULL 字段不能为空
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
PRIMARY KEY关键字用于定义列为主键。
修改表
修改表的名字
alter table 表名 rename 【to】 新表名
rename table 表名 to 新表名
添加表的字段
alter table 表名 add 列名 类型 位置(after 列 / first)
默认为最后
修改表的字段
alter table 表名 change 原列名 新列名 类型 位置(after列/first) 修饰
删除表列
alter table 表名 drop 列名
删除表
drop table 表名
清空表数据
delete table 表名
truncate table 表名
区别
delete 删除表数据,会将表中的数据清除,但是,自增编号的增值不会初始化
truncate 清除表数据,会将表中的数据清除,并且,自增编号也会初始化
DML 数据操作语言
增加数据
# 全列插入
insert into 表名 values(值1,值2,值3)
# 支持同时插入多条,在 values(值1,值2,值3),(值1,值2,值3)
# 缺省插入
insert into 表名 (列名1,列名2) values (值1,值2)
# 支持同时插入多条,在 values(值1,值2),(值1,值2)
# 表复制
insert into 表1(列1,列2) select 列1,列2 from 表2
#全列插入,如果有自动增长的列,就需要用0占位,要是用其他的数字占位,那自增从那个数字开始
修改数据
update 表名 set 列1 = 值1, 列2 = 值2 where 条件
删除数据
# 物理删除
delete from 表名 where 条件
# 逻辑删除
alter table 表名 add o、isdelete bit default 0;
update 表名 isdelete = 1 where 条件
# 对于重要的函数,不希望物理删除,一旦删除,数据无法找回
# 所以,会设置一个isdelete的列,类型为 bit,表示逻辑删除
DQL 数据查询语言
了解基础语法(一)
select * from 表名 (固定)
where 条件(分组前过滤)
group by分组
having 条件(分组后过滤)
order by 字段 (排序) 默认是升序,然后可以降序,desc
limit 索引从哪开始,显示几条 分页显示
每页显示m条数据,当前显示第n页
limit (n-1)*m,m
# 查询语句的执行顺序
from 表名
where
group by
distinct
having
order by
limit
# 非空和不是空的字符串
is not null
!= ‘’
# 通过区间查询
between 从哪开始 and 结束
了解基础语法(二)
# 起别名
在表或者字段的后边 直接写或者 as 别名
# 去重复
在要去重复的字段名前边加 distinct
distinct只能放在最前边,要是多个字段,意味着多个字段同时去重复
就是说查询去除多个字段同时重复的数据
了解基础语法(模糊查询)
like '过滤语句'
%代表着匹配0到多个字符
_代表匹配任意一个字符
了解基础语法(正则表达式)
mysql中的正则表达式是在where 的后边写 regexp 表达式
匹配每个字符串
^ 匹配输入字符串的开始位置
$ 匹配字符串的结束位置
. 匹配除 /n之外的任何单个字符
[。。。] 匹配所包含的的任意一个字符。
[^...] 匹配未包含里边的任意一个字符
| 或者的意思,匹配 |前边的后者 | 后边的字符
匹配次数
* 匹配前边的表达式 0次或者多次
+ 匹配前边的表达式1次或者多次
{n} n是一个非负整数。精确匹配n次
{n,m} 最少匹配n次,最多匹配m次
查询中常用函数
单行函数
# 数学函数
rand()# 随机数 ,从0,1之间
round(m,n)# 对于m,从小数点的后n位开始四舍五入,默认是直接取整数
abs() # 绝对值
ceil() # 向上取整
floor()# 向下 取整
truncate(m,n) # 将m中,小数点的后n位截掉,不要了
# 字符函数
concat(st1,st2,。。。) #将字符串连接
length() # 获取字符串长度
substr(str,pos,len) #截取字符串str,从pos开始,位置1开始,len表示长度
replace(str,old,,new)# 表示在str中搜索old,用new来代替
# 日期函数
now()/sysdate()# 获取当前时间,年月日,时分秒
date_format( d,f)# 按照表达式f的要求,格式化日期d
datediff(d1,d2) # 计算日期d1 到d2之间的相隔的天数
day(date) # 获取天
month(date)# 获取月
year(date)# 获取年
date_add(时间,interval expr type) # 函数向日期添加指定的时间间隔。
date # 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。
type,可以是年月日,时分秒,周等
ADDDATE # 与date_add一模一样
聚合函数
avg() 平均值
sum()获取总数
max()获取最大值
min() 获取最小值
count() 统计数目
分组函数
group by 字段名 having 分组后过滤条件
加密函数
# 将内容转化为32位的十六进制的编码
md5(‘root’)
# 将内容转化为40位的十六进制编码
SHA('root')
# 将内容转化为41位的十六进制编码
PASSWORD(‘root’)
# 将内容转化为16位十六进制的编码
old_password(‘root’)
# 以上都是不可逆的
# 可逆的
encode(‘root’) 加密
decode(‘root’) 解密
高级查询
多表查询
# 笛卡尔积
俩张表的查询的结果为记录数的乘积
# 内连接查询(三种)
where子句
用多张表的关联键相等的方式
多个关联条件用and连接
多张表,号相隔
inner join on
innner join连接表,on连接条件
也是多张表连接相等的方式
inner join using
inner join 连接表 using()直接写相同的关连键
# 自然连接
在from 表的后边加 natural join 另一张表
会自动去找相同的关键键
会去掉重复列
# 外链接
左连接
left join 表 on 条件关连键相等
会以左边的表的数据为主
右连接
right join 表 on 条件 关联键相等
会以右边的表的数据为主
子查询
即嵌套查询,将一个查询结果作为另一个查询条件或者组成部门的查询
多行子查询的时候,子查询中返回多个行,这个时候,可以用 any或者all来修饰
* any就是任意一个
* all 就是所有
in 和 exists
in适合A表的数据比B表多的情况
in是先将子查询中的数据检索出来放置在缓冲区,然后查询主查询,找到每一个和子查询中的数据对比
exists 适合 B表比A表多的情况
exists是先将主查询的数据检索,每检索一条都在子查询中找看有没有,有就返回True,就将当前这一条数据放置在结果集中
集合查询
union
union all
就是将多个结果集合并在一起显示
* 要求结果集的查询字段的数量和类型一致
* 最好名字也用别名设置为一致的
union是过滤重复的
union all是全部显示
完整性约束(完整性约束即数据的准确性)
实体完整性,针对于行
# 主键约束(保证记录是唯一的,不重复的)
* 创建表的时候添加
* 列名 类型 primary key
* primary key(列名)
* 修改表的时候添加约束
* alter table 表名 add constraint 约束名(一般以pk_开头) parimary key(列名)
# 唯一约束(保证记录是唯一的)
* 创建表的时候添加
* 列名 类型 unique
* unique(列名)
* 修改表结构的时候添加唯一约束
* alter table 表名 add constraint 约束名(一般以un_开头) unique(列名)
# 主键自增
# 在创建表的时候添加
auto_increment
域完整性,保证列的数据正确性
非空约束
在创建表的时候:列名 类型 not null
默认值约束
在创建表的时候,在字段名的类型后边跟着写 default ‘值’
域完整性,保证引用关系的正确性
在创建表的时候添加
foreign key(列名) references 被引用的表(被引用表中的引用列)
在修改表的时候添加
alter table 表名 add constraint 约束名(一般fk_开头) foreign key(列名) references 被引用的表(被引用表中的引用列)
删除约束
alter table 表名 drop primary key # 删除主键约束
alter table 表名 drop foreign key 约束名 # 删除外建约束
alter table 表名 drop index 约束名 # 删除唯一约束
事务
什么是事务
事务用于保证数据的一致性,由一组DML操作组成,该组sql语句要么同时成功,要是同时失败
事务的ACID特性
A 原子性:事务是原子工作单元,要么同时执行,要么同时不执行
简单的讲: 就是将一组DML语句当做了一个不可再次分隔的原子,一个整体
C 一致性: 符合约束规则,执行之前的整体状态和执行后的数据一致
I 隔离性,并发事务之间相互不影响
行级锁的概念,就和死锁一样,要是俩个窗口同时对于一个资源修改,在一个未提交之前,另一个处于等待状态,超出等待延时,就会报错
D 持久性,事务完成之后,对数据库的影响是永久的
事务的定义
# 开始事务
set Autocommit = 0
设置自动提交关闭状态
start TRANSACTION
begin
savepoint a
设置保存点,回滚未提交事务的时候,可以选择回滚到这个地方
rollback to a
事务回滚到保存点的位置
commit
提交事务,,提交事务所有的保存点全部失效
rollback
回滚所有没有提交的sql