MySql之联表查询


 

联表查询


JOIN概述(重点)

mysql中join的7中类型

在这里插入图片描述
 

本篇只讲解join联接的三种基本类型,左连接(Left Join),右联接(Right Join),等值联接(Inner Join)

知识点总结

1. 判断左右联接

  • 左联接–from a left join b ----以表a为基准
  • 右联接–from a right join b ----以表b为基准

2. 解题思路

  1. 分析查询的字段来自那些表,
  2. 确定使用那种连接查询
  3. 判断交叉点(这两个表中哪个数据是相同的)。

假设存在多表查询,先进行两张表查询,再慢慢增加

3. 关于where和on的区别

4. 关于三种联接

操作描述
inner join两表交集(如果表中至少有一个匹配,即返回该行)
left join会从左表中返回所有的值,即使右表中没有匹配
right join会从右表中返回所有的值,即使左表中没有匹配

例题

现有三张表

表名属性
student(学生表)studentNo,studentName,email
result(考试成绩表)studentNo,subjectNo,studentResult
subject(科目表)subjectNo,subjectName,
  • 问题一:查询参加了考试的同学(学号,姓名,科目编号,分数)
SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s
RIGHT JOIN `result` AS r
ON s.`studentno` = r.`studentno`
或:
SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s
INNER JOIN `result` AS r
ON s.`studentno` = r.`studentno`

问题一
 

若采用左连接,则会返回student表中所有学生的信息,即使在result表中不存在该学生的信息。

SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s
LEFT JOIN `result` AS r
ON s.`studentno` = r.`studentno`

在这里插入图片描述 

  • 问题二:查询缺考的学生
--  AND r.`studentresult` IS NULL
SELECT s.`studentno`,`studentname`,`studentresult`
FROM `student` AS s
LEFT JOIN `result` AS r
ON s.`studentno` = r.`studentno`
WHERE studentresult IS NULL

在这里插入图片描述
 

  • 思考题: 查询参加考试的同学信息:学号,学生姓名,科目名,分数
-- 先查询两张表
SELECT s.`studentno`,`studentname`,`studentresult`,`subjectno`
FROM `student` AS s
INNER JOIN `result` AS r
ON s.`studentno` = r.`studentno`

-- 增加第三张
SELECT s.`studentno`,`studentname`,`studentresult`,`subjectname`
FROM `student` AS s
INNER JOIN `result` AS r
ON s.`studentno` = r.`studentno`
LEFT JOIN `subject` AS sub
ON sub.`subjectno` = r.`subjectno`

在这里插入图片描述
 

自连接


一张表拆为两张表

案例

已知表:
categoryId表示科目id,pid表示科目等级

categoryIdpidcategoryName
21信息技术
31软件开发
43数据库
51美术设计
63web开发
75ps技术
82办公信息

---->可拆分为

父类(科目等级=1的科目):

categoryIdcategoryName
2信息技术
3软件开发
5美术设计

子类:

pidcategoryIdcategoryName
34数据库
36web开发
57ps技术
28办公信息

求连接表:

父类子类
软件开发数据库
软件开发web开发
美术设计ps技术
信息技术办公信息

实现语句

SELECT f.`categoryName` AS '父类科目' ,s.`categoryName` AS '子类科目'
FROM `category` AS f,`category` AS s
WHERE f.categoryId = s.pid

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值