先吹吹:
0-0 什么是数据库?
数据 : qq密码 仓库
数据库:保存海量数据的仓库。
0-1数据库的诞生:
瞬时——》放在内存里的,程序结束,第二次运行的时候,上次的数据就没了。
解决方法:保存在文件里。(写文件里)
瞬时状态—》持久性数据;如:txt文件;
0-2 萌芽阶段:
0-3层次模型:
层次:
层次模型的问题:查询的效率和不完整性。
0-4网状模型:
0-5关系型模型(第二代数据库):
关系:共性。
1、安装连接和配置
安装一个Navicat就行
1-4 连接Mysql(登录)
在hyper里F11就能关闭Mysql服务。
Mysql使用的语句是sql语句,Sql server使用的是T-SQl,但是几乎相差不大。
在Hyper中登录命令:
mysql -u root -p//我要用户管理员的身份登录进入数据库。
在Hyper中退出:\q等。
1-5 创建data文件
下载了hyper,cd进入C:\Program Files\MySQL\MySQL Server 5.7,输入
mysqld --initialize-insecure --user=root
管理员身份运行,创建data文件。
这样环境就配置好了。
2、 数据库的基本操作:
2-1 数据库显示和详解:
show databases;
2-2 创建一个仓库:
create database +名字;
例:create database student;
创建一个数据库,如果不存在:
create database if not exists 数据库名
2-3 删除一个数据库:
drop database 数据库名;
例如:drop database student;
类比:创建数据库:drop database if exists student;
2-4 查看数据库的sql:
//例如
show create database student;
2-5 创建数据库指定字符编码以及查看数据库的字符编码:
例如:create database if not exists 'stdudent' charset=gbk;(或者utf-8)
show create database student;//这条命令进行验证。
乱码->字符编码
但是实际开发过程中一定要用utf8;
2-6 修改字符编码:
例如:
alter database teacher charset=gbk;
3、表的基本操作:
3-1 提出问题,引入表的思维:
仓库-> 数据库
表
1.电子产品
2.日用品
3.化妆品
4.。。。。
结论:仓库的下边,其实,是有其他东西。这个东西,归类,表。
3-2 引用数据库和查看数据库中的表:
use +数据库名
查看表用:show tables;
3-3 创建表:
create table student(
-> id int,
-> name varchar(30),
-> age int
-> )
3-4 创建表(B格):
id int auto_increment primary key comment'主键id',
id name age 字段
auto_increment 自动增长
primary key 主键 最主要的 靠它来区分学生这张表
comment 注释
default 默认值
mysql> create table if not exists teacher(
-> id int auto_increment primary key comment'主键id',
-> name varchar(30) not null comment '老师的名字',
-> phone varchar(20) comment '电话号码',
-> address varchar(100) default '暂时未知' comment '住址'
-> )engine=innodb;
3-5 查看表的结构
desc teacher;
3-6 删除表
drop table student;
drop table if not exists student,teacher;
3-7 修改表
alter table student add phone varchar(20);添加
alter table student gender varchar(1) after name;放在一个固定位置
alter table student gender varchar(1) first:最前面
alter table student drop address;删除固定的字段
alter table student change phone tele_phone int(11);既改名字又改类型
alter table student rename to students;改变表名
4、MySQL数据类型:
0)数据库的数据类型问题:
没有统一的标准,但应该符合业务项目的逻辑标准。
1)int的数值类型:
unsigned int;无符号整形
2)int 类型实际操作和注意事项:
可以超过本身的宽度,但是不能超过范围。
3)浮点数:
float和double会出现精度丢失。解决方法:定点数
4)定点数:
deciaml:因为整数和浮点数分开,不会出现丢失。
5)字符串和文本类型:
char 0-255 定长字符串,VARCHAR 0-65535 变长字符串,会回收字节,但char的效率比varchar高。
6)布尔类型:
boolean;true:1 false:0;
7)枚举类型:
enum;通过整数管理。节省空间。
8)set类型:(集合类型)
9)时间日期类型:
每一张表都要有时间日期类型,DATETIME:YYYY-MM-DD;
5、列属性完整性:
1)列属性问题:
auto__increment:自动增长,一定是primary key;
primary key 不一定是auto increment;用了auto increment之后,比如删除3这个字段,就不能用3了
2)primary key主键的作用及企业用途:
类比身份证;
唯一的;关联表;
主键是不能设置为null的,除非设置为auto—increment;
3)删除、组合键、选择主键:
用尽量唯一的“号”来进行区分。
4)复合主键究竟有什么用:
做网站时:昵称和id;一个表里只有一个主键,主键不能为空。即使有多个主键也认为为一个。
5)unique唯一键的作用和添加介绍:
一个表里可以有多个唯一键,可以为null,主键是区分数据的,唯一键是,只能在一张表里凑热闹,主键能在多个表里凑热闹。
6)唯一键拓展:
alter table t_11 drop index phone;
7)主键和唯一键的区别:
主键和唯一键不能重复,唯一键只能在自己的表里折腾,主键可以在多个表里
8)sql的内注释和代码注释:
:字段注释,comment ‘姓名);sql内注释
9)数据库完整性:
一张表里至少得有一个主键,有些字段可以为空,有些字段为default。等等。
10)外键:
foreign key;
11)更正错误,删除外键:
show create table entry;
删除外键:删除constraint;
12)外键三招操作严格、置空和级联的使用场景介绍:
置空:主表删除ID,从表置为null。
级联:主表更新ID,从表也更新ID。
13)置空和级联演示:
6、数据库设计思维:
1)数据库设计基本概念:
关系?关系型数据库,两张表的共有字段去确定数据的完整性。
行?一条数据 一条数据记录 实体
列?一个字段 属性
冗余:提高查询性能;
2)实体和实体之间的关系:
一对一、一对多、多对一、多对多。
3)Codd第一范式 确保每列原子性:
确保每列(字段)不能再分了。
4)Codd第二范式
不能扯淡,不能在学生表里加钱啊、男女朋友啥的。
5)Codd第三范式
消除传递依赖;比如“张三”、“张”、“三”;
7、单表查询:
1)select:select 'Go fuck yourself' as gnmd,select 加字段名,as可以用来改名。(不加也行)。
2)from:select * from t1,t2;
3)limit: select * from 表名 order by age desc limit 1,2(从1开始,往后两个)(降序排序);
4)dual :伪表 select 2*7 from dual;
8、多表查询
union 多表查询+distinct就能消除重复行
多表查询时,inner join 在没有外键时,要有公共字段。内连接。on后加公共字段。
left join 左连接,以左表为基准,另一张表为辅。缺少的为NULL。
right join 右连接,以右表为基准,缺少的为NULL。
cross join 交叉连接,返回笛卡尔积。
nature join 自然连接,找到公共字段进行连接。公共字段名必须相同,若没有公共字段,则返回笛卡尔积。若两个字段都有为NULL。
using 指定连接字段。
9、子查询
子查询的基本语法:
in 和 not in:
exits 和 not exits:
十一、高级部分:
1.视图:刻意隐藏信息,如教务处学生系统,起到隐藏的作用。
(1)view视图创建、使用、作用
create view vw_stu as SELECT name from Student;
select * from vw_stu;
视图算法:temptable:临时表算法、merge:合并算法。
(2)显示视图:
终端上show tables;show create view vw_stu;
(3)更新和删除视图:
修改视图:alter;
删除视图:drop;
(4)视图算法temptable、merge:
merge:合并
temptable:临时
2.事务
一)事务的提出:
(1)点购买但你没付款。
(2)为什么转账的时候还要提醒你是不是这个卡号。
不可能两边update。
但所有事情确定了才更新就叫事务。
二)事务:transaction
跟西方结婚一样,淘宝收货和发货。
start translation
update wallet set balance=balance-50 where id=1;
update wallet set balance=balance+50 where id=2;
commit;
三)rollback to回滚点
设置回滚点:相当于虚拟机的快照,
savepoint +four(点)。
rollback to+four(点)。
保留点之前的数据。
四)事务的四大特性ACID :
atomicity 原子性(不能再分,要执行一起执行)。
consistency 一致性(事务一旦commit或回滚所有数据都该执行)。
isolation 隔离性。(A与B的交易不可能被C打断)
durability 持久性。(在数据库永久写存)
五)注意事项
事务只能在数据库引擎为innodb的时候才能使用。
3.索引
index(普通索引) Primary Key(主键) unique index(唯一索引)
如字典查笔画,快速查找数据。频繁查找数据。设置索引增删改查慢
4.存储过程(用来模块化设计)(相当于函数)
(1)delimiter
之前用分号为结尾,用delimiter // 就能以 //为结尾了
(2)procedure存储过程的用途
10、企业约束规范
10-1 库表字段约束规范:
表示是否的时候:is_vip 一定要使用类型:tinyint,为无符号。长度:1,只有0和1;
表名和字段名必须为小写字母,不能有大写字母。出现分隔单词必须用下划线隔开。
表名不能出现复数,表名不能起table(mysql里的);
索引名:
主键:pk__xxx
唯一键:uk _ _xxx
索引:idx__xxx
所有的小数全用decimal。
字符串很小时用char,别用varchar。
如果超过了5000,用text;
表里必须要有的字段id、create_time、update_time;
id必须为bigint,而且为无符号,id为单表时设为自增。
create_time 必须为datatime;
update_time 必须为datatime;
字段频繁查询,应该允许一定的冗余。
单表超过2w,分库分表。
年龄一般为tinyint,且无符号。
12-2 索引规范:
(1)限制每张表上的索引数量,建议单张表索引不超过5个:
索引并不是越多越好!索引可以提高效率同样可以降低效率。
索引可以增加查询效率,但同样会降低插入和更新效率,甚至可能会降低查询效率。
(2)禁止给表中的每一列都建立单独的索引:
(3)尽量避免使用外键索引。
(4)join数据类型两边必须一致。
12-3 SQL规范:
不要妄想使用count(xxx,xx,xx)去替代count(*),因为count星会统计null的行。如果某一列值都为null,你要注意count
不是name =null而是is null。
判断一个是不是空用is null。
不要用外键和级联。尤其是在高并发集群的项目中里,其他的表也要跟着改。一切外键的问题放在serve层解决或者应用层解决。
实际开发过程中禁止使用存储过程。存储过程很难调试,而且很难扩展。
删除和修改的时候先select出来查询错误,再删除
子查询的in操作能避免就避免
数据库全为utf8。