SQL_学生-课程数据库(上)

 

第一部分

单表查询

例一:查询全体学生的学号与姓名

SELECT Sno,Sname

FROM Student;

例二:查询全体学生的姓名、学号、所在系

SELECT Sname,Sno,Sdept

FROM Student;

例三:查询全体学生的详细记录

SELECT *

FROM Student;

等价于:

SELECT *

FROM Student;

例四:查询全体学生的姓名及其出生年份

SELECT Sname,2009-Sage

FROM Student;

例五:查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示所有的系名

SELECT Sname,'Year of Birth:',2004-Sage,LOWER(Sdept)

FROM Student;

指定列别名如下方法:

SELECT Sname NAME,'Year of Birth:' BIRTH,2009-Sage BIRTHDAY,

LOWER(Sdept) DEPARTMENT

FROM Student;

例六:查询选修了课程的学生的学号

SELECT Sno //等价于SELECT ALL Sno

FROM SC;

去掉重复行方法:

SELECT DISTINCT Sno

FROM SC;

例七:查询计算机科学系全体学生的名单

SELECT Sname

FROM Student

WHERE Sdept='CS';

例八:查询所有年龄在20岁以下的学生的姓名及其年龄

SELECT Sname,Sage

FROM Student

WHERE Sage<20;

例九:查询考试成绩有不及格的学生的学号

SELECT DISTINCT Sno

FROM SC

WHERE Grade<60;

例十:查询年龄在20-23(包括20岁和23)之间的学生的姓名、系别和年龄

SELECT Sname,Sdept,Sage

FROM Student

WHERE Sage BETWEEN 20 AND 23;

例十一:查询年龄不在20-23岁之间的学生的姓名、系别、和年龄

SELECT Sname,Sdept,Sage

FROM Student

WHERE Sage NOT BETWEEN 20 AND 23;

例十二:查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别

SELECT Sname,Ssex

FROM Student

WHERE Sdept IN('CS','MA','IS');

等价于:

SELECT Sname,Ssex

FROM Student

WHERE Sdept='CS'OR Sdept='MA' OR Sdept='IS';

例十三:查询既不是计算机科学系、数学系,也不是信息系的姓名和性别

SELECT Sname,Ssex

FROM Student

WHERE Sdept NOT IN('IS','MA','CS');

例十四:查询学号为200215121的学生的详细情况

SELECT *

FROM Student

WHERE Sno LIKE '200215126 ';//输入数字6后空一格后输入单引号,否则查询不显示

等价于:

SELECT *

FROM Student

WHERE Sno='200215121';

例十五:查询所有姓刘的学生的姓名、学号和性别

SELECT Sname,Sno,Ssex

FROM Student

WHERE Sname LIKE '%';

例十六:查询姓”欧阳”且全名为3个汉字的学生的姓名

SELECT Sname

FROM Student

WHERE Sname LIKE '欧阳__%';

例十七:查询名字中第2个字为“阳”字的学生的姓名和学号

SELECT Sname,Sno

FROM Student

WHERE Sname LIKE '_%';

例十八:查询所有不姓刘的学生的姓名

SELECT Sname,Sno,Ssex

FROM Student

WHERE Sname NOT LIKE '%';

例十九:查询 DB_Design课程的课程号和学分

SELECT Cno,Ccredit

FROM Course

WHERE Cname LIKE 'DB/_Design%' ESCAPE'/';

例二十:查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况

SELECT *

FROM Course

WHERE Cname LIKE 'DB/_%i__%'ESCAPE'/';

例二十一:查询缺少成绩的学生的学号和相应的课程号

SELECT Sno,Cno

FROM SC

WHERE Grade IS NULL;

例二十二:查询所有有成绩的学生学号和课程号

SELECT DISTINCT Sno,Cno

FROM SC

WHERE Grade IS NOT NULL;

例二十三:查询计算机科学系年龄在20岁以下的学生的姓名

SELECT Sname

FROM Student

