mysql中union,左连接,右连接,与内连接

来源:互联网 发布:怎样在淘宝查注册时间 编辑:程序博客网 时间:2024/06/07 19:06
  1. union
1).作用:    把俩次或者多次查询结果合并起来2).要求    俩次查询的列数一致    对于组合查询结果排序:    select语句的输出用order by子句排序。在用union组合查询时,只能使用一条order by子句,它必须出现在最后一条select语句    之后。对于结果集,不存在用一种方式排序一部分,而又用另一部分方式排序另一部分的情况,因此不允许使用多条order by子句。3).推荐:    查询的每一列,相对应的列类型也一样。可以来自多张表。    多次sql语句取出的列名可以不一致,此时以第一个sql的列名为准    如果不同的的语句中取出的行,有完全相同(每个列的值都相同),那么相同的行将会合并(去重复)    如果不去重复,可以加all来指定    (select * from ta) union all (select * from tb);4).order by 的用法:    如果语句中有order by limit,需加()包起来,推荐放到所有子句之后,即-对最终合并后的结果来排序。    (select goods_id,cat_id,goods_name,shop_price from goods where cat_id = 4 order by shop_price     desc) union (select goods_id,cat_id,goods_name,shop_price from goods where cat_id = 5 order by     shop_price desc) order by shop_price desc;    在子句中order by配合limit使用才有意义,如果order by不配合limit使用,会被语法分析器优化分析时时去除    (select goods_id,cat_id,goods_name,shop_price from goods where cat_id = 3 order by shop_price desc     limit 3) union (select goods_id,cat_id,goods_name,shop_price from goods where cat_id = 4 order by     shop_price desc limit 2);5).案例     select*from ta union select*from tb;+------+------+| id   | num  |+------+------+| a    |    5 || b    |   10 || c    |   15 || d    |   10 || b    |    5 || d    |   20 || e    |   99 |+------+------+ select id,sum(num) from (select * from ta union select * from tb) as temp group by id;+------+----------+| id   | sum(num) |+------+----------+| a    |        5 || b    |       15 || c    |       15 || d    |       30 || e    |       99 |+------+----------+

2.连接查询

1).表的分析    A表有9行,B表有10行  两表相乘有:9*10=90 行2).左连接:    select1,列2,列n from     tableA left join tableB    ON tableA列 = tableB (此处连接成一张大表,完全当成普通表看)    Where group having ... 照常写3).右连接:    select1,列2,列n from     tableA right join tableB    ON tableA列 = tableB (此处连接成一张大表,完全当成普通表看)    Where group having ... 照常写4).内连接:    内连接:查询左右变都有的数据,即不要左右中null的那一部分。内连接是左右连接的交集。    select1,列2,列n from     tableA inner join tableB    ON tableA列 = tableB (此处连接成一张大表,完全当成普通表看)    Where group having ... 照常写5).左右连接的区别:    左右连接:    以左表为准,去右表找匹配的数据,找不到匹配,用null补齐。    如何记忆:    ①.左右连接可以互相转化。    ②.可以把右连接转化为左连接来使用(并推荐使用左连接代替右连接,兼容性好一些)    A站在B的左边  ===>  B站在A的右边    A left join B ===> B right join A6).思考:    能否查出左右连接的并集呢?    答:目前不能,目前的mysql不支持外连接.outer join 但是可以用 Union 来达到目的。    练习题:     select boy.* , girl.* from     -> boy left join girl    -> on boy.flower = girl.flower;+--------+----------+--------+--------+| name   | flower   | name   | flower |+--------+----------+--------+--------+| 林书豪 | 玫瑰     | 艾薇儿 | 玫瑰   || 刘翔   | 桃花     | 居里夫 | 桃花   || 周杰伦 | 茉莉花   | 芙蓉姐 | 茉莉花 || 周杰伦 | 茉莉花   | 凤姐   | 茉莉花 || 犀利哥 | 荷花     | 林志玲 | 荷花   || 刘德华 | 狗尾巴花 | NULL   | NULL   |+--------+----------+--------+--------+    select * from    -> boy right join girl    -> on boy.flower = girl.flower;+--------+--------+--------+----------+| name   | flower | name   | flower   |+--------+--------+--------+----------+| 林书豪 | 玫瑰   | 艾薇儿 | 玫瑰     || 刘翔   | 桃花   | 居里夫 | 桃花     || 周杰伦 | 茉莉花 | 芙蓉姐 | 茉莉花   || 周杰伦 | 茉莉花 | 凤姐   | 茉莉花   || 犀利哥 | 荷花   | 林志玲 | 荷花     || NULL   | NULL   | 大S    | 火爆腰花 |+--------+--------+--------+----------+    (select boy.*,girl.* from boy left join girl on boy.flower = girl.flower)    -> union    -> (select boy.*,girl.* from boy right join girl on boy.flower = girl.flower);+--------+----------+--------+----------+| name   | flower   | name   | flower   |+--------+----------+--------+----------+| 林书豪 | 玫瑰     | 艾薇儿 | 玫瑰     || 刘翔   | 桃花     | 居里夫 | 桃花     || 周杰伦 | 茉莉花   | 芙蓉姐 | 茉莉花   || 周杰伦 | 茉莉花   | 凤姐   | 茉莉花   || 犀利哥 | 荷花     | 林志玲 | 荷花     || 刘德华 | 狗尾巴花 | NULL   | NULL     || NULL   | NULL     | 大S    | 火爆腰花 |+--------+----------+--------+----------+    (select boy.*,girl.* from boy left join girl on boy.flower = girl.flower)    -> union all    -> (select boy.*,girl.* from boy right join girl on boy.flower = girl.flower);+--------+----------+--------+----------+| name   | flower   | name   | flower   |+--------+----------+--------+----------+| 林书豪 | 玫瑰     | 艾薇儿 | 玫瑰     || 刘翔   | 桃花     | 居里夫 | 桃花     || 周杰伦 | 茉莉花   | 芙蓉姐 | 茉莉花   || 周杰伦 | 茉莉花   | 凤姐   | 茉莉花   || 犀利哥 | 荷花     | 林志玲 | 荷花     || 刘德华 | 狗尾巴花 | NULL   | NULL     || 林书豪 | 玫瑰     | 艾薇儿 | 玫瑰     || 刘翔   | 桃花     | 居里夫 | 桃花     || 周杰伦 | 茉莉花   | 芙蓉姐 | 茉莉花   || 周杰伦 | 茉莉花   | 凤姐   | 茉莉花   || 犀利哥 | 荷花     | 林志玲 | 荷花     || NULL   | NULL     | 大S    | 火爆腰花 |+--------+----------+--------+----------+

