zoukankan      html  css  js  c++  java
  • MySQL数据库之连接查询

    MySQL数据库之连接查询

     

    JOIN 对比

    操作符名称描述
    INNER JOIN 如果表中有至少一个匹配,则返回行
    LEFT JOIN 即使右表中没有匹配,也从左表中返回所有的行
    RIGHT JOIN 即使左表中没有匹配,也从右表中返回所有的行

    七种Join

     

    示例

    /*
    连接查询
      如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
    内连接 inner join
      查询两个表中的结果集中的交集
    外连接 outer join
      左外连接 left join
          (以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)
      右外连接 right join
          (以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)
         
    等值连接和非等值连接
    自连接
    */

    -- 查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
    SELECT * FROM student;
    SELECT * FROM result;

    /*
    思路:
    (1):分析需求,确定查询的列来源于两个类,student result,连接查询
    (2):确定使用哪种连接查询?(内连接)
    */
    SELECT s.studentno,studentname,subjectno,StudentResult
    FROM student s
    INNER JOIN result r
    ON r.studentno = s.studentno

    -- 右连接(也可实现)
    SELECT s.studentno,studentname,subjectno,StudentResult
    FROM student s
    RIGHT JOIN result r
    ON r.studentno = s.studentno

    -- 等值连接
    SELECT s.studentno,studentname,subjectno,StudentResult
    FROM student s , result r
    WHERE r.studentno = s.studentno

    -- 左连接 (查询了所有同学,不考试的也会查出来)
    SELECT s.studentno,studentname,subjectno,StudentResult
    FROM student s
    LEFT JOIN result r
    ON r.studentno = s.studentno

    -- 查缺考的同学(左连接应用场景)
    SELECT s.studentno,studentname,subjectno,StudentResult
    FROM student s
    LEFT JOIN result r
    ON r.studentno = s.studentno
    WHERE StudentResult IS NULL

    -- 查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
    SELECT s.studentno,studentname,subjectname,StudentResult
    FROM student s
    INNER JOIN result r
    ON r.studentno = s.studentno
    INNER JOIN `subject` sub
    ON sub.subjectno = r.subjectno

     

    自连接示例

    /*
    自连接
      数据表与自身进行连接

    需求:从一个包含栏目ID , 栏目名称和父栏目ID的表中
      查询父栏目名称和其他子栏目名称
    */

    -- 创建一个表
    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','办公信息');

    -- 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)
    -- 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)
    SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目'
    FROM category AS a,category AS b
    WHERE a.`categoryid`=b.`pid`

    -- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
    SELECT s.studentno,studentname,subjectname,StudentResult
    FROM student s
    INNER JOIN result r
    ON r.studentno = s.studentno
    INNER JOIN `subject` sub
    ON sub.subjectno = r.subjectno

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

    -- 查询科目及所属的年级(科目名称,年级名称)
    SELECT subjectname AS 科目名称,gradename AS 年级名称
    FROM SUBJECT sub
    INNER JOIN grade g
    ON sub.gradeid = g.gradeid

    -- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
    SELECT s.studentno,studentname,subjectname,StudentResult
    FROM student s
    INNER JOIN result r
    ON r.studentno = s.studentno
    INNER JOIN `subject` sub
    ON r.subjectno = sub.subjectno
    WHERE subjectname='数据库结构-1'
  • 相关阅读:
    JavaScript中函数和构造函数的区别
    如何使用less(变量,混合,匹配,运算,嵌套...)
    sublime text3 最常用的快捷键及插件
    ReentrantLock实现原理
    揭密FutureTask
    消息队列设计精要(转)
    漫谈MySql中的事务
    浅析Spring AOP
    理解java动态代理
    理解tomcat之搭建简易http服务器
  • 原文地址:https://www.cnblogs.com/awong18/p/13198513.html
Copyright © 2011-2022 走看看