目录
数据库简单介绍
可以有效地管理数据,数据库可以提供远程服务,即通过远程连接来是使用数据库,因此有称为数据库服务器。
MySQL(关系型数据库,对数据要求严格),是现在主流的数据库,后面讲的所有知识都是围绕MySQL讲的,安装版本是5.7.27
数据库基础
1.常用数据类型
1.1数值常用类型:
int(4字节)、bigint(8字节)、double(M,D)(8字节,M是指定长度,D是指定小数位数)、decimal(M,D)(M,D同上)
1.2 字符串常用类型:
varchar(size) (可变长度字符串,size是最大长度,单位是字符,此类型的大小是0-65535字节)
1.3 日期类型:
datetime(8字节,格式是YYYYMMDDhhmmss,会自动转换成时间格式)
2.数据库的操作
2.1 显示当前数据库:show database;
2.2 创建数据库:create database [if not exists] 数据库名;
create database if not exists user character set utf8mb4(或者 charset utf8);
PS: SQL不区分大小写;[]是可选项,可写可不写;单词之间至少要有一个空格;
utf8mb4字符集是完整的utf8(utf8没有包含某些复杂的中文字符,所以utf8mb4是完整版的utf8);
2.3 使用数据库:use 数据库名;
PS:一旦选中某个数据库,后面的操作都是针对该数据库展开;
2.4 删除数据库:drop database [if not exists] 数据库名;【危险操作】
3.表的操作
需要操作数据库中的表时,需要先使用该数据库:
use 数据库名;
3.1 查看表结构:desc 表名;
3.2创建表:create table table_name(field1 datatype,field2 datatype,field3 datatype);
datatype后面可以使用comment增加字段说明;
3.3 删除表 :drop table [if not exists] 表名;【危险操作】
增删改查【CRUD】
注释:#或者--
1.新增(Create)
insert into 表名 vaules(值,值,值...)【值要和创建表的列类型相同】;
1.1:一次插入一条记录:
insert into 表名 values(值,值,值);
insert into 表名 values(值,值,值);
1.2 一次插入多条记录:insert into 表名 values(值,值,值),(值,值,值),(值,值,值);
【一次插入多条记录效率高于一次插入一条记录,mysql 是一个客户端,服务器结构的程序】
1.3 指定列插入:insert into 表名(指定列,指定列) values(值,值);
2.查询(Retrieve)
2.1 全列查询(所有行和列):select * from 表名;
2.1指定列查询:select 列名,列名 ... from 表名;
2.3 按照表达式查询:select 表达式 from表名;
【查询的是临时结果,sql四则运算中只能针对数字进行】
2.4指定别名:select 表达式 as 别名 from 表名;
【as 可以省略,但是不建议省】
2.5 去重查询:select distinct 列名 ,列名 ...from 表名;
2.6 查询结果排序:select 列名,列名.. from 表名 order by 列名/表达式 desc/asc;
2.7 条件查询:select 列名/ * from 表名 where 条件;
2.8 分页查询:select ... from 表名 limit n offset s;
【n:筛选n条结果,s:从s 开始】
3.修改(Update)
【较危险,修改的是MySQL服务器中的,保存在硬盘上的数据,是永久生效的】
update 表名 set 列 = 值 where 条件/ oeder by / limit;
4.删除(Delete)
delete from 表名 [ where 条件/ oeder by / limit];
【delete from :删除之后表还在,表中的数据没有了】
【drop table : 删除之后,表和表中的数据都没有了】
数据库约束和表的关系
1.数据库约束【都是在创建表中出现的】
1.1 not null:创建表时,指定列不能为空
1.2 unique:唯一约束,指定列为唯一的、不重复的【在插入和修改时会先查询,查看是否有重复的数据】
1.3 default:默认值约束
1.4 primary key :主键约束,指定列为主键,且是非空,不能重复的【not null 和 unique的结合】,一个表中只能由一个主键
eg:....id int not null primary key,
自增主键:auto_increment ,针对整数类型的主键, 插入数据对应字段不给值时,使用最大值+1;
1.5 foreign key :外键约束,用于关联其他表的主键或唯一键
foreign key (字段名) reference 主表(列)
PS :约束别人的是父表,被人约束的是子表;delete或者update父表中的记录时,需要查看子表中是否用过这个记录,若使用了则不能delete或者update;
带有外键约束的插入或者修改,前提是父表中已存在
check:MySQL使用时不报错,但忽略该约束
2.表的设计
一对一、一对多、多对多
CRUD进阶
1.新增(少用)
更复杂的操作,将select查询到的结果数据插入到另一个表中,插入的数据需要匹配
insert into 表名【(列,列)】 select...;
2.查询
2.1聚合查询
2.1.1 聚合函数
count、sum、avg、max、min
2.1.2 group by :对指定列进行分组查询,使用group by 需满足:select指定的字段必须是分组依据字段,其他字段若想出现在select中必须包含在聚合函数里;
select role, max(salary),min(salary),avg(salary) from emp group by rloe;
2.1.3 having
group by 字句进行分组后,需要对分组结果进行条件过滤时,需使用having,不能用where
select role, max(salary),min(salary),avg(salary) from emp group by rloe having avg(salary) < 1500;
2.2 联合查询(低效)
多表查询:对多张表进行笛卡尔积(列数是多表列之和,行数是多表行之积)
2.2.1内连接:select * from 表1,表2 where 连接条件
select * from 表1 join 表2 on 连接条件
2.2.2 外连接:
左外连接: select *from 表1 left join 表2 on 连接条件
右外连接: select * from 表1 right join 表2 on 连接条件
2.3 自连接
在同一张表中连接自身进行查询
2.4 子查询:嵌入在其他SQL语句中的select语句(类似套娃)
2.5 合并查询:union(自动去掉结果中的重复行)/union all(不会去掉重复行) 合并多个结果
MySQL索引事务
1.索引
特殊文件,包含对数据表中所有记录的引用指针。可以快速定位、检索数据,类似于一本书的目录,但是会占用额外的磁盘空间
索引底层的数据结构是B+树,是为数据库量身定做的,原理后续详细讲解
1.1 使用:创建主键约束。外键约束。唯一约束时会自动创建对应列的索引
查看索引:show index from 表名;
创建索引(除主键、唯一约束、外键的字段外,创建普通索引):
create index 索引名 on 表名(字段名);
删除索引:drop index 索引名 on 表名;
(系统自动生成的索引不能删除,只针对手动创建的索引)
2.事务
本质是把多个操作打包成一个操作完成,这个操作么全部成功,要么全部失败(如果是操作中的某一个操作失败了,那么其他成功的操作会恢复成原始状态)
【面试高频】事务的基本特征:
一致性
原子性
持久性
隔离性(并发事务可能会出现的问题:脏数据、不可重复读、幻读(不可重复读的特殊情况))
四种事务的隔离级别:read uncommmitted 、read committed、repeatable read、serializable
JDBC编程
实际开发中,绝大部分都是用代码来操作数据库
不同数据库提供的API接口也不完全相同,所以就有大佬用Java整合了一套操作数据库的API,让所有数据库都能按照一样的方式进行操作使用
数据库驱动包:由于JDBC提供了统一的API,但是每个数据库本身也有自己的API,每个数据库厂商会提供一些代码(数据库驱动包)将JDBC的API转化成对应数据库原生API
MySQL驱动包:mysql-connector-java