上一篇介绍到查询。这一篇主要讲连接查询,将介绍INNER JOIN,OUTER JOIN(LEFT和RIGHT),FULL JOIN,CROSS JOIN。

连接顾名斯义就是把多个数据表数据合并到一个结果集。

用内部连接检索匹配的数据(inner join)

连接结构语法如下:SELECT <column list> FROM <first table>  <join_type> <last table> [ON <join condition>]

接着上面的。经理又有了新需求。要求你查看每个商品的订单日期,先看下面的3条需求代码:

select p.ProductID,p.Name,o.UnitPrice,o.OrderQty,o.ModifiedDate FROM Production.Product AS p inner join Sales.SalesOrderDetail AS o ON p.ProductID=o.ProductID --查询到121317条数据集

select p.*,o.UnitPrice,o.OrderQty,o.ModifiedDate FROM Production.Product AS p inner join Sales.SalesOrderDetail AS o ON p.ProductID=o.ProductID  -- --查询到121317条数据集(注意看,下面p.*不同。*表示所有列。p表示p的所有列别查询出来

select ProductID,o.UnitPrice,o.OrderQty,o.ModifiedDate FROM Production.Product AS p inner join Sales.SalesOrderDetail AS o ON p.ProductID=o.ProductID

--(无法查询到,运行出现问题:返回了“消息 209,级别 16,状态 1,第 1 行 列名 'ProductID' 不明确。“的错误信息,因为SQL不知道ProductID是那个表的列)

先看2个数据表数据(主要讲解外部连接和全连接)

Order
 ID                        Name                      Contact         
1 test3  null
2      test4 1
3   test5 5
4 test 6 2
   Contact  
ID Name      
1 test1
2    test2  
3 test3  
4   test4

使用外部检索更多数据(outer join)。

外部连接很少用于实际开发。大家也要理解外部连接。

外部连接基本语法和内部连接差不多:SELECT <select column>  FROM <the table you want  to be the left table>  <LEFT|RIGHT>[OUTER] JOIN <table you want  to be the right table  >[ON ] <join condition> OUTER可以简写掉。为了遵循ISO标准化代码所以加上了

SELECT o.*,c.* FROM  Order as o inner join Contact AS c on c.id=o.Contact --inner查询只有2条结果。

SELECT o.*,c.* FROM  Order as o left join Contact AS c on c.id=o.Contact --left查询只有4条结果,有2条结果C.ID和C.Name 为NULL,数据没有匹配到所以null。

SELECT o.*,c.* FROM  Order as o right join Contact AS c on c.id=o.Contact --right查询只有4条结果,有2条结果o.ID和o.Name,o.Contact 为NULL,数据没有匹配到所以null。

外部连接主要检索孤立数据多

 完全连接(full join)

外部连接几乎很少使用,只要理解这个概念就知道。顾名思义就完全连接就是left和right联合查询。返回2个表的所有数据。没有匹配到值就NULL代替。先看外部连接SQL语句

SELECT o.*,c.* FROM Order AS o FULL JOIN Contact as c ON C.ID=O.Contact-- 共查询到6条数据(按理说应该是4+4=8条数据,因为中间有2条数据匹配到了,所有6条了)

交叉连接(CROSS JOIN)

交叉连接又称笛卡尔连接。这个用的更少,主要用于测试大量数据。打个比方。有2个表。一个是保存姓有100个姓,一个保存名有1000个名。我要100000个姓名。就使用交叉连接了。继续接着上面的那个表。

SELECT o.*,c.* FROM Order AS o CROSS JOIN Contact as c  --就会产生16条数据。数据量有点大就不贴了。

在SQL2000的早期语法。虽然现在不在使用了。现在sql2012版本不在兼容了。碰见也要记得早期语法。

内部连接:SELECT * from Order,Contact where Order.Contact=Contact.ID;用,代替inner join 和where 代替on。

外部连接:SELECT * from Order,Contact where Order.Contact*=Contact.ID;用,代替(left|right) join 和where 代替on,后面条件(*=左连接,=*右连接)

交叉连接:SELECT *from Order,Contact;去掉CROSS JOIN 就可以关键词添加一个,

联合(union)

接着上面表:相对来说比较简单,就是2个表数据合并成一个表(注意2个表数据结构和数据列一样才能UNION)

select ID,Name FORM Contact
UNION (all)
select ID,Name FORM Order
--all是可选参数。如果没有all,2条结果集有重合数据就舍弃取一条,加上all不会舍弃。

SQL入门经典(三) 之连接查询的更多相关文章

  1. 学习如何看懂SQL Server执行计划(三)——连接查询篇

    三.连接查询部分 --------------------嵌套循环-------------------- /* UserInfo表数据少.Coupon表数据多嵌套循环可以理解为就是两层For循环,外 ...

  2. SQL入门经典(十) 之事务

    事务是什么?事务关键在与其原子性.原子性概念是指可以把一些事情当作一个执行单元来看待.从数据库角度看待.他是指应该全部执行或者全部不执行一条或多条语句的最小组合.当处理数据时候经常确保一件事发生另一件 ...

  3. SQL总结(三)其他查询

    SQL总结(三)其他查询 其他常用的SQL,在这里集合. 1.SELECT INTO 从一个表中选取数据,然后把数据插入另一个表中.常用于创建表的备份或者用于对记录进行存档. 语法: SELECT c ...

  4. MyBatis基础入门《三》Select查询集合

    MyBatis基础入门<三>Select查询集合 描述: 代码新增了一个MybatisUtil工具类,查询数据库返回集合的时候,接收数据的三种方式.由于代码会渐渐增多,未涉及改动过的文件不 ...

  5. 《SQL入门经典》总结

    <SQL入门经典>这本书从考试前就开了个头,一直到前两天才看完,拉的战线也够长的.放假来了,基本上什么内容都不记得了.好不容易看完了,就赶紧总结一下吧! 该书分为两大部分,第一部分是第1~ ...

  6. SQL入门经典(一)之简介

    今天是我第一天开通博客,也是我的第一篇博客.以后为大家带来第一篇关于学习技术性文章,这段时间会为大家带来是SQL入门学习.希望大家坚持读下去,因为学历有限.我也是初学者.语言表达能力不好和知识点不足, ...

  7. MySQL数据库实验三:连接查询

    实验三    连接查询 实验名称:连接查询(2课时) 一.实验目的 理解JOIN语句的操作和基本使用方法,掌握内连接.外连接.自身连接的概念和使用. 二.实验环境 是MS SQL SERVER 200 ...

  8. SQL入门经典(六) 之视图

    视图实际上就是一个存储查询,重点是可以混合和匹配来自基本表(或其他视图)的数据,从而创建在很多方面象另一个普通表那样的起的作用.可以创建一个简单的查询,仅仅从一个表(另一个视图)选择几列或几行,而忽略 ...

  9. sql server 实现多表连接查询

    项目中要实现多表查询,用外连接实现. a表 a(aid,aname) 其中aid为pk b表 b(aid,bname,aid) 其中 bid为pk,aid为fk c表 c(cid,cname,aid) ...

随机推荐

  1. 使用WebDriver遇到的那些坑

    在做web项目的自动化端到端测试时主要使用的是Selenium WebDriver来驱动浏览器.Selenium WebDriver的优点是支持的语言多,支持的浏览器多.主流的浏览器Chrome.Fi ...

  2. winform 异步读取数据 小实例

    这几天对突然对委托事件,异步编程产生了兴趣,大量阅读前辈们的代码后自己总结了一下. 主要是实现 DataTable的导入导出,当然可以模拟从数据库读取大量数据,这可能需要一定的时间,然后 再把数据导入 ...

  3. cv_prj2

    Computer Vision Project 2 – Harris Corner Detector 姓名: 王兴路 学号: 3140102282 指导老师: 宋明黎 2016-12-16 19:30 ...

  4. rsync排除文件同步

    排除扩展名为log的文件 rsync -ave ssh --exclude '*.log' root@192.168.168.188:/website/abc.com/* /website/abc.c ...

  5. MySql之安装配置

    1.解压Mysql.zip后,添加bin目录的环境变量 2.配置my.ini文件中的 # basedir =D:\mysql-5.6.24-winx64 # datadir = D:\mysql-5. ...

  6. node学习笔记(四)

    //Node.js标准库提供了http模块,其中封装了一个高效的http服务器和一个简易的http客户端 //http.Server是一个基于事件的HTTP服务器,它的核心由Node.js下层c++部 ...

  7. 一行css代码调试中学到的javascript知识,很有意思

    现在到处都是JavaScript,每天都能知道点新东西.一旦你入了门,你总能从这里或是那里领悟到很多知识.今天我想分享Addy Osmani的一行代码 ,这行代码对于你调试你的CSS是很有用的.为了可 ...

  8. ubuntu安装goldendict以及添加本地词典和在线词典

    软件在ubuntu软件中心安装就可以了, 关于网络词典, 推荐有道在线词典,网址http://dict.youdao.com/search?q=%GDWORD%&ue=utf8 添加方法:编辑 ...

  9. 使用html2canvas实现批量生成条形码

    /*前台代码*/ <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Generat ...

  10. 解决拖拽有内容的div的bug和兼容问题

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; color: #2b7ec3 } p.p2 { margin: 0.0px ...