SQL Server 一些关键字详解(二)
2015-08-19 20:20
337 查看
1.LEFT JOIN 容易让人误解的地方
背景:因为在网上搜了下 LEFT JOIN 和 OUTER APPLY 的区别,时发现,有的网友解释为:1) A left join B 的连接的记录数与A表的记录数同.
2) LEFT JOIN 左连接 -- 显示左表所有存在的记录 记录数=左表.
像这些说法都不对的.根据我测试得出的结论应该是:
LEFT JOIN 返回结果数 >= 左表的记录数
网上有部分人的解释都漏了 大于(>) 的那部分,后我找了下感觉比较权威的答案:
在W3School中的解释为:
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
在百度百科解释为:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的。换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID)。B表记录不足的地方均为NULL。
好像都没有明显的说到:当左表的数据,在右表匹配到多条记录的情况,这样就很容易让人误解.下面我做了个例子,
比如有个类别表(Category)内容如下:
/****** Object: Table [dbo].[CategoryDetail] Script Date: 08/19/2015 19:46:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[CategoryDetail]( [Id] [int] IDENTITY(1,1) NOT NULL, [CategoryId] [int] NULL, [Cry] [varchar](50) NULL, CONSTRAINT [PK_CategoryDetail] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO SET IDENTITY_INSERT [dbo].[CategoryDetail] ON INSERT [dbo].[CategoryDetail] ([Id], [CategoryId], [Cry]) VALUES (1, 1, N'喵') INSERT [dbo].[CategoryDetail] ([Id], [CategoryId], [Cry]) VALUES (2, 2, N'汪') INSERT [dbo].[CategoryDetail] ([Id], [CategoryId], [Cry]) VALUES (3, 2, N'汪汪') SET IDENTITY_INSERT [dbo].[CategoryDetail] OFF /****** Object: Table [dbo].[Category] Script Date: 08/19/2015 19:46:36 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[Category]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](50) NULL, CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO SET IDENTITY_INSERT [dbo].[Category] ON INSERT [dbo].[Category] ([Id], [Name]) VALUES (1, N'Cat') INSERT [dbo].[Category] ([Id], [Name]) VALUES (2, N'Dog') INSERT [dbo].[Category] ([Id], [Name]) VALUES (3, N'Tiger') SET IDENTITY_INSERT [dbo].[Category] OFF
View Code
相关文章推荐
- PostgreSQL Replication之第一章 理解复制概念(1)
- mysql5.6 ERROR 1045 (28000): Access denied for user (using password: NO)
- mysqlconn-ocilib
- memcached--高速存储服务
- MySQL时间戳格式化函数FROM_UNIXTIME介绍
- mysql异常Lock wait timeout exceeded; try restarting transaction
- mysql---行与列互转
- Mysql5.7新特性
- oracle之光标(游标)介绍
- oracle游标:查询并打印员工的姓名和薪水
- SQL
- ubuntu中mysql修改编码utf8
- mysql中的主从复制slave-skip-errors参数使用方法
- MongoDB学习三--MongoDB简单增删改查
- mysql information_schema
- Oracle 设置表空间自增长
- 浅析关系数据库和NoSql非关系数据库
- SQL server 在自增长的字段中插入指定值
- MongoDB分片集群环境搭建好后简单的创建和测试数据库表
- sql over开窗函数,