什么是数据库
数据库(DB DateBase)
概念:数据仓库,软件,安装在操作系统(window,Linux,,mac,~~~)之上!可以存储大量数据
作用:存储数据,管理数据
数据库分类
- 关系型数据库:(SQL)
- 通过表与表之间,行与列之间的关系进行数据的存储,如学员信息表,考勤表
- MySQL, Oracle,Sql Server,DB2,SQLlite
- 非关系型数据库:(NOSQL)
- 非关系型数据库,对象的存储,通过对象的自身的属性来决定。
- Redis,MongDB
DBMS(数据库管理系统)
操作数据库
操作数据库>操作数据库中的表>操作数据库中的表中的数据;
操作数据库
1、 创建数据库
create database web --web为数据库的表名
2、删除数据库
drop database web
3、使用数据库
use web
4、查看数据库
show databases
表中数据类型的讲解
数值
-
tinyint 十分小的数据 只有1个字节
-
smallint 较小的数据 2个字节
-
mediumint 中等大小的数据 3个字节
-
int 标准的整数 4个字节 (常用)
-
bigint 较大的数据 8个字节
-
float 浮点数 4个字节
-
double 浮点数 8个字节(精度问题)
-
decimal 字符串类型的浮点数,一般用于金融计算的时候。
字符串
- char 字符串固定大小的 0~255
- varchar 可变字符串 0~65535 (常用的String )
- tinytext 微型文本 2^8-1
- text 文本串 2^16-1 一般用于保存大文本
时间
- data YYYY-MM-DD 日期格式
- time HH:mm:ss 时间格式
- datatime YYYY-MM-DD HH:mm:ss 最为常用的时间格式
- timestamp 时间戳,就是1970.1.1到现在的毫秒数。
- year 表示年份
null
注意:不要使用NULL进行运算,结果还是NULL;
数据库的字段属性
Unsigned :
- 无符号的整数。
- 声明了该列不能为负数。
zerofill:
- 0填充
- 不足的位数用0来填充
自增:
- 通常理解为自增,自动在上一条记录的基础上加一(默认)
- 通常用来设计唯一的主键,必须时整数类型
- 可以自定义设计主键的初始值和步长
非空:
- 假设设置为not null,如果不给它赋值,就会报错
- NULL,如果不填写值,默认为null;
默认:
- 设置默认值
- sex ,如果设置默认值为男,如果不指定该列的值,则会有默认的值。
创建数据库表
格式
create table [if not exists] `表名`(
'字段名' [列类型] [属性][索引][注释],
······
'字段名' [列类型] [属性][索引][注释],
'字段名' [列类型] [属性][索引][注释],
)[表类型][字符集设置][注释]
数据库引擎的区别
INNODB 默认使用 优点: 安全性高,支持事务的处理
MYISAM 早些年使用 优点: 节约空间,速度较快
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持(表锁定) | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间的大小 | 较小 | 较大(约MYISAM的两倍) |
修改和删除数据表
--修改表名
ALTER TABLE 旧表名 RENAME AS 新表名
--增加表的字段属性
ALTER TABLE 表名 ADD 字段名 列属性
--修改表的字段
ALTER TABLE 表名 MODIFY 字段名 修改的列属性 (修改约束)
ALTER TABLE 表名 CHANGE 字段名 新的字段名 修改的列属性 (重命名+修改约束)
--删除表的字段
ALTER TABLE 表名 DROP 字段名
--删除表
DROP TABLE IF EXISTS 表名
--注意点:所有创建和删除尽量加上判断,以免报错。
DML语言
添加
insert into 表名 字段名 values (字段值)
修改
update 表名 set 字段名=新的值 where 条件语句
删除
delete from 表名 where 条件语句
DQL查询数据(Data Query Language)
语法: select 字段名···· from 表名
-- 查询全部学生
select * from student
--查询指定字段
select 'studentName','studentNo' from student
--别名
select 'student' as name from student
--函数:拼接
select concat('姓名为:','studentName') from student
别名 字段名 as 新的字段名
去重 distinct
select distinct 'StudentNo' from student --发现重复的学生ID去掉重复的数据
Where 条件子句
逻辑运算符
and与 or 或 not非
select * from 表名 where 'student' = ?
模糊查询
select 'student' from 表名 where '成绩' between 60 and 70 --查询成绩在60和70之间的学生信息
select 'student' from 表名 where '名字' like '%张%' --查询名字中带有张的学生
select 'student' from 表名 where '学号' in (001,002,003) --查询学生学号为001,002,003的学生信息
运算符 | 语法 | 描述 |
---|---|---|
between | a between b and c | 若a在b和c之间,则结果为真 |
like | a like b | sql匹配,如果a匹配b.则结果为真 |
in | a in (a1,a2,a3) | 假设a在a1,或者a2,a3中的某一个值中,则结果为真 |
联表查询
操作 | 描述 |
---|---|
inner Join | 如果表中至少有一个匹配,就返回真 |
left join | 会从左表中返回所有的值,即使右表中没有匹配 |
right | 会从右表中返回所有的值,即使左表中没有匹配 |
--表达式
select '字段名'····
from student as s
inner join result as r
on s.studentName =r.studentName
自连接
分页和排序(limit ,order by)分组、过滤
--分页
select * from 表名 where 条件语句 limit 查询的起始下标,页面大小个数
--排序
select * from 表名 where 条件语句 order by desc(降序) asc(升序)
--分组
select * from 表名 where 条件语句 group by 字段名 --根据字段名分组
--过滤
select * from 表名 where 条件语句 having 条件语句 --在where后,再进行过滤
子查询
本质:在where语句中在嵌套一个查询语句
MySQL函数
常用函数
--算数函数
select ABC() --取绝对值
select ceiling() --向上取整
select Floor() --向下取整
select Rand() --返回一个0~10之间的整数
select sign() --判断一个数的符号,负数返回-1.正数返回+1
--字符串函数
select Char_length('字符串') --字符串的长度
select concat('我','爱学习','java') --拼接字符串
select insert('我爱编程hello mysql',1,2,'不喜欢') --替换,从第一个字符串开始,替换2个字符。
select lower() --小写字母
select upper() --大写字母
select replace() --替换
--时间和日期
select current_date() --获取当前日期
select now() -- 获取当前时间
select current() --获取当前时间
select localtime() --获取本地时间
select system() --系统时间
--系统
select system_user() --获取当前用户
select version() --当前mysql的版本
聚合函数
函数名称 | 描述 |
---|---|
count() | 计数 |
sum() | 求和 |
avg() | 平均值 |
max() | 最大值 |
min() | 最小值 |
select count(name) from student --count(字段),会忽略null值
select count(*) from student --count(*),不会忽略null值 本质 计算行数
select count(1) from student --count(1,不会忽略null值 本质 计算行数
select sum(num) as 总和 from student
select avg(num) as 平均值 from student
select max(num) as 最大值 from student
select min(num) as 最小值 from student
数据库级别的MD5加密(扩展)
MD5不可逆,具体的值的md5是一样的
事务
什么是事务
事务原则:ACID原则 原子性、一致性、隔离性、持久性
- 原子性(Atomicity):要么都成功,要么都失败。
- 一致性(Consistency):保证事务前后的数据完整性要一致
- 持久性(Durability):事务一旦提交则不可逆,被持久化到数据库中
- 隔离性(Isolation):事务的隔离性就是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰到,事务之间要相互隔离。
隔离所导致的一些问题,脏读、幻读、不可重复读
脏读:
指一个事务读取了另一个事务未提交的数据
不可重复读:
在一个事务内读取表中的某一行数据,多次读取的结果不同。(这个不一定错误,只是某些场合不对)
幻读:
是指在一个事务内读取到了别的事务插入的数据,导致前后读取的不一致。
set autocommit=0; --关闭自动提交
start transaction --开启一个事务
update 表名 set num=num-5 where name='a';
update 表名 set num=num+5 where name='b'; --实现a给b转账5块钱
commit; --转账成功,提交事务
rollback; --转账失败,回滚到转账之前
set autocommit=1; --开启自动提交
索引
MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构。
提取句子的主干,就可以得到索引的本质:索引就是数据结构
索引的分类
在一个表中,主键索引只能有一个,而唯一索引可以有多个-
- 主键索引(Primary key)
唯一的标识,主键不可重复,只能有一个列作为主键
- 唯一索引(unique key)
避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引
- 常规索引(key/index)
默认的,index,key来设置
- 全文索引(Fulltext)
在特定的数据库下才有,Myisam
快速定位数据
索引原则
- 索引不是越多越好
- 不要对进程变动数据加索引
- 小数据量的表不需要加索引
- 索引一般加在常用来查询的字段上
三大范式
第一范式:
原子性:保证每一列不可再分
第二范式:
前提:满足第一范式
每张表只描述一件事情
第三范式:
前提:满足第一范式和第二范式
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。