• 【知识库】-数据库_MySQL之高级数据查询:去重复、组合查询、连接查询、虚拟表


      

      简书作者:seay

      文章出处: 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表

      回顾:【知识库】-数据库_MySQL之基本数据查询:子查询、分组查询、模糊查询

      Learn  [已经过测试校验]

        一、去重复(DISTINCT)

        二、组合查询

        三、UNION(并集)

        四、连接查询

        五、虚拟表

    一、去重复(DISTINCT)

      DISTINCT:用于返回唯一不同的值,主要是用于某一字段

      语法

    SELECT DISTINCT <列名>|* FROM <表名>

      示例

    -- 查询所有班级名称
    SELECT DISTINCT Class FROM Students

      

    二、组合查询

      SQL组合查询可以使用以下关键字进行操作:

    • UNION(并集):比较两个查询的结果,返回两个集合所有非重复行。
    • INTERSECT(交集):比较两个查询的结果,返回由左右双侧输入查询输出的非重复行。
    • EXCEPT(差集):比较两个查询的结果,返回左侧查询集合中不包含左右集合交集部分的非重复行。
    • 注意:
      使用 EXCEPT 或 INTERSECT 的两个查询的结果集组合起来的基本规则:
      所有查询中的列数和列的顺序必须相同;数据类型必须兼容。

      语法
    [SQL查询表达式1]
      UNION | INTERSECT | EXCEPT
    [SQL查询表达式2];

      基础数据

    -- 创建数据表T1
    CREATE TABLE T1(
        A int NULL,
        B int NULL,
        C int NULL
    );
    -- 创建数据表T2
    CREATE TABLE T2(
        A int NULL,
        B int NULL,
        C int NULL
    );
    -- 插入基础数据
    INSERT INTO T1 VALUES(1,2,3);
    INSERT INTO T1 VALUES(2,3,4);
    INSERT INTO T1 VALUES(3,4,5);
    INSERT INTO T1 VALUES(4,5,6);
    INSERT INTO T1 VALUES(5,6,7);
    INSERT INTO T2 VALUES(3,4,5);
    INSERT INTO T2 VALUES(5,6,7);
    INSERT INTO T2 VALUES(6,7,8);
    INSERT INTO T2 VALUES(7,8,9);

    三、UNION(并集)

      示例1(去重复)

    --查询T1和T2的所有数据,去重复
    SELECT * FROM T1 UNION SELECT * FROM T2;

      

      

      示例2(不去重复)

    --查询T1和T2的所有数据,不去重复,在UNION关键字后面加上ALL
    SELECT * FROM T1 UNION ALL SELECT * FROM T2;

      

      MySQL中没有实现INTERSECT(交集)和EXCEPT(差集)

    四、连接查询

      常用的连接查询有如下几种:
      内连接(INNER JOIN):返回连接的对象都满足条件的行。
      左连接(LEFT JOIN):返回左边数据所有数据,即使右边没有数据  (没有对应数据显示为NULL)。
      右连接(RIGHT JOIN):返回右边数据所有数据,即使左边没有数据  (没有对应数据显示为NULL)。
      全连接(FULL JOIN):返回左右交叉数据。
      提示:INNER JOIN 与 JOIN 是相同的。

      语法

    SELECT 字段列表 FROM <数据表|视图> INNER JOIN <数据表|视图> ON 条件表达式; 

      数据

      在上一篇【知识库】-数据库_MySQL之基本数据查询:子查询、分组查询、模糊查询基础数据基础上,再增加一些数据。

    INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,Address) 
    VALUES(2016010,'小夏','一班','',19,'18817716689','沈阳');
    INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,Address) 
    VALUES(2016011,'倪妮','二班','',20,'18817716698','北京');
    
    INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016012,1,90,1);
    INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016012,2,86,1);
    INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016012,3,79,1);

      

      内连接(INNER JOIN)

    --查询成绩表并显示课程名称
    SELECT S.Id,S.SId,C.Name,S.Grades,S.IsPassed
     FROM Scores S INNER JOIN Courses C ON S.CId=C.Id;

      

    左连接(LEFT JOIN)

    --查询学生信息成绩表
    SELECT * FROM Students ST LEFT JOIN Scores S ON ST.Id=S.SId;

      

      

    右连接(RIGHT JOIN)

    --查询学生信息成绩表
    SELECT * FROM Students ST RIGHT JOIN Scores S ON ST.Id=S.SId;

      

       MySQL中不支持全连接(FULL JOIN)

    五、虚拟表

      SQL虚拟表是通过SELECT查询语句返回的一个结果集。
      当虚拟表构建出来后,可以直接当作实际数据表一样查询操作,在实际使用中会经常使用到。

      语法

    SELECT 字段列表1 FROM
      (SELECT 字段列表2 FROM <表名> [WHERE子句]) <虚拟表名称> 
    [WHERE子句]

      示例

    SELECT * FROM ( SELECT S.Id,S.Name CName,S.Grades,S.IsPassed,S.SId,ST.Name,ST.Class 
    FROM Students ST LEFT JOIN (SELECT Scores.*,C.Name FROM
     Scores LEFT JOIN Courses C ON Scores.CId=C.Id) S ON ST.Id=S.SId ) T

      

      【示例中的SELECT Scores.*,C.Name FROMScores LEFT JOIN Courses C ON Scores.CId=C.Id中 C 和最后面 T 就是虚拟表名称。】

  • 相关阅读:
    ps cc 2018安装
    eclipse 快速添加 set , get 方法
    电脑设置以太网
    C# 获取web.config配置文件内容
    C# @Page指令中的AutoEventWireup,CodeBehind,Inherits
    未能正确加载“Microsoft.VisualStudio.Implementation.EditorPackage”包
    C# 实现MD5加密
    mutex 简单介绍
    select @@IDENTITY
    C# vs2012创建报表
  • 原文地址:https://www.cnblogs.com/1138720556Gary/p/11221330.html
Copyright © 2020-2023  润新知