Mysql

数据库(DB:DateBase)

概念:数据仓库,可以存储大量数据和管理数据

分类

关系型数据库:

  • MySQL,Oracle,Sql Server,SQLite
  • 通过表和表之间,行和列之间的关系进行数据的存储

非关系型数据库: (NoSQL) Not Only

  • Redis,MongDB
  • 对象存储,通过对象的自身属性决定。

数据表的类型

MYISAM INNODB
事务支持 N Y
数据行锁定 N Y
外键约束 N Y
全文索引 Y N
空间大小 较小 较大

登录:mysql -u root -p
初始化/创建data文件:mysqld --initialize-insecure --user=root

DDL(数据库定义语言)

创建数据库:create database if not exists student charset = gbk;

删除数据库:drop database if exists student;

更新数据库:alter database teacher charset = gbk;

查看数据库:show databases;
创建表:

​ ①创建库 create database if not exists frank_school charset = gbk;

​ ②use frank_school;

​ ③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=innnodb;

​ ④show tables;
查看表: desc teacher;

删除表:drop table if exists stu, ooo;
修改表:

​ alter table student add gender varchar(1) first/after name;

​ alter table student drop address;

​ alter table student change phone tel_phone int(11); 可修改字段名

​ alter table student modify tel_phone int(13); 修改约束

​ alter table student rename students; 修改表名

清空表:truncate table student; --自增会归零

删除表:delete from test; --不会影响自增

delete删除后,重启数据库现象:

  • InnoDB 自增列会从1开始(存在内存中,断电即失)
  • MyISAM 继续从上一个自增量开始(存在文件中,不会丢失)

DML (数据库操纵语言)

插入数据:insert into teacher (id,name,phone,address) values (1,'Frank','1888888','ShangHai');

删除数据:detele from teacher where age < 20;

更新数据:update teacher set name = 'frank' where phone = '111';

DQL(数据库查询语言)

查询数据:
select * from teacher order by chinese asc/desc;

select avg(age) as '年龄' , gender as '性别' from ifo group by gender;

多表查询:
select name,score from student inner/left/right join score on student.id = score.stuId;

子查询:select * from student where id in/exists (select stuid from score where score >= 85);

MD5加密

update student set pwd=MD5(pwd)


事务

  • 原子性:要么成功,要么失败
  • 一致性:事务前后的数据完整性保证一致
  • 持久性:事务一旦提交则不可逆,被持久化到数据库中
  • 隔离性:多个用户并发访问数据库时,每个事务相互隔离
    • 脏读:指一个事务读取了另一个事务未提交的数据
    • 不可重复读:在一个事务内读取表中的某一个行数据,多次读取结果不同。
    • 虚读:指在一个事务内读取到了别的事务插入的数据,导致前后不一致。

模拟转账

set autocommit = 0; --关闭自动提交
start transaction;  --开启一个事务

update account set money=money-500 where name = 'a';
update account set money=money+500 where name = 'b';

commit; --提交后,就被持久化了
rollback; --回滚

set autocommit = 1;  --恢复默认值

索引 Innodb默认数据结构:Btree

show index from student;  --显示所有的索引信息
alter table school.student add fulltext index 'studentName' ('student'); --增加一个全文索引  (索引名)列名
create index id_app_user_name on app_user('name'); --添加索引  索引名 on 表(字段)

三大范式

第一范式;原子性,保证每一列不可再分
第二范式:满足第一范式前提,每张表只描述一件事情
第三范式:前提满足第一二范式,确保数据表中的每一列数据都和主键直接相关,不能间接相关

  • 规范性和性能的问题:关联查询的表不得超过三张表
    • 考虑商业化的需求,(成本,用户体验)数据库的性能更加重要
    • 在规范性能的问题,需要适当的考虑规范性
    • 故意给某些表增加冗余的字段(从多表查询变为单表查询)
    • 故意增加一些计算列(从大数据量降低为小数据量的查询:索引)
posted @ 2022-12-06 19:13  Benny1799  阅读(27)  评论(0)    收藏  举报