前言


接上一篇关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询,主要是关系型数据库基本数据查询。包括子查询、分组查询、聚合函数查询、模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL语法,包括虚拟表、去重复查询、组合查询、连接查询。

去重复(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;

INTERSECT(交集)

--查询T1和T2的交集
SELECT * FROM T1 INTERSECT SELECT * FROM T2;

EXCEPT(差集)

--查询T1和T2的差集
SELECT * FROM T1 EXCEPT SELECT * FROM T2;

连接查询


常用的连接查询有如下几种:

内连接(INNER JOIN):返回连接的对象都满足条件的行。

左连接(LEFT JOIN):返回左边数据所有数据,即使右边没有数据

(没有对应数据显示为NULL)。

右连接(RIGHT JOIN):返回右边数据所有数据,即使左边没有数据

(没有对应数据显示为NULL)。

全连接(FULL JOIN):返回左右交叉数据。

提示:INNER JOIN 与 JOIN 是相同的。

语法

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

数据

在上一篇关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询基础数据基础上,再增加一些数据。

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;

全连接(FULL JOIN)

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

虚拟表


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 就是虚拟表名称。

本文到这里先告一段落,后面会接着更新。

欢迎大家多多指正不足之处。

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

  1. SQL Server 不同数据间建立链接服务器进行连接查询

        在平时查询以及导数据时,经常会遇到需要使用两个数据库里数据的情况,这时就会用到在两个服务器之间建立一个链接,进行操作,脚本语句如下: 举例:例如你在测试服务器上想要查询业务库里的数据信息,此脚 ...

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

    简书作者:seay 文章出处: 关系数据库SQL之高级数据查询:去重复.组合查询.连接查询.虚拟表 回顾:[知识库]-数据库_MySQL之基本数据查询:子查询.分组查询.模糊查询 Learn [已经过 ...

  3. mysql常用基础操作语法(八)~~多表查询合并结果和内连接查询【命令行模式】

    1.使用union和union all合并两个查询结果:select 字段名 from tablename1 union select 字段名 from tablename2: 注意这个操作必须保证两 ...

  4. Mysql学习总结(24)——MySQL多表查询合并结果和内连接查询

    1.使用union和union all合并两个查询结果:select 字段名 from tablename1 union select 字段名 from tablename2: 注意这个操作必须保证两 ...

  5. MySQL 查询语句--------------进阶6:连接查询

    #进阶6:连接查询 /* 含义:多个表格连接,当查询的字段来自于多个表时候,就会用到连接查询 我觉得这里类似于excel中的vlookup函数 笛卡尔乘积现象:表1有m行,表2有n行,结果有m*n行 ...

  6. Excel 表格查找重复数据,去重复统计

    找出表格是否有重复数据: =IF(AND(G20=G19,D20=D19),"是","否") 筛选移除[重复的数据]然后开始统计 =SUBTOTAL(9,E2: ...

  7. DataTable相关操作,筛选,取前N条数据,去重复行,获取指定列数据

    #region DataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回      /// <summary>      /// Dat ...

  8. SQL学习之数据列去空格函数

    1.LTRIM()---去掉列值左边的空格  如下代码: select * from dbo.course where tno='t003' and cno='c0013'

  9. oracle sql 当初始化数据时避免重复主键

    一:当有主键序列自动增长时候(序列为:seq_cct_id) insert into cs_cost_type (CCT_ID, CCT_NAME, CCT_RATE, CCT_RATE_TYPE, ...

随机推荐

  1. C语言中的栈和堆

    原文出处<http://blog.csdn.net/xiayufeng520/article/details/45956305#t0> 栈内存由编译器分配和释放,堆内存由程序分配和释放. ...

  2. 关于object和embed

    最近发现很久之前写的demo 在FF上有兼容问题, 主要发生在如下: 由于时间太久,自己都有点搞不清怎么写的,尤其是object标签,今天查了很多资料,总结一下object标签 在网页中正常显示fla ...

  3. 跨域资源共享(CORS)在ASP.NET Web API中是如何实现的?

    在<通过扩展让ASP.NET Web API支持W3C的CORS规范>中,我们通过自定义的HttpMessageHandler自行为ASP.NET Web API实现了针对CORS的支持, ...

  4. 《JavaScript语言精粹》—— 读书总结

    话说这本书还是同学的推荐才读的,之前感觉这本书太薄了,不值得看,没想到小身材有大智慧,书中的内容总结的还是很到位的!所以就把最后几章,精华的部分整理整理. 优美的特性 函数是顶级对象 在JS中,没有块 ...

  5. 使用python拼接多张图片.二三事

    前几日在博客上看到一篇“使用python拼接多张图片”的Blog[具体是能将的图片名字必须是形如xx_1.png ... xx_100.png或者xx_001.png ... xx_100.png,拼 ...

  6. java基础-多线程执行

    package Thanqi; public class TestApple implements Runnable{ //苹果的数量 private int count = 5; //拿苹果 //s ...

  7. iOS之Core Data及其线程安全

    一.简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对 ...

  8. py2exe使用中遇到的几个问题

    问题: 在使用py2exe对所写的python脚本打包成.exe可执行程序时,遇到两个问题: 问题1: RuntimeError: maximum recursion depth exceeded w ...

  9. Android搜索框效果

    转载:http://blog.csdn.net/walker02/article/details/7917392 需求:项目中的有关搜索的地方,加上清空文字的功能,目的是为了增加用户体验,使用户删除文 ...

  10. eclipse build workspace太慢或者 js出错问题解决

    1.js文件错误解决办法 右键项目->properties->Builders(注:JavaScript Validator也会引起 build workspace太慢) 2.Eclips ...