MySql数据库的连接和子查询

数据准备

学生表

studentNonamesexgradeId
1张三2
2李四1
3王五2
4麻子2
5小红1
6阿丽1
7陈六1

成绩表

studentNoobjectNoexamDategradeIdstudentTesult
1张三12022-10-8 12:04:4160
2李四12022-10-8 12:04:4170
3张三22022-10-7 12:04:4180
4王五12022-10-8 12:04:4173
5陈六12022-10-8 12:04:4181
6阿丽12022-10-8 12:04:4172
7麻子12022-10-8 12:04:4170
8小红12022-10-8 12:04:4173
9阿丽22022-10-7 12:04:4170
10麻子22022-10-7 12:04:4173

科目表

objectNoobjectName
1java
2php
3c
4golang

子查询

in

例1

select * from student where studentno in(
			select studentno from result
	);
  1. 从成绩表中查出所有学生id
  2. 再用第一步查寻出的学生id作为查询条件,从学生表中查询
    作用:查询出参加考试的学生信息

例2

select * from student where studentno not in(
			select studentno from result
	);
  1. 从成绩表中查出所有学生id
  2. 再用第一步查寻出的学生id作为查询条件,从学生表中查询
    作用:查询出没参加考试的学生信息

子查询返回的结果是供父查询使用,父查询需要什么字段,子查询就返回什么字段

连接

例1

select * from student inner join resulet
on student.studentNo=result.studentNo 
  1. 将学生表和成绩表进行连接
  2. 找出学生表中的学生id=成绩表中的学生id的数据

例2

select * from student inner join resulet
on student.studentNo<>result.studentNo 
  1. 将学生表和成绩表进行连接
  2. 找出学生表中的学生id!=成绩表中的学生id的数据

问: 结果会和子查询的例2一样吗?
答: 不会,两个表进行连接时,会将字段进行组合,再筛选满足条件的数据。
如果a表有3条数据,b表有10条数据,组合后的表,会有30条数据(笛卡尔积)。
注:1. 连接不会自动去除重复选项,可以使用distinct去重,select distinct …
子查询可以自动去重。
2. 如果结果集中需要显示两个表的列,建议使用表连接
3. 如果结果集中只显示一个表的列,建议使用子查询。

exists z

1.建、删表之前 进行判断

drop table if exsts temp;

2.exists子查询

select …from tablename where exists (子查询);

  • 子查询有返回结果,exists子查询结果为true
  • 子查询无返回结果,exists子查询结果为false,外层查询不执行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值