首页 > 数据库 >SQL题目:在数据中找出所有val全为1的key

SQL题目:在数据中找出所有val全为1的key

时间:2024-04-18 09:13:05浏览次数:20  
标签:INSERT val INTO ArrayTbl2 VALUES key SQL NULL

这道题目我觉得很经典,所以记录下来。

表的结果如下:

一个实体对应10行数据,所以上面的表省略了一部分以方便显示。A、B、C的元素和正文中是一样的。

key为A的行val全都是NULL, key为B的行中只有i=1的行val是3,其他的都是NULL, key为C的行val全部都是1。

请思考一下如何从这张表中选出val全是1的key。答案是C。

这次,我们要按“行方向”进行全称量化,所以使用EXISTS谓词。

严格来说,这个问题还是相当复杂的,如果能注意到问题在哪里,那你就是高级水平了。在使用EXISTS解答之后,请再试试看有没有别的解法。这个问题有很多种解法,非常有趣。

表SQL:

/* 练习题1-8-1:数组表——行结构表的情况 */
CREATE TABLE ArrayTbl2
 (key   CHAR(1) NOT NULL,
    i   INTEGER NOT NULL,
  val   INTEGER,
  PRIMARY KEY (key, i));

/* A全为NULL、B仅有一个为非NULL、C全为非NULL */
INSERT INTO ArrayTbl2 VALUES('A', 1, NULL);
INSERT INTO ArrayTbl2 VALUES('A', 2, NULL);
INSERT INTO ArrayTbl2 VALUES('A', 3, NULL);
INSERT INTO ArrayTbl2 VALUES('A', 4, NULL);
INSERT INTO ArrayTbl2 VALUES('A', 5, NULL);
INSERT INTO ArrayTbl2 VALUES('A', 6, NULL);
INSERT INTO ArrayTbl2 VALUES('A', 7, NULL);
INSERT INTO ArrayTbl2 VALUES('A', 8, NULL);
INSERT INTO ArrayTbl2 VALUES('A', 9, NULL);
INSERT INTO ArrayTbl2 VALUES('A',10, NULL);
INSERT INTO ArrayTbl2 VALUES('B', 1, 3);
INSERT INTO ArrayTbl2 VALUES('B', 2, NULL);
INSERT INTO ArrayTbl2 VALUES('B', 3, NULL);
INSERT INTO ArrayTbl2 VALUES('B', 4, NULL);
INSERT INTO ArrayTbl2 VALUES('B', 5, NULL);
INSERT INTO ArrayTbl2 VALUES('B', 6, NULL);
INSERT INTO ArrayTbl2 VALUES('B', 7, NULL);
INSERT INTO ArrayTbl2 VALUES('B', 8, NULL);
INSERT INTO ArrayTbl2 VALUES('B', 9, NULL);
INSERT INTO ArrayTbl2 VALUES('B',10, NULL);
INSERT INTO ArrayTbl2 VALUES('C', 1, 1);
INSERT INTO ArrayTbl2 VALUES('C', 2, 1);
INSERT INTO ArrayTbl2 VALUES('C', 3, 1);
INSERT INTO ArrayTbl2 VALUES('C', 4, 1);
INSERT INTO ArrayTbl2 VALUES('C', 5, 1);
INSERT INTO ArrayTbl2 VALUES('C', 6, 1);
INSERT INTO ArrayTbl2 VALUES('C', 7, 1);
INSERT INTO ArrayTbl2 VALUES('C', 8, 1);
INSERT INTO ArrayTbl2 VALUES('C', 9, 1);
INSERT INTO ArrayTbl2 VALUES('C',10, 1);

 

1、错误解法

/* 练习题1-8-1:数组表——行结构表的情况 
   错误的结果 */
SELECT DISTINCT key1
  FROM ArrayTbl2 AT1
 WHERE NOT EXISTS
        (SELECT *
           FROM ArrayTbl2 AT2
          WHERE AT1.key1 = AT2.key1
            AND AT2.val <> 1);

 

2、exits解法

/* 正确解法 */
SELECT DISTINCT key
  FROM ArrayTbl2 A1
 WHERE NOT EXISTS
        (SELECT *
           FROM ArrayTbl2 A2
          WHERE A1.key = A2.key
            AND (A2.val <> 1 OR A2.val IS NULL));

 

3、all谓词

/* 其他解法1:使用ALL谓词 */
SELECT DISTINCT key
  FROM ArrayTbl2 A1
 WHERE 1 = ALL
          (SELECT val
             FROM ArrayTbl2 A2
            WHERE A1.key = A2.key);

 

4、having子句

