添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
英勇无比的移动电源  ·  pythonoserror: ...·  1 月前    · 
乐观的番茄  ·  python jsonpath ...·  2 月前    · 
捣蛋的土豆  ·  matplotlib.backend_bas ...·  3 月前    · 

「这是我参与2022首次更文挑战的第14天,活动详情查看: 2022首次更文挑战

嗨,大家好,我们开发过程中经常会使用到将多个查询结果都直接显示出来,那么应该怎么查询呢?本次介绍一下SQL中的UNION关键字,将实现将多个查询条件中的结果展示出来。

UNION

UNION的中文含义是联合的意思,即合并两个或多个 SELECT 语句的结果。使用技巧如下:

  • UNION 内部的每个 SELECT 语句必须拥有相同数量的列。
  • 列必须拥有相似的数据类型。
  • 每个 SELECT 语句中的列的顺序必须相同。
  • 相同数量的列

    如下图,使用上一章介绍的数据作为演示数据 分别建立表 s_user 和表 s_user_1

    CREATE TABLE `s_user` (
      `userid` int(11) NOT NULL AUTO_INCREMENT,
      `user_name` varchar(255) DEFAULT NULL,
      `name` varchar(255) DEFAULT NULL,
      `pass_word` varchar(255) DEFAULT NULL,
      `salt` varchar(255) DEFAULT NULL,
      `state` varchar(255) DEFAULT NULL,
      `create_time` datetime DEFAULT NULL,
      PRIMARY KEY (`userid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    

    测试数据如下:

    INSERT INTO `test`.`s_user`(`userid`, `user_name`, `name`, `pass_word`, `salt`, `state`, `create_time`) VALUES (1, '小米', '小米', '123123', '123', '1', '2022-02-10 19:48:43');
    INSERT INTO `test`.`s_user`(`userid`, `user_name`, `name`, `pass_word`, `salt`, `state`, `create_time`) VALUES (2, '小白', '小白', '123123', '123', '1', '2022-02-10 19:48:43');
    INSERT INTO `test`.`s_user_1`(`userid`, `user_name`, `name`, `pass_word`, `salt`, `state`, `create_time`) VALUES (1, '小红', '小红', '123123', '123', '1', '2022-02-10 19:48:43');
    INSERT INTO `test`.`s_user_1`(`userid`, `user_name`, `name`, `pass_word`, `salt`, `state`, `create_time`) VALUES (2, '小黄', '小黄', '123123', '123', '1', '2022-02-10 19:48:43');
    

    UNION 内部的每个 SELECT 语句必须拥有相同数量的列:先查询具有相同列的SQL

    SELECT * FROM `s_user` UNION SELECT * FROM `s_user_1`
    

    查询出所有的列,可以看到,执行结果如下。

    如果第一个查询是所有列,第二个查询是三个字段,那么查询结果又是怎么样呢,现在执行如下SQL:

    SELECT * FROM `s_user` UNION SELECT userid,name,pass_word FROM `s_user_1`
    错误提示:使用的SELECT语句查询出不同的列数

    SELECT userid,name,pass_word  FROM `s_user` UNION SELECT userid,name,pass_word FROM `s_user_1`
    

      上面看到了多个查询的列数必须相同,那么查询出的列数如果相同,查询字段的数据类型不同,是否可正常处理呢?下面将s_user查询中的pass_word换成create_time,进行查询。通过查询之后可以看到。在SQL查询中,列的数据类型是无关的。当然实际业务中是不会将其设置成不同的类型的。

    SELECT userid,name,create_time  FROM `s_user` UNION SELECT pass_word,name,userid FROM `s_user_1`
    

      在使用UNION关键字进行查询时,是否和列的顺序有关呢,上面看到可能和列的顺序有关,可能也是无关的,那么进行一下测试。可以看到执行结果是和列的顺序无关的。在实际业务中是合并多个查询,因此我们在项目中定义是需要列的顺序一致的。

    SELECT create_time,userid,name  FROM `s_user` UNION SELECT pass_word,name,userid FROM `s_user_1`
    

    UNION 和 UNION ALL区别

      为了测试UNION 和 UNION ALL区别需要在数据表s_user_1中增加【小白】,与表s_user中的【小白】都存在数据库中,两个会有什么不同结果呢。

    INSERT INTO `test`.`s_user_1`(`userid`, `user_name`, `name`, `pass_word`, `salt`, `state`, `create_time`) VALUES (3, '小白', '小白', '123123', '123', '1', '2022-02-10 19:48:43');
    

    首先执行:

    SELECT user_name,name,pass_word,salt
    FROM `s_user` UNION SELECT user_name,name,pass_word,salt FROM `s_user_1`
    

    执行结果:

    SELECT user_name,name,pass_word,salt
    FROM `s_user` UNION ALL SELECT user_name,name,pass_word,salt FROM `s_user_1`
    

    执行结果:

      可以看到UNION关联的去除了重复项,而UNION ALL查询出了所有的值,没有去除重复数据。