超详细mysql left join,right join,inner join用法分析下面是例子分析表A记录如下:aID aNum1 a200501112 a200501123 a200501134 a200501145 a20050115表B记录如下:bID bName1 20060324012 20060324023 20060324034 20060324048 2006032408创建这两个表SQL语句如下:CREATE TABLE aaID int( 1 ) AUTO_INCREMENT PRIMARY KEY , aNum char( 20 ))CREATE TABLE b(bID int( 1 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,bName char( 20 ))INSERT INTO aVALUES ( 1, ‘a20050111′ ) , ( 2,‘a20050112′ ) , ( 3, ‘a20050113′ ), ( 4, ‘a20050114′ ) , ( 5,‘a20050115′ ) ;INSERT INTO bVALUES ( 1, ‘ 2006032401′ ) , ( 2, ’2006032402′ ) , ( 3,’2006032403′ ) , ( 4, ’2006032404′ ) , ( 8, ’2006032408′ ) ;实验如下:1.left join(左联接)sql语句如下:SELECT * FROM aLEFT JOIN bON a.aID =b.bID结果如下:aID aNum bID bName1 a20050111 1 20060324012 a20050112 2 20060324023 a20050113 3 20060324034 a20050114 4 20060324045 a20050115 NULL NULL(所影响的行数为 5 行)结果说明:left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID =B.bID).B表记录不足的地方均为NULL.2.right join(右联接)sql语句如下:SELECT * FROM aRIGHT JOING bON a.aID = b.bID结果如下:aID aNum bID bName1 a20050111 1 20060324012 a20050112 2 20060324023 a20050113 3 20060324034 a20050114 4 2006032404NULL NULL 8 2006032408(所影响的行数为 5 行)结果说明:仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A 表不足的地方用NULL填充.3.inner join(相等联接或内联接)sql语句如下:SELECT * FROM aINNER JOIN bON a.aID =b.bID等同于以下SQL句:SELECT *FROM a,bWHERE a.aID = b.bID结果如下:aID aNum bID bName1 a20050111 1 20060324012 a20050112 2 20060324023 a20050113 3 20060324034 a20050114 4 2006032404结果说明:很明显,这里只显示出了 A.aID = B.bID的记录.这说明innerjoin并不以谁为基础,它只显示符合条件的记录.LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。
使用 LEFT JOIN运算来创建一个左边外部联接。
左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。
语法:FROM table1 LEFT JOIN table2 ON table1.field1 compoprtable2.field2说明:table1, table2参数用于指定要将记录组合的表的名称。
field1,field2参数指定被联接的字段的名称。
且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
compopr 参数指定关系比较运算符:‛=‛,‚<‛,‚>‛,‚<=‛,‚>=‛或‚<>‛。
如果在 INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。
MySQL中的各种JOIN1. 笛卡尔积(交叉连接)在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','如SELECT * FROM table1 CROSS JOIN table2 SELECT * FROM table1 JOIN table2 SELECT * FROM table1,table2由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE,ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢。
一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN2. 内连接INNER JOIN在MySQL中把INNER JOIN叫做等值连接,即需要指定等值连接条件在MySQL中CROSS和INNER JOIN被划分在一起,不明白。
参看MySQL帮助手册/doc/refman/5.0/e n/join.htmljoin_table:table_reference [INNER | CROSS] JOIN table_factor[join_condition]3. MySQL中的外连接,分为左外连接和右连接,即除了返回符合连接条件的结果之外,还要返回左表(左连接)或者右表(右连接)中不符合连接条件的结果,相对应的使用NULL 对应。
a. LEFT [OUTER] JOINSELECT column_name FROM table1 LEFT [OUTER] JOIN table2ONtable1.column=table2.column除了返回符合连接条件的结果之外,还需要显示左表中不符合连接条件的数据列,相对应使用NULL对应b. RIGHT [OUTER] JOINSELECT column_name FROM table1 RIGHT [OUTER] JOIN table2ONtable1.column=table2.columnRIGHT与LEFTJOIN相似不同的仅仅是除了显示符合连接条件的结果之外,还需要显示右表中不符合连接条件的数据列,相应使用NULL对应--------------------------------------------添加显示条件WHERE, ON, USING1. WHERE子句2. ON3. USING子句,如果连接的两个表连接条件的两个列具有相同的名字的话可以使用USING例如SELECT FROM LEFT JOIN USING ()连接多余两个表的情况举例:mysql>SELECT artists.Artist,cds.title, genres.genre-> FROM cds-> LEFT JOIN genres-> ON cds.genreID = genres.genreID -> LEFT JOIN artists-> ON cds.artistID =artists.artistID;或者mysql> SELECT artists.Artist,cds.title,genres.genre-> FROM cds-> LEFT JOIN genres-> ON cds.genreID = genres.genreID -> LEFT JOIN artists-> ON cds.artistID =artists.artistID-> WHERE (genres.genre = 'Pop'); --------------------------------------------另外需要注意的地方在MySQL中涉及到多表查询的时候,需要根据查询的情况,想好使用哪种连接方式效率更高。
1. 交叉连接(笛卡尔积)或者内连接[INNER | CROSS] JOIN2. 左外连接LEFT [OUTER] JOIN或者右外连接RIGHT [OUTER] JOIN注意指定连接条件WHERE, ON,USING.SQL查询语句《三》:多表查询(也叫连接查询,此处为基于两个表的连接查询)如果一个查询需要对多个表进行操作就称为连接查询,连接查询的结果集或结果称为表之间的连接.连接查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系数据库查询最主要的特征.select 表1.字段名1,表2.字段名2,...from 表1,表2where 连接条件SQL-92标准所定义的FROM子句的连接语法格式为:FROM 表名join_type 表名[ON (连接条件)]连接操作中的ON (连接条件) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。
连接查询分类:1.自连接查询,对同一个表进行连接操作2.内连接查询,<又分为:自然连接、等值连接、不等值连接三种>3.外连接查询,<又分为:左外连接、右外连接、全外连接三种>4.交叉连接查询,也作无条件查询。
5.联合查询----------------------------一。
自连接查询:一个表自己与自己建立连接称为自连接或自身连接。
进行自连接就如同两个分开的表一样,可以把一个表的某一行与同一表中的另一行连接起来。
例:查询选学“101”课程的成绩高于“9505201”号学生成绩的所有学生记录,并按成绩从高到低排列。
select x.* from sclass x,sclass ywhere o=''101'' and x.degree>y.degree and y.sno=''9505201'' and o=''101''order by x.degree desc----------------------------二。