我的面试宝典

AI

Java框架篇

打乱顺序
  1. image-20230522181425060

    解析 : B D

    当发现有多种类型的Bean时,@Primary注解会通知IoC容器优先使用它所标注的Bean进行注入;@Quelifier注解可以与@AutoWired注解组合使用,达到通过类型和名称一起筛选Bean的效果。

  1. image-20230522181543628

    解析 : C

    Spring MVC 拦截器包含三个方法:preHandle()postHandle()afterCompletion()

    preHandle() 方法:该方方法在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;当其返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)。

    postHandle()方法:该方法在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。

    afterCompletion()方法:该方法在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。

  2. image-20230522181829953

    解析 : C

    • method属性代表指定请求的method的类型,
    • value属性指请求的实际地址,params是指定request中一定要有的参数值。
    • required是@RequestParam注解的属性,是指该参数是否为必传项,默认为true,表示请求中一定要传入对应的参数。
  3. image-20230522181938557

    解析 : C

  4. image-20230522182343629

    解析 : A

    拦截器需实现 HandlerInterceptor 接口,而 WebMvcConfigurer 接口是 MVC 配置类要实现的接口

  5. image-20230522182551088

    解析 : C 目标方法允许结束后,若发生异常,会先执行异常通知,再执行后置通知。返回通知仅在无异常时执行

    @Before:Before 通知,用于方法执行前增强

    @AfterReturning :After Returning 通知,方法正常执行返回后增强

    @AfterThrowing:After Throwing 通知,方法执行通过抛出异常退出时

    @After:After (Finally) 通知,方法执行退出时执行增强,不管是正常返回,还是抛出异常退出,相当于try{}catch{}finally{}中的finally的语句。

    @Around:Around 通知,最强大的通知,环绕在目标方法前后执行。它有机会在方法运行之前和之后进行工作,并确定该方法何时、如何以及是否真正开始运行

  1. @EnableAutoConfiguration注解

    @EnableAutoConfiguration注解

    解析 : A B C D

    @EnableAutoConfiguration由@SpringBootApplication引入,它的主要功能是启动Spring应用程序上下文时进行自动配置,它会尝试猜测并配置项目可能需要的Bean。

    @Import是@EnableAutoConfiguration注解的组成部分,也是自动配置功能的核心实现者。

    @SpringBootApplication
        @SpringBootConfiguration
        @EnableAutoConfiguration
            @AutoConfigurationPackage
                @Import(AutoConfigurationPackages.Registrar.class)
            @Import(AutoConfigurationImportSelector.class)
        @ComponentScan

    SpringBoot的核心注解 : @SpringBootApplication注解包含三个注解

    • @SpringBootConfiguration

    • @EnableAutoConfiguration

      实现自动配置的关键 , 此注解又包含两个关键注解

      • @AutoConfigurationPackage

        主启动类所在包以及子包里面的所有组件扫描并加载到spring的容器中,所以我们开发过程中Controller层、Service层、Dao层的代码总是和主启动类在同一级目录或者次级目录之下。

      • @Import(AutoConfigurationImportSelector.class)

        来作自动配置

        至于哪些才是需要自动配置的类呢,AutoConfigurationImportSelector类里面有一个方法selectImports(),该方法通过层层调用,最终会调用一个方法loadSpringFactories(),此方加载所有的spring.factories文件,而spring.factories文件中的数据以(key-value)的形式存储,key就是EnableAutoConfiguration,value自然就是那些需要自动配置的类的全类名了,解析这个文件然后返回需要做自动配置的类的全类名

    • @ComponentScan
  2. Spring常用容器

    image-20230522191211501

    解析 : A C

    ​ A,B考察BeanFactory与FactoryBean。BeanFactory是Spring容器的接口,FactoryBean是Spring中用于实现“工厂Bean”的接口。

    ​ C 是ApplicationContext,是BeanFactory的子接口。

    ​ D应该是干扰选项,暂时没有找到相关解释。 另外,BeacFactory和ApplicationContext其实是有继承关系的两个接口。个人觉得题目所说的,“属于Spring容器的类”,存在问题。

  3. Spring AOP

    image-20230522220254137

    解析 : D 在运行时织入 , 需要为目标生成代理对象

