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








暫無數據