欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mysql 多表查询 以及 concat 、concat_ws和 group_concat

程序员文章站 2023-03-28 10:27:30
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只返回两个表中联结字段相等的行 举例如下: 表A记录如下:aID aNum1 a200501112 a2 ......

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行

举例如下:
--------------------------------------------
表a记录如下:
aid     anum
1     a20050111
2     a20050112
3     a20050113
4     a20050114
5     a20050115

表b记录如下:
bid     bname
1     2006032401
2     2006032402
3     2006032403
4     2006032404
8     2006032408

--------------------------------------------
1.left join
sql语句如下:
select * from a
left join b
on a.aid = b.bid

结果如下:
aid     anum     bid     bname
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
5     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 a
right join b
on a.aid = b.bid

结果如下:
aid     anum     bid     bname
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
null     null     8     2006032408

(所影响的行数为 5 行)
结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(b)为基础的,a表不足的地方用null填充.
--------------------------------------------
3.inner join
sql语句如下:
select * from a
innerjoin b
on a.aid = b.bid

结果如下:
aid     anum     bid     bname
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404

结果说明:
很明显,这里只显示出了 a.aid = b.bid的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
--------------------------------------------
注:
left join操作用于在任何的 from 子句中,组合来源表的记录。使用 left join 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。

语法:from table1 left join table2 on table1.field1 compopr table2.field2

说明:table1, table2参数用于指定要将记录组合的表的名称。
field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
compopr参数指定关系比较运算符:"=", "<", ">", "<=", ">=" 或 "<>"。
如果在inner join操作中要联接包含memo 数据类型或 ole object 数据类型数据的字段,将会发生错误.

 

 

concat()函数

1、功能:将多个字符串连接成一个字符串。

2、语法:concat(str1, str2,...)

返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。

concat_ws()函数

1、功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符~(concat_ws就是concat with separator)

2、语法:concat_ws(separator, str1, str2, ...)

返回结果为连接参数产生的字符串,以某个字符隔开,如果有任何一个参数为null,则返回值为null。

说明:第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。

group_concat()

1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )

说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。