Web:前端->后端->数据库
前端:负责用户交互
后端:业务逻辑
数据库:持久化
关系型数据库MySQL
一、数据库管理工具
数据库是安装在电脑上的一种服务 DataBase
Navicate DataGrip
SQL是一种编程语言,用来管理数据库
- DML:数据操作语言,操作数据库中的数据(insert、update、delete)
- DDL:数据定义语言,创建、删除、修改数据库、数据表
- DQL:数据查询语言,对数据库中的数据进行查询
- DCL:数据控制语言,用来控制数据库组件的存取(事务)
学习数据库,从两方面入手:
- 掌握数据库的基本使用
- 设计数据库:根据项目需求,设计表跟表之间的关系
二、数据库的使用
2.1 创建数据库实例
sql
create database test default character set utf8 collate utf8_general_ci;
utf8_general_ci:排序不区分大小写
uft8_bin:排序区分大小写
2.2 删除数据库实例
sql
drop database test;
2.3 创建数据表
sql
user test;
create table 表名(
字段名称 数据类型,
字段名称 数据类型,
int id;
name varchar(20),
.......
);
整数类型:tinyint、smallint、mediumint、int、bigint
浮点类型:float、double
日期类型:date、datetime、timestamp
字符串类型:char 、varchar、text
二进制类型:bit 、binary、varbinary、tinyblob、blob、mediumblob、longblob
2.4 删除数据表
sql
drop table user;
2.5 修改表结构
- 新增一个字段
sql
alter table student add sex varchar(2);
- 修改一个字段
sql
alter table student change sex gender int;
- 删除一个字段
sql
alter table student drop gender;
三、SQL函数
SQL语句的下标从1开始
3.1 数学函数
sql
select abs(-20);//求绝对值 20
select floor(19.9); //求小于参数的最大整数 19
select ceil(19.0001); //求大于参数的最小整数 20
3.2 字符串函数
sql
select insert(s1,index,len,s2);//把从s1的index位置,长度为len的字符串替换为s2
select upper("java");//转大写
select lower("JAVA");//转小写
select left(name,2);//从左边开始数,截取name的前2个字符
select right(name,2);//从右边开始数,截取name的前2个字符
select substring(name,2,3);//从name的第2个字符开始,截取长度为3的字符串
select reverse(name);//反转字符串name
3.3 日期函数
sql
select curdate();//获取当前日期
select curtime();//获取当前时间
select now();//获取当前日期+时间
select datediff('2026-08-28','2016-08-28');//计算两个日期之间相隔的天数
select adddate('2022-09-14',100);//计算当前日期100天之后的日期
select subdate('2022-09-14',100);//计算当前日期100天之前的日期
3.4 聚合函数
sql
select count(*) from student;//统计student表中的数据总条数
select sum(score) from student;//计算score的和
select avg(score) from student;//计算score的平均值
select max(score) from student;//计算score中的最大值
select min(score) from student;//计算score中的最小值
3.5 分组
sql
select count(*),opername from bus_rent group by opername;//根据opername进行分组统计
select count(*),opername from bus_remt gropu by opername order by count(*) asc;//升序排列
select count(*),opername from bus_remt gropu by opername order by count(*) desc;//降序排列
select count(*),opername from bus_remt gropu by opername having count(*) > 1;//筛选条件大于1的数据
四、MySQL运算符
4.1 算术运算符
sql
select score /100 from student;//执行运算符,加减乘除
select score < 100 from student;//比较运算符:大于、小于、等于、不等于
select score < 100 && id > 1 from student where id = 2;//逻辑运算符
select score < 100 || id > 1 from student where id = 2;//逻辑运算符
4.2 特殊运算符
sql
select name is null from student;//判断student表中字段name是否为空
select score between 70 and 200 from student;//判断score是否在70-200之间
4.3 in
判断值是否在某个特定区间内
sql
select * from student where id in (1,2,3);
4.4 模糊查询 like
sql
select * from student where name like %三%
五、表设计
5.1 主键&外键
主键:表中的一个字段,该字段的值是每一行数据的唯一标识
一般会将主键设置为id,int类型,自增,主键的值不能重复
sql
create table user(
id int primary key auto_increament,
name varchar(20)
);
外键:表中的一个字段,与其他表的主键建立约束关系,主键的值约束外键的值
外键是为了保证业务逻辑的准确性,但是效率较低,一般项目开发中不使用外键
sql
create table class(
id int primary key auto_increment,
name varchar(20)
);
sql
create table student(
id int primary key auto_increment,
name varchar(11),
cid int,
foreign key (cid) references class(id)
);
5.2 数据表的三种关系
- 一对一:A表的一条数据只能对应B表的一条数据,B表的一条数据只能对应A表的一条数据
- 一对多:A表的一条数据只能对应B表的一条数据,B表的一条数据可以对应A表的多条数据
学生和班级,一个学生只能数据一个班级,一个班级拥有多个学生
- 多对多:A表的一条数据可以对应B表的多条数据,B表的一条数据可以对应A表的多条数据
学生选课:一个学生可以选择多门课,一门课可以被多个学生选择
六、索引
索引是一种特殊的数据库结构,可以用来快速查询数据表中的特定记录,索引是提高数据库性能的重要方式,所有的字段都可以添加索引。
索引包括:普通索引、唯一性索引、全文索引、单列索引、多列索引、空间索引。
使用索引可以提升查询速度,但是创建和更新索引需要耗费时间,索引需要占用物理空间。
普通索引:不需要任何限制条件的索引,可以在任意数据类型创建。
唯一索引:索引的值必须唯一,比如主键索引。
全文索引:只能创建在char、varchar、text类型的字段上,查询数据量较大的字符串类型字段时,使用全文索引可提高速度。
单列索引:只能对应一个字段的索引。
多列索引:一张表中,多个字段共同组成一个索引。
空间索引:只能建立在空间数据库上(GIS)
索引用来做快速排序,主键自带索引,其他字段可以手动添加索引。
索引的设计原则:
- 出现在where语句中的列
- 索引的值,尽量唯一,效率更高
- 不要添加过多的索引,维护成本很高
添加索引
sql
alter table student add index in_name(name);
删除索引
sql
alter table student drop index in_name;
七、事务
将多条SQL作为一个整体,要么全部执行,要么一条都不执行。
四个特性:
- 原子性:多条SQL是一个整体,不可再分割。
- 一致性:SQL执行前后,数据的值保持一致。
- 隔离性:一个事务的执行不能被其他事务干扰。
- 持久性:一个事务一旦提交,数据的改变是永久性的。
八、视图
数据库中一张虚拟的表,允许不同用户或应用程序以不同的方式查看同一张表中的数据
sql
create view view_common as select id,name,card_id from person;
create view view_all as select * from person;
使用视图
sql
select * from view_common;
select * from view_all;
删除视图
sql
drop view view_common;
drop view view_all;
九、触发器
触发器定义了一些列操作,可以对指定表进行插入、删除、更新操作的同时自动执行这些操作。主要用于同步数据。
- 开发更快,因为触发器存储在数据库中,所以不需要在应用程序中重复编写触发器代码;
- 更容易维护,定义触发器后,访问目标表,会自动调用触发器;
- 如果修改业务,只需要修改触发器即可,不需要修改业务代码。
创建触发器
sql
create trigger t_afterinsert_on_tab1
after insert on tab1
for each row
begin
insert into tab2(tab2_id) values(new.tab1_id);
end;
create trigger t_afterdelete_on_tab1
after delete on tab1
for each row
begin
delect from tab2 where tab2_id = old.tab1_id;
end;
删除触发器
sql
drop trigger t_afterinsert_on_tab1;
drop trigger t_afterdelete_on_tab1;
十、存储过程
存储过程是一组为了完成特定功能的SQL语句的集合,经过编译存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。
优点:
- 模块化程序设计,只需要创建一次存储过程,以后就可以在程序中任意调用
- 执行速度更快,同样的SQL重复执行,使用存储过程更快
- 更换的安全机制,对于没有权限执行存储过程的用户,可以通过授权的方式执行
10.1 课程表中添加课程
创建存储过程
sql
create procedure add_name(in target int)
begin
declare name varchar(11);
if target = 1 then
set name = "MySQL";
else
set name = "Java";
end if;
insert into course(name) values(name);
end;
调用存储过程
sql
call add_name(1);
删除存储过程
sql
drop procedure add_name;
10.2 统计学生表中学生总数
创建存储过程(out)
sql
create procedure count_of_student(out count_num int)
begin
select count(*) from student;
end;
调用存储过程
sql
call count_of_student(@count_num);
删除存储过程
sql
drop procedure count_of_student;