数据库实验二

实验二——SQL语句(6课时)

一、 实验目的

1. 熟悉SQL的数据查询语言,能使用SQL进行单表查询、连接查询、嵌套查询、集合查询和统计查询,能理解空值的处理;

2. 熟悉数据库的数据更新操作,能使用SQL语句对数据库进行数据的插入、更新、删除操作;

3. 熟悉SQL支持的有关视图的操作,能创建、查询及取消视图;

4. 了解NULL在数据库中的特殊含义,掌握使用SQL进行与空值相关的操作;

 

二、 实验预习内容

在认真阅读教材及实验指导书【实验1.2 数据查询】、【实验1.3 数据更新】、【实验1.4 视图】和【实验1.6 空值和空集的处理】的基础上,上机前请预习以下内容,并在空白处填写相应的步骤或命令。

1. 使用SCHOOL数据库,在SQL SERVER 2000 查询分析器使用SQL语言完成以下操作。请在空白处填写相应的SQL命令。

1) 查询年级为2001的所有学生的名称,按编号顺序排列;

select sname

from STUDENTS

WHERE grade='2001'

 

2) 查询所有课程名称中含有data的课程编号;

SELECT cid

FROM COURSES

WHERE cname like '%data%'

 

3) 统计所有老师的平均工资;

SELECT AVG(salary)

from TEACHERS

 

4) 查询至少选了3门课的学生编号;

SELECT sid FROM CHOICES

group by sid having count(*)>=3

 

   

5) 查询学号为80009026的学生的姓名、所选课名及成绩;

 select courses.cname,students.sname,choices.score

from (STUDENTS JOIN CHOICES ON STUDENTS.sid=CHOICES.sid)

join COURSES ON COURSES.cid=CHOICES.cid

where CHOICES.sid='80009026'

 

6) 查询没有学生选的课程编号;

select cid from courses

except 

select cid from choices

 

 

 

7) 查询既选了C++又选了Java课程的学生编号;

select sid

from choices

where cid =

(select cid from courses where cname = 'C++') and sid in

        (select sid

         from choices 

         where cid=

(select cid from courses where cname = 'Java'))

 

 

 

8) 查询选了C++但没选Java课程的学生编号;

 

select sid

from choices

where cid =

(select cid from courses where cname = 'C++') and sid  not in

        (select sid

         from choices 

         where cid=

         (select cid from courses where cname = 'Java'))

         

 

9) 向STUDENTS表中插入“LiMing”的个人信息(编号:700045678,名字:LiMingEmailLX@cdemg.com,年级:1992);

  

insert into students

values('700045678','LiMing','LX@cdemg.com',1992)

 

 

10) 将“LiMing”的年级改为2002

    update students

set grade=2002

where sname='LiMing

 

11) 删除所有选了Java课程的学生选课记录;

delete

from choices

where cid=(select cid from courses where cname='Java')

 

12) 求出每门课的课程号、选课人数,结果存入数据库表T1中。

 

create table T1 (cid char(10) primary key, number int ) 

insert into t1 

select cid,count(distinct sid) 

from choices 

group by cid

 

13) 查询所有选课记录的成绩并换算为五分制(注意NULL的情况);

select score/20 Score

from choices

 

14) 查询成绩小于60的选课记录,统计总数、平均分、最大值和最小值(注意查询结果中NULL的情况);

 

select distinct count(*) 总数, avg(score) 平均值, max(score)最大值, min(score)最小值

from choices

where score<60

 

15) 按成绩顺序排序显示CHOICES表中所有记录。(使用ORDER BY排序,注意NULL的情况);

     select * 

from choices

order by score

 

         

16) 创建视图V1,显示学生姓名、所选课名称、任课教师名;

        create view v1 (sname,cname,tname)

          as 

          select sname,cname,tname

          from teachers,choices ,students,courses

      where choices.cid=courses.cid and choices.sid=students.sid and choices.tid=teachers.tid

 

17) 取消V1视图;

drop  view v1

 

 

2. 使用STC数据库,在SQL SERVER 2000 查询分析器使用SQL语言完成以下操作。请在空白处填写相应的SQL命令或其它内容。

1) 创建视图V2,显示计算机(CS)系学生信息;(结合下面的b)小题,V2视图创建2次,分别使用/不使用WITH CHECK OPTION选项)

1)不加WITH CHECK OPTION

2)加WITH CHECK OPTION

create view v2 

as select *

from stu 

where sdept='cs' 

 

 

create view v2 as

select *from stu

where sdept='cs'

with check option

 

 

2) 插入元组(99999,张三,20岁,男,PH)到V2中,运行结果如何?(观察WITH CHECK OPTION对结果的影响);

1)不加WITH CHECK OPTION的结果

2)加WITH CHECK OPTION的结果

insert into v2 

