select [all/distinct] 列名
from 基表(或视图)
where 条件表达式
group by
having 内部函数表达式
order by 列名 asc/desc
all:检索所有符合条件的元组(默认可以不写)
distinct:检索去掉重复的元组
*:整个元祖,列名*为所有的列
,:用来分开多个项
count(*):计算列的个数
sum(*):求某个列的总和(定义基表时的列类型要是数值型)
avg(*):求某一列的平均值(定义基表时的列类型要是数值型)
max(*):求某个列的最大值
min(*):求某个列的最小值
1. 列出教工表中的系编号
select 系编号
from 教工
2. 列出教工表中的系编号并消除重复元组
select distinct 系编号
from 教工
3. 查询学生总人数。
select count(学号)
from 学生
4. 查询选修了课程的学生人数。
select count(distinct 学号)
from 成绩
5. 查询选修C102课程的学生最高分数。
select max(分数)-----max是最大值,你可以看上面的格式,还有avg,sum,min
from 成绩
where 课程号='c102'------查询的条件
6. 显示副教授的工资和提高10%的工资额
select 工资,工资*1.1-----列的运算,可以在列名后加上(+,-,*,/)
from 教工
where 职称='副教授'
7. 列出所有教授的名单,并将姓名改为教授姓名
select 姓名 教授姓名------改显示列的名字
from 教工
where 职称='教授'
8. 列出所有教授的姓名和工资
select 姓名,工资 ---用逗号来分开多个要显示的内容
from 教工
where 职称='教授'
9. 显示成绩为84,88,89的学号和课程号
select 学号,课程号
from 成绩
where 分数='84'or 分数='88'or 分数='89'-----用or来表示并条件,也可:分数 in ('84','88','89')
10. 列出1980年1月1日之后出生的男学生名单
select 姓名
from 学生
where 性别='男'and 出生年月>'01-01-1980'------多个条件时可以用(and,or,in,not,,like(?,_,*,%),>,>=,<,<=,=,<>)来比较,
11. 列出姓'王'的学生名单
select 姓名
from 学生
where 姓名 like'王%'-----like(字符串),'?'和'_'表示任一个字符,'*'和'%'表示任一串字符
12.按系编号的升序显示系编号为101学生的信息
select *
from 学生
where 系编号='101'
order by 学号------加desc是降序
13. 查询成绩及格,选修课程超过2门、平均成绩>70分学生的学号,
select 学号,count(学号),avg(分数)
from 成绩
where 分数>60
group by 学号
having count(学号)>2 and avg(分数)>70----在select,我们不能count(学号)>2这样来表示选修课程超过2门
多个表的查询
1. 查询每个学生及其选修课程的情况。
select 姓名,课程名
from 成绩,学生,课程
where 成绩.学号=学生.学号 and 成绩.课程号=课程.课程号----两个表的相同元组相等,就是我们建基表时定义外码的原故。
2. 对上例用投影完成自然连接.
select 姓名,课程名
from (成绩 as a inner join 学生 as b on a.学号=b.学号)inner join 课程 as c on a.课程号=c.课程号
3. 用嵌套查询,查询与“姜明明”在同一个系学习的学生.
select 姓名
from 学生
where 系编号=(select 系编号
from 学生
where 姓名='姜明明')-----嵌套查询就是在查询语句中再来一个查询
4. 上例中的查询用自身连接来完成:
select distinct b.姓名
from 学生 as a,学生 as b
where a.系编号=(select 系编号
from 学生
where 姓名='姜明明') and a.系编号=b.系编号
带有EXISTS谓词的子查询(相关子查询):
5. 查询所有选修了C101号课程的学生姓名。
select a.姓名,a.学号
from 学生 a
where exists(select 学号
from 成绩
where 课程号='c101'and a.学号=成绩.学号)
from 基表(或视图)
where 条件表达式
group by
having 内部函数表达式
order by 列名 asc/desc
all:检索所有符合条件的元组(默认可以不写)
distinct:检索去掉重复的元组
*:整个元祖,列名*为所有的列
,:用来分开多个项
count(*):计算列的个数
sum(*):求某个列的总和(定义基表时的列类型要是数值型)
avg(*):求某一列的平均值(定义基表时的列类型要是数值型)
max(*):求某个列的最大值
min(*):求某个列的最小值
1. 列出教工表中的系编号
select 系编号
from 教工
2. 列出教工表中的系编号并消除重复元组
select distinct 系编号
from 教工
3. 查询学生总人数。
select count(学号)
from 学生
4. 查询选修了课程的学生人数。
select count(distinct 学号)
from 成绩
5. 查询选修C102课程的学生最高分数。
select max(分数)-----max是最大值,你可以看上面的格式,还有avg,sum,min
from 成绩
where 课程号='c102'------查询的条件
6. 显示副教授的工资和提高10%的工资额
select 工资,工资*1.1-----列的运算,可以在列名后加上(+,-,*,/)
from 教工
where 职称='副教授'
7. 列出所有教授的名单,并将姓名改为教授姓名
select 姓名 教授姓名------改显示列的名字
from 教工
where 职称='教授'
8. 列出所有教授的姓名和工资
select 姓名,工资 ---用逗号来分开多个要显示的内容
from 教工
where 职称='教授'
9. 显示成绩为84,88,89的学号和课程号
select 学号,课程号
from 成绩
where 分数='84'or 分数='88'or 分数='89'-----用or来表示并条件,也可:分数 in ('84','88','89')
10. 列出1980年1月1日之后出生的男学生名单
select 姓名
from 学生
where 性别='男'and 出生年月>'01-01-1980'------多个条件时可以用(and,or,in,not,,like(?,_,*,%),>,>=,<,<=,=,<>)来比较,
11. 列出姓'王'的学生名单
select 姓名
from 学生
where 姓名 like'王%'-----like(字符串),'?'和'_'表示任一个字符,'*'和'%'表示任一串字符
12.按系编号的升序显示系编号为101学生的信息
select *
from 学生
where 系编号='101'
order by 学号------加desc是降序
13. 查询成绩及格,选修课程超过2门、平均成绩>70分学生的学号,
select 学号,count(学号),avg(分数)
from 成绩
where 分数>60
group by 学号
having count(学号)>2 and avg(分数)>70----在select,我们不能count(学号)>2这样来表示选修课程超过2门
多个表的查询
1. 查询每个学生及其选修课程的情况。
select 姓名,课程名
from 成绩,学生,课程
where 成绩.学号=学生.学号 and 成绩.课程号=课程.课程号----两个表的相同元组相等,就是我们建基表时定义外码的原故。
2. 对上例用投影完成自然连接.
select 姓名,课程名
from (成绩 as a inner join 学生 as b on a.学号=b.学号)inner join 课程 as c on a.课程号=c.课程号
3. 用嵌套查询,查询与“姜明明”在同一个系学习的学生.
select 姓名
from 学生
where 系编号=(select 系编号
from 学生
where 姓名='姜明明')-----嵌套查询就是在查询语句中再来一个查询
4. 上例中的查询用自身连接来完成:
select distinct b.姓名
from 学生 as a,学生 as b
where a.系编号=(select 系编号
from 学生
where 姓名='姜明明') and a.系编号=b.系编号
带有EXISTS谓词的子查询(相关子查询):
5. 查询所有选修了C101号课程的学生姓名。
select a.姓名,a.学号
from 学生 a
where exists(select 学号
from 成绩
where 课程号='c101'and a.学号=成绩.学号)