先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
– 1.删除单条
delete from score where name=‘刘备’;
– 2.全部删除 delete from score
– 3.清空表 truncate [table] 名称
**扩充:**
`delete vs truncate`
● truncate 删除快,但是数据不能被恢复;delete 删除慢,但数据能被恢复。
● delete 删除可以加条件,⽽ truncate 不能加条件。
`delete 和 drop 的区别`
● delete:只删除表中的数据。
● drop:删除表数据+表结构。
**drop属于DDL,delete属于DML,而trucate属于DDL。**
`truvate执行原理:`
① 拷贝一份原表结构进行创建
② 将原表进性删除和数据清除
`delete执行原理`
● 在InnoDB数据库引擎下,delete并不是真正的把数据删除掉了,而是给数据打了一个删除标签,标时当前的数据已经被删除了。**数据存储大小不会改变。**
● delete的数据是可以被恢复的,但是truncate、drop删除的数据是不能被恢复的。
● 执行效率:drop > truncate > delete
数据量越大,上面的执行效率差距也越大。
因为drop直接就删除掉表这个整体的结构就好了,truncate需要先把原表的结构拷贝一份,再删除原表结构,而delete是要去给数据打上删除标签的,他不能够快速直截了当的清除。
[]( )表约束和表设计—2
============================================================================
[]( )1\. 什么是表约束
-----------------------------------------------------------------------------
**表约束是在创建表的时候,设计⼀些表的约束条件,⽤来保证数据的合法性和数据的正确性。**
例如⼀个账号只能绑定⼀个⼿机号,那么⼿机号就不能重复,不能被多个账号绑定使⽤,所以它应该设 置唯⼀约束。⽽主键是⽤来标识数据的,因此它不能为 NULL,也不能为空,所以他需要设置⾮空约束 或(主键约束,主键约束也不能为 NULL)。
[]( )2\. 为什么需要表约束?
--------------------------------------------------------------------------------
就像法律是⽤来规范⼈们的正确行为的⼀样,**表约束也是为了规范程序员正确使用表的**,但表约束是预先设置的,设置之后就对所有插⼊和修改立即生效,比如非空约束设置好之后,如果添加和修改为 NULL 值就会报错,这点是和法律有细微的不同。
比如下表,如果对⽼师名称没有约束的话,那么数据 5 的这条⼯资就不能正常发放了,因为压根就不知道要发给谁:![](https://img-blog.csdnimg.cn/09c0b2be84a24518a5aec25a38278544.png)
总之**如果没有表约束,会导致数据不正确,从而导致程序或现实中的业务⽆法推进和执行**。
[]( )3\. 常见约束
---------------------------------------------------------------------------
![在这里插入图片描述](https://img-blog.csdnimg.cn/b8f4f6130db74488a007da82673eb1b6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
**表约束是需要在创建表的时候就给他设计的**
### []( )非空约束 not null
* 创建非空约束
crete table table_name (
id int not null,
sn int,
name varchar(20),
);
![在这里插入图片描述](https://img-blog.csdnimg.cn/d7d97fbdf47c4cb3ab1c3f281ece1415.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
添加了⾮空约束之后,设置的字段就不能为空了。
* 查看非空约束
![在这里插入图片描述](https://img-blog.csdnimg.cn/cea562f2f3c641dc82ae7ea748824564.png)
* 验证非空约束
![在这里插入图片描述](https://img-blog.csdnimg.cn/c940a7dfa83a401ca730a5a0773a154f.png)
### []( )唯一约束 unique
* 创建唯一约束
create table student (
id int not null,
sn int unique,
name varchar(20),
);
![在这里插入图片描述](https://img-blog.csdnimg.cn/e16893eaebae4ea48143d6bb7bbd7e45.png)
* 查看唯一约束
使⽤ `show keys from table_name` 可以查看索引详情
![在这里插入图片描述](https://img-blog.csdnimg.cn/d7468a21938649948fafe93cb9bbe3ec.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
* 验证唯一约束
![在这里插入图片描述](https://img-blog.csdnimg.cn/6bdcec1c785a4d40a3641da809f04fc8.png)
**问题:** 给某个字段创建了唯一约束,没有指定非空约束
① 这个字段是否可以插入null值?
② 这个字段是否可以插入空值?
_**可以插入null,也是可以重复插入null的。对于null来说,并不是一个“值”,它相当于“为空”,就是“没有”的意思。**
可以插入空值,但是不可以重复插入空值,**空**和__null_\*在查询上的区别就是“空”是可以被查询出来的,用它作为条件去查询到结果,而null是“没有”的意思,是查询不到的。\*
### []( )主键约束 primary key
主键是可以⽤来表示⼀张表中某条数据的代表凭证,例如对于“⼈”这张表来说,唯⼀的身份证就可以作 为主键来代表这个⼈,“姓名”不⾏,因为姓名有可能会重复。
主键的特征:
1. **主键可以由多个字段或单个字段组成。**
2. **主键不能为空且且唯一。**
3. **一个表中只能有⼀个主键。**
指定id列为主键:
* 独立主键
create table table_name(
id int not null PRIMARY KEY,
sn int unique,
name varchar(20) default’unkown’,
qq_mail varchar(20)
);
![在这里插入图片描述](https://img-blog.csdnimg.cn/b27b1f2518134257add4b2ac550029e0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
* 联合主键
create table table_name(
id int,
name varchar(250),
primary key(id,name)
);
![在这里插入图片描述](https://img-blog.csdnimg.cn/3513f2b6a1bd4d7592a86d72b1c9fca2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
注意事项,设置主键字段不能为 null,否则会报错。
**面试题:主键约束 VS 唯⼀约束**
① 一个表中主键约束只能有一个,而唯一约束可以有多个。
② 唯一约束可以插入一个或多个null,而主键约束不允许插入null。
### []( )外键约束 foreign key
foreign key (字段名) references 主表(列)
案例:
创建班级表classes,id为主键:
– 创建班级表,有使⽤MySQL关键字作为字段时,需要使⽤``来标识
create table classes (
id int primary key,
name varchar(250),
desc
text
);
创建学⽣表student,⼀个学⽣对应⼀个班级,⼀个班级对应多个学⽣。使⽤id为主键,classes\_id 为外键,关联班级表id
– 重新设置学⽣表结构
drop table if exists student;
create table student (
id int primary key auto_increment,
sn int unique,
name varchar(250) default’unkown’,
classes_id int,
foreign key(classes_id) references classes(id)
);
### []( )检查约束 check
检查约束是保证列中的值符合指定的条件,⽐如性别只能插⼊“男”或者“⼥”。
检查约束 check 使⽤语法:
check(<检查约束>)
create table test_user (
id int,
name varchar(20),
sex varchar(1),
check (sex =‘男’ or sex=‘⼥’)
);
### []( )自增 auto\_increment
create table test_user(
id int primary key auto_increment,
username varchar(250)
);
![在这里插入图片描述](https://img-blog.csdnimg.cn/27fc4d9b694543d0844bf52680963cde.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
* **注意事项:**
① ⼀个表中只能有⼀个⾃增列。
② 2.⾃增列的字段类型只能为整数类型(TINYINT、SMALLINT、INT、BIGINT 等)。
③ auto\_increment 必须配合 key ⼀起使⽤,这个 key 可以是 primary key,foreign key,如果没有 key 就会报错
④ 唯⼀列可以为自增列
⑤ 外键也可以为自增列
* **查看自增值**
show create table table_name;
show create table table_name\G;
![在这里插入图片描述](https://img-blog.csdnimg.cn/c44f040465364c19979e0bbc90328dba.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
* **手动设置自增值**
![在这里插入图片描述](https://img-blog.csdnimg.cn/e891d87955b04423b6c574810a28bb9d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
* **修改自增值**
注意事项:auto\_increment 的值只能设置⽐⽬前存储的最⼤值⼤,否则设置不会⽣效。
alter table table_name auto_increment=n;
* **delete 和 truncate 重置自增验证**
delete 不重置⾃增:
truncate 重置⾃增:
![在这里插入图片描述](https://img-blog.csdnimg.cn/6d369ae4d81a4d12b097e926ff494d6f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_19,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/1326db749f9f436bb65c9a1e7e219ea7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_18,color_FFFFFF,t_70,g_se,x_16)
### []( )默认约束 default
默认约束是给没有给列赋值时的默认值,⽤法如下:
create table test_user(
id int primary key auto_increment,
sex varchar(1) default ‘男’
);
![在这里插入图片描述](https://img-blog.csdnimg.cn/f849a4d2695747b393784d542a989bfc.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
### []( )insert…select
将一张表的某一字段的数据完全的插入令一张新表中,按照字段的顺序进行匹配。
![在这里插入图片描述](https://img-blog.csdnimg.cn/7a859f69fec44e328c0894341dbeccf6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/364e1bdb7930474ab7b709147fed0b60.png)
[]( )4\. 表的设计规则-数据库设计的三范式
---------------------------------------------------------------------------------------
### []( )第一范式(确保每列保持原子性)
第⼀范式是最基本的范式。如果数据库表中的**所有字段值都是不可分解的原⼦值**,就说明该数据库表满足了第⼀范式。 第⼀范式的合理遵循需要根据系统的实际需求来定。
错误示例:
![在这里插入图片描述](https://img-blog.csdnimg.cn/d9e05ee6174b4d7791a364d8ec429f6b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
“地址”这个属性,本来直接将“地 址”属性设计成⼀个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地 址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某⼀部分操作的时候将非常方便
正确示例:
![在这里插入图片描述](https://img-blog.csdnimg.cn/f18dcfa31d0e4acf964ca60cbb007962.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
上表所示的用户信息遵循了第⼀范式的要求,这样在对⽤户使⽤城市进⾏分类的时候就⾮常⽅便,也提高了数据库的性能。
### []( )第二范式(确保表中的每列都和主键相关)
第⼆范式在第⼀范式的基础之上更进⼀层。第⼆范式需要确保数据库表中的每⼀列都和主键相关,而不能只与主键的某 ⼀部分相关(主要针对联合主键⽽⾔)。**也就是说在⼀个数据库表中,⼀个表中只能保存⼀种数据,不可以把多种数据 保存在同⼀张数据库表中。**
不符合示例:
![在这里插入图片描述](https://img-blog.csdnimg.cn/aa90b8a30f4e420891c9ab3547c7838e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信 息不与该表的主键相关,⽽仅仅是与商品编号相关。所以在这⾥违反了第⼆范式的设计原则。
正确示例:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2381c0790f8f426e863712a2c526d3a0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
这样设计,在很⼤程度上减⼩了数据库的冗余。如果要获取订单的商品信息,使⽤商品编号到商品信息表中查询即可。
### []( )第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保**数据表中的每⼀列数据都和主键直接相关,而不能间接相关,并且每一个字段都不能和非主键字段有依赖。**
比如在设计⼀个订单数据表的时候,可以将客户编号作为⼀个外键和订单表建⽴相应的关系。⽽不可以在订单表中添加 关于客户其它信息(比如姓名、所属公司等)的字段。如下面这两个表所示的设计就是⼀个满⾜第三范式的数据库表。 不符合第三范式:
![在这里插入图片描述](https://img-blog.csdnimg.cn/88e3e23a1e5a4e53b3e295dea9062ebe.png)
正确表结构:
![在这里插入图片描述](https://img-blog.csdnimg.cn/8fd97042fa9b4b5092fe778808334278.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的记录,也不必在订单信息表中多次输⼊客户信息的内容,减小了数据冗余。
#### []( )范式优点:实现列和非主键的解耦!
修改了一个字段,不会影响其他字段,优秀的设计理念。**“高内聚 低耦合”**
[]( )5\. 表结构
--------------------------------------------------------------------------
表和表之间的关系有三种:
* ⼀对⼀:⼀个学⽣对应⼀个学号。
* ⼀对多:⼀个班级包含多个学⽣(⽤两张表表示)。
* 多对多:⼀张表中的⼀条数据可以对应到另⼀张表的多条数据,反之也是这样的,这样的关系叫做多对多,⼀般⽤三个表表示。
![在这里插入图片描述](https://img-blog.csdnimg.cn/121ad11365414103b831c96bb2546cfb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
[]( )高级SQL查询—3
============================================================================
[]( )1.聚合查询
-------------------------------------------------------------------------
常见的统计总数、计算平局值等操作,可以使⽤聚合函数来实现,常⻅的聚合函数有:
![在这里插入图片描述](https://img-blog.csdnimg.cn/bd7e42bc8a124fce8947ea60c1507aa9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
* **count 查询条数**
– 统计班级共有多少同学
select count(*) from student;
select count(0) from student;
– 统计班级收集的 qq_mail 有多少个,qq_mail 为 NULL 的数据不会计⼊结果
select count(qq_mail) from student;
count用法1:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2995d9ca794146e8839e6d95e8860a44.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
用法2
![在这里插入图片描述](https://img-blog.csdnimg.cn/b1cde9151e6d473bae950b8aecce2779.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
用法3
![在这里插入图片描述](https://img-blog.csdnimg.cn/6ccc95dd40624ab890f2088a044558b0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
**在不同的 count 统计场景下,要使用不同的 count 查询。**
* **sum 函数**
– 统计数学成绩总分
select sum(math) from exam_result;
– 不及格 < 60 的总分,没有结果,返回 NULL
select sum(math) from exam_result where math < 60;
![在这里插入图片描述](https://img-blog.csdnimg.cn/eadd50609a4d4d1ba08b9006d3cee4b5.png)
* **avg函数**
– 统计平均总分
select avg(chinese + math + english) 平均总分 from exam_result;
![在这里插入图片描述](https://img-blog.csdnimg.cn/f4bb216272174e5bbbe49c28eaed5ac4.png)
* **max / min 函数**
– 返回英语最⾼分
select max(english) from exam_result;
– 返回 > 70 分以上的数学最低分
select min(math) from exam_result where math > 70;
* **ifnull 函数**
ifnull 函数是 MySQL 控制流函数之一,它接受两个参数,如果不是 null,则返回第⼀个参数,否 则 ifnull 函数返回第⼆个参数。
select ifnull(expression_1,expression_2);
– 示例1
select ifnull(1,0); – returns 1
– 示例2
select ifnull(‘’,1); – returns ‘’
– 示例3
select ifnull(unll,‘Hello,Null’); – returns Hello,Null
`解决总成绩为null的问题`
![在这里插入图片描述](https://img-blog.csdnimg.cn/2e9551446f434906b5dfbaec53103c81.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
使⽤ ifnull 函数来解决:
![在这里插入图片描述](https://img-blog.csdnimg.cn/e6e7000108004b8d89b514a8341d631b.png)
但是我们尽量是在开发中直接设置字段的约束为“not null”,尽量不调用数据库自己的函数。
* **分组查询 group by**
select 中使⽤ group by 子句可以对指定列进⾏分组查询。需要满足:使用 group by 进⾏分组查询时,select 指定的字段必须是“分组依据字段”,其他字段若想出现在 select 中则必须包含在聚合函数中。
select column1, sum(column2), … from table group by column1;
**案例:**
准备测试表及数据:职员表,有id(主键)、name(姓名)、role(⻆⾊)、salary(薪⽔)
![](https://img-blog.csdnimg.cn/f263221628934cfbba603c15dffd1b39.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_15,color_FFFFFF,t_70,g_se,x_16)
– 查询每个⻆⾊的最⾼⼯资、最低⼯资和平均⼯资
select role,max(salary),min(salary),avg(salary) from emp group by role;
* **分组条件查询 having**
group by ⼦句进⾏分组以后,需要对分组结果再进⾏条件过滤时,不能使⽤ where 语句,而需要用 having
– 显示平均⼯资低于 1500 的⻆⾊和它的平均⼯资
select role,max(salary),min(salary),avg(salary) from emp group by role
having avg(salary)>1500;
[]( )2\. SQL 查询关键字执行顺序
------------------------------------------------------------------------------------
**SQL 查询执行先后顺序: group by > having > order by > limit**
[]( )3\. 联合查询(多表查询)
---------------------------------------------------------------------------------
### []( )3.1 前置知识—笛卡尔积
笛卡尔积是联合查询也就是多表查询的基础,笛卡尔积⼜称直积,表示为 X_Y,比如 A 表中的数据为 m ⾏,B 表中的数据有 n ⾏,那么 A 和 B 做笛卡尔积,结果为 m_n 行。
比如以下表,它们的笛卡尔积就有 9 个:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2f319bc3df1a4d4f91c702be5b5a1306.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/0bbfeb7cdb7c455a9b702283edd41434.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
我们可以发现,在联表查询时首先要使用笛卡尔积,但是单纯的笛卡尔积查询出来的是由很多的无效数据的。因此我们要进行过滤。
### []( )3.2 内连接
内连接侧重于两个表之间的共性,它的作⽤是使⽤联接,⽐较两个(或多个)表之间的共有数据,然后进行返回。
比如我要查询学生的成绩,涉及到两张表:学生表和成绩表,使⽤内连接查询的数据是下图的红色部分:
![在这里插入图片描述](https://img-blog.csdnimg.cn/f83b67a8a40740aab2e4625eeb8467d8.png)
* **内连接语法**
上一个问题所述,如果不加过滤条件,我们联表查询出来的就是笛卡尔积,会有很多的无意义数据,所以需要加过滤条件保留有效数据
![在这里插入图片描述](https://img-blog.csdnimg.cn/10ceec7082d14543b84aa06e42eade29.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
select * from t1 [inner|cross] join t2 [on 过滤条件] [where 过滤条件]
![在这里插入图片描述](https://img-blog.csdnimg.cn/1b5053bffc4442c2b176e9eee9769465.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
内连接的写法有以下 4 种:
* **select \* from t1 join t2;**
* select \* from t1 inner join t2;
* select \* from t1 cross join t2;
* **select \* from t1,t2;**
![在这里插入图片描述](https://img-blog.csdnimg.cn/358e672e77754464b5fa13151e649746.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
* 内连接查询的“问题”
内连接的问题是,查询到的是两张表相关联的部分,没有主表和次表之分,但是如果分了主要字段和其他查询字段,需要把否一张表的主要字段都查出来,但是如果另外一张表没有相关这个字段某个数据的外键信息,那么内连接就不能满足查询条件了。
### []( )3.3 外连接
**外连接包括内连接和其他至少一张表的所有满足条件的信息**,外连接包括:
* 左(外)连接
* 右(外)连接
![在这里插入图片描述](https://img-blog.csdnimg.cn/aef1a3f917ea4a948f67c99413342c3f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
* **语法连接:**
– 左连接语法
select * from t1 left join t2 [on 连接条件];
– 右连接语法
select * from t1 right join t2 [on 连接条件];
**eg:查询所有人的成绩**
– 左连接查询所有人成绩
select s.sn,s.username,s.mail,st.score from student s left join score_table st on s.id=st.student_id;
– 右连接查询所有人成绩
select s.sn,s.username,s.mail,st.score from score_table st right join student s on s.id=st.student_id;
**注意:**
`外连接必须加 on 过滤条件。`
### []( )3.4 自连接
**自连接是指在同一张表连接自身进行查询。**
eg:
① 查询英语成绩>计算机成绩的数据
select st1.score 英语,st2.score 计算机 from score_table st1,score_table st2
where
st1.student_id=st2.student_id and st1.score>st2.score;
从上面的语法“select \* from t1,t2”我们可以看出,自连接就是查询同⼀张表的内查询,因为这个语句就 是内连接的查询语句,因此我们还可以使⽤以下 join 语句查询:
select st1.score 英语,st2.score 计算机 from score_table st1
join score_table st2 on st1.student_id=st2.student_id and st1.score>st2.score;
② 查询学⽣信息+英语成绩>计算机成绩的数据
select st1.score 英语,st2.score 计算机,s.username from score_table st1
join score_table st2 on st1.student_id=st2.student_id and st1.score>st2.score
join student s on s.id=st1.student_id;
### []( )3.5 子查询
**子查询是指嵌入在其他 sql 语句中的 select 语句,也叫嵌套查询。**
eg:
① 查询张三的同班同学
查询的实现步骤:
1. 先查询张三的班级 id。
2. 查询⽤户表 where 条件是班级 id。
– 步骤1
select class_id from student where username=‘张三’;
– 步骤2
select * from student where class_id=1;
–最终合并的⼦查询语句如下:
select * from student where class_id=
(select class_id from student whereusername=‘张三’);
② 查询计算机或英语的成绩
select * from score_table where course_id in
(select id from course where name=‘计算机’ or name=‘英语’);
③ 查询比Java班平均分高的学⽣
查询思路:
1. 查询 Java 班的 id。
2. 根据班级 id 查询出所有的学⽣。
3. 根据学生计算出 Java 班的平均分。
4. 把上⼀步作为临时表,查询分数大于平均分的分数。
–前三步sql
select avg(score) from score_table
where student_id in (select id from student where class_id=
(select id from class where classname='Java班'));
–查询分数表中⼤于此平均分的数据:
select * from score_table st,
(select avg(score) as avg from score_table where student_id in
(select id from student where class_id=(
select id from class where classname='Java班'))) tmp
where st.score>tmp.avg
### []( )3.6 合并查询
合并查询用于合并结果集相同的两张(多张)表,它有两个关键字:
* union
* union all
**union 使用**
查询 id ⼩于 3 和名字为“英语”的课程:
select * from course where id<3
union
select * from course where name=‘英语’;
– 或者使⽤ or 来实现
select * from course where id<3 or name=‘英语’;
![在这里插入图片描述](https://img-blog.csdnimg.cn/328482e51205469f99e54de62b7df2ba.png)
**union all 使用**
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行案例:查询 id 小于 3,或者名字为“英语”的课程。
– 可以看到结果集中出现重复数据Java
select * from course where id<3
union all
select * from course where name=‘英语’;
![在这里插入图片描述](https://img-blog.csdnimg.cn/7c367e5c2c1b48e582a71e6bc865dc92.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
[]( )内容重点总结
=========================================================================
* **MySQL索引,知识点总结**
链接:[link]( ).
* **MySQL事务,知识点总结**
链接:[link]( ).
* **Java通过 JDBC 连接数据库操作**
链接: [link]( ).
# 最后
每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。
如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份**限量版的Java零基础宝典**能够对你有所帮助。
![](https://img-blog.csdnimg.cn/img_convert/c90c27e547bdb1b7b7b6c36ae45539bc.webp?x-oss-process=image/format,png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)**
![img](https://img-blog.csdnimg.cn/img_convert/ab78c3b69b02adcb351a5ec10031b5ab.jpeg)
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
``
![在这里插入图片描述](https://img-blog.csdnimg.cn/328482e51205469f99e54de62b7df2ba.png)
**union all 使用**
该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行案例:查询 id 小于 3,或者名字为“英语”的课程。
– 可以看到结果集中出现重复数据Java
select * from course where id<3
union all
select * from course where name=‘英语’;
![在这里插入图片描述](https://img-blog.csdnimg.cn/7c367e5c2c1b48e582a71e6bc865dc92.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zi_5biD772e,size_20,color_FFFFFF,t_70,g_se,x_16)
[]( )内容重点总结
=========================================================================
* **MySQL索引,知识点总结**
链接:[link]( ).
* **MySQL事务,知识点总结**
链接:[link]( ).
* **Java通过 JDBC 连接数据库操作**
链接: [link]( ).
# 最后
每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。
如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份**限量版的Java零基础宝典**能够对你有所帮助。
[外链图片转存中...(img-Su6DIz5E-1713423827394)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)**
[外链图片转存中...(img-0WIO1uvi-1713423827395)]
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**