数据库教案(中)

liuwei1234567890liu 2008-11-05 06:24:53
四、表的查询:
1、select 的使用:select * from 表名(查询表中所有数据);
2、查询指定的列:select sno,sname from student ; ( 查询所有学生的学号和姓名);
3、distinct 命令的使用:使查询结果去掉重复的列;
4、top percent的使用:
例:查询学生表中前5行数据:(共10行数据)
select top 50 percent *
from student;
与下面语句等价:
select top 5*
from student;
5、在SQL语句中,为了方便可以为字段及表命名别名;
例:查询学生的学号和姓名(显示的结果标题分别为“学号”和“姓名”):
三种方法:
①用as
select sno as '学号'
from student as s;
②用=
select '学号'=sno (注意:sno 与 学号的前后顺序)
from student;
③ select sno '学号'
from student
6、带条件的查询:
①比较运算(常用)
例:查询年龄在19-22 之间的学生姓名。
use student
select sname,sage
from student
where sage>=19 and sage<=22;
②between 开始值and 结束值(相当于>=开始 and <=结束)
use student
select sname,sage
from student
where sage between 19 and 22;

注:between and 的用法虽然有时和比较运算用法一致,但它不如①灵活,它只适用于有临界值的时候(=)。
③in :给定一个列表的范围
修改上例:use student
select sname,sage
from student
where sage in(19,20,21,22);
④模糊查询:like (% _ )
重点掌握:% _
理解:[] 、[^]
例:查询姓王的同学信息;
select *
from student
where sname like '王%'
⑤NULL:在SQL Server中是空值的表示
例:检索 学生系别为空的学生信息;
select *
from student
where sdept_name is null;
不能写为 sdept_name= null
7、上机实践:关于查询的作业
7、order by(asc|desc):
对检索出来的数据进行升序或降序排序,格式如下:
select 字段列表 from 表名 order by 字段名列表[ASC | DESC]
ASC :为升序,可以省略。
DESC :为降序。
示例:
1、 把选课表中的数据按成绩排序(小到大):
select * from sc order by grade //可以省略ASC
2、 按成绩按降序排序
select * from sc order by grade DESC

8、函数:
 字符串函数
ascii :取一个字符的ASC值。
Space(n) :产生n个空格
Replicate :重复字符
Reverse :反转字符串
Left :返回从字符串左边开始指定个数的字符
Right :返回从字符串右边开始指定个数的字符
Ltrim :去掉字符串左部空格
Rtrim :去掉字符串右部空格
Len :返回字符串长度
Lower :把字符串转化为大写
Upper :把字符转化为小写
Str :由数字数据转换来的字符数据
Stuff :删除指定长度的字符并在指定的起始点插入另一组字符
 数学函数
abs
sign
ceiling
rand
round(n,m)
Sqrt(f)

 日期与时间函数
getDate()
Day(d) = select datePart(dd,getdate())
Year(d) = select datePart(YY,getdate())
Month(d) = select datePart(mm,getdate())
DateAdd()
DateDiff()
DatePart()


 统计函数:(重点)
①count():计数函数
使用方法一:count(*) 计算结果集中存在多少行,即使表中行的数据为null,也被计算在其中;

例:查询计算机系共有多少学生
use student
select count(*)
from student
where sdept_name='计算机'

在查询分析器中实现,查看结果,显示无列名,思考应该怎么修改?
修改后:
use student
select count(*)as '计算机系人数'
from student
where sdept_name='计算机'

使用方法二:count( 列名表达式) 计算表达式返回的非空值,不管值是否重复:
例:查询有多少学生参与了选课
尝试一:select count(sno) as ' 选课人数' from sc
结果为3人,但是实际上就2人。
尝试二:select count(distinct sno) as ' 选课人数' from sc
distinct 去掉了重复值,结果正确。
②sum() :求和函数
③avg():求平均值函数
④max():求最大值函数
⑤min():最小值子函数
聚合函数包括以上的五种函数;
9、group by having (重点)
先看一个例子:查询学号为‘0001’的学生的平均成绩;
学生写,在教师机实践:
select avg(grade)
from sc
where sno='0001'

修改要求:查询学生的平均成绩,并在结果中显示‘学号’和‘平均成绩’;

目的是想以每个学号为一组来显示每个学生的平均成绩,这时就要配合 group by 分组语句来实现。
学生写:select avg(grade),sno
from sc
group by sno

注意:group by 后面的内容只能为分类的名称。不能为聚合函数(使用统计函数的为聚合函数),也不能为子查询(以后讲)。
having 的作用是当完成数据结果的统计后,可以使用having 来对结果进行进一步筛选,与where 子句对比,从作用上having 与 where 都是起到筛选的作用,但是在用法上它们各不相同,看具体的例子:
例:查询学号为‘0001’的学生的平均成绩。(筛选条件为分类字段的)

/*用where子句实现*/
select avg(grade),sno
from sc
where sno='0001'
group by sno

/*用having子句实现*/
use student
select avg(grade),sno
from sc
group by sno
having sno='0001'

从结果来看,两种方法结果一致。也就是说筛选条件为分类字段的(例中是以sno为分类字段的),使用having 与 where 作用一样。

例:查询平均成绩大于78的学生。
/*用where 子句实现*/
use student
select avg(grade),sno
from sc
where avg(grade)>78
group by sno

提示错误:where不能包含聚合函数;

/*用having 子句实现*/
use student
select avg(grade),sno
from sc
group by sno
having avg(grade)>78

运行正确。
注意,筛选的条件使用聚合函数的必须使用having子句,having 与group by 同时使用。


10、将查询结果保存到新表中:into
例:查询学生平均成绩,并将结果保存到新表scinfo中;
use student
select sno as '学号',avg(grade) as '平均成绩'
into scinfo
from sc
group by sno

11、在查询的同时进行计算:
例:显示学生的出生日期等信息;
思考:用修改student 表的字段和值吗?修改以后的结果又是什么?
use student
select sname '姓名',2008-sage as '出生日期'
from student
五、数据更新:
1、insert 语句:
格式:insert into 表名(字段名称) values(与各字段对应的值)
例:新增加一名教师,编号为1,姓名为john ,专业为计算机,职称为教授;
insert into teacher (t_id,t_name,specialty,level) values(1,'john','计算机','教授')
select * from teacher;

也可以写成:
use student

insert into teacher values(2,'john','计算机','教授')
/* 可以将字段名省略,但是在values 中各表达式的顺序必须与表中顺序一致*/
select * from teacher

使用insert时要注意的问题:value 中表达式数量要与列名列表中数量一致,并且表达式的数据类型要与表中所对应列的数据类型一致。
2、update 语句:
格式:update 表名 set 要修改的列名=表达式
例:修改上例,将john 的职称改为’副教授’;
use student
update teacher
set level='副教授'
/*level 是SQL中命令,也是teacher 表中字段名,为了区分可写为[levle]*/
where t_name='john'

select * from teacher
3、delete 语句:只删除表中的数据,不影响表的结构;
例:删除编号为2的教师信息;
use student
delete from teacher /*from 可写也可不写*/
where t_id=2
select * from teacher
...全文
134 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
asd497983544 2008-11-07
  • 打赏
  • 举报
回复
呵呵 第一 惯了

2,209

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 其他数据库
社区管理员
  • 其他数据库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