WHERE Sdept='CS' AND Sage<20;

例二十四:查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列

SELECT Sno,Grade

FROM SC

WHERE Cno='3'

ORDER BY Grade DESC

例二十五:查询全体学生的情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列

SELECT *

FROM Student

ORDER BY Sdept,Sage DESC;

例二十六:查询学生的总人数

SELECT COUNT(*)

FROM Student;

例二十七:查询选修了课程的学生人数

SELECT COUNT(DISTINCT Sno)

FROM SC

例二十八:计算1号课程的学生平均成绩

SELECT AVG(Grade)

FROM SC

WHERE Cno='1';

例二十九:查询选修1号课程的学生最高分数

SELECT MAX(Grade)

FROM SC

WHERE Cno='1';

例三十:查询学生200215012选修课程的总学分数

SELECT SUM(Ccredit)

FROM SC,Course

WHERE Sno='200215122'AND SC.Cno=Course.Cno;

33:查询每一个学生及其选修课程的情况

SELECT Student.*,SC.*

FROM Student,SC

WHERE Student.Sno=SC.Sno;

34:针对33用自然连接完成

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade

FROM Student,SC

WHERE Student.Sno=SC.Sno;

32:查询选修了3门以上课程的学生的学号

SELECT Sno

FROM SC

GROUP BY Sno

HAVING COUNT(*) >3;

31:求各个课程号及相应的选课人数

SELECT Cno,COUNT(Sno) AS 'COUNT(Sno)'

FROM SC

GROUP BY Cno;

35查询每一门课的间接先修课(即先修课的先修课)

SELECT FIRST.Cno,SECOND.Cpno

FROM Course FIRST,Course SECOND

WHERE FIRST.Cpno=SECOND.Cno;

?36:外连接

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade

From Student LEFT OUT JOIN SC ON(Student.Sno=SC.Sno);

也可以使用USING来去掉结果中地重复值

FROM Student LEFT OUT JOIN SC USING(Sno);

37:查询选修了2号课程且成绩在90分以上地所有学生

SELECT Student.Sno,Sname

FROM Student SC

WHERE Student.Sno=SC.Sno AND

SC.Cno='2' AND SC.Grade>90;

38:查询每个学生地学号、姓名、选修课地课程名及成绩

SELECT Student.Sno,Sname,Cname,Grade

FROM Student,SC,Course

WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno

嵌套查询:

SELECT Sname

FROM Student

WHERE Sno IN

(SELECT Sno

FROM SC

WHERE Cno='2');

SELECT Sno,Sname,Sdept

FROM Student

WHERE Sdept IN

(SELECT Sdept

FROM Student

WHERE Sname='刘晨');

40:查询选修了课程名为“信息系统”的学生学号和姓名

SELECT Sno,Sname

FROM Student

WHERE Sno IN

(SELECT Sno

FROM SC

WHERE Cno IN

(SELECT Cno

FROM Course

WHERE Cname='信息系统'

)

)

带有比较运算符的子查询

SELECT Sno,Sname,Sdept

FROM Student

WHERE Sdept=

(SELECT Sdept

FROM Student

WHERE Sname='刘晨')

 

41:找出每一个学生超过他选修课程平均成绩的课程号

SELECT Sno,Cno

FROM SC x

WHERE Grade >=(SELECT AVG(Grade)

FROM SC y

WHERE y.Sno=x.Sno);

SELECT AVG(Grade)

FROM SC y

WHERE y.Sno='200215121';

SELECT Sno,Cno

FROM SC x

WHERE Grade>=80;

42:查询其他系中比计算机科学系某一学生年龄小的学生姓名和年龄

SELECT Sname,Sage

FROM Student

WHERE Sage<ANY(SELECT Sage

FROM Student

WHERE Sdept='CS')

AND Sdept<>'CS'

SELECT Sname,Sage

FROM Student

WHERE Sage<

(SELECT MAX(Sage)

FROM Student

WHERE Sdept='CS')

