Добавлено: код 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')
)
Я собираюсь отобразить идентификаторы и имена всех студентов, которые прошли курсы, которые были сделаны учеником, чей идентификатор "31401". У меня есть следующий код:
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?
Оператор на основе набора не выполняет то, что вы хотите. Вы можете использовать join
, group 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
.