如何在 MySQL 中执行 IS_THE_SUBSET_OF 函数?

Posted

技术标签:

【中文标题】如何在 MySQL 中执行 IS_THE_SUBSET_OF 函数?【英文标题】:How to perform IS_THE_SUBSET_OF function in MySQL? 【发布时间】:2018-04-16 11:23:10 【问题描述】:

添加:学生和需要的 CREATE 代码

CREATE TABLE `student` (
    `sid` VARCHAR(6) NOT NULL,
    `sname` VARCHAR(6) NULL DEFAULT NULL,
    `sex` VARCHAR(2) NULL DEFAULT NULL,
    `age` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
    `dept` VARCHAR(50) NULL DEFAULT NULL,
    `class` VARCHAR(4) NULL DEFAULT NULL,
    PRIMARY KEY (`sid`)
);

CREATE TABLE `takes` (
    `sid` VARCHAR(6) NOT NULL,
    `cid` VARCHAR(3) NOT NULL,
    `score` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
    PRIMARY KEY (`sid`, `cid`)
)

我将显示所有参加过 ID 为“31401”的学生所修课程的学生的 ID 和姓名。我有以下代码:

SELECT sid, sname
FROM student S
WHERE NOT EXISTS((SELECT cid
                 FROM takes
                 WHERE sid = '31401')
                 EXCEPT
                 (SELECT cid
                 FROM takes T
                 WHERE S.sid = T.sid));

但是,mysql 中没有 EXCEPT 操作。所以我想知道我是否可以这样重写:

SELECT sid, sname
FROM student S
WHERE ((SELECT cid
        FROM takes
        WHERE sid = '31401')
        IS_THE_SUBSET_OF
       (SELECT cid
        FROM takes T
        WHERE S.sid = T.sid));

如何实现 IS_THE_SUBSET_OF 函数?

【问题讨论】:

您可以使用 HAVING、IS、IS NOT、IS NOT IN() 等,或者您可以只使用连接来做您想做的事情,而不是保存子查询并更快。 Error when using except in a query的可能重复 【参考方案1】:

没有基于集合的运算符可以满足您的需求。可以使用joingroup by等一些逻辑:

select t.sid
from takes t join
     takes ts
     on t.cid = ts.cid and ts.sid = 31401  -- don't use single quotes for a numeric constant
group by t.sid
having count(*) = (select count(*) from takes ts2 where ts2.sid = 31401);

此公式假设 takes 没有重复的 sid/cid 对。

【讨论】:

以上是关于如何在 MySQL 中执行 IS_THE_SUBSET_OF 函数?的主要内容,如果未能解决你的问题,请参考以下文章

mysql中如何查看优化器优化后的执行计划

mysql如何查询SQL中哪些语句执行最占用CPU?

如何在MySQL中执行SQL?

如何在 MySQL Workbench 中执行多个 SQL 查询?

mysql中如何在命令行中,执行一个SQL脚本文件?

如何在 Ms Access 2007 中执行 Mysql 查询