1 mysql连接查询

在介绍join查询之前,先定义两招表,并插入数据.

  • user表:

    image-20200316221542283.png

  • account表:

    image-20200316221510669.png

1.1 join内连接

join查询就是集合运算中的笛卡尔积 集合a和b的笛卡尔积 a = (i,j,k) b = (l, m ,n) 所以a和b的笛卡尔积就是 = (il,im,in,jl,jm,jn,kl,km,kn). 对于a集合大小为m,b 集合大小为n,那么最终的笛卡尔积的结果数为 m * n;

  • join写法

    对于user表,account表执行join查询:

    SELECT a.id, a.account, u.id as uid, u.username from account a join user u;

    查询的结果如下:
    image-20200316225746545.png

    共3 * 4 = 12条记录.

    另外我们可以集合on语句,筛选出满足特定条件的记录.

    SELECT a.id, a.account, u.id, u.username from account a join user u on a.id = u.id;

    此时查询结果:

    image-20200316225658564.png

    共2条记录满足account的id等于user表的id.

  • inner join写法

    // cross实现内连接
    SELECT a.id, a.account, u.id as uid, u.username from user u CROSS join account a;
    // cross结合on刷选指定条件的记录
    SELECT a.id, a.account, u.id as uid, u.username from user u CROSS join account a ON u.id = a.id;
  • cross join写法

    // inner join写法
    SELECT a.id, a.account, u.id as uid, u.username from account a inner join user u ;
    // inner join 结合 on 筛选指定条件的记录
    SELECT a.id, a.account, u.id as uid, u.username from user u inner join account a on u.id = a.id;
注: 以上三种写法是等价的.都是属于内连接的

1.2 外连接

1.2.1 左连接

左外连接,语法是left outer join或者left join,两种写法相同, 可以结合on条件筛选特定条件的记录.其中左连接也叫作左外连接.

比如a left (outer) join b,此含义就是以a表为标准,查询的结果中包含所有的a的记录以及和a中的记录匹配的b的记录,即使在b中没有找到和a表中某些记录相匹配的记录,那么a这些记录也要输出,且未匹配的a表中的记录对应的b表中的记录的列显示为空NULL

在左连接中,left左边的表称作左表,left右边的表称作由表, 此时输出的结果按照左表中的所有的数据记录作为标准. 其对应的b中未匹配的记录的列显示为NULL.

// a左外连接b
SELECT a.id, a.account, u.id as uid, u.username from account a left OUTER join user u on a.id = u.id;

显示的结果:

image-20200316225618842.png

1.2.2 右连接

右外连接,语法是 right outer join 或者right join,两种写法相同, 可以结合on语句筛选指定条件的记录,其中右连接又叫做右外连接.

右外连接的意思就是,a right join b。那么输出的结果中会包含了b表的所有的记录以及a表中满足on之后的条件的记录,即使在a表中没有找到满足on之后的条件的记录,那么会输出的a表中的记录的列都为NULL.

right 左边的表a称作左表,right右边的表b称作右表.那么在右连接操作中,输出的结果中按照right关键字右的表b为基准输出结果集.无论a表中是否有满足条件的记录,b表都会全部输出.

// a右连接u,输出的结果以u结果作为输出的结果集标准
SELECT a.id, a.account, u.id, u.username from account a right join user u on a.id = u.id

输出结果:
image-20200316225543990.png

on语句下的多条件匹配:

// on语句的多条件查询
SELECT a.id, a.account, u.id as uid, u.username from account a right join user u on a.id = u.id or a.account = u.username;

输出结果如下:
image-20200316230209959.png

1.3 左连接和右连接查询的注意事项

  • left join和righ join必须on结合一块使用,如果没有on语句,那么mysql报语法错误,这点和内连接不同.
  • on指定条件可以指定多个筛选条件,不仅仅只能指定一个筛选条件.

娟儿
1 声望0 粉丝