3 . 连接笔试题

查出2006-6-1到2006-7-1之间举行的所有比赛,并且用以下形式列出:拜仁 2 :0 不莱梅 2006-2-21select*from t;+------+----------+| tid  | tname    |+------+----------+|    1 | 国安      ||    2 | 申花      ||    3 | 传智联队   |+------+----------+ select*from m;+-----+------+------+------+------------+| mid | hid  | gid  | mres | matime     |+-----+------+------+------+------------+|   1 |    1 |    2 | 2:0  | 2006-05-21 ||   2 |    1 |    3 | 1:2  | 2006-06-21 ||   3 |    2 |    3 | 2:5  | 2006-06-25 ||   4 |    2 |    1 | 3:2  | 2006-07-21 |+-----+------+------+------+------------+ select mid,hid,tname,mres,gid,matime from m left join t on m.hid = t.tid;+-----+------+-------+------+------+------------+| mid | hid  | tname | mres | gid  | matime     |+-----+------+-------+------+------+------------+|   1 |    1 | 国安  | 2:0  |    2 | 2006-05-21 ||   2 |    1 | 国安  | 1:2  |    3 | 2006-06-21 ||   3 |    2 | 申花  | 2:5  |    3 | 2006-06-25 ||   4 |    2 | 申花  | 3:2  |    1 | 2006-07-21 |+-----+------+-------+------+------+------------+select mid,hid,t1.tname as hname,mres,gid,t2.tname as gname,matime from m left join t as t1 on m.hid = t1.tid      -> left join t as t2    -> on m.gid = t2.tid;+-----+------+-------+------+------+----------+------------+| mid | hid  | hname | mres | gid  | gname    | matime     |+-----+------+-------+------+------+----------+------------+|   4 |    2 | 申花  | 3:2  |    1 | 国安     | 2006-07-21 ||   1 |    1 | 国安  | 2:0  |    2 | 申花     | 2006-05-21 ||   2 |    1 | 国安  | 1:2  |    3 | 传智联队 | 2006-06-21 ||   3 |    2 | 申花  | 2:5  |    3 | 传智联队 | 2006-06-25 |+-----+------+-------+------+------+----------+------------+ select t1.tname,mres,t2.tname as gname,matime from m left join t as t1 on m.hid = t1.tid     -> left join t as t2    -> on m.gid = t2.tid    -> where m.matime between '2006-06-1' and '2006-7-01';+-------+------+----------+------------+| tname | mres | gname    | matime     |+-------+------+----------+------------+| 国安  | 1:2  | 传智联队 | 2006-06-21 || 申花  | 2:5  | 传智联队 | 2006-06-25 |+-------+------+----------+------------+
阅读全文
1 0