MySQL数据库技术(16)[MySQL防范]
本文“MySQL数据库技术(16)[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
? ? 3.6 检索记录
? ? 除非终究检索它们并操纵它们来做点事情,不然将记录放入数据库没什么好处.这就是SELECT 语句的用处,即帮忙取出数据.SELECT 大约是SQL 语言中最常用的语句,并且怎样利用它也最为讲究;用它来挑选记录大概相当复杂,大概会触及很多表中列之间的对比.SELECT 语句的语法以下:
? ? 除了词" S E L E C T"和阐明但愿检索什么的column_list 部份外,语法中的每样东西都是可选的.有的数据库还需求FROM 子句.MySQL 有所差别,它答应对表达式求值而不引用任何表:
? ? 在第1章中,我们对SELECT 语句下了很大的工夫,主要集合介绍了列挑选的列表和WHERE、GROUP BY、ORDER BY、H AVING 以及LIMIT 子句.本章中,我们将主要精神放在SELECT 语句中最大概令人搞不清的方面,即衔接( j o i n)上.我们将介绍MySQL 支持的衔接范例、它们的含义、怎样指定它们等.这样做将有助于更有效地利用M y S Q L,因为在很多情形下,办理怎样编写查询的关键是肯定怎样将表恰本地衔接在一同.还应当参阅一下本章背面3 . 8节"办理筹划随笔".在那一节中将会找到办理几个SQL 问题的筹划,它们大都
都触及SELECT 语句这样或那样的功效.
? ? 利用SELECT 的一个问题是,在第一次碰到一种新的问题时,并不老是可以知道怎样编写SELECT 查询来办理它.但在办理今后,再碰到近似的问题时,可操纵此中的经验.SELECT 大约是过去的经验在可以有效地利用中起很大作用的语句,这是因为利用它的办法太多的原故.
? ? 在有了一定的经验后,可将这些经验用于新问题,您会发现自己考虑问题近似于,"噢,是的,它就是一个LEFT JOIN 问题."大概,"啊哈,这就是一个受各对索引列制约的三线路衔接."(指出这一点,实际上我也感到有点不肯意.听到经验有帮忙,您大概遭到一定的鼓舞.别的,考虑到您终究能那样考虑问题也会令自己有点惊奇.)下几节中介绍怎样操纵MySQL 支持的衔接操作的格局,大都例子利用了下面的两个表.它们很小,很简单,足以很清楚地看出每种衔接的效果.
? ? 3.6.1 普通衔接
? ? 最简单的衔接是普通衔接( trivial join),这种衔接中只指定一个表.在此情形下,行从指定的表中挑选.如:
? ? 有的作者根本就不考虑这种SELECT 衔接的情势,仅对从两个或多个表中检索记录的SELECT 语句利用"衔接"这个术语.本人认为那只是见解差别罢了.
? 3.6.2 全衔接
? 假如指定多个表,将各个表名用逗号脱离,就指定了全衔接.比方,假如衔接两个表,来自第一个表中的每行与第二个表中每行举行组合:
? ? 全衔接也称为叉衔接,因为每个表的每行都与其他表中的每行穿插以产生全部大概的组合.这也就是所谓的笛卡儿积.这样衔接表潜在地产生数目非常大的行,因为大概得到的行数为每个表中行数之积.三个辨别含有1 0 0、2 0 0、3 0 0行的表的全衔接将产生1 0 0×2 0 0×3 0 0= 6百万行.即便各表很小,所得到的行数也会很大.在这样的情形下,普通要利用W H E R E
子句来将后果集削减为易于管理的大小.
? ? 假如在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 的列,因为没有什么意思.真正要关心的是左边表中不匹配的列,如:
? ? 操纵LEFT JOIN 时有一件事情需求防备,假如所衔接的列未定义为NOT NULL,将会在后果中得出一些无关的行.
? ? LEFT JOIN 有几个同义词和变种.LEFT OUTER JOIN 为LEFT JOIN 的一个同义词.
? ? LEFT JOIN 还有一个为MySQL 所承受的ODBC 表示以下("o j"意为"outer join"):
? ? N ATURAL LEFT JOIN 近似于LEFT JOIN;它履行一个LEFT JOIN,匹配左边表和右边表中具有相同名称的全部列.
? ? 有的数据库还有,RIGHT JOIN,但MySQL 迄今还没有.
以上是“MySQL数据库技术(16)[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |