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连接