MySQL数据库篇

MySQL技能树

MySQLl触发器 : http://t.csdn.cn/2UGaQ

MySQL视图 : http://t.csdn.cn/0qUVa

MySQL存储过程 : http://t.csdn.cn/B062N

一 . 基础篇

相关概念 、三大范式 、基本操作 、约束 、事务 、索引

在MySQL中,"@@"和"@"符号用于引用系统和用户定义的变量,其区别在于:

  • @@var_name:引用系统预定义的变量,如@@version、@@global.tx_isolation、@@autocommit等。这些变量的值是数据库服务器针对会话级别或全局级别的设置。
  • @var_name:引用自定义会话级别变量,在当前会话中定义该变量,并将值赋给变量。可以使用SET 或 SELECT语句来声明和赋值变量,例如:SET @my_var := 10; SELECT @my_var;。

1 . SQL分类

1. 1 数据定义语言(DDL) Definition

用来操作数据库、表、列等; 常用语句:createalterdrop

1. 2 数据操作语言(DML) Manipulation

用来操作数据库中表里的数据;常用语句:insertupdate delete

insert
-- 用法
insert into 'student' ('name') values ('At');
insert into 'student' ('name','pwd') values ('At','123');

-- 省略字段(值必须一一对应) , isdelete等公共字段可以不填
INSERT INTO `student` values ('xxx','xxx','xxx','xxx','xxx','xxx'); 

-- 语法
INSERT INTO 表名([字段1,字段2..])VALUES('值1','值2'..),[('值1','值2'..)..];    
update
-- 语法
UPDATE 表名 SET 字段1=值1,[字段2=值2...] WHERE 条件[];


-- 修改名字,指定条件
UPDATE `student` SET `name`='zsr204' WHERE id=1;

-- 不指定条件的情况,会改动所有表
UPDATE `student` SET `name`='zsr204';

-- 修改多个属性
UPDATE `student` SET `name`='zsr',`address`='湖北' WHERE id=1;

-- 通过多个条件定位数据
UPDATE `student` SET `name`='zsr204' WHERE `name`='zsr' AND `pwd`='200024';
delete
-- 删除数据(避免这样写,会全部删除)
DELETE FROM `student`;

-- 删除指定数据
DELETE FROM `student` WHERE id=1;

关于DELETE删除的问题,重启数据库现象:

  • INNODB 自增列会从1开始(存在内存当中,断电即失)
  • MYISAM 继续从上一个子增量开始(存在内存当中,不会丢失)

truncate :完全清空一个数据库表,表的结构和索引约束不会变! 不支持数据回滚

1. 3 数据库控制语言(DCL) Control

用来操作访问权限和安全级别; 常用语句:grantdeny

1. 4 数据查询语言(DQL) Query

用来查询数据 常用语句:select

-- 基本数据
-- 创建student表
CREATE TABLE student (
    sid CHAR(6),
    sname VARCHAR(50),
    age INT,
    gender VARCHAR(50) DEFAULT 'male'
);

-- 向student表插入数据
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');
-- 查询所有
select * from student;

-- 查询指定字段
select sid,sname from student;

-- 数据过滤
select distinct gender from student;

-- 查询出来的所有age全部加10
select sname,age+10 from student;
distinct

作用 : 从查询结果中过滤重复数据

在select查询语句中distinct关键字只能用在第一个所查列名之前。

查询中的算术运算符

在select查询语句中还可以使用加减乘除运算符。

2 . 三大范式

第一范式

每列的值具有原子性,不可再分割

第二范式

在第一范式的基础上建立 , 如果表是单主键,那么主键以外的列必须完全依赖于主键;如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分。

第三范式

也是在第二范式的基础撒花姑娘建立的 , 意思是 : 非主键列之间不能相关依赖。

3 . 基本操作

完整的流程
3 .1 库的操作
0-- 如果存在先删除
drop database if exists 数据库名称;

-- 创建数据库
create database 数据库名称;

-- 创建数据库后查看该数据库基本信息MySQL命令
show create database 数据库名称;

-- 删除命令
drop database 数据库名称;

-- 展示所有数据
show databases;

-- 更改字符集
alter database 数据库名称 character set gbk;

-- 切换数据库
use 数据库名称;

-- 查看当前使用的数据库
select database();
3 . 2 表的操作
创建数据表

一个完整的用户表

-- 用户表
create table if not exists user
(
    id           bigint auto_increment comment 'id' primary key,
    userAccount  varchar(256)                           not null comment '账号',
    userPassword varchar(512)                           not null comment '密码',
    userName     varchar(256)                           null comment '用户昵称',
    userAvatar   varchar(1024)                          null comment '用户头像',
    userProfile  varchar(512)                           null comment '用户简介',
    userRole     varchar(256) default 'user'            not null comment '用户角色:user/admin/ban',
    createTime   datetime     default CURRENT_TIMESTAMP not null comment '创建时间',
    updateTime   datetime     default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
    isDelete     tinyint      default 0                 not null comment '是否删除'
) comment '用户' collate = utf8mb4_unicode_ci;
展示库中所有的表和查看数据表
-- 查看所有表
show tables;

-- 查询基本信息
show create table user;

-- 查看字段信息
desc user;
修改数据表

修改表名、修改字段名、修改字段 数据类型…等等

-- 修改表名 (下文还是user)
alter table user rename to use;

-- 修改字段 , 修改userName 为Uername (下文还是userName)
alter table user change userName username varchar(10);

-- 修改字段名
alter table user modify userName int;

-- 增加字段 (新增otherID)
alter table user add otherID int;

-- 删除字段
alter table user drop otherID;
删除数据表
drop table 表名;

4 . 约束

约束分为 : 主键约束 、非空约束、默认值约束、外键约束、唯一性约束
4 . 1 主键约束

用于唯一的标识表中的每一行。被标识为主键的数据在表中是唯一的且其值不能为空

-- 方式一
create table student(
    id int primary key,
    name varchar(20)
);

-- 方式二
create table student(
    id int,
    name varchar(20),
    primary key(id)
);
4 . 2 非空约束

即 NOT NULL指的是字段的值不能为空

create table student02(
    id int
    name varchar(20) not null
);
4 . 2 默认值约束

即 default 用于给数据表中的字段指定默认值

create table student(
    id int,
    name varchar(20),
    gender varchar(10) default 'male'
);
4 . 4 唯一性约束

即UNIQUE用于保证数据表中字段的唯一性 , 可以设置多个

create table student(
    id int,
    name varchar(20) unique
);
4 . 5 外键约束

常用于多张表之间的约束 , 主从关系

-- 在创建数据表时语法如下:
constraint 外键名 foreign key (从表外键字段) references 主表 (主键字段)

-- 将创建数据表创号后语法如下:
alter table 从表名 add constraint 外键名 foreign key (从表外键字段) references 主表 (主键字段);

示例 :

-- 创建student表
create table student(
    id int primary key,
    name varchar(20)
);

-- 创建班级表
create table class(
    classid int primary key,
    studentid int
);

-- 将班级表中的studentid设置为外键 叫fk_class_studentid
alter table class add constraint fk_class_studentid foreign key(studentid) references student(id);
数据一致性

建立外键是为了保证数据的完整和统一性 , 如果主表中的数据被删除或修改从表中对应的数据 , 从表对应的数据也应该被删除

删除外键
-- 以上述为例
alter table class drop foreign key fk_class_studentid;

5 . 事务

