JAVA-MySQL五{MySQL重点DQL查询数据二}JAVA从基础开始 --7

接上-联表查询

join 对比

在这里插入图片描述
在这里插入图片描述

操作描述
inner join如果至少有一个值就返回结果
left join即使右表中没有匹配,也会从左表中返回值
right join从右表中返回值,即使左表没有匹配

– join on 条件判断 连接查询
– where 等值查询
结果相同

整合

-- 联表查询join 查询参加了考试的同学的姓名学号,科目,分数

select * from student
select * from exam

/*
思路:
1.需求,分析查询字段来自哪张表
2.确定哪种连接查询 
3.确定交叉点,表中有哪些数据时相同的
4.判断条件 :student表的id会和exam中的studentName是相等的
*/
-- 第一步需求
select `studentName`,`name`,`examName`,`examFraction`
from `student` as s
-- 联表  交叉
inner join `exam` as e
-- 确定交叉点  学号相同
where s.id = e.studentName

-- Right Join
select `studentName`,`name`,`examName`,`examFraction`
from `student` as s
right join `exam` as e
on s.id = e.studentName

-- Left Join  
select `studentName`,`name`,`examName`,`examFraction`
from `student` as s
Left join `exam` as e
on s.id = e.studentName


-- Left Join   应用 查询缺考同学
select `studentName`,`name`,`examName`,`examFraction`
from `student` as s
Left join `exam` as e
on s.id = e.studentName
where examFraction is null

-- join on 连接查询
--  where 等值查询


-- 多表查询
select `studentName`'学生编号',s.name'学生姓名',g.name'年级',`examSubjectName`'考试科目',concat(examFraction,'分') as '分数'
from `student`  s
right join `exam`  e
on s.id = e.studentName
inner join `grade` g
on g.gradeid = s.gradeid
inner join `examsubject` t
on t.examSubjectId = e.examName

最后一段多表查询结果
在这里插入图片描述

自连接

自己的表和自己的表链接,一张表拆为两张一样的表

当数据结构中的目录 ,有可能是一级目录,也有可能是二级或多级目录,它们都在一张表里,就涉及到自己表给自己表匹配的情况

在这里插入图片描述

我们需要把最上层目录找到,再通过它的id来匹配它的子项

最上层id名称
2首页
3第二页
5第三页
子类名称
4第二页第一项
6第二页第二项
7第三页第一项
8首页第一项

我们需要的结果是

首页
首页第一项
第二页
第二页第一项
第二页第二项
第三页
第三页第一项

-- 多表查询
select `studentName`'学生编号',s.name'学生姓名',g.name'年级',`examSubjectName`'考试科目',concat(examFraction,'分') as '分数'
from `student`  s
right join `exam`  e
on s.id = e.studentName
inner join `grade` g
on g.gradeid = s.gradeid
inner join `examsubject` t
on t.examSubjectId = e.examName

-- 自连接
create table if not exists `category`(
`categoryid` int(10) unsigned not null auto_increment comment '自己的id',
`pid` int(10) not null comment '父类id',
`categoryName` varchar(255) comment '自己的名字',
primary key (`categoryid`)
)engine=innodb default charset=utf8

insert into `category`(`categoryid`,`pid`,`categoryName`) 
values  ('2','1','首页'),
('3','1','第二页'),
('4','3','第二页第一项'),
('5','1','第三页'),
('6','3','第二页第二项'),
('7','5','第三页第一项'),
('8','2','首页第一项');

TRUNCATE `category`


-- 查询 父子信息 --别名
SELECT
	f.`categoryName` AS '父',
	z.`categoryName` AS '子' 
FROM
	`category` AS f,
	`category` AS z 
WHERE
	f.`categoryid` = z.`pid`

得到结果
在这里插入图片描述

很多人好奇(也包括我)为什么不直接用where而使用left join 去匹配查询,是因为where是把所有相关表全部拿出来,再对比查询,二left join 是左边是总表,而其他表是只根据总表来返回数据,而不是全部查出来再做比较


select `examSubjectName` ,`name`
from `examsubject`
,`grade`
where
`examSubjectGrade` = `gradeid`

-- 查询某学科的学生  学号,姓名,科目名,分数
SELECT
	ex.`studentName` AS '学号',
	st.`name` AS '姓名',
	eb.`examSubjectName` AS '科目名',
	ex.`examFraction` AS '分数' 
FROM
	`exam` AS ex
	INNER JOIN `examsubject` AS eb ON eb.`examSubjectId` = ex.`examName`
	INNER JOIN `student` AS st ON ex.`studentName` = st.`id` 
WHERE
	eb.`examSubjectId` = '14'


wehere只有一个 其他条件用and和or连接

下一章 Group by–having–order by–limit

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轻动琴弦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值