联表查询

联表查询

JOIN 对比

 

  -- =============== 联表查询 join =============
  
  -- 查询参加了考试的同学(学号,姓名,科目编号,分数)
  SELECT * FROM student
  SELECT * FROM result
  
  /* 思路
  1.分析需求,分析查询的字段来自哪些表,(连接查询)
  2.确定使用哪种连接查询,7种
  确定交叉点(这两个表中哪个数据是相同的)
  判断的条件: 学生表中的 studentNo = 成绩表 studentNo
  */
  SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
  FROM student AS s
  INNER JOIN result AS r
  ON s.`studentno` = r.`studentno`
  
  
-- Right join
  SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
  FROM student s
  RIGHT JOIN result r
  ON s.`studentno` = r.`studentno`
  
-- Left join
  SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
  FROM student s
 LEFT JOIN result r
  ON s.`studentno` = r.`studentno`

 

操作描述
Inner join 如果表中至少有一个匹配,就返回行
Left join 会从左表中返回所有的值,即使右表中没有匹配
right join 会从右表中返回所有的值,即使左表中没有匹配

 

自连接(了解)

自己的表和自己的表连接,核心:一张表拆为两张一样的表即可

父类

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

子类

pidcategoryidcategoryName
3 4 数据库
2 8 办公信息
3 6 web开发
5 7 ps技术

操作:查询父类对应的子类关系

父类子类
信息技术 办公信息
软件开发 数据库
软件开发 web开发
美术设计 ps技术
-- 查询父子信息:把一张表看为两个一模一样的表 
SELECT  `categoryName` AS '父栏目',b.`categoryName` AS     `子栏目`
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.`pid`
-- 差询学员所属的年级 (学号,学生的姓名,年级名称)
SELECT studentNo,studentName,gradeName
FROM student s
INNER JOIN `grade` g
ON s.`gradeId` = g.`gradeId`

-- 查询了参加 数据库结构-1 考试的同学信息:学号,学生姓名,科目名,分数
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM student s
INNER JOIN `result` r
ON s.`studentno` = r.`studentno`
INNER JOIN `subject` sub
ON r.`subjectno` = sub.`subjectno`
WHERE subjectname = '数据库结构-1 '

 

posted @ 2022-08-09 23:03  少时凌云志  阅读(73)  评论(0)    收藏  举报