AND Sdept<>'CS';

43:查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄

SELECT Sname,Sage

FROM Student

WHERE Sage<ALL

(SELECT Sage

FROM Student

WHERE Sdept='CS')

AND Sdept<>'CS';

SELECT Sname,Sage

FROM Student

WHERE Sage<

(SELECT MIN(Sage)

FROM Student

WHERE Sdept='CS')

AND Sdept<>'CS';

44:查询所有选修了1号课程的学生的姓名

SELECT Sname

FROM Student

WHERE EXISTS

(SELECT *

FROM SC

WHERE Sno=Student.Sno AND Cno='1');

45:查询没有选修1号课程的学生的姓名

SELECT Sname

FROM Student

WHERE NOT EXISTS

(SELECT *

FROM SC

WHERE Sno=Student.Sno AND Cno='1');

SELECT Sno,Sname,Sdept

FROM Student S1

WHERE EXISTS

(SELECT *

FROM Student S2

WHERE S2.Sdept=S1.Sdept AND S2.Sname='刘晨');

|39EXISTS实现查询代码:

SELECT Sno,Sname,Sdept

FROM Student S1

WHERE EXISTS

(SELECT *

FROM Student S2

WHERE S2.Sdept=S1.Sdept AND

S2.Sname='刘晨');

?例46:查询选修了全部课程的学生的姓名

SELECT Sname

FROM Student

WHERE NOT EXISTS

(SELECT *

FROM Course

WHERE NOT EXISTS

(SELECT *

WHERE Sno=Student.Sno

AND Cno=Course.Cno));

?例47查询至少选修了学生200215122选修的全部课程的学生号码

SELECT DISTINCT Sno

FROM SC SCX

WHERE NOT EXISTS

(SELECT *

FROM SC SCY

WHERE SCY.Sno='200215122' AND

NOT EXISTS

(SELECT *

FROM SC SCZ

WHERE SCZ.Sno=SCX.Sno AND

SCZ.Cno=SCY.Cno));

 

 

