sq lserver数据库操作--连表查询
2015-12-22 14:11
337 查看
前端时间突然忙了,于是就耽搁了一段时间,迟迟没能及时将所学的、看的记录归档。今天空闲了,在群里聊天也没了意思。于是就把这几天接触的关于数据库方面的知识做一个记录,这也是有个朋友问过我的知识点吧。
我们都知道,数据库的连表查询无非就是join和union(当然也有通过子查询实现连表查询的效果的,但这个效率很低),而就join来说,又分为left (out) join(左连接、左外链接),right (out) join(右连接、右外链接),full join(全外连接),inner join(内连接),它们四者有何区别呢?区别在于参照上。
左外链接,以左表为参照,右边表中没有的记录取null,右边重复的记录,则总的查询记录中就重复存在。
右外链接,以右表为参照,左边表中没有的记录取null,左边重复的记录,则总的查询记录中就重复存在。
完整外部连接,返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
内连接,使用比较运算符根据每个表共有的列的值匹配两个表中的行。
举个例子如下:
A表: B表:
---------------------------------------------------------- ---------------------------------------------------------------
id name id aid
1 name1 1 1
2 name1 2 1
3 name1 3 null
---------------------------------------------------------------------------------------------------------------------------------------
左连接:select A.id,A.name,B.id,B.aid from A a left out join B b on a.id=b.aid
结果:
-----------------------------------------------
a.id a.name b.id b.aid
1 name1 1 1
1 name1 2 1
2 name2 null null
3 name3 null null
右连接:select A.id,A.name,B.id,B.aid from A a right out join B b on a.id=b.aid
结果:
-----------------------------------------------
a.id a.name b.id b.aid
1 name1 1 1
1 name1 2 1
null null 3 null
全连接:select A.id,A.name,B.id,B.aid from A a full out join B b on a.id=b.aid
结果:
-----------------------------------------------
a.id a.name b.id b.aid
1 name1 1 1
1 name1 2 1
2 name2 null null
3 name3 null null
null null 3 null
内连接:select A.id,A.name,B.id,B.aid from A a inner join B b on a.id=b.aid
结果:
-----------------------------------------------
a.id a.name b.id b.aid
1 name1 1 1
1 name1 2 1
union可以取得两个表的交集,又分为union和union all,区别是,前者会去除重复的条目,后者会仍旧保留。做union链接的表的字段必须相同。
我们都知道,数据库的连表查询无非就是join和union(当然也有通过子查询实现连表查询的效果的,但这个效率很低),而就join来说,又分为left (out) join(左连接、左外链接),right (out) join(右连接、右外链接),full join(全外连接),inner join(内连接),它们四者有何区别呢?区别在于参照上。
左外链接,以左表为参照,右边表中没有的记录取null,右边重复的记录,则总的查询记录中就重复存在。
右外链接,以右表为参照,左边表中没有的记录取null,左边重复的记录,则总的查询记录中就重复存在。
完整外部连接,返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
内连接,使用比较运算符根据每个表共有的列的值匹配两个表中的行。
举个例子如下:
A表: B表:
---------------------------------------------------------- ---------------------------------------------------------------
id name id aid
1 name1 1 1
2 name1 2 1
3 name1 3 null
---------------------------------------------------------------------------------------------------------------------------------------
左连接:select A.id,A.name,B.id,B.aid from A a left out join B b on a.id=b.aid
结果:
-----------------------------------------------
a.id a.name b.id b.aid
1 name1 1 1
1 name1 2 1
2 name2 null null
3 name3 null null
右连接:select A.id,A.name,B.id,B.aid from A a right out join B b on a.id=b.aid
结果:
-----------------------------------------------
a.id a.name b.id b.aid
1 name1 1 1
1 name1 2 1
null null 3 null
全连接:select A.id,A.name,B.id,B.aid from A a full out join B b on a.id=b.aid
结果:
-----------------------------------------------
a.id a.name b.id b.aid
1 name1 1 1
1 name1 2 1
2 name2 null null
3 name3 null null
null null 3 null
内连接:select A.id,A.name,B.id,B.aid from A a inner join B b on a.id=b.aid
结果:
-----------------------------------------------
a.id a.name b.id b.aid
1 name1 1 1
1 name1 2 1
union可以取得两个表的交集,又分为union和union all,区别是,前者会去除重复的条目,后者会仍旧保留。做union链接的表的字段必须相同。
相关文章推荐
- MySQL用户权限管理
- 数据库性能测试方案示例
- MYSQL SELECT 过程 转
- MYSQL SELECT 过程 转
- SQL 执行顺序
- 数据库性能指标 2005-04-06 19:36:14(转载)
- sql 中延迟执行
- Mybatis3源码分析(16)-Sql解析执行-结果集映射(ResultSetHandler)
- 如何进行 Oracle 10g RAC关闭及启动
- 常用 SQL语句
- 定时监视redis,自动重启redsi服务
- 使用mysql库连接mysql
- memcache的内存分配机制
- ucenter info:can not connect to MySQL server解决办法
- PostgreSQL安装详细步骤(windows)
- mongodb 索引建立问题
- oracle 9i相关问题
- MySQL5.7更改密码时出现ERROR 1054 (42S22): Unknown column 'password' in 'field list'
- oracle 查看锁死的表,锁死的进程
- Mybatis3源码分析(15)-Sql解析执行-Statement初始化和参数设置