四个特性
  • 原子性(Atomicity):指事务是一个不可分割的最小工作单位,事务中的操作只有都发生和都不发生两种情况
  • 一致性(Consistency):事务必须使数据库从一个一致状态变换到另外一个一致状态,举一个栗子,李二给王五转账50元,其事务就是让李二账户上减去50元,王五账户上加上50元;一致性是指其他事务看到的情况是要么李二还没有给王五转账的状态,要么王五已经成功接收到李二的50元转账。而对于李二少了50元,王五还没加上50元这个中间状态是不可见的。
  • 隔离性(Isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(Durability):一个事务一旦提交成功,它对数据库中数据的改变将是永久性的,接下来的其他操作或故障不应对其有任何影响。
事务分类

事务分为隐式事务和显式事务两种。

DML语句(insert、update、delete)就是隐式事务。

  • 显示事务:该事务具有明显的开启和结束标记;也是本文重点要讲的东西。使用显式事务的前提是你得先把自动提交事务的功能给禁用。禁用自动提交功能就是设置autocommit变量值为0(0:禁用 1:开启)
  • 隐式事务:该事务没有明显的开启和结束标记,它们都具有自动提交事务的功能;不妨思考一下,update语句修改数据时,是不是对表中数据进行改变了,它的本质其实就相当于一个事务。

二 . 进阶篇

此篇包含聚合函数及其他函数的运用 、条件查询的各种关键字 、关联查询 、子查询 、连接查询

2. 1 函数

聚合函数
  • count()

    统计表中数据的行数或者统计指定列其值不为NULL的数据个数

    select count(*) from student;
  • max()

    计算指定列的最大值,如果指定列是字符串类型则使用字符串排序运算

    select max(age) from student;
  • min()

    计算指定列的最小值,如果指定列是字符串类型则使用字符串排序运算

    select sname,min(age) from student;
  • sum()

    计算指定列的数值和,如果指定列类型不是数值类型则计算结果为0

    select sum(age) from student;
  • avg()

    计算指定列的平均值,如果指定列类型不是数值类型则计算结果为

    select avg(age) from student;
其他函数
-- 时间函数
SELECT NOW();
SELECT DAY (NOW());
SELECT DATE (NOW());
SELECT TIME (NOW());
SELECT YEAR (NOW());
SELECT MONTH (NOW());
SELECT CURRENT_DATE();
SELECT CURRENT_TIME();
SELECT CURRENT_TIMESTAMP();
SELECT ADDTIME('14:23:12','01:02:01');
SELECT DATE_ADD(NOW(),INTERVAL 1 DAY);
SELECT DATE_ADD(NOW(),INTERVAL 1 MONTH);
SELECT DATE_SUB(NOW(),INTERVAL 1 DAY);
SELECT DATE_SUB(NOW(),INTERVAL 1 MONTH);
SELECT DATEDIFF('2019-07-22','2019-05-05');

-- 字符串函数
    -- 连接函数
SELECT CONCAT ()
    -- 用于在字符串中查找指定字符串或子字符串的位置(索引)
SELECT INSTR ();
    -- 统计长度
SELECT LENGTH();

-- 数学函数
    -- 绝对值
SELECT ABS(-136);
    -- 向下取整
SELECT FLOOR(3.14);
    -- 向上取整
SELECT CEILING(3.14);

2. 2 条件查询

关系运算符
关系运算符说明
=等于
<>不等于
!=不等于
<小于
<=小于等于
>大于
>=大于等于
in关键字查询

in关键字用于判断某个字段的值是否在指定集合中。如果字段的值恰好在指定的集合中,则将字段所在的记录将査询出来。

-- 查询这俩
select * from student where sid in ('S_1002','S_1003');

-- 查询除过s_1001以外的
select * from student where sid not in ('S_1001');
between and关键字查询

between and 用于判断某个字段的值是否在指定的范围之内。如果字段的值在指定范围内,则将所在的记录将查询出来

-- 查询15到18的学生
select * from student where age between 15 and 18;

-- 查询不在这个区间的
select * from student where age not between 15 and 18;
空值查询

在MySQL中,使用 IS NULL关键字判断字段的值是否为空值。请注意:空值NULL不同于0,也不同于空字符串

-- 查询不为空
select * from student where sname is not null;
and关键字查询

在MySQL中可使用AND关键字可以连接两个或者多个查询条件。

select * from student where age>15 and gender='male';
or 关键字查询

在使用SELECT语句查询数据时可使用OR关键字连接多个査询条件。在使用OR关键字时,只要记录满足其中任意一个条件就会被查询出来

select * from student where age>15 or gender='male';
like关键字查询

MySQL中可使用LIKE关键字可以判断两个字符串是否相匹配

-- 查询sname中与wang匹配的学生信息
select * from student where sname like 'wang';
含有%通配的字符串
-- 查询学生姓名以li开始的
select * from student where sname like 'li%';

-- 查询学生姓名以g结尾的
select * from student where sname like '%g';

-- 查询学生姓名包含s的
select * from student where sname like '%s%';
含有__通配的字符串_
-- 查询学生姓名以zx开头且长度为4的
select * from student where sname like 'zx__';

-- 查询学生姓名以g结尾且长度为4的
select * from student where sname like '___g';
limit限制查询

当执行查询数据时可能会返回很多条记录,而用户需要的数据可能只是其中的一条或者几条

select * from student order by age asc limit 3;
group by分组查询

俗地理解为:通过GROUP BY将原来的表拆分成了几张小表。

order by 排序查询

2. 3 关联查询

基本数据

DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS class;

-- 创建班级表
CREATE TABLE class(
    cid int(4) NOT NULL PRIMARY KEY,
    cname varchar(30) 
);

-- 创建学生表
CREATE TABLE student(
    sid int(8) NOT NULL PRIMARY KEY,
    sname varchar(30),
    classid int(8) NOT NULL
);

-- 为学生表添加外键约束
ALTER TABLE student ADD CONSTRAINT fk_student_classid FOREIGN KEY(classid) REFERENCES class(cid);
-- 向班级表插入数据
INSERT INTO class(cid,cname)VALUES(1,'Java');
INSERT INTO class(cid,cname)VALUES(2,'Python');

-- 向学生表插入数据
INSERT INTO student(sid,sname,classid)VALUES(1,'tome',1);
INSERT INTO student(sid,sname,classid)VALUES(2,'lucy',1);
INSERT INTO student(sid,sname,classid)VALUES(3,'lili',2);
INSERT INTO student(sid,sname,classid)VALUES(4,'domi',2);

查询

-- 查询Java班的所有学生
select * from student where classid=(select cid from class where cname='Java');

2. 4 连接查询

举例

student表

学号姓名性别
001Alice
002Bob
003Charlie
004David
005Eve

course表

课程号课程名学分
001数据结构4
002操作系统5
003计算机网络3
004编译原理4
005数据库系统原理5

SC 表

学号课程号成绩
00100190
00100285
00100392
00200288
00200389
00200495
00300180
00300387
00300596
00400185
00400282
00400389
00500190
00500288
00500393

出几道子查询不用join的题目(分组并having过滤啥的各种函数),并给出答案

问题 :

1> 查询学生姓名、课程名和成绩

SELECT student.姓名, course.课程名, sc.成绩
    FROM student
    JOIN sc ON student.学号 = sc.学号
    JOIN course ON course.课程号 = sc.课程号;
    

2> 查询每个学生的平均成绩,并按照平均成绩从高到低排序。

SELECT s.学号, s.姓名, AVG(sc.成绩) AS 平均成绩
    FROM 学生 s 
    INNER JOIN SC sc ON s.学号 = sc.学号
    GROUP BY s.学号, s.姓名
    ORDER BY 平均成绩 DESC;

3> 查询每门课程的平均成绩,并按照平均成绩从高到低排序。

SELECT c.课程号, c.课程名, AVG(sc.成绩) AS 平均成绩
    FROM course c 
    INNER JOIN SC sc ON c.课程号 = sc.课程号
    GROUP BY c.课程号, c.课程名
    ORDER BY 平均成绩 DESC;

4> 查询选修了数据结构课程的男生中,成绩最高的学生的学号、姓名和成绩。

SELECT s.学号, s.姓名, MAX(sc.成绩) AS 成绩
    FROM 学生 s 
    INNER JOIN SC sc ON s.学号 = sc.学号
    WHERE s.性别 = '男' AND sc.课程号 = '001'
    GROUP BY s.学号, s.姓名
    ORDER BY 成绩 DESC
    LIMIT 1;
内连接查询

内连接(Inner Join)又称简单连接或自然连接,是一种非常常见的连接查询。内连接使用比较运算符对两个表中的数据进行比较并列出与连接条件匹配的数据行,组合成新的 记录。也就是说在内连接查询中只有满足条件的记录才能出现在查询结果中。

select student.name , sc.grade
    from sc
    inner join student on sc.sno = student.sno;

-- 其他举例
-- 查询学员所属的年级(学号,学生姓名,年级名称)
SELECT `StudentNo`,`StudentName`,`GradeName`
FROM student s
INNER JOIN grade g
ON s.GradeID=g.GradeID;

-- 查询科目所属的年级
SELECT `SubjectName`,`GradeName`
FROM `subject` s
INNER JOIN `grade` g
ON s.GradeID=g.GradeID;

-- 查询列参加程序设计考试的同学信息(学号,姓名,科目名,分数)
SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult`
FROM student s
INNER JOIN result r
on s.StudentNo=r.StudentNo
INNER JOIN `subject` sub
on r.SubjectNo=sub.SubjectNo
where SubjectName='课程设计';
外连接查询

在使用内连接查询时我们发现:返回的结果只包含符合查询条件和连接条件的数据。但是,有时还需要在返回查询结果中不仅包含符合条件的数据,而且还包括左表、右表或两个表中的所有数据,此时我们就需要使用外连接查询。

左外连接查询
右外连接查询

2. 5 子查询

举例

1> 查询每个学生的平均分

SELECT s.学号, s.姓名, AVG(sc.成绩) AS 平均分
FROM student AS s, sc
WHERE s.学号 = sc.学号
GROUP BY s.学号, s.姓名;

2> 查询成绩优秀的前三名学生

SELECT s.学号, s.姓名, SUM(sc.成绩) AS 总成绩
FROM student AS s, sc
WHERE s.学号 = sc.学号
GROUP BY s.学号, s.姓名
ORDER BY 总成绩 DESC
LIMIT 3;

3>查询选修了所有课程的学生

SELECT s.学号, s.姓名
FROM student AS s
WHERE NOT EXISTS(
    SELECT c.课程号
    FROM course AS c
    WHERE NOT EXISTS(
        SELECT sc.学号
        FROM sc
        WHERE sc.课程号 = c.课程号 AND sc.学号 = s.学号
    )
)

查询分数最高的学生及其所修的课程和成绩

-- join on
SELECT student.姓名, course.课程名, sc.成绩
FROM student
JOIN sc ON student.学号 = sc.学号
JOIN course ON course.课程号 = sc.课程号
WHERE sc.成绩 = (
    SELECT MAX(成绩) FROM sc WHERE 学号 = student.学号
);

-- and
SELECT S.姓名, C.课程名, SC.成绩
FROM student S, course C, sc SC
WHERE S.学号 = SC.学号
AND C.课程号 = SC.课程号
AND SC.成绩 = (
  SELECT MAX(成绩)
  FROM sc
  WHERE 学号 = S.学号
);
带比较运算符

比较运算符前面我们提到过得,就是>、<、=、>=、<=、!=等

select * from class where cid=(select classid from student where sname='张三');
select * from class where cid>(select classid from student where sname='张三');
带exists关键字

EXISTS关键字后面的参数可以是任意一个子查询, 它不产生任何数据只返回TRUE或FALSE。当返回值为TRUE时外层查询才会 执行

select * from class where exists (select * from student where sname='王五');
带any关键字

ANY关键字表示满足其中任意一个条件就返回一个结果作为外层查询条件。

select * from class where cid > any (select classid from student);
带all关键字

ALL关键字与ANY有点类似,只不过带ALL关键字的子査询返回的结果需同时满足所有内层査询条件。

select * from class where cid > all (select classid from student);

重要(从关键字分析):

查询语句的书写顺序和执行顺序
select ==> from ==> where ==> group by ==> having ==> order by ==> limit

查询语句的执行顺序
from ==> where ==> group by ==> having ==> select ==> order by ==> limit

2 . 6 视图

CSDN

视图不是表,不保存数据,只是一张虚拟表;

示例:

​ 数据库视图是在关系数据库中定义的虚拟表格。它是一个基于一个或多个数据库表的查询结果集,并且与查询结果集相关联的视图是动态的。与实际的数据库表格不同,视图并不具有自己的数据,而是从一个或多个实际数据库表格中提取出数据,并根据某种规则呈现出来。视图的作用在于提供一种通过表的连结机制而过滤的数据表视图机制。

一般情况下,视图只存储视图定义,而不存储数据。在访问视图时,查询解析器会使用视图定义来生成查询语句,并将其发送给关系数据库 引擎执行。因此,使用视图可以在不修改基础表结构的情况下,实现数据的不同组合、排序、分组和筛选等处理方式。同时,视图还可以提供一个对基础表的安全性和完整性进行控制的手段,以保护敏感数据的访问。

-- 以下是一个简单的视图示例,假设我们有一个名为“students”的表格,其中包含学生的成绩和基本信息,我们可以通过创建一个“优秀学生”的视图来筛选出所有分数大于等于80分(即“优秀”的学生)的学生信息:

CREATE VIEW excellent_students AS SELECT name, score FROM students WHERE score >= 80;
-- 这样一来,我们就可以通过访问excellent_students视图来查询包含所有“优秀”的学生信息了:

SELECT * FROM excellent_students;

总之,数据库视图是一种虚拟的、动态的表格,可以根据自定义的规则从一个或多个实际数据库表格中提取数据,并提供一种安全、灵活、高效的操作方式。它在关系数据库实现中扮演着重要的角色。

相关的MySQL指令
操作指令代码
创建视图CREATE VIEW 视图名(列1,列2...) AS SELECT (列1,列2...) FROM ...;
使用视图当成表使用
修改视图CREATE OR REPLACE VIEW 视图名 AS SELECT [...] FROM [...];
查看数据库已有视图SHOW TABLES [like...];(可以使用模糊查找)
查看视图详情DESC 视图名或者SHOW FIELDS FROM 视图名
视图条件限制[WITH CHECK OPTION]

创建视图

创建视图和查询相比,增加了前面的create view 视图名 as

create view 视图名(列1,列2...)
 as select (列1,列2...)
 from ...;
查询视图

正常当一张表来使用就行

select * from 视图名称 [可跟条件];
修改视图
create or replace view 视图名 as select [...] from [...];
查看视图
show tables;

-- 查看视图详情 , 俩都行
desc 视图名;
show fields from 视图名;

2 . 7 存储过程

就是数据库 SQL 语言层面的代码封装与重用。

存储过程:(PROCEDURE)是事先经过编译并存储在数据库中的一段SQL语句的集合。调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是很有好处的。

存储过程就类似于Java中的方法,需要先定义,使用时需要调用。存储过程可以定义参数,参数分为IN、OUT、INOUT类型三种类型。

  • in代表输入参数(默认情况下为in参数),表示该参数的值必须由调用程序指定。
  • out代表输出参数,表示该参数的值经存储过程计算后,将out参数的计算结果返回给调用程序。
  • inout代表即时输入参数,又是输出参数,表示该参数的值即可有调用程序制定,又可以将inout参数的计算结果返回给调用程序。

格式

-- 调用
CALL xxx();
-- 定义
DELIMITER //

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    PROCEDURE 数据库名.存储过程名([in变量名 类型,out 参数 2,...])
    /*LANGUAGE SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    | COMMENT 'string'*/
    BEGIN
        [DECLARE 变量名 类型 [DEFAULT 值];]
        存储过程的语句块;
    END//

-- DELIMITER ;

存储过程中的语句必须包含在BEGIN和END之间。

DECLARE中用来声明变量,变量默认赋值使用的DEFAULT,语句块中改变变量值,使用SET 变量=值;

示例

查询student表中的sex为男的有多少个人。

DELIMITER //

CREATE
    PROCEDURE `demo`.`demo2`(IN s_sex CHAR(1),OUT s_count INT)
    -- 存储过程体
    BEGIN
        -- 把SQL中查询的结果通过INTO赋给变量
        SELECT COUNT(*) INTO s_count FROM student WHERE sex= s_sex;
        SELECT s_count;
        
    END//
-- DELIMITER ;

-- @s_count表示测试出输出的参数
CALL demo2 ('男',@s_count);
管理
显示存储过程
SHOW PROCEDURE STATUS
显示存储过程的源码
SHOW CREATE PROCEDURE 存储过程名;
删除存储过程
DROP PROCEDURE 存储过程名;
Mybatis与存储过程
<parameterMap type="savemap" id=“usermap"> 
    <parameter property="name" jdbcType="VARCHAR" mode="IN"/>
    <parameter property="sex" jdbcType="CHAR" mode="IN"/>
    <parameter property="result" jdbcType="VARCHAR" mode="OUT"/>
</parameterMap>

<insert id="saveUserDemo" parameterMap="savemap" statementType="CALLABLE"> 
{call saveuser(?, ?, ?)} 
</insert >
HashMap<String, Object> map = new HashMap<String, Object>(); 
    map.put("name", "Jim"); 
    map.put("sex","男");
    //调用
    userDao.saveUserDemo(map); 
    map.get(“result”);//获得输出参数

2 . 8 触发器

触发器是一种特殊的存储过程,它在试图更改触发器所保护的数据时自动执行。
  • 在MySQL中,只有执行insert,delete,update操作时才能触发触发器的执行;
  • 触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作;
  • 使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发;
创建触发器
1 . 创建只有一个执行语句的触发器
create trigger 触发器名 before|after 事件 on 表名 for each row 语句;

eg: 当给user表中插入一条数据时 , user_logs添加日志

create trigger trigger_test1 after insert on user 
for each row 
    insert into user_logs values(NULL,now(),'new');
2 . 创建多个执行语句的触发器
create trigger 触发器名 before|after 事件 on 表名 foreach row
begin
    语句
end;

三 . 应用篇

JDBC 、Mybatis 、Mybatis-Plus

Java篇

Linux篇

理论篇

1 . Linux的基本使用

1 . 常用命令

命令格式 :

command [-options] [parameter]
  • command :命令名,相应功能的英文单词或单词的缩写
  • [-options] :选项,可用来对命令进行控制,也可以省略
  • parameter :传给命令的参数,可以是 零个、一个 或者 多个

帮助命令

  • -help 显示对应命令的帮助信息
  • -man 查阅对应命令的使用手册

    操作键功能
    空格键显示手册页的下一屏
    回车键一次滚动手册页的一行
    b回滚一屏
    f前滚一屏
    q退出

常用命令

序号命令英文作用
1lslist
2pwd
3cd
4touch
5mkdir
6rm
7clear

2 . 其他命令

3 . 文件和目录的常用命令

4 . 系统信息相关命令

5 . 用户权限相关命令

6 . 远程管理常用命令

2 . 实战篇

windows平台下 , 做一个类似cmd的网站

Git篇

最后修改:2023 年 05 月 30 日
如果觉得我的文章对你有用,请随意赞赏