聚合查询、联合查询【mysql数据库】

把查询结果插入到另一个表中(相当于复制表)

 要求查询结果临时表的列数和列的类型,要和student2这里匹配

聚合查询

本质上是针对行和行之间的运算

聚合查询需要搭配聚合函数

1、count 

 

 不一定非要写星号(*),还可以写成任意的 列名/表达式

 虽然有一行是全NULL,count计算会把全为NULL的行也给计算进去

 2、sum

sum求和,把这一列的所有行进行加和,要求这个列得是数字(不能是字符串/日期)

3、AVG

4、MAX&&MIN

 求和,平均,最大,最小这些操作都是针对数字类型的列进行的。

 表达式的聚合计算

 联合查询

包括:内连接,外连接,子查询,合并查询

多表查询的基本执行过程:笛卡尔积

 

 笛卡尔积通过排列组合:列数是两个表列数的和,行数是两个表行数的积

 通过条件,排除无意义的数据。

 练习:

drop table if exists classes;
drop table if exists student;
drop table if exists course;
drop table if exists score;

create table classes (id int primary key auto_increment, name varchar(20), `desc` varchar(100));

create table student (id int primary key auto_increment, sn varchar(20),  name varchar(20), qq_mail varchar(20) , classes_id int);

create table course(id int primary key auto_increment, name varchar(20));

create table score(score decimal(3, 1), student_id int, course_id int);

insert into classes(name, `desc`) values 
('class1', 'desc1'),
('class2','desc2'),
('class3','desc3');

insert into student(sn, name, qq_mail, classes_id) values
('09982','likui','xuanfeng@qq.com',1),
('00835','puti',null,1),
('00391','baisuzhen',null,1),
('00031','xuxian','xuxian@qq.com',1),
('00054','buxiangbiye',null,1),
('51234','haohaoshuohua','say@qq.com',2),
('83223','tellme',null,2),
('09527','laowai','foreigner@qq.com',2);

insert into course(name) values
('Java'),('wenhua'),('yuanli'),('chinese'),('math'),('english');

insert into score(score, student_id, course_id) values
-- likui
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
-- puti
(60, 2, 1),(59.5, 2, 5),
-- baisuzhen
(33, 3, 1),(68, 3, 3),(99, 3, 5),
-- xuxian
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
-- buxiangbiye
(81, 5, 1),(37, 5, 5),
-- haohaoshuohua
(56, 6, 2),(43, 6, 4),(79, 6, 6),
-- tellme
(80, 7, 2),(92, 7, 6);

 4个表:student 学生表 、 classes 班级表 、 course 课程表 、 score 分数表

 

 查询许仙同学的成绩

写法1:from多个表 

 1、先笛卡尔积

 2、引入连接条件

 3、根据必要需求,加入必要的条件即可

 4、把不必要的列去掉,保留想关注的列

写法二:join on

 写法三:inner join

注意: from多个表只能够实现内连接,而join on既可以实现内连接也可以使用外连接。

查询所有同学的总成绩及个人信息

 第一步:笛卡尔积

 第二步:加上连接条件

 第三步:加上聚合查询,把同一个学生的行合并到一个组里,同时计算总分

 

第一步:笛卡尔积

 第二步:引入连接条件:三张表需要两个连接条件

 第三步:精简一些不必要的列

 ​​​

 用join on也是没问题的

         内连接和外连接在大多数情况下是没有区别的,比如要连接的两个表里面的数据都是一一对应的,这时是没有区别的,如果不是一一对应,内连接和外连接就有区别了。

 

 如果不是一一对应

 

自连接:自己和自己进行笛卡尔积

SQL中无法针对行和行之间的条件比较,需要使用自连接,把行转成列

 显示所有‘计算机原理’成绩比‘java’成绩高的成绩信息

 

 

子查询:把多个SQL组合成一个,把一个查询作为另一个查询的一部分条件(套娃),代码可读性非常差,执行效率也非常差(慎用)

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

insert into classes(name, `desc`) values
('计算机系2019级1班', '学习了计算机原理、C和Java语言、数据结构和算法'),
('中文系2019级3班','学习了中国传统文学'),
('自动化2019级5班','学习了机械自动化');
insert into student(sn, name, qq_mail, classes_id) values
('09982','黑旋风李逵','xuanfeng@qq.com',1),
('00835','菩提老祖',null,1),
('00391','白素贞',null,1),
('00031','许仙','xuxian@qq.com',1),
('00054','不想毕业',null,1),
('51234','好好说话','say@qq.com',2),
('83223','tellme',null,2),
('09527','老外学中文','foreigner@qq.com',2);
insert into course(name) values
('Java'),('中国传统文化'),('计算机原理'),('语文'),('高阶数学'),('英文');
insert into score(score, student_id, course_id) values
-- 黑旋风李逵
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
-- 菩提老祖
(60, 2, 1),(59.5, 2, 5),
-- 白素贞
(33, 3, 1),(68, 3, 3),(99, 3, 5),
-- 许仙
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
-- 不想毕业
(81, 5, 1),(37, 5, 5), 
4.2.1 内连接  
-- 好好说话
(56, 6, 2),(43, 6, 4),(79, 6, 6),
-- tellme
(80, 7, 2),(92, 7, 6);