/* 其他解法2:使用HAVING子句 */
SELECT key
  FROM ArrayTbl2
 GROUP BY key
HAVING SUM(CASE WHEN val = 1 THEN 1 ELSE 0 END) = 10;

 

5、having子句2

/* 其他解法3:在HAVING子句中使用极值函数 */
SELECT key
  FROM ArrayTbl2
 GROUP BY key
HAVING MAX(val) = 1
   AND MIN(val) = 1;

 

标签:INSERT,val,INTO,ArrayTbl2,VALUES,key,SQL,NULL
From: https://www.cnblogs.com/stfzhuang/p/18142207

相关文章

  • 二次注入(SQL)
    先来一段理论二次SQL注入(Second-OrderSQLInjection)是一种特殊类型的SQL注入攻击。与一般的SQL注入攻击类似,攻击者会通过输入恶意的SQL语句来执行非法操作。而二次SQL注入则是指攻击者在应用程序中注入恶意的数据,然后等待应用程序将这些数据存储在数据库中。当应用程序再次从数......
  • openGauss Slow-Query-Diagnosis-慢SQL根因分析命令参考
    命令参考表1gs_dbmindcomponentslow_query_diagnosis命令行说明参数参数说明取值范围-h,--help帮助命令-action动作参数show:结果展示clean:清理结果diagnosis:交互诊断-c,--conf配置目录---query慢SQL文本*--start-time显示开始时间......
  • openGauss Slow-Query-Diagnosis-慢SQL根因分析使用指导
    使用指导假设用户已经初始化配置文件目录confpath,则可以通过下述命令实现本特性的功能:仅启动慢SQL诊断功能(输出Top3根因),启动命令如下(更多用法参考对service子命令的说明):gs_dbmindservicestart-cconfpath--only-runslow_query_diagnosis用户交互式慢SQL诊断,命令如下......
  • openGauss SQLdiag-慢SQL发现
    SQLdiag:慢SQL发现SQLdiag是openGauss中SQL语句执行时长预测工具。现有的预测技术主要基于执行计划的预测方法,但这些预测方案仅适用于OLAP场景且可以获取执行计划的任务,对于OLTP或者HTAP这样的快速、简单查询是没有太多使用价值的。与上述方案不同,SQLdiag着眼于数据库的历史SQL语......
  • openGauss Slow-Query-Diagnosis-慢SQL根因分析常见问题处理
    常见问题处理如果用户对没有执行过的慢SQL执行交互式诊断命令,则无法给出诊断结果。exporter指标采集功能没有启动时运行慢SQL诊断功能,此时功能无法正常运行。配置文件中的参数重新设置后,需要重新启动服务进程才能生效。使用慢SQL的交互诊断功能时,工具基于RPC和数据采集服务获......
  • Failing package is: mysql-community-server-5.7.44-1.el7.x86_64 GPG Keys are con
    Failingpackageis:mysql-community-server-5.7.44-1.el7.x86_64GPGKeysareconfiguredas:file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql  执行 wget--quiet--output-document-https://repo.mysql.com/RPM-GPG-KEY-mysql-2022|gpg--no-default-keyring--keyr......
  • centos7 安装 Mysql 5.7.28,详细完整教程
    https://cloud.tencent.com/developer/article/1886339 1. 下载MySQLyum包wgethttp://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm复制2.安装MySQL源rpm-Uvhmysql57-community-release-el7-10.noarch.rpm复制3.安装MySQL服务端,需要等待一些......
  • Centos系统彻底卸载MySQL数据库
    一、检查系统是否安装了MySQL数据库命令:rpm-qa|grep-imysql  二、关闭MySQL服务命令:servicemysqlstop三、卸载并删除MySQL(不检查依赖关系)卸载common命令:rpm-ev--nodepsmysql-community-common-8.0.29-1.el7.x86_64  卸载libs命令:rpm-ev--nodepsmysql-......
  • Go 单元测试之Mysql数据库集成测试
    目录一、sqlmock介绍二、安装三、基本用法四、一个小案例五、Gorm初始化注意点一、sqlmock介绍sqlmock是一个用于测试数据库交互的Go模拟库。它可以模拟SQL查询、插入、更新等操作,并且可以验证SQL语句的执行情况,非常适合用于单元测试中。二、安装gogetgithub.com/......
  • openGauss SQLdiag-慢SQL发现获取帮助
    获取帮助使用SQLdiag工具前,您可以通过以下指令获取帮助。gs_dbmindcomponentsqldiag--help显示如下帮助信息:usage:[-h][-fCSV_FILE][--predicted-filePREDICTED_FILE][--model{template,dnn}]--model-pathMODEL_PATH[--config......