多表查询之简单回顾

1.1.1 多表查询的分类

1.1.1.1 连接查询
 交叉连接:cross join
 交叉连接:查询到的是两个表的笛卡尔积。
 语法:
 select * from 表1 cross join 表2;
 select * from 表1,表2;
 内连接:inner join(inner是可以省略的)
 显示内连接:在SQL中显示的调用inner join关键字
 语法:select * from 表1 inner join 表2 on 关联条件;
 隐式内连接:在SQL中没有调用inner join关键字
 语法:select * from 表1,表2 where 关联条件;
 外连接:outer join(outer可以省略的)
 左外连接:
 语法:select * from 表1 left outer join 表2 on 关联条件;
 右外连接
 语法:select * from 表1 right outer join 表2 on 关联条件;
1.1.1.2 子查询
 子查询:一个查询语句条件需要依赖另一个查询语句的结果。

多表查询之数据准备

1.1.1 数据准备
1.1.1.1 班级表数据的准备

1.1 多表查询之交叉连接

1.1.1 交叉连接
1.1.1.1 使用cross join关键字

select * from classes cross join student;

在这里插入图片描述
1.1.1.2 不使用cross join关键字

SELECT * FROM classes,student;

效果一样

1.1 多表查询之内连接

1.1.1 内连接
1.1.1.1 显示内连接

select * from classes c inner join student s on c.id = s.cno;

在这里插入图片描述
1.1.1.2 隐式内连接

SELECT * FROM classes c,student s WHERE c.id = s.cno; 

在这里插入图片描述

1.1 多表查询之外连接

1.1.1 外连接(主要体现再对关联外键为null的处理上)
1.1.1.1 左外连接(以左边表为主键进行关联查询)

SELECT * FROM classes c LEFT OUTER JOIN student s ON c.id = s.cno;

在这里插入图片描述
1.1.1.2 右外连接(以右边表为主表进行关联查询)

select * from classes c right outer join student s on c.id = s.cno;

在这里插入图片描述
1.1.1 内连接和外连接的区别
在这里插入图片描述
在这里插入图片描述

1.1 多表查询之子查询

1.1.1 子查询
1.1.1.1 带in的子查询
 查询学生生日在91年之后的班级的信息。

select * from classes where id in (SELECT cno FROM student WHERE birthday > '1991-01-01');

在这里插入图片描述
1.1.1.2 带exists的子查询
 查询学生生日大于91年1月1日,如果记录存在,前面的SQL语句(select * from classes)就会执行

select * from classes where exists (SELECT cno FROM student WHERE birthday > '1991-01-01');

在这里插入图片描述
1.1.1.3 带any的子查询(大于任何一个,意思就是除了最小值都符合),一班的id最小,所以没有一班

SELECT * FROM classes WHERE id > ANY (SELECT cno FROM student )

在这里插入图片描述
1.1.1.4 带all的子查询(大于所有的,意思就是只有最大值符合),四班的id最大,所以为四班

SELECT * FROM classes WHERE id > ALL (SELECT cno FROM student)

在这里插入图片描述
1.1.1.5 查询班级名称,和班级总人数

SELECT c.cname,COUNT(*) FROM classes c,student s WHERE c.id = s.cno GROUP BY c.cname;

在这里插入图片描述
 查询学生的姓名和学生所选的总课程平均成绩。

select s.sname,avg(sc.score) from student s,stu_cour sc where s.sid = sc.sno group by s.sname;

在这里插入图片描述
 查询学生的姓名和学生的选课总数,显示选课超过2门学生姓名。

select s.sname,count(*) from student s,stu_cour sc where s.sid = sc.sno group by s.sname having count(*) > 2;

首先我们先查询所有学员所报的课程数;
 select s.sname,count(*) from student s,stu_cour sc where s.sid = sc.sno group by s.sname;

在这里插入图片描述
我们在此基础上加having count(*) > 2;即可得出选课超过2门学生姓名
在这里插入图片描述
 查询平均成绩大于80分的学生的总数。

select count(*) from student s where s.sid in (SELECT sc.sno FROM stu_cour sc GROUP BY sc.sno HAVING AVG(sc.score) >  80);
首先我们可以通过stu_cour表查出平均分大于80分的有那些人;

在这里插入图片描述
我们再用in通过查询出来的学生id(sno)查询出个数
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值