首页 > 数据库 >有点意思的sql

有点意思的sql

时间:2023-07-14 22:55:26浏览次数:44  
标签:有点 name temp 意思 sql foo Id SELECT

同事问我一个问题,要我写几条sql。假设表temp的结构是这样的:
字段: id,  name
有这些记录:
123, foo

123,   bar
123, test

124,  test

125  foo
126  bar
127 foo
127 test
128 foo
128 bar
128 test
128 else
现在要写4条sql,找到符合下面四个条件的id:
1. 只有name = foo
2. 只有name = bar
3. name = foo以及name = bar
4. name != foo以及name != bar
第1条开始写出了这样的sql:

SELECT Id 
FROM temp 
WHERE  Id IN 
(SELECT Id FROM temp GROUP BY Id HAVING COUNT(*) = 1)
AND Name = 'foo'

显然不对,比如127这个Id就漏了。不过,同事的要求是不需要找出全部记录,随便找出几个就行了,所以这个还能满足要求。
第3条想了一会,写出来了

SELECT T1.Id
FROM 
(
 SELECT Id FROM temp WHERE Name = 'foo' GROUP BY Id
) as T1
INNER JOIN 
(
 SELECT Id FROM temp WHERE Name = 'bar' GROUP BY Id
) as T2 ON T1.Id = T2.Id

第4条想不出,查了资料,写法很巧妙

SELECT Id
FROM 
(
 SELECT Id,
  MAX(CASE WHEN Name IN ('foo', 'bar') THEN 1 ELSE 0 END) AS flag
  FROM temp
  GROUP BY Id
) as T WHERE T.flag = 0

回过头来,第1条可以这样写

SELECT Id
FROM 
(
 SELECT Id,
  MAX(CASE WHEN Name = 'foo' THEN 1 ELSE 0 END) AS flag
  FROM temp 
  GROUP BY Id
) as T WHERE T.flag = 1

第2条就很容易了,把foo 换成bar就好了。这个sql还是有点难度的,有点意思,学习一下。

标签:有点,name,temp,意思,sql,foo,Id,SELECT
From: https://www.cnblogs.com/badnumber/p/17555192.html

相关文章

  • 在centos 7.9 系统docker上构建mysql 5.7
    1、拉取镜像[root@localhost~]#dockerpullmysql:5.7 2、查看镜像[root@localhost~]#dockerimages 3、根据镜像id构建mysql容器,且分配端口号[root@localhost~]#dockerrun-d-p3306:3306--namemysql-eMYSQL_ROOT_PASSWORD='OK'c20987f18b13命令说......
  • [极客大挑战 2019]EasySQL
    [极客大挑战2019]EasySQL题目来源:buuctf题目类型:web涉及考点:SQL注入先看题目,给了两个输入框:随便输入几个数进去,例如username=123,password=123:页面回显说是错误的用户密码,但注意到url中采用的是get传参:下一步寻找注入点,我们可以假设数据库中的查询语句为:select......
  • 关键sql
    分组后获取分组中对应的消息主体思路,先分组,然后获取关键数据,进行级联或利用EXISTS关键字SELECT*FROM(SELECTB.*FROM(SELECTACCEPTNO,TASK_ID,MAX(TIME_MARKER)ASMTMFROMKKWHERETIME_MARKER>5ANDFILD_COUNT<5GROUPBYACCE......
  • 快速离线安装MySql数据库
    一、mysal压缩文件通过ftp放入\opt-->解压cd/opttar-xzvfmysql-5.7.29-linux-glibc2.12-×86_64.tar.gz二、移动一>创建data目录一>创建用户组mvmysql-5.7.29-linux-glibc2.12-×86_64/usr/localcd/usr/localmvmysql-5.7.29-linux-glibc2.12-×86_64mysqlcd......
  • Mysql
    Mysql中的数据类型字段类型整型TINYINT,SMALLINNT,MEDIUMINT,INT,BIGINT分别使用8,16,24,32,64位的存储空间,一般情况下越小的列越好INT(11)中的数字只是规定了交互工具显示字符的个数,对于存储和计算来说没有任何意义。浮点数FLOAT和DOUBLE为浮点类型,DECIMAL为高精度小树类型,CPU原......
  • SQL中的各种连接介绍
    准备工作创建表stu和表classcreatetableIFNOTEXISTSstu(idbigintunsignedAUTO_INCREMENTcomment'学号',namevarchar(50)notnullcomment'姓名',ageintunsignednotnullcomment'年龄',class_idbigintunsignednotnullcomment......
  • MySQL基础
    1.数据库登录  mysql-uroot-p  mysql-uroot-pmysql  mysql-uroot-p-h192.168.213.200  备份  mysqldump-uroot-p--all-dtabases>all_databasees_20210305.sql      //备份所有库  mysqldump-uroot-p--databasesmysql>mysql_20......
  • SQL注入问题、视图、触发器、事务、存储过程、函数、流程控制、索引、测试索引
    SQL注入问题连接MySQL服务器conn=pymysql.connect(host=‘127.0.0.1’port=3306user=‘root’password='1234'......
  • mysql数据库3 表关系/多表查询等
    表关系(外键)#外键的前戏建立一张表:emp"""1.表不清晰,现在到底是员工表还是部门表2.字段需要重复的写,浪费资源3.兼容性很差,牵一发而动全身(这个问题是最不能容忍的)"""#以上问题该如何解决呢?我们的思路是,把一张表拆分成两张表拆成emp和depart部门表......
  • Mysql刪除binlog的方法
    参考文献:Mysql刪除binlog的方法(https://blog.csdn.net/weixin_42324463/article/details/126801856)在mysql的data目录下的binlog文件会随着时间推移越来越大。binlog文件不是直接rm就能解决的。即使rm删除了,但是mysql-bin.index档案中,还是有记录。正确步骤:1.linux进入mysqls......