【数据库】增删改查 高阶(超级详细)保姆级教学

文章目录


插入

我们在向表中插入数据时,其实可以一次性把另一张表中的数据都插入进来。

语法:

sql 复制代码
INSERT INTO table_name [(column [, column ...])] SELECT ...



插入之后:

注意:插入的列要与指定的列一一对应,否则会产生错误。

聚合查询

聚合函数


COUNT

使用count可以查询目标数据的数量。

查询所有数据的个数:

1.count(*)

2.count(x)->x为常量



select(column)可以查询特定列的数据数量,如果有null,则不会被计算在内。

SUM

sum就是计算一列数据的总和。

我们之前学过,null与任何值相加结果都是null。但是在sum函数中,系统会自动处理null值,最终把他当成"0"来看待。

查询中我们也可以像之前一样加where条件来约束。

AVG

对指定的列求平均

仍然可以使用表达式和别名。

MAX&&MIN

求某一列的最大值最小值

GROUP BY

SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。需要满足:使用 GROUP BY 进行分组查询时,SELECT 指定的字段必须是"分组依据字段",其他字段若想出现在SELECT 中则必须包含在聚合函数中。

建立一个emp表:

源码:码云地址

查询不同职位的平均工资:

round函数可以传递 数值以及位数的参数,位数代表小数点后的位数。

分组查询后可以再用排序。

HAVING

GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用HAVING

这条 SQL 语句存在语法错误,核心问题在于 WHERE 子句中不能直接使用聚合函数(如 avg(salary))。因为聚合函数得到的数据是不真实的数据。

跟在group by 子句之后,对分组结果进行过滤。

这两段代码虽然运行结果相同,但是只要数据特殊,就会产生不一样的结果,而且代码在执行过程中的运行逻辑也完全不同。

联合查询

一般连接

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:


1.去两张表的笛卡尔积

但是,这其中有很多无效数据,如何去除呢?

2.去除无效数据

依然是使用where筛选。

如果量表之间是主外键关系,一般通过主外键相连。

3.能通过指定列查询来精简结果集。
后面的代码演示我们使用码云中的java113.sql来继续学习。
链接在上面↑

当然在使用中我们也可以去给表起别名来精简代码。

内连接

语法:

sql 复制代码
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;

内连接就是在一般连接的基础上,多了一种写法而已。

练习:

(1)查询"许仙"同学的 成绩

(2)查询所有同学的总成绩,及同学的个人信息:

外连接

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。

语法:

sql 复制代码
-- 左外连接,表1完全显示
select 字段名  from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;

案例:查询所有同学的成绩,及同学的个人信息,如果该同学没有成绩,也需要显示:

用这种方法我们也可以解决找到缺考的同学类似的问题。

自连接

自连接顾名思义就是一张表自己和自己相连接。

自己怎么跟自己比较呢?

像这样的表就没法实现行与行之间的比较。因为每一行都是不同的数据。

这样的表设计,可以在同一行进行列与列的比较。

示例:显示所有"计算机原理"成绩比"Java"成绩高的成绩信息
我们如果实现自己与自己相连,不可以直接向其他情况那样,而是要给两个表取一个不同的别名。

sql 复制代码
-- 也可以使用join on 语句来进行自连接查询
SELECT
 s1.* 
FROM
 score s1
 JOIN score s2 ON s1.student_id = s2.student_id
 AND s1.score < s2.score
 AND s1.course_id = 1
 AND s2.course_id = 3;

子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

单行子查询:返回一行记录的子查询

查询与"不想毕业" 同学的同班同学:

多行查询:返回多行子记录的查询:

案例:查询"语文"或"英文"课程的成绩信息:

这里要用in ,因为多行不可以使用 = 。

not in 也可以使用。

exists [not] exists

相当于 if。

select null 会返回一个非空的单行的表,只不过这个表列名和值都为null。

拓展

可以用子查询创建一个临时表,用来查询。

sql 复制代码
select * from student (select * from..)[where] ...

查询所有比"中文系2019级3班"平均分高的成绩信息:

合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION和UNION ALL时,前后查询的结果集中,字段需要一致。

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

案例:查询id小于3,或者名字为"英文"的课程:

该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

案例:查询id小于3,或者名字为"Java"的课程


总结

本文围绕 SQL 查询展开,涵盖多方面内容:插入操作支持从其他表批量插入且需保证列一一对应;聚合查询包含 COUNT、SUM 等聚合函数,结合 GROUP BY 可实现分组统计,分组后需用 HAVING 而非 WHERE 过滤聚合结果;联合查询涉及一般连接、内连接、外连接、自连接,还有子查询(含单行、多行及 exists 用法)及基于子查询创建临时表的拓展,同时讲解了合并查询的 UNION(去重)和 UNION ALL(保留重复)操作,且需保证合并的结果集字段一致。

相关推荐
雨夜赶路人7 小时前
SQL -- GROUP BY 基本语法
数据库·sql
在坚持一下我可没意见7 小时前
Java 网络编程:TCP 与 UDP 的「通信江湖」(基于TCP回显服务器)
java·服务器·开发语言·笔记·tcp/ip·udp·java-ee
cr7xin7 小时前
缓存查询逻辑及问题解决
数据库·redis·后端·缓存·go
大卫小东(Sheldon)7 小时前
使用JMH对远程接口进行压测
java
JMzz7 小时前
Rust 中的内存对齐与缓存友好设计:性能优化的隐秘战场 ⚡
java·后端·spring·缓存·性能优化·rust
Java水解7 小时前
2026java面试题(含答案,持续更新中)
java·后端·面试
何中应7 小时前
Oracle数据库安装(Windows)
java·数据库·后端·oracle
Han.miracle7 小时前
Java的多线程——多线程(二)
java·开发语言·线程·多线程