• MySQL——联表查询


    1.1、JOIN 对比

    1.2、查询参加了考试 的同学(学号,姓名,科目编号,分数)

    思路:

    1. 分析需求,分析查询的字段来自哪些表,(连接查询)
    2. 确定使用哪种连接查询? 7种
    3. 确定交叉点(这两个表中哪个数据是相同的)
    4. 判断的条件:学生表的中 studentNo = 成绩表 studentNo
    操作 描述
    Inner join 如果表中至少有一个匹配,就返回行
    left join 会从左表中返回所有的值,即使右表中没有匹配
    right join 会从右表中返回所有的值,即使左表中没有匹配

    1.2.1、Inner Join

    SELECT s.studentNO,studentName,SubjectNo,StudentResult
    FROM student AS s
    INNER JOIN result AS r
    ON s.studentNO = r.studentNO
    

    1.2.2、Right Join

    SELECT s.studentNO,studentName,SubjectNo,StudentResult
    FROM student s
    RIGHT JOIN result r
    ON s.studentNO = r.studentNO
    

    1.2.3、Left Join

    SELECT s.studentNO,studentName,SubjectNo,StudentResult
    FROM student s
    LEFT JOIN result r
    ON s.studentNO = r.studentNO
    

    1.3、查询参加考试的同学(学号,学生姓名,科目名,分数)

    如果存在多张表关联查询思路:

    1. 我要查询哪些数据 select ...
    2. 从那几个表中查 FROM 表 XXX Join 连接的表 on 交叉条件
    3. 假设存在一种多张表查询,慢慢来,先查询两张表然后再慢慢增加
    SELECT s.studentNo,studentName,SubjectName,`StudentResult`
    FROM student s
    RIGHT JOIN result r
    ON r.studentNo = s.studentNo
    INNER JOIN `subject` sub
    ON r.SubjectNo = sub.SubjectNo
    

    效果:

    1.4、自连接

    自己的表和自己的表连接

    核心:一张表拆为两张一样的表即可,设计出Demo

    CREATE TABLE `category` (
      `categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id',
      `pid` INT(10) NOT NULL COMMENT '父id',
      `categoryName` VARCHAR(50) NOT NULL COMMENT '主题名字',
      PRIMARY KEY (`categoryid`)
    ) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
    
    INSERT INTO `category` (`categoryid`, `pid`, `categoryName`) 
    VALUES('2','1','信息技术'),
    ('3','1','软件开发'),
    ('4','3','数据库'),
    ('5','1','美术设计'),
    ('6','3','web开发'),
    ('7','5','ps技术'),
    ('8','2','办公信息');
    

    效果:

    分析:

    父类

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

    子类

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

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

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

    查询父子信息: 把一张表看为两个一模一样的表:

    SELECT a.`categoryName` AS '父栏目',b.`categoryName` AS '子栏目'
    FROM `category` AS a,`category` AS b
    WHERE a.`categoryid` = b.`pid`
    

    效果:

    1.5、联表查询的练习

    1、查询学生所属的年级

    SELECT studentNo,studentName,`GradeName`
    FROM student s
    INNER JOIN `grade` g
    ON s.`GradeID` = g.`GradeID`
    

    效果:

    2、查询科目所属的年级 (科目名称,年级名称)

    SELECT `SubjectName`,`GradeName`
    FROM `subject` sub
    INNER JOIN `grade` g
    ON sub.`GradeID` = g.`GradeID`
    

    效果:

    3、查询了参加 数据库结构-1 考试的同学信息

    -- 查询了参加 数据库结构-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'
    

    效果:

  • 相关阅读:
    如何向Android模拟器打电话发短信
    APK文件安装模拟器和ADB命令的使用
    android的个人代码总结
    android一些基础知识
    android常用的一些属性说明
    新的博客
    用字符进行布尔值判断,踩到的一个小坑
    通过outlook的web邮箱获取指定邮件内容的邮件
    使用win32com接口获取outlook收件箱的内容
    Python 详解命令行解析
  • 原文地址:https://www.cnblogs.com/godles/p/12206919.html
Copyright © 2020-2023  润新知