整个SELECT语句,根据WHERE子句的条件表达式从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标表达式选出元组中的属性值形成结果表。
以下是其基本格式 <>表示必须语句,[ ],( )表示非必须语句
SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>]...
FROM <表名或视图名> [,<表名或视图名] | (<SELECT语句>) [AS] <别名>
[WHERE <条件表达式> ]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];
SELECT 的 <目标表达式>可填如下
1. * 查询所有表的列
2.<表名>.* 查询某表所有列
3.聚集函数
COUNT ([DISTINCT|ALL] <列名>) 或者 COUNT(*)
SUM ([DISTINCT|ALL] <列名>)
AVG ([DISTINCT|ALL] <列名>)
MAX ([DISTINCT|ALL] <列名>)
MIN ([DISTINCT|ALL] <列名>)
4.[<表名>.] <属性列名表达式> [,[<表名>.]<属性列名表达式>]....
属性列名表达式 可以是由属性列、作用于属性列的聚集函数和常量的任意算数运算
WHERE 子句的条件表达式语句
<列属性名> [NOT] [BETWEEN] [<谓词>] <列属性名> [AND] [同前 ]
<列属性名> [NOT] [BETWEEN] [<谓词>] <'常量'> [AND] [同前 ]
<列属性名> <谓词> [ANY|ALL](SELECT语句)
<列属性名> [NOT] [IN] <集合>|(SELECT 语句)
<列属性名> [NOT] LIKE <匹配串>
[NOT] EXISTS (SELECT语句)
<列属性名> IS [NOT] NULL
AND .....OR......
TIPS:
WHERE 语句并非SELECT所必须,且聚集函数无法出现在WHERE函数
TIPS:
asc是指定列按升序排列(即:从小到大排序) ---降序排列
desc则是指定列按降序排列(即:从大到小排序) ---升序排列
排序子句语法:order by 列名 asc/desc
练习
试用SQL查询语句表达下列对3.2题中教务管理数据库的三个基本表S、SC、C查询:
⑴ 统计有学生选修的课程门数。
SELECT COUNT(DISTINCT C#)
FROM SC;
⑵ 求选修4号课程的学生的平均年龄。
SELECT AVG(AGE)
FROM S,SC
WHERE S.S#=SC.S# AND C#=’4’AND SEX=’F’;
⑶ 求LIU老师所授课程的每门课程的学生平均成绩。
SELECT C.C#,AVG(GRADE)
FROM SC,C
WHERE SC.C#=C.C# AND TEACHER=’LIU’;
⑷ 统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
SELECT C#,COUNT(S#)
FROM SC GROUP BY C#
HAVING COUNT(*)>10
ORDER BY 2 DESC,1;
⑸ 检索学号比WANG同学大,而年龄比他小的学生姓名。
SELECT SNAME
FROM S
WHERE S#>ALL(SELECT S# FROM S WHERE SNAME=’WANG’ AND AGE<ALL(SELECT AGE FROM S WHERE SNAME=’WANG’);
⑹ 检索姓名以WANG打头的所有学生的姓名和年龄。
SELECT SNAME,AGE
FROM S
WHERE SNAME LIKE ‘WANG%’
⑺ 在SC中检索成绩为空值的学生学号和课程号。
SELECT S#,C#
FROM SC
WHERE GRADE IS NULL;
⑻ 求年龄大于女同学平均年龄的男学生姓名和年龄。
SELECT SNAME,AGE
FROM S
WHERE SEX=’M’AND AGE>(SELECT AVG(AGE) FROM S WHERE SEX=’F’);
⑼ 求年龄大于所有女同学年龄的男学生姓名和年龄。
SELECT SNAME,AGE
FROM S
WHERE SEX=’M’AND AGE>ALL(SELECT AGE FROM S WHERE SEX=’F’);