sql server 多表语句实例

本文深入探讨了SQL语言中SELECT语句的使用方法,详细解释了其组成部分和执行流程,并通过具体实例展示了如何运用SQL进行数据检索、统计、排序等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在SQL语言中,SELECT语句是使用频率最高的查询语句,它用来从数据库中检索满足特定条件的记录。一个SELECT语句主要包含如下几部分:

      1   从哪个或哪些表中提取数据。

      2   选取表中的哪些列。

      3   选择满足什么条件的数据。

      4   查询结果以什么顺序显示。

 形式:

       SELECT select_list [into new_table_name] FROM table_list

       [WHERE search_conditions]

       [GROUP BY group_by_list]

       [HAVING search_conditions]

       [ORDER BY order_list[ASC|DESC]]


select_list该参数描述查询后的结果集有哪些列,这些列是使用逗号进行分隔。

into new_table_name:指定使用查询后所得的结果集来创建一个新表,new_table_name是新表的名称。

FROM table_list:用来指定查询条件的结果集是从哪些表中检索来的,可以是一组列表,这些表可以是SQL SERVER本地服务器中的基表,也可以是视图。

WHERE search_conditions: WHERE子句就是为查询指定条件,它可以用来定义所要检索的表中的记录要满足查询的一些条件,只有符合这些条件的记录才能放入记录结果集。

GROUP BY group_by_list:为了将结果集分组,每组分别对应一个值,分组的根据就是group_by_list列中的值。

HAVING search_conditions:主要是用来对结果集再一次进行条件规定,再一次进行检索,一般HAVING子句总是与GROUP BY 子句一起使用。

ORDER BY:指定查询结果中记录的排列顺序。ASCDESC关键字是按升序和降序排列。

IN子句:在查找特定条件的数据时,如果条件较多,就需要用到多个or运算符,以查找满足其中任一条件的记录。但是使用多个or运算符,将使得where子句变得过于冗长,所以可以使用IN子句。

整个语句的执行过程如下:

1. 读取FROM子句中基本表或试图的数据。

2. 选取满足WHERE子句中给出的条件表达式的元组。

3. 按GROUP子句中指定列的值分组,同时提取满足HAVING 子句中组条件表达式的那些组。

4. 按SELECT子句中给出的列名或表达式求值输出。

5.    ORDER子句对输出的目标进行排序,按附加说明ASC升序排列或按DESC降序排列。 

在“学生管理库”下有已表:S(Sno,Sname,Ssex,Sage,Sdept,

Sclass)分别表示:学号、姓名、性别、年龄和系名和班级;C(Cno,Cname,Ctime)分别表示:课程号、课程名和学时数;S_C(Sno,Cno,Grade)分别表示:学号、课程号和成绩。

1. 找出所有成绩小于60分的学生姓名、学号和成绩。

Select S.Sname,S_C.Sno,S_C.Grade from S,S_C where S.Sno=S_C.Snoand Grade < 60

2. 统计所有参加选修学生的人数。

Select count(S.Sno)from S where S.Snoin (select distinct Sno  from S_C)                    (或  Select count (distinct Sno)from S )

3.找出选修“数据结构”课程最高成绩学生的姓名、性别、年龄及分数。

Select Sname,Ssex,Sage,Grade from S,S_C where S.SnoS_C.Snoand Grade =(select max (grade) from S_C,C where C.Cno= S_C.Cnoand Cname= ‘数据结构’)

4. 找出比机械系所有学生年龄都小的其他系学生的学号和姓名。

Select Sno,Sname from S where Sdept<> ‘机械’ andSage < (select min(Sage) from S group by Sdept having Sdept=‘机械’)

5. 找出所有选修“数据库原理”课程学生的姓名、系名和成绩。

Select S.Sname,S.Sdept,S_C.Grade from S,S_C where S.Sno= S_C.Snoand S_C.Cnoin (select Cnofrom C where Cname= ‘数据库原理’)

6. 建一新表:T_C (Tno (教师编号,C4), Cno(课程号,C3), Sclass(班级, C, 6), Rno(教室,C4)),输入如下内容:

Tno

Cno

Sclass

Rno

T001

C1

210201

R111

T002

C2

210201

R115

T003

C3

210201

R203

T004

C4

220202

R301

T005

C5

220202

R101

T006

C6

220202

R201

Create table T_C(Tnochar(4) not null,Cnochar(3) not null, Sclasschar(6) not null, Rnochar(4) not null)

 Insert into T_C values(‘T001’, ‘ C1’, ‘ 210201’, ‘ R111’)

7. 找出选修“操作系统”课程的210201班学生上课所在教室及教 师编号。

Select Rno,Tno from T_C where Cno= (select Cnofrom C where Cname= ‘操作系统’)and Sclass= ‘210201’

8. 将对T_C表的删除权转授于user7,查询、插入权转授于user2user3

Grant delete on T_C to user7

 Grant select,insert on T_C to user2,user3

9. 找出选修T006教师所上课程的课程名及学时数。

Select C.Cname, Ctime from C where C.Cnoin (select Cnofrom T_C where Tno= ‘T006’)

10. 找出在R111教室上课的学生姓名与课程名。

Select Sname, C.Cname from S,C,T_C where T_C.sclass=S.Sclassand T_C.Cno=C.Cnoand  Rno = ‘R111’ 

11. 找出210201C1课程的教师编号及学生成绩,并按成绩降序输出。

Select T_C.Tno,S_C.Grade from T_C,S_C where T_C.Cno= S_C.Cnoand T_C.Cno= ‘C1’ and T_C.Sclass= ‘210201’ order by S_C.Gradedesc

12. 找出至少选修三门(包括三门)以上课程学生的学号、姓名和班级。

Select Sno, Sname, Sclass from S where Snoin (select Snofrom S_C group by Snohaving count(Sno)>= 3)

13. 找出最低分学生的学号、姓名和成绩。

Select S.Sno, S.Sname, S_C.Grade from S,S_C where S.Sno=S_C.Snoand S_C.Grade= (Select min(Grade) from S_C)

14. 建一视图:H_S_C:包含属性:Sname,Cname,Grade它是所有成绩大于60分学生的信息。

Create view H_S_C as (Select S.Sname,C.Cname,S_C.Grade from S,C,S_C where   S_C.Cno= C.Cnoand S_C.Sno= S.Snoand S_C.Grade> 60)

15. 统计选修“C3”课程的学生人数。

Select count(*) from S_C where Cno= ‘C3’

16. 列出每位学生的学号和平均成绩,并按学号降序排列。

Select Sno,avg(Grade) from S_C group by Snoorder by   Sno desc




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值