山那边是海 发表于 2015-1-16 14:19:22

sql中inner join, left join , right join ,full join ,cross join 的用法

BlackHole黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继innerjoin,fullouterjoin,leftjoin,rightjion
外部毗连innerjoin两表都满意的组合
fullouter全连两表不异的组合在一同,A表有,B表没有的数据(显现为null),一样B表有
A表没有的显现为(null)
A表leftjoinB表左连,以A表为基本,A表的全体数据,B表有的组合。没有的为null
A表rightjoinB表右连,以B表为基本,B表的全体数据,A表的有的组合。没有的为null

查询剖析器中实行:
--建表table1,table2:
createtabletable1(idint,namevarchar(10))
createtabletable2(idint,scoreint)
insertintotable1select1,lee
insertintotable1select2,zhang
insertintotable1select4,wang
insertintotable2select1,90
insertintotable2select2,100
insertintotable2select3,70
如表
-------------------------------------------------
table1|table2|
-------------------------------------------------
idname|idscore|
1lee|190|
2zhang|2100|
4wang|370|
-------------------------------------------------

以下均在查询剖析器中实行

1、外毗连
1.观点:包含左向外连接、右向外连接或完全内部连接

2.左毗连:leftjoin或leftouterjoin
(1)左向外连接的了局集包含LEFTOUTER子句中指定的左表的一切行,而不单单是连接列所婚配的行。假如左表的某行在右表中没有婚配行,则在相干联的了局集行中右表的一切选择列表列均为空值(null)。
(2)sql语句
select*fromtable1leftjointable2ontable1.id=table2.id
-------------了局-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
------------------------------
正文:包括table1的一切子句,依据指定前提前往table2响应的字段,不切合的以null显现

3.右毗连:rightjoin或rightouterjoin
(1)右向外连接是左向外连接的反向连接。将前往右表的一切行。假如右表的某行在左表中没有婚配行,则将为左表前往空值。
(2)sql语句
select*fromtable1rightjointable2ontable1.id=table2.id
-------------了局-------------
idnameidscore
------------------------------
1lee190
2zhang2100
NULLNULL370
------------------------------
正文:包括table2的一切子句,依据指定前提前往table1响应的字段,不切合的以null显现

4.完全内部连接:fulljoin或fullouterjoin
(1)完全内部连接前往左表和右表中的一切行。当某行在另外一个表中没有婚配行时,则另外一个表的选择列表列包括空值。假如表之间有婚配行,则全部了局集行包括基表的数据值。
(2)sql语句
select*fromtable1fulljointable2ontable1.id=table2.id
-------------了局-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
NULLNULL370
------------------------------
正文:前往摆布毗连的和(见上左、右毗连)

2、内毗连
1.观点:内连接是用对照运算符对照要连接列的值的连接

2.内毗连:join或innerjoin

3.sql语句
select*fromtable1jointable2ontable1.id=table2.id
-------------了局-------------
idnameidscore
------------------------------
1lee190
2zhang2100
------------------------------
正文:只前往切合前提的table1和table2的列

4.等价(与以下实行效果不异)
A:selecta.*,b.*fromtable1a,table2bwherea.id=b.id
B:select*fromtable1crossjointable2wheretable1.id=table2.id(注:crossjoin后加前提只能用where,不克不及用on)

3、交织毗连(完整)

1.观点:没有WHERE子句的交织连接将发生连接所触及的表的笛卡尔积。第一个表的行数乘以第二个表的行数即是笛卡尔积了局集的巨细。(table1和table2交织毗连发生3*3=9笔记录)

2.交织毗连:crossjoin(不带前提where...)

3.sql语句
select*fromtable1crossjointable2
-------------了局-------------
idnameidscore
------------------------------
1lee190
2zhang190
4wang190
1lee2100
2zhang2100
4wang2100
1lee370
2zhang370
4wang370
------------------------------
正文:前往3*3=9笔记录,即笛卡尔积

4.等价(与以下实行效果不异)
A:select*fromtable1,table2
如果WHERE子句的查询条件里使用比较操作符LIKE和REGEXP,MySQL只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说,如果查询条件是LIKEabc%‘,MySQL将使用索引;如果查询条件是LIKE%abc’,MySQL将不使用索引。

小魔女 发表于 2015-1-18 12:53:18

一个是把SQL语句写到客户端,可以使用DataSet进行加工;

再现理想 发表于 2015-1-26 17:58:20

groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。

活着的死人 发表于 2015-2-4 20:54:29

语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!

灵魂腐蚀 发表于 2015-2-10 10:26:15

以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了

老尸 发表于 2015-3-1 10:45:42

财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..

飘飘悠悠 发表于 2015-3-10 17:31:23

另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);

金色的骷髅 发表于 2015-3-17 09:24:27

sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西

愤怒的大鸟 发表于 2015-3-24 06:05:42

大家注意一点。如下面的例子:
页: [1]
查看完整版本: sql中inner join, left join , right join ,full join ,cross join 的用法