Day19-联表查询

本文详细探讨了SQL联表查询中的INNERJOIN、LEFTJOIN和RIGHTJOIN,通过实例展示了如何在实际场景中使用这三种方法,包括查询参加考试的学生信息、缺考情况、年级关系,以及多表连接和自连接的应用。此外,还涉及到了分页排序、子查询和不同类型的排序方式。
摘要由CSDN通过智能技术生成

Day19

联表查询

JOIN对比

查看源图像

  • INNER JOIN
-- 查询参加了考试的同学(学号,姓名,科目编号,分数)
/*
思路:
1.分析需求,分析需要查询的字段来自于哪些字段,(连接查询)
2.确定用七种联表查询中的哪一种
3.确定交叉点,两个表之间哪些字段是相同的
4.判断的条件如:student表中学号和result表中的学号相同
*/

SELECT s.studentno AS 学号,`studentname` AS 姓名,`subjectno` AS 科目编号,`studentresult` AS 学生成绩
FROM `student` AS s
INNER JOIN `result` AS r
WHERE s.studentno = r.studentno

在这里插入图片描述

  • RIGHT JOIN
-- RIGHT JOIN
SELECT s.studentno AS 学号,`studentname` AS 姓名,`subjectno` AS 科目编号,`studentresult` AS 学生成绩
FROM `student` AS s
RIGHT JOIN `result` AS r
ON s.studentno = r.studentno-- 确定交叉点

在这里插入图片描述

  • LEFT JOIN
-- LEFT JOIN
SELECT s.studentno AS 学号,`studentname` AS 姓名,`subjectno` AS 科目编号,`studentresult` AS 学生成绩
FROM `student` AS s
LEFT JOIN `result` AS r
ON s.studentno = r.studentno-- 确定交叉点

在这里插入图片描述

总结:

操作描述
inner join如果表中至少有一个匹配,就返回行
left join会从左边中返回所有的值,即使右表中没有匹配
right join会从右边中返回所有的值,即使左表中没有匹配
-- JOIN(连接的表) ON (判断的条件)连接查询
-- WHERE 等值查询
-- 查询缺考的同学
SELECT s.studentno AS 学号,`studentname` AS 姓名,`subjectno` AS 科目编号,`studentresult` AS 学生成绩
FROM `student` AS s
LEFT JOIN `result` AS r
ON s.studentno = r.studentno-- 确定交叉点
WHERE `studentresult` IS NULL

在这里插入图片描述

-- 查询学员的年级(学号,学生姓名,年级名称)
SELECT `studentno` AS 学生姓名, `studentname` AS 学生姓名,`gradename` AS 年级名称
FROM `student` AS s
INNER JOIN `grade` AS g
ON s.`gradeid` = g.`gradeid`

在这里插入图片描述

  • 三表查询
-- 思考题(查询了参加考试的同学信息:学号,学生姓名,科目名,分数)
SELECT s.studentno AS 学号,`studentname` AS 姓名,`subjectname`AS 科目名,`studentresult`AS 学生成绩
FROM `student` AS s
RIGHT JOIN `result` AS r
ON s.studentno = r.studentno-- 连接条件
-- 开始连接subject表
INNER JOIN `subject` AS sb
ON r.subjectno = sb.subjectno

在这里插入图片描述

-- 查询了参加 数据库-1 考试的同学信息:学号,学生姓名,科目名,分数
SELECT s.studentno AS 学号,`studentname` AS 姓名,`subjectname`AS 科目名,`studentresult`AS 学生成绩
FROM `student` AS s
RIGHT JOIN `result` AS r
ON s.studentno = r.studentno-- 连接条件
-- 开始连接subject表
INNER JOIN `subject` AS sb
ON r.subjectno = sb.subjectno
WHERE `subjectname` = '高等数学-1'

在这里插入图片描述

-- 我要查询哪些数据 select ...
-- 从哪几个表中查 from 表 XXX join 连接的表 on 交叉条件
-- 假设存在一种多张表查询,慢慢来,先查询两张表然后再慢慢增加

自连接(了解)

自连接:自己的表和自己的表连接

核心:一张表拆分为两张一样的表

父类:

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

子类:

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

父类对应的子类关系:

父类子类
信息技术办公信息
软件开发数据库
软件开发web开发
美术设计ps技术
-- 查询父子信息:把一张一张表拆分为两张一样的表
SELECT a.`category_name` AS 父类, b.`category_name` AS 子类
FROM `category` AS a, `category` AS b
WHERE a.`category_id` = b.`pid`

在这里插入图片描述

分页和排序

分页 LIMIT

  • 缓解数据库压力,给人体验更好。
  • 或者不分页,应用瀑布流(一般用于图片,抖音也用了,可以不停的往下刷)
-- 分页,每页显示两条数据
-- LIMIT 起始值(从第几条数据开始显示),页面的大小(每页显示多少条数据)
SELECT s.studentno AS 学号,`studentname` AS 姓名,`subjectname`AS 科目名,`studentresult`AS 学生成绩
FROM `student` AS s
RIGHT JOIN `result` AS r
ON s.studentno = r.studentno
-- 开始连接subject表
INNER JOIN `subject` AS sb
ON r.subjectno = sb.subjectno
-- 降序排列
ORDER BY `studentresult` ASC
LIMIT 0,2
-- 第一页 limit 0,2    (1-1)*2
-- 第二页 limit 2,2    (2-1)*2
-- 第三页 limit 4,2   (3-1)*2
-- 第N页 limit (n-1)*2,2    (n-1)*pageSize,pageSize
-- pageSize,页面大小
-- (n-1)*pageSize,起始值
-- n,当前页
-- 总页数 = (数据总数%页面大小==0)? (数据总数/页面大小) : (数据总数/页面大小 + 1)

在这里插入图片描述

排序 ORDER BY

-- 排序: 升序ASC和降序DESC
-- ORDER BY +排序的字段+ 升序ASC或者降序DESC
-- 查询的结果根据 成绩降序 排序
SELECT s.studentno AS 学号,`studentname` AS 姓名,`subjectname`AS 科目名,`studentresult`AS 学生成绩
FROM `student` AS s
RIGHT JOIN `result` AS r
ON s.studentno = r.studentno
-- 开始连接subject表
INNER JOIN `subject` AS sb
ON r.subjectno = sb.subjectno
-- 降序排列
ORDER BY `studentresult` DESC

在这里插入图片描述

SELECT s.studentno AS 学号,`studentname` AS 姓名,`subjectname`AS 科目名,`studentresult`AS 学生成绩
FROM `student` AS s
RIGHT JOIN `result` AS r
ON s.studentno = r.studentno
-- 开始连接subject表
INNER JOIN `subject` AS sb
ON r.subjectno = sb.subjectno
-- 升序排列
ORDER BY `studentresult` ASC

在这里插入图片描述

子查询

where(这个值是计算出来的)

本质:在where语句中嵌套一个子查询语句

-- 方式1:使用连接查询
SELECT `studentno` AS 学号,r.`subjectno` AS 科目编号,`studentresult` AS 学生成绩
FROM `result` r
INNER JOIN `subject` sb
ON r.`subjectno`=sb.`subjectno`
WHERE `subjectname` = '高等数学-3'

在这里插入图片描述

-- 方式二  子查询(由里及外)
SELECT `studentno` AS 学号,`subjectno` AS 科目编号,`studentresult` AS 学生成绩
FROM `result` 
WHERE `subjectno` =(
     SELECT `subjectno` FROM `subject`
     WHERE `subjectname` = '高等数学-3'
)

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值