MySQL学习记录 【基本操作 → 数据操作 → 高级查询 → 联合查询】 总结

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

– 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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值