本次练习都给出标准答案,建议还是自己先不看答案,手动练习一遍。虽然答案一看就明白,但是主要目的是培养大家的动手能力
一. 创建一个学生档案表(表名为xsda),其表结构如下:
列名 |
类型 |
长度 |
允许空 |
备注 |
Xh |
Char |
10 |
学号 |
|
Xm |
Char |
8 |
√ |
姓名 |
csny |
Datetime |
√ |
出生年月 |
|
Gz |
Decimal |
6 |
√ |
工资 |
Zy |
Char |
10 |
√ |
专业 |
CREATE TABLE `xsda` ( xhCHAR( 10 ) NOT NULL UNIQUE , xmCHAR( 8 ) , csny DATETIME, gz DECIMAL( 6, 1 ) ,//整数部分最多为6位,小数部分为1位 zy CHAR( 10 ) ) ENGINE = INNODB DEFAULT CHARSET = utf8;
- 在xsda表中插入一个学生记录:(2000jsj008,李平)
- 把xsda表中80-01-01前出生的人的工资增加20%
-
查询xsda表中不同专业的人数
- 假如另外还有一个学生成绩表xscj(xh,kch,kccj), xh,kch,kccj分别指学号、课程号、成绩,要求查询姓名为李平的同学的各门课程的成绩。
- xsda、xscj表同上,查询选修了kch为Yy2的学生的xh和Xm。
答案1.
INSERT INTO `xsda` ( xh, xm ) VALUES ('2000jsj008', '李平');
答案2.
UPDATE `xsda` SET gz = gz * 1.2 WHERE csny < '80-01-01';
答案3.
SELECT zy AS '专业', COUNT( xh )AS '人数' FROM xsda GROUP BY zy;
答案4.
Select kch as '课程',kccj as '成绩' from `xsda`,`xscj` where xsda.xh=xscj.xh and xsda.xm=’ 李平’;
答案5.
SELECT xsda.xh ,xsda.xm from xsda,xscj where kch = 'Yy2' AND xsda.xh = xscj.xh;
二、有一个[学生课程]数据库,数据库中包括三个表:
学生表:Student由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在系(Sdept)五个属性组成,记为:Student(Sno,Sname,Ssex,Sage,Sdept),Sno 为关键字。
课程表:Course由课程号(Cno)、课程名(Cname)、先修课号(Cpno)、学分(Ccredit)四个属性组成,记为: Course(Cno,Cname,Cpno,Ccredit) Cno为关键字。
成绩表:SG由学号(Sno)、课程号(Cno)、成绩(Grade)三个属性组成,记为: SG(Sno,Cno,Grade) (SNO, CNO) 为关键字。
基础题
用SQL语言实现下列功能:
1.建立学生表[Student],其中学号属性不能为空,并且其值是唯一的。
2.查考试成绩有不及格的学生的学号。
3.将学号为05001学生的年龄改为22岁。
4.计算1号课程的学生平均成绩。
5. 查计算机系姓赵的男同学的姓名(Sname)、性别(Ssex)、年龄(Sage)。
6.将一个新学生记录(学号:05020;姓名:丁莉;性别:女;年龄:17岁;所在系:计算机;)插入Student表中。
1. create table student (Sno char(5) primary key, Sname char(20), Ssex char(2), Sage int, Sdept char(15) )engine = InnoDB default charset = utf8;
2. select distinct sno from sg where grade < 60
3. update student set sage=22 where sno='05001'
4. select avg(grade) from sg where cno='1'
5. select sname,ssex,sage from sdudent where sdept=’计算机系’and sname like '赵 %' and ssex ='男'
6. insert into student values ('05020', '丁莉', '女', 17, '计算机系')
升级题
用SQL语言实现下列功能:
2.向Student表增加“入学时间(Scome)”列,其数据类型为日期型。
ALTER TABLE `Student` ADD Scome DATETIME;
3.查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。
SELECT Sno, Grade FROM `SG` WHERE Cno = '3' ORDER BY Grade DESC;
4.查询学习1号课程的学生最高分数、平均成绩。
select MAX(Grade),AVG(Grade) FROM SC WHERE Cno = '1';
5.查询与“李洋”在同一个系学习的学生。
SELECT Sno, Sname, Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname='李洋')
6.将计算机系全体学生的成绩置零。
UPDATE SG SET Grade=0 WHERE Sno in ( SELECT Sno FROM Student WHERE Sdept = '计算机系')
7.删除学号为05019的学生记录。
DELETE FROM Student WHERE Sno='05019'
8.删除计算机系所有学生的成绩记录。
DELETE FROM SG WHERE Sno in ( SELECT Sno FROM Student WHERE Sdept = '计算机系')
三、现有关系数据库如下:
数据库名:学生成绩数据库
学生表(班级编号,学号,姓名,性别,民族,身份证号,出生日期)
课程表(课程号,课程名,开课学期,学时)
成绩表(ID,学号,课程号,分数)
基础题
用SQL语言实现下列功能的sql语句代码:
1.查询学生信息表中的年龄(重复年龄只显示一次)
use 教学成绩管理数据库 select distinct 年龄=datediff(year,出生日期,getdate()) from 学生信息表
补充:DATEDIFF() 函数返回两个日期之间的天数。
SELECT DATEDIFF(day,'2008-12-29','2008-12-30') AS DiffDate;
结果:
DiffDate |
---|
1 |
2.从学生信息表和教学成绩表中查询查询学生的学号、姓名、课程名和分数
use 学生成绩数据库 select 成绩表.学号,姓名,课程名,分数 from 教学成绩表,学生信息表 where成绩表.学号 = 学生表.学号 AND 成绩表.课程号=课程表.课程号
3.从课程表中统计第二学期的总学时。
执行结果为:
课程好 课程名 开课学期 学时
… … … …
… … … …
sum
============
…
Select课程号, 课程名, 开课学期, 学时 From 课程表 Where开课学期=2 compute avg(学时)
4.编写一个存储过程,输入学号,从“教学成绩表视图” 显示该学生的姓名、课程名、分数。
CREATE PROCEDURE 成绩1 @xh char (6) as select 姓名,课程名称,分数 from 教学成绩表视图 where 学号=@xh
5.创建一个触发器,当修改学生表中的姓名时,显示“学生姓名已被修改”。
Create Trigger 触发器7 On 学生表
For updata
As
Print “学生姓名已被修改”
Go
升级题
用SQL语言实现下列功能的sql语句代码:
1.在[学生成绩数据库]的[学生表]中查询年龄为20岁或22岁的学生。
use 教学成绩管理数据库 select 姓名, 性别, 年龄=datediff(year,出生日期,getdate()) from 学生表 where (datediff(year,出生日期,getdate())=20) or (datediff(year,出生日期,getdate())=22)
2.在[学生成绩数据库]中查询每个学生的班级编号、学号、姓名、平均分,结果按平均分降序排列,均分相同者按班级排列。
use 教学成绩管理数据库 select 班级编号,a.学号,a.姓名, avg(分数) 平均分 from 学生表 as a join成绩表 as b on a.学号 = b.学号 group by 班级编号, a.学号,a.姓名 order by avg(分数) desc, 班级编号 asc
3.编写一个自定义函数,根据[学生表]中的[出生日期]列,计算年龄。
CREATE FUNCTION dbo.计算年龄(@vardate datetime,@Curdate datetime) RETURNS tinyint AS BEGIN return datediff(yyyy, @vardate, @Curdate) END
4.创建一个视图[教学成绩表视图]显示学生的学号、姓名、课程名、分数。
CREATE VIEW [教学成绩表视图]
AS
SELECT 学号, 姓名, 课程名, 分数
FROM 学生表, 成绩表
WHERE 学生表.学号=成绩表.学号
5.编写一个存储过程,输入学号,从[教学成绩表视图]显示该学生的姓名、课程名、分数。
CREATE PROCEDURE [成绩1] @xh char (6) as select 姓名,课程名称,分数 from 教学成绩表视图 where 学号=@xh
6.把[学生表]、[成绩表]通过[学号]建立约束关系。
alter table 学生表
add constraint 约束1 foreign key (学号) references 成绩表 (学号)
7.创建一个触发器,当修改学生表中的姓名时,显示“学生姓名已被修改”。
Create Trigger 触发器7 On 学生表 For updata As Print '学生姓名已被修改' Go
8.在学生表中插入记录:
班级编号 学号 姓名 性别 民族 身份证号 出生日期
050201 050201001 王莉欣 女 汉 53010219790625224 1979-06-25
050202 050202001 张晶 男 NULL 01020319801224121 NULL
把张晶的民族改为“汉”、出生日期改为“1980-12-24”
insert 学生表 values ('050201','050201001','王莉欣','女','汉','53010219790625224','1979-06-25') insert 学生表 values ('050202','050201001', '张晶', '男', null, '01020319801224121', null) update 学生表 set 民族='汉', 身份证号='01020319800226121', 出生日期='1980-02-26' where 姓名='张晶'
四、用SQL语句创建表1和表2。
departments(Depid,Depname,Depnote)
employees(Empid,Empname,Birthdate,Depart,Salary,Position)
表1 departments
字段名 |
数据类型 |
说明 |
Depid |
Tinyint |
部门编号(主键) |
Depname |
Char(12) |
部门名称 |
Depnote |
Varchar(100) |
有关说明 |
表2 employees
字段名 |
数据类型 |
说明 |
Empid |
Char(6) |
员工编号(主键) |
Empname |
Char(20) |
员工姓名(非空) |
Birthdate |
Smalldatetime |
出生日期 |
Depart |
Tinyint |
所在部门(外键)(非空) |
Salary |
Float |
月薪 |
Position |
Char(8) |
职务 |
create table departsment( Depid Tinyint not null primary key, Depname Char(12), Depnote Varchar(100), ) go create table employee( Empid Char(6) not null primary key, Empname Char(20) not null, Birthdate Smalldatetime Depart Tinyint foreign key references departments(Depdid), Salary Float, Position Char(8) )
2、 向表1中添加如下数据
Depid |
Depname |
Denote |
1 |
软件开发部 |
|
2 |
系统集成部 |
insert into departments(Depid,Depname) values('1','软件开发部') go insert into departments(Depid,Depname) values('2','系统集成部')
3、 向表2中添加如下数据
empid |
empname |
birthdate |
depart |
salary |
Position |
A00001 |
王晓丽 |
1970/4/27 |
2 |
2400.00 |
|
A00004 |
马明 |
1962/3/14 |
1 |
4600.00 |
副经理 |
insert into employee values('A00001','王晓丽','1970/4/27',2,2400.00,'') go insert into employee values('A00004','马明' '1962/3/14',1,4600.00,'副经理')
4、 查询所有1970年以后出生的员工的信息。
Select * from employee where Birthdate>’1970-01-01’
5、 查询工资高于2000元的员工的信息。
Select * from employee where Salary>2000
6、 查询系统集成部的所有员工的信息。
Select employee.* from employee,departments where employee. Depart=departments. Depdid and Depname=’ 系统集成部’
7、 统计软件开发部的人均工资
select avg(salary) from employee, departments where employee. Depart=departments. Depdid and Depname=’ 软件开发部’
8、 查询所有员工中工资最高和最低的人。
select * from employee where saraly=(select max(saraly) from employee) go select * from employee where saraly=(select min(saraly) from employee)
9、 统计软件开发部的人数。
select count(*) from employee, departments where employee. Depart=departments. Depdid and Depname=’ 软件开发部’
10、 将所有员工的工资上调10%。
Update employee set gz=gz*1.2
11、 将工资收入低于2500元的员工每人加薪200元。
Update employee set gz=gz+200 where saray<2500
12、 对所有“岗位”一栏为空的记录,将其“岗位”改为“职员”。
Update employee set Position=’ 职员’ where Position is null
13、 删除年龄大于50岁的员工的信息。
Delete from employee where year(getdate())-year(birthdate)>50
14、删除所有1970年以前出生的员工的信息。
Delete from employee where birthdate<’1970-01-01’