單選題:有關(guān)系S(SNO,SNAME,SDEPT,SAGE),C(CNO,CNAME),Sc(SNO,CNO,GRADE)。其中SNO是學(xué)生號,SNAME是學(xué)生姓名,SDEPT是系別,SAGE是學(xué)生年齡,CNO是號,CNAME是課程名稱,GRADE是成績。要查詢“計算機(jī)”系的沒有不及格成績的學(xué)生學(xué)號和姓名 ( )
A.SELECT Sno, Sname FROM S WHERE Sdept='計算機(jī)' INTERSECT SELECT Sno, Sname FROM SC WHERE GRADE>=60;
B.SELECT Sno, Sname FROM S WHERE Sdept='計算機(jī)' and Sno not in (SELECT SNO FROM SC WHERE GRADE<60);
C.SELECT Sno, Sname FROM S WHERE Sdept='計算機(jī)' EXCEPT SELECT SNOFROM SC WHERE GRADE<60;
D.SELECT Sno, Sname FROM S WHERE Sdept='計算機(jī)' and SNO in (SELECT SNO FROM SC WHERE GRADE>=60);
答案:選B
解析:
首先提示一點(diǎn),一個學(xué)生會對應(yīng)多個課程,會存在有的課程及格有的課程不及格,如下表所示:
學(xué)號 課程 成績
學(xué)生A 課程1 66
學(xué)生A 課程2 55
學(xué)生A 課程3 44
其次沒有不及格成績的學(xué)生學(xué)號和姓名,意味著這個學(xué)生的所有課程成績都要及格,上表中的學(xué)生A這類有的課程及格有的課程不及格的學(xué)生不符合條件
小伙伴大多疑問D選項(xiàng),對于SELECT SNO FROM SC WHERE GRADE>=60這個子查詢,學(xué)生A這類有的課程及格有的課程不及格的學(xué)生會出現(xiàn)在子查詢結(jié)果中,進(jìn)而最后結(jié)果中也會出現(xiàn)學(xué)生A這類有的課程及格有的課程不及格的學(xué)生,因此D不是正確的答案。
詳細(xì)探討:
A. SELECT Sno, Sname FROM S WHERE Sdept='計算機(jī)’INTERSECT SELECT Sno, Sname FROM SC WHERE GRADE>=60;
首先 其中SELECT Sno, Sname FROM SC WHERE GRADE>=60錯誤,Sname 不在SC中,這個子查詢無法執(zhí)行。
其次這個查詢語句使用了INTERSECT操作符來獲取同時滿足兩個條件的學(xué)生學(xué)號和姓名。首先,在第一個子查詢中,我們選擇S表中Sno和Sname列,限定條件是Sdept為“計算機(jī)”。然后,在第二個子查詢中,我們選擇SC表中Sno和Sname列,限定條件是GRADE大于等于60, 學(xué)生A這類有的課程及格有的課程不及格的學(xué)生會被查詢到,。最后,使用INTERSECT操作符來獲取兩個子查詢的交集。然而,學(xué)生A這類有的課程及格有的課程不及格的學(xué)生會出現(xiàn)在最后結(jié)果中,因此不是正確的答案。
B. SELECT Sno, Sname FROM S WHERE Sdept='計算機(jī)' and Sno not in (SELECT SNO FROM SC WHERE GRADE<60);
這個查詢語句使用了NOT IN關(guān)鍵字來排除主查詢中的學(xué)生學(xué)號在子查詢中出現(xiàn)的情況。首先,在主查詢中,我們從S表中選擇Sno和Sname列,限定條件是Sdept為“計算機(jī)”。然后,在子查詢中,我們選擇SC表中的SNO列,限定條件是GRADE小于60。最后,使用NOT IN關(guān)鍵字來排除主查詢中的學(xué)生學(xué)號在子查詢中出現(xiàn)的情況。這樣,只有在S表中的學(xué)生學(xué)號不在SC表中的不及格成績學(xué)生學(xué)號列表中的學(xué)生才會被選擇。因此,這個查詢語句是正確的答案。
C. SELECT Sno, Sname FROM S WHERE Sdept='計算機(jī)’ EXCEPT SELECT Sno FROM SC WHERE GRADE<60;
會報措提示:列數(shù)不一致 Error Code: 1222. The used SELECT statements have a different number of columns。EXCEPT前后列數(shù)不一致,無法執(zhí)行。改為:SELECT Sno FROM S WHERE Sdept='計算機(jī)’ EXCEPT SELECT Sno FROM SC WHERE GRADE<60;可以得到結(jié)果,但是結(jié)果無學(xué)生姓名Sname 。因此不是正確的答案。
D. SELECT Sno, Sname FROM S WHERE Sdept='計算機(jī)’ and SNO in (SELECT SNO FROM SC WHERE GRADE>=60);
對于SELECT SNO FROM SC WHERE GRADE>=60這個子查詢,學(xué)生A這類有的課程及格有的課程不及格的學(xué)生會出現(xiàn)在子查詢結(jié)果中,進(jìn)而最后結(jié)果中也會出現(xiàn)學(xué)生A這類有的課程及格有的課程不及格的學(xué)生,因此D不是正確的答案
綜上所述,B是正確的答案
備注:比較新的 MySQL 8.0.31 版本支持INTERSECT 和 EXCEPT,老版本不支持
以下是我對于此題的SQL建表建數(shù)實(shí)踐,感興趣的伙伴可以試試。
##建表建數(shù)實(shí)踐:
#創(chuàng)建S表:
#DROP TABLE S;
CREATE TABLE S (
Sno CHAR(10) PRIMARY KEY,
Sname VARCHAR(20) NOT NULL,
Sdept VARCHAR(20) NOT NULL,
Sage INT NOT NULL
);
INSERT INTO S VALUES ('S001', '張三', '計算機(jī)', 20);
INSERT INTO S VALUES ('S002', '李四', '數(shù)學(xué)', 21);
INSERT INTO S VALUES ('S003', '王五', '計算機(jī)', 19);
INSERT INTO S VALUES ('S004', '趙六', '物理', 20);
INSERT INTO S VALUES ('S005', '錢七', '計算機(jī)', 22);
#創(chuàng)建C表:
#DROP TABLE C;
CREATE TABLE C (
Cno CHAR(10) PRIMARY KEY,
Cname VARCHAR(20) NOT NULL
);
INSERT INTO C VALUES ('C001', '數(shù)據(jù)庫');
INSERT INTO C VALUES ('C002', '數(shù)據(jù)結(jié)構(gòu)');
INSERT INTO C VALUES ('C003', '計算機(jī)組成原理');
INSERT INTO C VALUES ('C004', '操作系統(tǒng)');
INSERT INTO C VALUES ('C005', '計算機(jī)網(wǎng)絡(luò)');
#創(chuàng)建SC表:
#DROP TABLE SC;
CREATE TABLE SC (
Sno CHAR(10) NOT NULL,
Cno CHAR(10) NOT NULL,
Grade INT NOT NULL,
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES S(Sno),
FOREIGN KEY (Cno) REFERENCES C(Cno)
);
INSERT INTO SC VALUES ('S001', 'C001', 66);
INSERT INTO SC VALUES ('S001', 'C002', 55);
INSERT INTO SC VALUES ('S001', 'C003', 44);
INSERT INTO SC VALUES ('S002', 'C001', 75);
INSERT INTO SC VALUES ('S002', 'C002', 80);
INSERT INTO SC VALUES ('S002', 'C003', 70);
INSERT INTO SC VALUES ('S003', 'C001', 90);
INSERT INTO SC VALUES ('S003', 'C002', 95);
INSERT INTO SC VALUES ('S003', 'C003', 85);
INSERT INTO SC VALUES ('S004', 'C001', 70);
INSERT INTO SC VALUES ('S004', 'C002', 80);
INSERT INTO SC VALUES ('S004', 'C003', 75);
INSERT INTO SC VALUES ('S005', 'C001', 85);
INSERT INTO SC VALUES ('S005', 'C002', 90);
INSERT INTO SC VALUES ('S005', 'C003', 80);
A.SELECT Sno, Sname FROM S WHERE Sdept='計算機(jī)' INTERSECT SELECT Sno, Sname FROM SC WHERE GRADE>=60;
B.SELECT Sno, Sname FROM S WHERE Sdept='計算機(jī)' and Sno not in (SELECT SNO FROM SC WHERE GRADE<60);
C.SELECT Sno, Sname FROM S WHERE Sdept='計算機(jī)' EXCEPT SELECT SNOFROM SC WHERE GRADE<60;
D.SELECT Sno, Sname FROM S WHERE Sdept='計算機(jī)' and SNO in (SELECT SNO FROM SC WHERE GRADE>=60);








暫無數(shù)據(jù)