SQL入门经典(三) 之连接查询

上一篇介绍到查询。这一篇主要讲连接查询,将介绍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不会舍弃。
时间: 2024-12-12 12:43:59

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

SQL入门经典(十) 之事务

事务是什么?事务关键在与其原子性.原子性概念是指可以把一些事情当作一个执行单元来看待.从数据库角度看待.他是指应该全部执行或者全部不执行一条或多条语句的最小组合.当处理数据时候经常确保一件事发生另一件事也随之发生.或者二件事都不发生.实际上可能达到程度是有几十件事情或者更多的事情都必须一起发生或者都不发生.来看一个一个经典事例.这个事例各大书籍讲事务都有.就是你去银行转帐给朋友.转了100元sql如下:你的帐号扣了100元,你朋友帐号加了100元.看起来很完美.其实有个BUG存在,你的帐号被扣1

SQL总结(三)其他查询

SQL总结(三)其他查询 其他常用的SQL,在这里集合. 1.SELECT INTO 从一个表中选取数据,然后把数据插入另一个表中.常用于创建表的备份或者用于对记录进行存档. 语法: SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_tablename IN 子句可用于向另一个数据库中拷贝表. 1)备份表信息 SELECT ID,Name INTO Students_Backup FROM Stude

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

实验三    连接查询 实验名称:连接查询(2课时) 一.实验目的 理解JOIN语句的操作和基本使用方法,掌握内连接.外连接.自身连接的概念和使用. 二.实验环境 是MS SQL SERVER 2005的中文客户端. 三.实验示例 1. 查询每个学生及其选修课程的情况 SELECT  Student.*,SC.* FROM     Student,SC WHERE  Student.Sno = SC.Sno: 2.检索至少选修课程号为C2和C4的学生学号 SELECT X.S# FROM SC

Linq to sql 结合Entity Framework 的连接查询总结

最近在做项目使用linq结合EntityFramework来处理数据库的操作.想来也用了快一年了,发现有些使用技巧是需要注意下,特做下总结,希望对刚入门的朋友们有所帮助.刚开始用的时候各总循环查询子查询,结果性能差得不行,现在看看都觉得好笑.也只有写出过很烂的代码才知道怎么样的代码才是优雅的吧,哈哈.我先总结下连接查询吧,发现很多刚入门的朋友和我一样,不知道怎么用linq写类似与sql的连接查询(left join.inner join等等). 连接查询 内连接查询 linq语法如下: 1 va

SQL入门经典(一)之简介

今天是我第一天开通博客,也是我的第一篇博客.以后为大家带来第一篇关于学习技术性文章,这段时间会为大家带来是SQL入门学习.希望大家坚持读下去,因为学历有限.我也是初学者.语言表达能力不好和知识点不足,我写的不好,希望大家多多包涵.主要分享给那些想学SQL一个入门教程.主要是T-SQL语言为主.学完这些内容后你基本会数据库UDF.增删改查.存储过程.视图.规则.默认值等一些常用基本用法.高级部分现在不讨论. 结构化查询语言(Structured Query Language)简称SQL(发音:/?

SQL入门经典(六) 之视图

视图实际上就是一个存储查询,重点是可以混合和匹配来自基本表(或其他视图)的数据,从而创建在很多方面象另一个普通表那样的起的作用.可以创建一个简单的查询,仅仅从一个表(另一个视图)选择几列或几行,而忽略其他行或列,或者也可以创建一个复杂查询.连接几个表查询,使得这些连接查询看起来更像一个表. 对视图的使用往往不是过多或者就是不够-很少是正好的.学完视图应当可以使用视图达到以下的目的: 1.为终端用户减少明显的数据复杂性. 2.防止敏感列被选择,但是仍然提供对其他数据访问. 3.给数据库添加额外的索

oracle中sql语句小练习(使用连接查询)

假设A(m,n,p),B(m,n,p) --1.A表中有某一项m而B表中没有 使用左连接查询:select a.* from A a left join B b on a.m=b.m where b.m is null; 左连接查询公共部分以及A表中的全部数据,B表中该列值为null的数据即为A中存在而B中不存在的结果. --2.A表中没有某一项m而B表中有 可改为使用右连接查询: select b.* from A a right join B b on a.m=b.m where a.m i

SQL入门经典(二) 之数据库基本查询、添加、更新和删除

使用SQL查询: SQL查询基本语法: SELECT [ALL|DISTINCT]  [TOP (<expression>) [PERCENT] [WITH TIES] ] <column list> [FROM <source table(s)/view>] [WHERE <restrictive condition>] [GROUD BY<column name or expression using a column in the SELECT

sql 入门经典(第五版) Ryan Stephens 学习笔记  第四部分:建立复杂的数据库查询

第十四章: 使用子查询定义未确定的数据 1. 子查询与select 结合使用 select colum from table where column where  columnb=(select colum_name from ...); 2.   子查询与inset结合使用 insert table1 select column1 from table2 where cloumn2>(select ......); 将表二中满足条件的某几项 插入到表1 中,注: 插入的项数 = table1