在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:指定查询结果中记录的排列顺序。ASC和DESC关键字是按升序和降序排列。
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.Sno= S_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 (教师编号,C, 4), Cno(课程号,C,3), Sclass(班级, C, 6), Rno(教室,C,4)),输入如下内容:
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,查询、插入权转授于user2和user3。
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. 找出210201班C1课程的教师编号及学生成绩,并按成绩降序输出。
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