金典 SQL笔记(7)

附上文本方便拷贝

page247-表连接269
--表连接
--建表及测试数据
--T_Customer 客户信息表
--T_OrderType 订单类型
--T_Order  订单信息
CREATE TABLE T_Customer(Fid INT NOT NULL,FName VARCHAR(20 ) NOT NULL,
Fage INT, PRIMARY KEY (Fid))

CREATE TABLE T_Order(Fid INT NOT NULL,FNumber VARCHAR(20 ) NOT NULL
,FPrice NUMERIC (10, 2),FCustomerId INT,FTypeId INT,PRIMARY KEY( Fid))

CREATE TABLE T_OrderType(Fid INT NOT NULL,FName VARCHAR(20 ) NOT NULL
,PRIMARY KEY(Fid ))

INSERT INTO T_Customer(Fid ,FName, Fage)
VALUES(1 ,'Tom', 21)
INSERT INTO T_Customer(Fid ,FName, Fage)
VALUES(2 ,'MIKE', 24)
INSERT INTO T_Customer(Fid ,FName, Fage)
VALUES(3 ,'JACK', 30)
INSERT INTO T_Customer(Fid ,FName, Fage)
VALUES(4 ,'Tom', 25)
INSERT INTO T_Customer(Fid ,FName, Fage)
VALUES(5 ,'LINDA',NULL)

INSERT INTO T_OrderType(Fid ,FName)
VALUES(1 ,'MarketCrder')
INSERT INTO T_OrderType(Fid ,FName)
VALUES(2 ,'LimitOrder')
INSERT INTO T_OrderType(Fid ,FName)
VALUES(3 ,'Stop Order')
INSERT INTO T_OrderType(Fid ,FName)
VALUES(4 ,'StopLimit Order')

INSERT INTO T_Order(Fid ,FNumber, FPrice,FCustomerId ,FTypeId)
VALUES(1 ,'K001', 100,1 ,1)
INSERT INTO T_Order(Fid ,FNumber, FPrice,FCustomerId ,FTypeId)
VALUES(2 ,'K002', 200,1 ,1)
INSERT INTO T_Order(Fid ,FNumber, FPrice,FCustomerId ,FTypeId)
VALUES(3 ,'T003', 300,1 ,1)
INSERT INTO T_Order(Fid ,FNumber, FPrice,FCustomerId ,FTypeId)
VALUES(4 ,'N002', 100,2 ,2)
INSERT INTO T_Order(Fid ,FNumber, FPrice,FCustomerId ,FTypeId)
VALUES(5 ,'N003', 500,3 ,4)
INSERT INTO T_Order(Fid ,FNumber, FPrice,FCustomerId ,FTypeId)
VALUES(6 ,'T001', 300,4 ,3)
INSERT INTO T_Order(Fid ,FNumber, FPrice,FCustomerId ,FTypeId)
VALUES(7 ,'T002', 100,NULL,1 )

--JOIN关键字将一个或者多个表按照彼此间的关系连接为一个结果集
--inner join 内连接组合俩张表,并且基于俩张表的关联来联系他们
--使用内连接需要指表中哪些字段成关联关系 ,并且需要指定基于什么
--条件进行连接内连接语法 inner join  table_name  on condition
--大多数系统中,inner join中的 inner是可选的,inner join 是默认的链接方式
SELECT * FROM T_Order
SELECT * FROM T_Customer
select * FROM T_Order INNER JOIN T_Customer
ON T_Customer. Fid = T_Order .Fid

--在使用表连接的时候,可以不局限于只连俩张表 ,因为在很情况下需要
--连接许多表
SELECT * FROM T_Order
SELECT o. Fid, o .FNumber, o.FPrice ,c. FName, ot .FName
from T_Order AS o INNER JOIN T_Customer AS c
ON o. FCustomerId = c .Fid
INNER JOIN T_OrderType AS ot
ON o. FTypeId = ot .Fid

--不等值连接
--上面演示的在on后面设置某字段必须等于另一个表中的字段
--除了等值连接,还存在一种不等值连接也就是在连接的条件中可以使用
--小于(<) 、大于(>)、不等于 (<>)等于运算, 而且还可以使用 like
--,between and等甚至还可以使用函数
SELECT o. Fid, o .FNumber, o.FPrice ,c. FName
from T_Order AS o INNER JOIN T_Customer AS c
ON o. FPrice < c .Fage * 5
--在可以在等值连接后面添加 and  来添加限制
AND o. FCustomerId = c .Fid

--交叉连接
--与内连接比起来,交叉连接非常简单 ,因为它不存ON子句
--交叉连接会将涉及到的所有记录都包含在结果集中可以采用俩种方式
--来定义交叉连接,分别是隐私连接和显示的连接
SELECT * FROM T_Order --7条数据
SELECT * FROM T_Customer --5条数据
SELECT * FROM T_Customer ,T_Order--35 条数据= 7*5
SELECT * FROM T_Customer
CROSS JOIN T_Order --显示连接 ;隐式连接默认忽略CROSS JOIN

--自连接
--上面讲的都是在不同数据表之间进行的 ,其实参与连接的表完全可以是
--同一张表, 也就是表与其自身的连接 ,这样的连接就被称为自连接
SELECT t1.*, t2.* FROM T_Customer  t1 INNER JOIN
T_Customer AS t2 ON t2. Fid = t1 .Fid