values('99999','张三','',20,'PH') 

 

 

 

 

insert into v2 

values('99999','张三','',20,'PH')

 

 

 

 

3) 在V2基础上,查询所有计算机系女生信息;

select * from V2   where ssex=''

3. 结束本次实验

 

三、 实验课后训练

1. 掌握SQL SERVER中流控制语句及其它常用编程语句;

1) 使用查询分析器,编写代码,输出乘法口诀表。

2. 自行练习实验指导书P24【实验1.2 数据查询】1.2.5自我实践部分;

3. 自行练习实验指导书P30【实验1.3 数据更新】1.3.5自我实践部分;

4. 自行练习实验指导书P36【实验1.4 视图】1.4.5自我实践部分;

5. 自行练习实验指导书P49【实验1.6 空值和空集的处理】1.6.5自我实践部分;

四、 实验报告

1. SQL SERVER中变量声明的命令是什么?输出命令是什么?

Declare @variable_name

out

2. SQL SERVER中实现分支和循环的语句分别是什么?

while (条件--只能是表达式)

语句或语句块

[break]--强制退出

多分支语句语法

Case

when 条件1 then 结果1

when 条件2 then 结果2

[else 其他结果]

end

 

3. 在SQL SERVER里使用ORDER BY排序时,NULL值如何处理?使用GROUP BY分组时,NULL值又如何处理的?

在使用 ORDER BY 进行排序时,有 ASC(升序)和 DESC(降序)两种方式。无论采用 哪种方式,NULL 值总被当作最小值处理。即在按升序排列时,取空值的元组将最先显示, 按降序排时,取空值的元组将会最后显示。 使用 GROUP BY 进行排序,取空值的项不是被忽略,而是将 NULL 看成一个取值,在处 理的时候把所有取空值的项都看成一样,因而形成一个分组。

4. 实验总结(实验过程中出现的问题、解决方法、结果如何或其它)

有好多次运行都是有检查完成但是执行错误,经检查才知道是上面的数据库默认是 master, 而不是要执行的数据库。由于粗心导致的字母拼写错误,导致执行结果出错。不会使用嵌套 语句,经过分析书上的程序段,略微懂了一点。向表中插入记录,应该用 insert into 表名 values(列属性).创建视图用 create view (视图名) as from 表名 。经过试验验证,明白 with check option 可以自动筛选不符合条件的记录

  • 14
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的数据库实验触发器实验: 1. 创建一个数据库表,包含以下字段:id(自增主键)、name、age、gender。 2. 编写一个触发器,当插入一条记录时,自动为该记录生成一个唯一的ID。触发器可以使用MySQL的内置函数UUID()生成。 3. 编写一个触发器,当删除一条记录时,自动将该记录的信息写入另一张日志表中,包括被删除记录的ID、姓名、年龄和性别。 4. 编写一个触发器,当更新一条记录时,自动将该记录的信息写入另一张历史表中,包括被更新记录的ID、姓名、年龄和性别。历史表应该具有时间戳字段,以便记录更新的时间。 下面是具体的实现步骤: 1. 创建一个名为“person”的表: ``` CREATE TABLE person ( id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT(11) NOT NULL, gender enum('M', 'F') NOT NULL, PRIMARY KEY (id) ); ``` 2. 创建一个名为“person_uuid”的触发器,用于自动生成ID: ``` CREATE TRIGGER person_uuid BEFORE INSERT ON person FOR EACH ROW SET NEW.id = UUID(); ``` 3. 创建一个名为“person_log”的表,用于记录删除操作: ``` CREATE TABLE person_log ( id INT(11) NOT NULL, name VARCHAR(50) NOT NULL, age INT(11) NOT NULL, gender enum('M', 'F') NOT NULL, deleted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` 4. 创建一个名为“person_delete”的触发器,用于将删除操作记录到日志表中: ``` CREATE TRIGGER person_delete AFTER DELETE ON person FOR EACH ROW INSERT INTO person_log (id, name, age, gender) VALUES (OLD.id, OLD.name, OLD.age, OLD.gender); ``` 5. 创建一个名为“person_history”的表,用于记录更新操作: ``` CREATE TABLE person_history ( id INT(11) NOT NULL, name VARCHAR(50) NOT NULL, age INT(11) NOT NULL, gender enum('M', 'F') NOT NULL, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` 6. 创建一个名为“person_update”的触发器,用于将更新操作记录到历史表中: ``` CREATE TRIGGER person_update AFTER UPDATE ON person FOR EACH ROW INSERT INTO person_history (id, name, age, gender) VALUES (OLD.id, OLD.name, OLD.age, OLD.gender); ``` 以上就是一个简单的数据库实验触发器实验。通过此实验,你可以了解如何使用MySQL触发器来自动生成唯一ID,记录删除操作和记录更新操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值