回顾Java知识点,面试题汇总Day13:数据库MySQL(持续更新)

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;
相关推荐
W_LuYi1851 小时前
Tauri + Rust + Vue 3 打造极速轻量桌面应用
java·开发语言·vue.js·rust
mN9B2uk171 小时前
在Qt中使用SQLite数据库
数据库·qt·sqlite
小张小张爱学习2 小时前
Java基础面试题
java·开发语言
network_tester2 小时前
SENT/PSI5传感器TSN集成测试:打通传统传感与未来车载网络的“最后一公里”
数据库·网络协议·tcp/ip·自动驾驶·信息与通信·信号处理·tcpdump
宋哥转AI2 小时前
Java后端转AI Agent:技术栈全景图与从ReAct到多Agent协作实战
java·人工智能·agent
Mr.Entropy2 小时前
ecplise 导出maven依赖jar
java·maven·jar
ANnianStriver2 小时前
PetLumina 05 — App 端 UI 效果应用
java·ui·ai编程
不懂的浪漫2 小时前
10|Netty native epoll 与零拷贝:从 Java NIO 再往下看一层![
java·netty·nio
plainGeekDev2 小时前
SharedPreferences → DataStore
android·java·kotlin