--外部连接
--左外部连接left outer join  右外部连接 right outer join
--全外部连接full outer join
--外部连接的语法和内部连接几乎一样 ,主要区别就是对于空值的处理
--外部连接不需要俩个表具有匹配记录 ,这样可以指定某个表中的记录总是放
--到结果集中

--左外部连接以左表为基准去匹配数据 ,将左表的数据放到结果集中 ,
--无论是否在右表中存在匹配记录
--,能匹配到则显示,不能匹配则显示为 NULL
SELECT * FROM T_Order --7条数据
SELECT * FROM T_Customer --5条数据
select o. FNumber, o .FPrice, o.FCustomerId , c. FName, c .Fage
  FROM T_Order AS o LEFT OUTER JOIN T_Customer AS c
ON o. FCustomerId =c .Fid

--右外部连接以右表为基准去匹配数据 ,将右表的数据放到结果集中 ,
--无论是否在左表中存在匹配记录
--,能匹配到则显示,不能匹配则显示为 NULL
SELECT * FROM T_Order --7条数据
SELECT * FROM T_Customer --5条数据
select o. FNumber, o .FPrice, o.FCustomerId , c. FName, c .Fage
  FROM T_Order AS o RIGHT OUTER JOIN T_Customer AS c
ON o. FCustomerId =c .Fid

--全外部连接
--几乎所有的数据库都支持左外部连接和右外部连接 ,但是全外部连接
--则不是所有数据库都支持的 ,诸如MYsql.
--全外部连接是左外部连接和右外部连接的合集 ,因为即使在右表中不存
--在匹配连接条件的数据,左表中的所有记录也将被放到结果集中 ,同样
--左表中不存在匹配记录,右表中的所有记录也将被放到结果集中
select o. FNumber, o .FPrice, o.FCustomerId , c. FName, c .Fage
  FROM T_Order AS o Full OUTER JOIN T_Customer AS c
ON o. FCustomerId =c .Fid

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 08:27:35

金典 SQL笔记(7)的相关文章

金典 SQL笔记(6)

page223-索引 --利用SQL 语句创建索引 --CREATE INDEX 索引名称on 表名(字段 ,字段, 字段字段n) --索引名称必须为唯一的,字段 ,字段, 同意一个到多个 --范例为T_person 表中给FName创建索引索引名为 idx_person_name CREATE INDEX idx_person_name ON T_Person (FName) --删除索引 --drop index 表名索引名 DROP INDEX T_person.idx_person_na

金典 SQL笔记(3)

由于在本地笔记上写的.CSDN markdown编辑器仅仅支持.md格式导入, 图片没办法直接导进去.写的多了懒的一张一张图片切图上传; 直接整个文章切成图片上传上去了.

金典 SQL笔记(8)

------------------------文本方便拷贝------------------------ page269-301子查询 --子查询 --SQL允许将一个查询语句作为一个结果集供其他 SQL语句使用, 就像使用 --普通的表一样,被当做结果集的查询语句被称为子查询 --所有可以使用表的地方都可以使用子查询 ,比如select * from T --上面的T 就可以用子查询来代替 select * from (select * from T2 where --age >= 30)

金典 SQL笔记(1)

page(1-75) 主键最好是无意义的字段便于以后扩展. PS:假设以标书编码为主键,以后标书编码填错需要改的时候,关联表都需要跟着改.如果是一个无意义的自增字段是主键就无此原因. 主键最好不要设置为联合主键,否则降低效率,不利于扩展 PS:原文[联合主键可以解决表中没有唯一主键的问题,不过联合主键有如下缺点:] 1.效率低.在进行数据的添加.删除.查找及更新的时候,数据库系统必须处理俩个字段,这样大大降低了数据的处理速度. 2.使数据库的结构设计变得槽糕.组成联合主键的字段通常都是有业务含义

金典 SQL笔记(9)

page301-354其它解决方式 ---开窗函数 --測试数据及表 USE [NB] GO /****** 对象: Table [dbo].[T_Person2] 脚本日期: 08/14/2015 11:24:46 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[T_Person3] ( [FName] [varchar] (20) NULL,

金典 SQL笔记 SQL语句汇总

SELECT * FROM (SELECT ROW_NUMBER() OVER ( ORDER BY id) AS rowN,FNumber, FName,FSalary ,Fage FROM dbo. T_Employee) AS a WHERE a. rowN >=3 AND a. rowN <=5 SELECT distinct CREATEDate,state FROM dbo .TwodimensionalcodeHistory SELECT * FROM Twodimensiona

金典 SQL笔记(2)

因为在本地笔记上写的.CSDN markdown编辑器只支持.md格式导入, 图片没办法直接导进去.写的多了懒的一张一张图片切图上传; 直接整个文章切成图片上传上去了. 版权声明:本文为博主原创文章,未经博主允许不得转载.

金典 SQL笔记(4)

因为在本地笔记上写的.CSDN markdown编辑器只支持.md格式导入, 图片没办法直接导进去.写的多了懒的一张一张图片切图上传; 直接整个文章切成图片上传上去了. 版权声明:本文为博主原创文章,未经博主允许不得转载.

金典 SQL笔记(5)

版权声明:本文为博主原创文章,未经博主允许不得转载.