• SQL union ALL用法


    union all 操作符用于合并两个或多个 SELECT 语句的结果集,并且不做去重操作。

    可能这样讲比较抽象,以一道题为例子:

    描述

    题目:现在运营想要分别查看学校为山东大学或者性别为男性的用户的device_id、gender、age和gpa数据,请取出相应结果,结果不去重。

    示例:user_profile

    iddevice_idgenderageuniversitygpaactive_days_within_30question_cntanswer_cnt
    12138male21北京大学3.47212
    23214male复旦大学415525
    36543female20北京大学3.212330
    42315female23浙江大学3.6512
    55432male25山东大学3.8201570
    62131male28山东大学3.315713
    74321male26复旦大学3.69652

    根据示例,你的查询应返回以下结果(注意输出的顺序,先输出学校为山东大学再输出性别为男生的信息):

    device_idgenderagegpa
    5432male253.8
    2131male283.3
    2138male213.4
    3214maleNone4
    5432male253.8
    2131male283.3
    4321male283.6

    示例1

    输入:

    drop table if exists `user_profile`;
    drop table if  exists `question_practice_detail`;
    CREATE TABLE `user_profile` (
    `id` int NOT NULL,
    `device_id` int NOT NULL,
    `gender` varchar(14) NOT NULL,
    `age` int ,
    `university` varchar(32) NOT NULL,
    `gpa` float,
    `active_days_within_30` int ,
    `question_cnt` int ,
    `answer_cnt` int 
    );
    CREATE TABLE `question_practice_detail` (
    `id` int NOT NULL,
    `device_id` int NOT NULL,
    `question_id`int NOT NULL,
    `result` varchar(32) NOT NULL
    );
    CREATE TABLE `question_detail` (
    `id` int NOT NULL,
    `question_id`int NOT NULL,
    `difficult_level` varchar(32) NOT NULL
    );
    
    INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学',3.4,7,2,12);
    INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学',4.0,15,5,25);
    INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学',3.2,12,3,30);
    INSERT INTO user_profile VALUES(4,2315,'female',23,'浙江大学',3.6,5,1,2);
    INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学',3.8,20,15,70);
    INSERT INTO user_profile VALUES(6,2131,'male',28,'山东大学',3.3,15,7,13);
    INSERT INTO user_profile VALUES(7,4321,'male',28,'复旦大学',3.6,9,6,52);
    INSERT INTO question_practice_detail VALUES(1,2138,111,'wrong');
    INSERT INTO question_practice_detail VALUES(2,3214,112,'wrong');
    INSERT INTO question_practice_detail VALUES(3,3214,113,'wrong');
    INSERT INTO question_practice_detail VALUES(4,6543,111,'right');
    INSERT INTO question_practice_detail VALUES(5,2315,115,'right');
    INSERT INTO question_practice_detail VALUES(6,2315,116,'right');
    INSERT INTO question_practice_detail VALUES(7,2315,117,'wrong');
    INSERT INTO question_practice_detail VALUES(8,5432,117,'wrong');
    INSERT INTO question_practice_detail VALUES(9,5432,112,'wrong');
    INSERT INTO question_practice_detail VALUES(10,2131,113,'right');
    INSERT INTO question_practice_detail VALUES(11,5432,113,'wrong');
    INSERT INTO question_practice_detail VALUES(12,2315,115,'right');
    INSERT INTO question_practice_detail VALUES(13,2315,116,'right');
    INSERT INTO question_practice_detail VALUES(14,2315,117,'wrong');
    INSERT INTO question_practice_detail VALUES(15,5432,117,'wrong');
    INSERT INTO question_practice_detail VALUES(16,5432,112,'wrong');
    INSERT INTO question_practice_detail VALUES(17,2131,113,'right');
    INSERT INTO question_practice_detail VALUES(18,5432,113,'wrong');
    INSERT INTO question_practice_detail VALUES(19,2315,117,'wrong');
    INSERT INTO question_practice_detail VALUES(20,5432,117,'wrong');
    INSERT INTO question_practice_detail VALUES(21,5432,112,'wrong');
    INSERT INTO question_practice_detail VALUES(22,2131,113,'right');
    INSERT INTO question_practice_detail VALUES(23,5432,113,'wrong');
    INSERT INTO question_detail VALUES(1,111,'hard');
    INSERT INTO question_detail VALUES(2,112,'medium');
    INSERT INTO question_detail VALUES(3,113,'easy');
    INSERT INTO question_detail VALUES(4,115,'easy');
    INSERT INTO question_detail VALUES(5,116,'medium');
    INSERT INTO question_detail VALUES(6,117,'easy');

    复制输出:

    1. 5432|male|25|3.8
    2. 2131|male|28|3.3
    3. 2138|male|21|3.4
    4. 3214|male|None|4.0
    5. 5432|male|25|3.8
    6. 2131|male|28|3.3
    7. 4321|male|28|3.6

    解题思路 一:

    但总会存在一个人满足了两个条件只筛选一次。这里的坑时使用or,因为or自带去重,而union等价于or,但union all 可以不去重,所以本体考察or与union的细节使用

    1. SELECT distinct up.device_id,up.gender,up.age,up.gpa,up.university FROM user_profile up
    2. LEFT JOIN question_practice_detail qd ON up.device_id= qd.device_id
    3.  WHERE up.university = "山东大学" OR up.gender = "male"
    4.  ORDER BY up.university desc,up.gender desc

    上面方法错误:

    解题思路 二:

    使用UNION ALL 把两个表链接起来 利用UNION ALL去方式粘贴两个表完成题目中的默认排序,并且题目中提到的可以重复,则不去重

    1. select device_id , gender , age , gpa from user_profile where university = '山东大学'
    2. UNION ALL
    3. select device_id , gender , age , gpa from user_profile where gender = 'male'

  • 相关阅读:
    RabbitMq(二) RabbitMQ 界面介绍
    2520. 统计能整除数字的位数
    【软件测试】大学毕业后,才发现自信可以撑起一片天......
    Spring Task
    redis cluster 集群,终极方案?
    CSS自定义属性与前端页面的主题切换
    猿创征文|2022 年我的开发者工具
    Vue 3.3 发布
    上海市青少年算法2023年9月月赛(丙组)
    壳寡糖/肉桂醛修饰乳清蛋白,乳清浓缩蛋白-羟丙基甲基纤维素复合材料
  • 原文地址:https://blog.csdn.net/RAVEEE/article/details/126824653