查询“不想毕业”的同学的同班同学

 

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

查询“语文”或“英语”课程的成绩信息

  1. 先根据课程名字查询出课程id
  2. 再根据课程id查询出课程分数

 

注意:查询结果放在内存中,如果查询结果太大了,内存放不下,in就用不了了,可以使用exists代替,exists本质上就是让数据库执行很多个查询操作, 但是exists可读性比较差,执行效率也大大低于in(适合解决特殊场景)

合并查询:本质上是把两个查询的结果集合成一个,union、union all

查询id小于3,或者名字为“英文”的课程: 

 or和union的区别:

        or查询只能来自同一张表,union查询可以是来自不同的表,只要查询的结果的列匹配即可。

union和union all的区别:

        union 会进行去重(把重复的行只保留一行),union all可以保留多份,不会去重。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当我们需要从一个数据库中获取更加特定、复杂的数据时,就需要使用复杂查询了。MySQL数据库支持各种类型的复杂查询,包括聚合函数、联合查询、子查询、嵌套查询等等。下面是一些复杂查询的示例: 1. 聚合函数:使用聚合函数可以对一列数据进行统计计算,如求平均值、最大值、最小值等等。 2. 联合查询联合查询可以将多个SELECT语句的结果合并为一个结果集。 3. 子查询:子查询是一个SELECT语句,嵌套在另一个SELECT语句中,用于过滤结果集或作为计算的基础。 4. 嵌套查询:嵌套查询是在一个SELECT语句中嵌套了另一个SELECT语句,用于从多个表中检索数据。 复杂查询可以帮助我们更快、更准确地获取我们所需的数据。但是,在编写复杂查询时,需要考虑查询效率和可读性等问题,以便得到更好的查询性能和更易于维护的查询语句。 ### 回答2: MySQL数据库是一个功能强大的数据库管理系统,它允许用户进行各种复杂查询。在本文中,我们将讨论复杂查询中的一些重要问题。 首先,复杂查询通常涉及使用多个表格。例如,如果我们需要从两个表格中获取数据,则需要使用JOIN语句。JOIN语句使我们能够将两个或多个表格中的数据进行匹配。使用JOIN语句需要非常小心,因为如果不正确地使用,会极大地降低查询效率。 其次,复杂查询经常使用嵌套或子查询来获取特定的数据。嵌套查询是一个查询中嵌套了另一个或多个查询。子查询通常在主查询中使用,以匹配或过滤特定的结果。 第三,复杂查询需要使用各种运算符和条件。在我们的查询中,运算符是用于比较值的符号。例如,等于,小于,大于等。条件是用于限制查询结果的表达式。例如,WHERE子句可以使用条件过滤查询结果。 最后,我们需要了解如何使用MySQL函数来处理和操作数据。MySQL提供了许多内置函数,例如SUM,AVG和COUNT,可以用于聚合和操作数据。 综上所述,MySQL数据库中的复杂查询需要细心操作,涉及多个表格和多个查询,使用各种运算符和条件,并使用MySQL函数来处理和操作数据。正确使用这些功能,可以大大提高查询效率,并生成准确的结果。 ### 回答3: MySQL数据库是一款非常流行的关系型数据库管理系统。在进行数据库操作时,常常需要进行复杂查询。复杂查询就是指需要同时使用多个条件进行查询,而这些条件之间的关系不是简单的等于关系或者区间关系。 MySQL数据库提供了许多函数和运算符来支持复杂查询。其中,常见的函数包括聚合函数、字符串函数、日期函数等等。这些函数可以帮助我们对数据进行分组、排序、过滤等操作,从而得到我们需要的数据结果。 在进行复杂查询时,我们需要使用SQL语言来编写查询语句。SQL语言是一种用于管理关系型数据库的语言,它具有灵活性和强大的功能性。 常见的复杂查询包括多表联结查询、嵌套查询、子查询等等。这些查询可以帮助我们查找数据的精确匹配、范围匹配、模糊匹配等不同的需求。 多表联结查询是指通过多个表中的字段来连接、匹配、过滤这些表的数据。这种查询常用于需要使用多个表中的数据来得到更完整的信息的场景中。 嵌套查询也是一种非常常见的查询方式,它可以通过嵌套多个查询语句来实现复杂的查询。嵌套查询中内外层查询之间的关系是互相嵌套的,内层查询可以使用外层查询的结果,或者通过子查询来限制外层查询的结果。 子查询就是通过一个查询给另一个查询提供限制条件,限制条件可以是精确匹配、范围匹配、模糊匹配等等。子查询可以用来查询一个表中符合某种条件的数据,然后再使用这些数据来继续进行查询。 综上所述,MySQL数据库的复杂查询是非常重要的数据库操作,可以帮助我们更灵活地处理数据。不同的查询方式可以针对不同的需求进行适配和处理,帮助我们更好地完成任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值