My SQL数据库实用技术(16)
时间:2007-12-23 来源:不详 作者:迈克DB
子句来将结果集减少为易于治理的大小。
假如在WHERE 子句中增加一个条件使各表在某些列上进行匹配,此连接就是所谓的等同连接(e q u i - j o i n),因为只选择那些在指定列中具有相等的值的行。如:
J O I N、CROSS JOIN 和INNER JOIN 连接类型都与“,”连接操作符意义相同。STRAIGHT_JOIN 与全连接类似,但各表按FROM 子句中指定的次序进行连接。一般情况下,在全连接中MySQL 优化程序自身完全不考虑安排各表的顺序,以便使记录的检索更快。在有的场合,优化程序将作出非优化的选择,这样将忽略STRAIGHT_JOIN 要害字。在SELECT 语句中,可在两个位置给出S T R A I G H T _ J O I N。一个位置是在SELECT 要害字与选择列表之间,将其放在这里对语句中所有全连接具有整体作用。另一个在FROM 子句中。下面两条语句是等价的:
限定列引用
SELECT 语句中列的引用必须对FROM 子句中指定的每个表是无歧义的。假如FROM 子句中仅指定了一个表,则无歧义存在,因为所有列必须是该表的列。假如指定了多个表,只出现在一个表中的列名也是无歧义的。但是,假如某个列名出现在多个表中,该列的引用必须用表名来限定,用tbl_name.col_name 语法来表明所指的是哪个表。假如表my_tbl1 含有列a 和b,表my_tbl2 含有列b 和c,则列a 和c 的引用是无歧义的,但b 的引用必须限定为my_tbl1.b 或m y _ t b l 2 . b,如:
本文来自织梦
有时,表名限定符还不能解决列的引用问题。例如,假如在一个查询中多次使用一个表,用表名限定列名没有什么用处。在此情况下,为表达您的想法可使用别名。给表指派一个别名,利用这个别名来引用列,其语法为: alias _ name.col _ name。下面的查询将表与
自身进行连接,给表指派了一个别名,以便应付引用列时有歧义的情况:
3.6.3 左连接
等价连接只给出两个表匹配的行。左连接也给出匹配行,但它还显示左边表中有的但在右边表中无匹配的行。对于这样的行,从右边表中选择的列都显示为N U L L。这样,每一行都从左边表中选出。假如右边表中有一个匹配行,则该行被选中。假如不匹配,行仍然被选中,但它是一个“假”行,其中所有列被设置为N U L L。换句话说,LEFT JOIN 强制结果集包含对应左边表中每一行的行,而不管左边表中的行在右边表中是否有匹配的行。匹配是根据ON 或USING( ) 子句中给出的列进行的。不管所连接的列是否具有相同的名称,都可使用ON。如:
本文来自织梦
USING( ) 子句类似于O N,但连接列的名称必须在每个表中是相同的。下面的查询将my_tbl1.b 连接到m y _ t b l 2 . b:
在希望只查找出现在左边表而不出现在右边表中的行时, LEFT JOIN 极为有用。可通过增加一条查询右边表中具有NULL 值的列的WHERE 子句来完成这项工作。
一般不用担心选择为NULL 的列,因为没有什么意思。真正要关心的是左边表中不匹配的列,如:
上一篇:My SQL数据库实用技术(15) 下一篇:My SQL数据库实用技术(17)
文章评论
共有位Admini5网友发表了评论 查看完整内容