ms SQL server數據庫學生表查詢

/************************************************
一、建立數據庫
************************************************/

USE master;
GO

CREATE DATABASE [StuData]
ON PRIMARY
(
    NAME = N'StuData',
    FILENAME = N'D:\SQL work\StuData.mdf',
    SIZE = 100MB,
    MAXSIZE = UNLIMITED,
    FILEGROWTH = 1MB
)

LOG ON 
(
    NAME = Studlog,
    FILENAME = 'D:\SQL work\Stulog1.ldf',
    SIZE = 100MB,
    MAXSIZE = 200,
    FILEGROWTH = 20
);

GO

/************************************************
二、建表
************************************************/

USE StuData;
GO

--學生表
CREATE TABLE S
(
	Sno CHAR(9) PRIMARY KEY,
	Sname CHAR(20) NOT NULL,
	Ssex CHAR(2) CHECK (Ssex IN ('男','女')),
	Sage SMALLINT,
	Sdept CHAR(20)
);

--課程表
CREATE TABLE C
(
	Cno CHAR(4) PRIMARY KEY,
	Cname CHAR(40) NOT NULL,
	Cpno CHAR(4),
	Ccredit SMALLINT,
	FOREIGN KEY (Cpno) REFERENCES C(Cno)
);
GO

--選課表
CREATE TABLE SC
(
	Sno CHAR(9),
	Cno CHAR(4),
	Grade SMALLINT CHECK (Grade >= 0 AND Grade <= 100),
	PRIMARY KEY (Sno, Cno),
	FOREIGN KEY (Sno) REFERENCES S(Sno),
	FOREIGN KEY (Cno) REFERENCES C(Cno)
);
GO

--加入列
--ALTER TABLE C ADD Cpno CHAR(4);

/************************************************
三、數據更新
************************************************/

--修改S
INSERT INTO S(Sno, Sname, Ssex, Sage, Sdept) VALUES ('95001',	'李勇',	'男',	20,	'CS');
INSERT INTO S(Sno, Sname, Ssex, Sage, Sdept) VALUES ('95002',	'劉晨',	'女',	19,	'IS');
INSERT INTO S(Sno, Sname, Ssex, Sage, Sdept) VALUES ('95003',	'王敏',	'女',	18,	'MA');
INSERT INTO S(Sno, Sname, Ssex, Sage, Sdept) VALUES ('95004',	'張力',	'男',	19,	'IS');

--修改C
INSERT INTO C(Cno, Cname, Ccredit, Cpno) VALUES ('C2',	'高等數學',	2,	null);
INSERT INTO C(Cno, Cname, Ccredit, Cpno) VALUES ('C6',	'數據處理',	2,	null);
INSERT INTO C(Cno, Cname, Ccredit, Cpno) VALUES ('C7',	'PASCAL語言',4,	'c6');
INSERT INTO C(Cno, Cname, Ccredit, Cpno) VALUES ('C4',	'操作系統',	3,	'c6');
INSERT INTO C(Cno, Cname, Ccredit, Cpno) VALUES ('C5',	'數據結構',	4,	'c7');
INSERT INTO C(Cno, Cname, Ccredit, Cpno) VALUES ('C1',	'數據庫',	4,	'c5');
INSERT INTO C(Cno, Cname, Ccredit, Cpno) VALUES ('C3',	'信息系統',	4,	'c1');

--修改數據
/*
UPDATE C 
SET Cpno='C5'
WHERE Cno = 'C1';
*/

--修改SC
INSERT INTO SC(Sno, Cno, Grade) VALUES ('95001',	'C1',	'92');
INSERT INTO SC(Sno, Cno, Grade) VALUES ('95001',	'C2',	'65');
INSERT INTO SC(Sno, Cno, Grade) VALUES ('95001',	'C3',	'88');
INSERT INTO SC(Sno, Cno, Grade) VALUES ('95001',	'C4',	'88');
INSERT INTO SC(Sno, Cno, Grade) VALUES ('95001',	'C5',	'88');
INSERT INTO SC(Sno, Cno, Grade) VALUES ('95001',	'C6',	'88');
INSERT INTO SC(Sno, Cno, Grade) VALUES ('95001',	'C7',	'88');
INSERT INTO SC(Sno, Cno, Grade) VALUES ('95002',	'C2',	'90');
INSERT INTO SC(Sno, Cno, Grade) VALUES ('95002',	'C5',	'73');

/************************************************
四、查詢
************************************************/

--列出所有表(測試)
SELECT *
FROM S;
SELECT *
FROM C;
SELECT *
FROM SC;

