zoukankan      html  css  js  c++  java
  • MySQL中的Union连接查询

    select
    union的用法
    作用:把两次或多次的查询结果合并起来
    要求:两次查询的列数一致就好
    推荐:查询的每一列,相对用的列类型也一样。
    可以来自于多张表。
    多次SQL语句取出的列明可以不一致,此时以第一个SQL的列名为准。
    如果不同的语句中取出的行,有完全相同(每个列的值都相同)
    那么相同的行将会合并(去重复);
    如果不去重复,可以加all来指定。
    请注意:
    如果子句中有order by,limit,须加(),推荐放到所有子句之后,即对最终合并后的结果排序。
    在子句中,order by配合limit使用才有意义。
    如果order by和limit不配合使用,会被语法分析器优化分析时去除。
    ***********************合并查询结果*******************
    #查询网店商品价格小于50的商品信息
    selelct good_id,goods_name,shop_price from goods where shop_price<50;
    #把价格大于5000或者小于20的商品查询出来
    select goods_id,goods_name,shop_price from goods where shop_price<20 or shop_price>5000;
    select goods_id,goods_name,shop_price from goods where shop_price > 5000 union select goods_id,goods_name,shop_price from goods where shop_price < 20;
    #把允许显示的留言显示出来
    select user_name,user_email,msg_content from feedback where msg_status=1;
    #把允许显示的评论取出来
    select user_name,email,content from content where status=1;
    #利用union简化为一条查询
    *************************连接查询*********************
    数学上:
    集合 set
    集合的特性:无序性,唯一性。
    一张表就是一个集合,一行数据是集合的一个元素。
    理论上讲,不可能存在完全相同的两个行,但是表中可以完全相同的两行,因为,表内部有一个rowid
    集合相乘就是笛卡尔积,其实就是两个集合的完全组合
    问:设集合A有M个元素,M个元素各不相同。设集合B,有N个元素,N个元素各不相同。
    A*B,得到的积,有M*N个元素,不可能重复。
    表A有9行,表B有10行,两表相乘,有9*10=90行数据。
    ta表
    id    num
    a      5
    b      10
    c      15
    d      10
    tb表
    id     num
    b       5
    c       10
    d       20
    e       99


    create table ta(
    id char(1),
    num int
    );

    insert into ta values
    ('a',5),
    ('b',10),
    ('c',15),
    ('d',10);


    create table tb(
    id char(1),
    num int
    );

    insert into ta values
    ('b',5),
    ('c',10),
    ('d',20),
    ('e',90);


    想要得到的结果
    a 5
    b 15
    c 25
    d 30
    e 90

    select * from ta;
    select * from tb;
    ****************************************
    select * from ta union select * from tb;
    #sum,group求和
    select id,sum(num) from (select * from ta union select * from tb) as temp group by id;
    update ta set num=15 where id='c';
    select * from ta union all select * from tb;
    #想取第4栏目的商品,价格降序排列,还想取第5个栏目的商品,价格也降序排列。union完成。
    (select goods_id,cat_id,goods_name,shop_price from goods where cat_id=4 order by shop_price desc) union (select goods_id,goods_name,shop_price from goods where cat_id =5 order by shop_price desc) order by desc;
    #取第3个栏目价格前3高的商品和第4个栏目价格前两高的商品,用union实现。
    (select goods_id,cat_id,goods_name,shop_price from goods where cat_id=4 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);

    select * from ta,tb;相当于,ta*tb之后再查。完全组合。
    *************************左连接********************
    select 列1,列2,列3...列N from
    tableA left join tableB
    on tableA.列=tableB[此时,表连接成一张大表,完全当成普通表看]
    where group,having...照常写
    要从goods,category表中取数据

    然后,在两张M*N的过程中,筛选,以什么条件筛选,答:cate_id相同。
    1、先接上表;
    2、是连接条件。
    select goods left join category on goods.cat_id=category.cat_id;
    #两张表连接成了一张大表。
    select
    goods_id,good.cat_id,cat_name,goods_name,shop_price
    from
    goods left join category on goods.cat_id=category.cat_id;
    *****************************右连接******************
    elect 列1,列2,列3...列N from
    tableA right join tableB
    on tableA.列=tableB[此时,表连接成一张大表,完全当成普通表看]
    where group,having...照常写
    *****************************内连接******************
    elect 列1,列2,列3...列N from
    tableA inner join tableB
    on tableA.列=tableB[此时,表连接成一张大表,完全当成普通表看]
    where group,having...照常写

  • 相关阅读:
    Codeforces 678E 状压DP
    Codeforces 667C DP
    POJ 3017 DP + 单调队列 + 堆
    Codeforces 1154F (DP)
    Codeforces 1154G 枚举
    Codeforces 1153D 树形DP
    Codeforces 1109E 线段树
    Codeforces 1109C 线段树
    Codeforces 1109D (树的计数问题)
    async/await
  • 原文地址:https://www.cnblogs.com/wyh3721/p/2557018.html
Copyright © 2011-2022 走看看