建立环境实验数据库/表 实验学时:2学时 实验类型:验证 实验要求:必修 一、实验目的 通过本实验的学习,使学生熟悉SQL Server 2014的集成环境,帮助学生掌握数据库、表的建立方法以及SQL Server的数据导入方法 二、实验内容    ()SQL Server 2014的安装 SQL Server2014的安装过程 SQL Server 2008、SQL Server2012的安装过程类似,都提供了一个功能树以用来安装所有 SQL Server 组件,包括计划、安装、维护、工具、资源、高级、选项等功能。下面是各功能选项中所包含的内容,如图3-1所示。 图3-1 安装计划中的内容 (1)选择“安装”功能,因为要创建SQL Server 2014的全新安装,单击“全新SQL Server 2014独立安装或向现有安装添加功能”选项,如图3-2所示。 图3-2 “安装”功能中的内容 (2)在“产品密匙”页上,选择相应的单选按钮,这些按钮指示是安装免费版本的SQL Server还是具有产品密匙的产品版本,如果使指免费的评估版,只有180天的试用期限,如图3-3所示。 图3-3 “产品密钥”界面 (3)在“许可条款”页上阅读许可协议,然后选中相应的复选框以接受许可条款条件。如图3-4所示。 图3-4 “许可条款”界面 (4)统进行安装程序支持规则检,以确定安装SQL Server安装程序支持文件时可能发生的问题。必须更正所有的失败,安装程序才能继续。如图3-5所示。 图3-5 “安装规则”界面 (5)在“设置角色”页上选择SQL Server功能安装,如图3-6所示。 图3-6 “设置”角色界面 (6)在“功能选择”页上选择要安装的组件。选择功能名称后,右侧窗体中会显示每个组件的说明。可以根据实际需要,选中一些功能,如图3-7所示。一般应用可选择“数据库引擎服务”、“客户端工具连接”、“SQL客户端连接”“管理工具”等选项。 图3-7“功能选择”界面 (7)在“实例配置”页上制定是安装默认实例还是命名实例,对于默认实例,实例的名称ID都是MSSQLSERVER,也可以自己“命名实例”安装实例,如图3-8所示。SQL Server支持多个实例,即支持在同一台计算机上同时运行多个SQL Server数据库引擎实例,每个SQL Server数据库引擎实例各有一套不为其它实例共享的统及用户数据库。应用程序连接同一台计算机上的SQL Server数据库引擎实例的方式连接其它计算机上运行的SQL Server数据库引擎的方式基本相同。 图3-8 “实例配置”界面 (8)在“服务器配置”页上指定SQL Server服务的登录帐户。SQL Server提供了多种服务,可以为所有SQL Server服务配相同的登录账户,也可以别配置每个服务账户。还可以指定服务是自动启动、手动启动还是禁用。Microsoft建议对各服务账户进行单独配置,以便为每项服务提供最低特权,即向SQL Server服务授予它们完成各自任务所需的最低权限,如图3-9所示。SQL Server中的每个服务代表一个进程或一组进程,每个进程需要有访问SQL Server相关文件统注册表的权限,为了能让SQL Server服务在操作统中正常的启动运行,就需要指定SQL Server的服务帐户,所以服务帐户指的是Windows操作统中的帐户。 图3-9 “服务器配置”界面 (9)在“数据库引擎配置”的“服务器配置”页上指定身份验证模式、用户名、密码,如图3-10所示。这里的用户身份验证指的是登录到服务器使用的身份验证模式及用户名密码。身份验证模式为“Windows身份验证模式”“混合模式(SQL Server身份验证Windows身份验证)”。如果选择“Windows身份验证模式”表示则只能使用Windows的帐号登录,即使用当前登录到操作统的帐号进行登录,通过这种方式用户登录到SQL Server中时不再需要输入帐号密码。如选择“混合模式(SQL Server身份验证Windows身份验证)”表示除了可以用使用登录到Windows的帐号作为登录的依据外,还可以使用SQL Server统的帐号登录,这里必须为内置SQL Server统管理员账户(SA)提供一个强密码。必须至少为SQL Server实例指定一个统管理员。若要添加用以运行SQL Server安装程序账户,则要单击“添加当前用户”按钮。若要向统管理员列表中添加账户或从中删除账户,则单击“添加…”或“删除…”按钮,然后编辑将拥有SQL Server实例的管理员特权的用户、组或计算机列表。 图3-10 设置身份验证模式管理员 (10)在“准备安装”页显示安装过程中的安装选项的树视图,如图3-11所示。若要继续,单击“安装”按钮。在安装过程中,“安装进度”页会提供相应的状态,因此可以在安装过程中监视安装进度。 图3-121“准备安装”界面 (11)安装完成后,“完成”页提供指向安装日志文件摘要以及其他重要说明的链接。如图3-12所示。 图3-12 “安装完成”界面 ()、建库建表练习      1、利用语句建库建表: 创建学生数据库StuDB,文件名位置自定,在此数据库中创建如下三张表: 学生(student) (   学号(sno) 普通编码定长字符类型,长度9,主码,   姓名(sname) 普通编码定长字符类型,长度10,非空,   性别(ssex) 统一编码定长字符类型,长度2,   年龄(sage) 微整型,   所在(sdept) 统一编码可变长字符类型,长度20 ) 课程(course) (   课程(cno) ,通编码定长字符类型,长度4,主码,   课程(cname) 统一编码定长字符类型,长度,40,非空,   开课学期(Semester) 短整数, 学(credit) 短整数 ) 修课表(sc)(   学号(sno) 普通编码定长字符类型,长度7,主码,外码   课程(cno) 普通编码定长字符类型,长度6,主码,外码   成绩(grade) 小整型,   修课类别(ctype)普通编码定长字符类型,长度4 ) 2、建立“汽车”数据库,文件名位置自定,在此数据库中创建如下三张表: 汽车表(CarT),结构如下:   汽车序号(CId) 整型 主关键字,   汽车名称(CName) 普通编码定长字符类型 长度为10  非空,   型号(CType)普通编码变长字符类型 长度为60  非空,   价格(CPrice) 整型,   车身眼色(Ccolor)普通编码变长字符类型 长度为20。 部门表(DepartT),结构如下:   部门序号(DId)整型 主关键字,   部门名(DName)普通编码定长字符类型 长度为20   非空,   负责人名(DLead)普通编码定长字符类型 长度为10  非空,   人数(DAmount) 整型。 汽车出厂表(FacT),结构如下:   汽车序号(CID) 整型 非空,   部门序号(DId) 整型 非空,   出厂日期(FDate)小日期时间型 非空,   出厂数量(FAmount) 整型,   出厂价格(FPrice) 整型。   其中:主关键字为(汽车序号,部门序号,出厂日期)   “汽车序号”为引用汽车表的“汽车序号”的外部关键字; “部门序号”为引用部门表的“部门序号”的外部关键字。 3、使用数据库的可视化工具建库建表 建立银行贷款表,具体要求同课堂教学的建库建表一致。 银行表(BankT)( 银行代码(Bno) 主键 银行名称(Bname) 非空 电话(Tel) ) 法人表(LET)( 法人代码(Eno)主键 法人名称(Ename)取值唯一 经济性质(Enature) 注册资金(Ecapital) 法定代表人(Erep) ) 贷款表(LoanT)( 法人代码(Eno) 银行代码(Bno) 贷款日期(Ldata) 贷款金额(Lamount) 贷款期限(Lterm) )        ()、数据导入练习 将“学生数据库数据.xls”中的数据导入到学生数据库的三张表中。 将“银行贷款数据.xls”中的数据导入到银行贷款数据库的三张表中。 三、实验报告 将实验结果反映在实验报告中,并对实验中遇到的问题及解决方案、进行整理、析总结,提出实验结论或自己的看法。
建立如下三个学生选课相关的表,并输入相应的记录行。 S(S#,SNAME,AGE,SEX,SDEPT) SC(S#,C#,GRADE) C(C#,CNAME,TEACHER,PC#) 其中,S 表示学生,它的各属性依次为学号姓名、年龄、性别、;SC 表示 成绩,它的各属性依次为学号课程数;C 表示课程,它的各属性依次为课 程号、课程任课教师。 2. 试用 SQL 语句完成下列查询: (1)查询学生选课表中的全部数据。 (2查询计算机学生姓名,年龄。 (3查询成绩在 70~80 之间的学生学号,课程成绩。 (4)查询计算机年龄在 18~20 之间且性别为"男"的学生姓名年龄。 (5查询课程号为"C01"的课程的最高数。 (6)查询计算机学生的最大年龄最小年龄。 (7)统计每个学生人数。 (8)统计每门课程的选课人数考试最高。 (9)查询每个学生的选课门数考试总成绩,并按选课门数的升序显示结果. (10)查询总成绩超过 200 学生,要求列出学号,总成绩。 (11)查询选修了"C02"的学生姓名所在。 (12查询成绩在 80 以上的学生姓名,课程成绩,并按成绩的降序排列。 (13查询那些课程没有人选修.要求列出课程课程名。 1 (14)要求用子查询 (1) .查询选修了课程"C01"的学生姓名所在(2) 查询数学成绩在 80 以上的学生学号,姓名。 Select sno,sname where dept =’数学’and sno in (select sno from sc where grade>80) (15)求数学学生学号姓名
05-12
插入记录行: S表: | S# | SNAME | AGE | SEX | SDEPT | |----|-------|-----|-----|-------| | 101| 小明 | 20 | 男 | 计算机 | | 102| 小红 | 19 | 女 | 数学 | | 103| 小刚 | 21 | 男 | 计算机 | | 104| 小丽 | 20 | 女 | 电子工程 | SC表: | S# | C# | GRADE | |-----|----|-------| | 101 | C01| 85 | | 101 | C02| 72 | | 102 | C01| 76 | | 102 | C02| 80 | | 103 | C01| 90 | | 103 | C02| 68 | | 104 | C01| 78 | | 104 | C02| 88 | C表: | C# | CNAME | TEACHER | PC# | |----|-------|---------|-----| | C01| 数据库 | 王老师 | 001 | | C02| 计算机网络 | 李老师 | 002 | | C03| 离散数学 | 张老师 | 003 | 查询语句: (1) 查询学生选课表中的全部数据。 ``` SELECT * FROM S, SC, C WHERE S.S# = SC.S# AND SC.C# = C.C#; ``` (2) 查询计算机学生姓名,年龄。 ``` SELECT SNAME, AGE FROM S WHERE SDEPT = &#39;计算机&#39;; ``` (3) 查询成绩在 70~80 之间的学生学号,课程成绩。 ``` SELECT S#, C#, GRADE FROM SC WHERE GRADE BETWEEN 70 AND 80; ``` (4) 查询计算机年龄在 18~20 之间且性别为"男"的学生姓名年龄。 ``` SELECT SNAME, AGE FROM S WHERE SDEPT = &#39;计算机&#39; AND SEX = &#39;男&#39; AND AGE BETWEEN 18 AND 20; ``` (5) 查询课程号为"C01"的课程的最高数。 ``` SELECT MAX(GRADE) AS MAX_GRADE FROM SC WHERE C# = &#39;C01&#39;; ``` (6) 查询计算机学生的最大年龄最小年龄。 ``` SELECT MAX(AGE) AS MAX_AGE, MIN(AGE) AS MIN_AGE FROM S WHERE SDEPT = &#39;计算机&#39;; ``` (7) 统计每个学生人数。 ``` SELECT SDEPT, COUNT(*) AS COUNT FROM S GROUP BY SDEPT; ``` (8) 统计每门课程的选课人数考试最高。 ``` SELECT CNAME, COUNT(*) AS COUNT, MAX(GRADE) AS MAX_GRADE FROM SC, C WHERE SC.C# = C.C# GROUP BY CNAME; ``` (9) 查询每个学生的选课门数考试总成绩,并按选课门数的升序显示结果。 ``` SELECT S.SNAME, COUNT(*) AS COUNT, SUM(GRADE) AS SUM_GRADE FROM S, SC WHERE S.S# = SC.S# GROUP BY S.SNAME ORDER BY COUNT ASC; ``` (10) 查询总成绩超过 200 学生,要求列出学号,总成绩。 ``` SELECT S#, SUM(GRADE) AS SUM_GRADE FROM SC GROUP BY S# HAVING SUM_GRADE > 200; ``` (11) 查询选修了"C02"的学生姓名所在。 ``` SELECT S.SNAME, S.SDEPT FROM S, SC WHERE S.S# = SC.S# AND SC.C# = &#39;C02&#39;; ``` (12) 查询成绩在 80 以上的学生姓名,课程成绩,并按成绩的降序排列。 ``` SELECT S.SNAME, SC.C#, SC.GRADE FROM S, SC WHERE S.S# = SC.S# AND SC.GRADE > 80 ORDER BY SC.GRADE DESC; ``` (13) 查询那些课程没有人选修.要求列出课程课程名。 ``` SELECT C# AS COURSE_NO, CNAME AS COURSE_NAME FROM C WHERE C# NOT IN (SELECT DISTINCT C# FROM SC); ``` (14) 查询选修了课程"C01"的学生姓名所在。 ``` SELECT S.SNAME, S.SDEPT FROM S WHERE S.S# IN (SELECT S# FROM SC WHERE C# = &#39;C01&#39;); ``` (15) 求数学学生学号姓名。 ``` SELECT S.S#, S.SNAME FROM S WHERE S.SDEPT = &#39;数学&#39;; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值