--查詢所有姓劉學生的姓名、學號和性別
SELECT  Sname , Sno , Ssex
FROM  S
WHERE  Sname  LIKE  '劉%' ;

--查詢選修c2課程且成績在90分及以上的所有學生的學號、姓名
--方法一
SELECT S.Sno, Sname
FROM S, SC
WHERE S.Sno = SC.Sno AND SC.Cno = 'C2' AND SC.Grade >= 90;

--方法二
SELECT Sno,Sname
FROM S
WHERE Sno IN
	(SELECT Sno 
	FROM SC
	WHERE SC.Cno = 'C2' AND SC.Grade >= 90);

--方法三
SELECT Sno,Sname 
FROM S
WHERE EXISTS
	(SELECT *
	FROM SC 
	WHERE Sno=S.Sno AND SC.Cno = 'C2' AND SC.Grade >= 90);

--查詢有2門以上課程是80分以上的學生學號及其(80分以上的)課程數
SELECT Sno, COUNT(*) NUM_OF_COURSE
FROM SC 
WHERE Grade >= 80 
GROUP BY Sno
	HAVING COUNT(*) >= 2;

--查詢選修了課程名爲“數據庫”的學生學號和姓名
--法一
SELECT Sno, Sname
FROM S
WHERE Sno IN
	(SELECT Sno 
	FROM SC
	WHERE Cno IN 
		(SELECT Cno 
		FROM C
		WHERE Cname = '數據庫')
	);

--法二
SELECT Sno, Sname
FROM S
WHERE EXISTS
	(SELECT *
	FROM SC
	WHERE Sno = S.Sno AND EXISTS
		(SELECT *
		FROM C
		WHERE Cno = SC.Cno AND Cname = '數據庫')
	);

--查詢其他系中比信息系某些學生年齡小的學生姓名和年齡
--法一
SELECT Sname, Sage
FROM S
WHERE Sage<ANY(SELECT Sage 
			  FROM S
			  WHERE Sdept = 'IS')
	AND Sdept <> 'IS';

--法二
SELECT Sname, Sage
FROM S
WHERE Sage < (SELECT MAX(Sage)
			  FROM S
			  WHERE Sdept='IS')
		AND Sdept!='IS';

-- 查詢沒有選修c1號課程的學生姓名
--法一
SELECT Sname
FROM S
WHERE Sno NOT IN
	(SELECT Sno 
	FROM SC
	WHERE Cno = 'C1');

--法二
SELECT Sname 
FROM S
WHERE NOT EXISTS
	(SELECT *
	FROM SC
	WHERE Sno = S.Sno AND Cno = 'C1');

--查詢選修了全部課程的學生姓名
--法一(派生表)
SELECT Sname
FROM S
WHERE Sno NOT IN
	(SELECT Sno 
	FROM (SELECT Sno,Cno
		FROM S,C
		EXCEPT
		SELECT Sno,Cno
		FROM SC) AS NEWT
	);

--法二(存在量詞)
SELECT Sname
FROM S
WHERE NOT EXISTS
	(SELECT *
	FROM C
	WHERE NOT EXISTS
		(SELECT *
		FROM SC
		WHERE Cno = C.Cno AND Sno = S.Sno)
	);

--查詢至少選修學生95002所選全部課程的學生學號
--法一
SELECT DISTINCT Sno 
FROM Sc AS S1
WHERE NOT EXISTS 
	(
	SELECT * 
	FROM Sc AS S2
	WHERE Sno='95002' AND NOT EXISTS 
		(
		SELECT *
		FROM Sc AS S3
		WHERE Sno=S1.SNO AND Cno=S2.Cno
		)	
	);

--法二	
SELECT DISTINCT SNO
FROM SC AS S1
WHERE SNO NOT IN 
(
	SELECT SNO 
	FROM SC AS S2
	WHERE SNO = '95002' AND S2.CNO NOT IN 
	(
		SELECT CNO 
		FROM SC AS S3 
		WHERE SNO = S1.SNO AND S3.CNO = S2.CNO 
	)
);

--三
SELECT DISTINCT SNO 
FROM SC AS SCX
WHERE Sno IN 
(
	SELECT Sno  
	FROM SC AS SCY
	WHERE SNO = SCX.Sno
	EXCEPT
	(	
		SELECT CNO 
		FROM SC 
		WHERE SNO = SCX.Sno
		EXCEPT
		SELECT Cno 
		FROM SC 
		WHERE Sno = '95002'
	)
);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章