一、基本表的定义与删除

T1.
用SQL语句创建如下三张表:学生(Student),课程表(Course),和学生选课表(SC),这三张表的结构如表1-1到表1-3所示。
表1-1 Student表结构

列名 说明 数据类型 约束
Sno 学号 字符串 长度为7,主码
Sname 姓名 字符串 长度为10,非空
Ssex 性别 字符串 长度为2,取‘男’或‘女’
Sage 年龄 整数 取值15~45
Sdept 所在系 字符串 长度为20 默认为‘计算机系’
create table Student(
Sno varchar(7) primary key,
Sname varchar(10) not null,
Ssex varchar(2) check(Ssex='男' or Ssex='女'),
Sage int check(Sage>=15 and Sage <=45),
Sdept varchar(20) default('计算机系'));

表1-2Course表结构

列名 说明 数据类型 约束
Cno 课程号 字符串 长度为10,主码
Cname 课程名 字符串 长度为20,非空
Ccredit 学分 整数 取值大于0
Semster 学期 整数 取值大于0
Cperiod 学时 整数 取值大于0
create table Course(
Cno varchar(10) primary key,
Cname varchar(20) not null,
Ccredit int check(Ccredit>0),
Semster int check(Semster >0),
Cperiodint check(Cperiod>0)
);

表1-3 SC表结构
表1-2Course表结构

列名 说明 数据类型 约束
Sno 学号 字符串 长度为7,主码,参照Student的外码
Cno 课程名 字符串 长度为10,主码,参照Course
Grade 成绩 整数 取值0~100
create table SC(
Sno varchar(7),
Cno varchar(10),
Grade int check(Grade >=0 and Grade <=100),
primary key(Sno,Cno),
foreign key (Sno) references Student(Sno),
foreign key (Cno) references Course(Cno));

PS:
外码(键): 一个关系模式(r1)可能在它的属性中包含另一个关系模式(r2)的主码,这个属性在r1上称作参照r2的外码。关系r1称为外码依赖的参照关系,关系r2称为外码的被参照关系。FK一定来自另一个表的PK,FK是PK的子集。

如果外键或者主键要求命名,请使用以下语法

constraint pk_Student_Sno primary key (Sno)
constraint fk_Student_Sno foreign key (Sno) references Student(Sno)//SC表,参照表后边的属性可以省略

已有表,添加外键

alter table SC
add constraint fk_Student_Sno
foreign key (Sno)
references Student(Sno);

二、修改表结构

T2.
为SC表添加“选课类别”列,此列的定义为XKLB char(4)

alter table SC add XKLB char(4);

T3.
将新添加的XKLB的类型修改为char(6)

alter table SC alter column XKLB char(6);

T4.
删除Course表的Cperiod列

alter table Course drop column Cperiod;

T5.
重命名Student表的Ssex列为sex

EXEC sp_rename 'Student.Ssex','sex';

三、数据查询功能

表3-1 Student表数据

Sno Sname Ssex Sage Sdept
9512101 李勇 19 计算机系
9512102 刘晨 20 计算机系
9512103 王敏 20 计算机系
9521101 张立 22 信息系
9521102 吴宾 21 信息系
9521103 张海 20 信息系
9531101 钱小平 18 数学系
9531102 王大力 19 数学系
insert into Student
values
('9512101','李勇','男',19,'计算机系'),
('9512102','刘晨','男',20,'计算机系'),
('9512103','王敏','女',20,'计算机系'),
('9521101','张立','男',22,'信息系'),
('9521102','吴宾','女',21,'信息系'),
('9521103','张海','男',20,'信息系'),
('9531101','钱小平','女',18,'数学系'),
('9531102','王大力','男',19,'数学系');

表3-2 Course表数据

Cno Cname Ccredit Semster
C01 计算机文化学 3 1
C02 VB 2 3
C03 计算机网络 4 7
C04 数据库基础 6 6
C05 高等数学 8 2
C06 数据结构 5 4
insert into Course(Cno,Cname,Ccredit,Semster)
values
('C01','计算机文化学',3,1),
('C02','VB',2,3),
('C03','计算机网络',4,7),
('C04','数据库基础',6,6),
('C05','高等数学',8,2),
('C06','数据结构',5,4);

表 3-3 SC表数据

Sno Cno Grade XKLB
9512101 c01 90 必修
9512101 c02 86 选修
9512101 c06 必修
9512102 c02 78 选修
9512102 c04 66 必修
9521102 c01 82 选修
9521102 c02 75 选修
9521102 c04 92 必修
9521102 c05 50 必修
9521103 c02 68 选修
9521103 c06 必修
9531101 c01 80 选修
9531101 c05 95 必修
9531102 c05 85 必修
insert into SC
values
('9512101','c01',90,'必修'),
('9512101','c02',86,'选修'),
('9512101','c06',NULL,'必修'),
('9512102','c02',78,'选修'),
('9512102','c04',66,'必修'),
('9521102','c01',82,'选修'),
('9521102','c02',75,'选修'),
('9521102','c04',92,'必修'),
('9521102','c05',50,'必修'),
('9521103','c02',68,'选修'),
('9521103','c06',NULL,'必修'),
('9531101','c01',80,'选修'),
('9531101','c05',95,'必修'),
('9531102','c05',85,'必修');

T6.
查询全体学生的学号与姓名

select Sno,Sname
from Student;

T7.
查询全体学生的姓名,学号和所在系

select Sno,Sname,Sdept
from Student;

T8.
查询全体学生的所有信息(三张表以上的关联查询)

select *
from Student left join SC on Student.Sno=SC.Sno left join Course on SC.Cno=Course.Cno

T9.
查询全体学生的姓名及其出生年份

select Sname,2018-Sage as '出生年份'
from Student

T10.
查询全体学生的姓名和出生年份,并在出生年份列前加入一个列,此列的每行数据均为“Year of Birth”常量值

select Sname,'Year of Birth',2018-Sage as '出生年份'
from Student

T11.
在选课表(SC)中查询有哪些学生选修了课程,并列出学生的学号

select distinct Sno
from SC

T12.
查询计算机系全体学生的姓名

select Sname
from Student
where Sdept='计算机系'

T13.
查询所有年龄在20岁以下的学生的姓名及年龄

select Sname,Sage
from Student
where Sage<20

T14.
查询考试成绩不及格的学生的姓名

select Sname
from Student,SC
where Student.Sno=SC.Sno and SC.Grade<60

T15.
查询年龄在20~23岁之间的学生的姓名,所在系和年龄

select Sname,Sdept,Sage
from Student
where Sage between 20 and 23

T16.
查询年龄不在20~23之间的学生的姓名,所在系和年龄

select Sname,Sdept,Sage
from Student
where Sage not between 20 and 23

T17.
查询信息系,数学系和计算机系学生的姓名和性别

select Sname,Ssex
from Student
where Sdept in ('信息系','数学系','计算机系')

T18.
查询既不属于信息系,数学系,也不属于计算机系的学生的姓名和性别

select Sname,Ssex
from Student
where Sdept not in ('信息系','数学系','计算机系')

T19.
查询学生表中姓“张”的学生的详细信息

select *
from Student
where Sname like '张%'

T20.
查询学生表中姓“张”,姓“李”和姓“刘”的学生的情况

select *
from Student
where Sname like '张%' or Sname like '李%' or Sname like '刘%'

使用下边的这种写法更加简便

select *
from Student
where Sname like '[张李刘]%' 

T21.
查询名字中第2个字为“小”或“大”字的学生的姓名和学号

select Sname,Sno
from Student
where Sname like '_[小大]%' 

T22.
查询所有不姓“刘”的学生的姓名

select Sname
from Student
where Sname not like '刘%' 

T23.
从学生表中查询学号的最后一位不是2,3,5的学生的情况

select *
from Student
where Sno not like '%[235]' 

T24.
查询无考试成绩的学生的学号和相应的课程号

select Sno,Cno
from SC
where Grade is null 

T25.
查询所有有考试成绩的学生的学号和课程号

select Sno,Cno
from SC
where Grade is not null 

T26.
查询计算机系年龄在20岁以下的学生的姓名

select Sname
from Student
where Sdept='计算机系' and Sage<20

T27.
将学生按年龄升序排序

select *
from Student
order by Sage asc

T28.
查询选修了课程“c02”的学生的学号及其成绩,查询结果按成绩降序排列

select Sno,Grade
from SC
where Cno='C02'
order by Grade desc

T29.
查询全体学生的信息,查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列

select *
from Student
order by Sdept,Sage desc

T30.
统计学生总人数

select count(*)
from Student

T31.
统计选修了选修课程的学生的人数

select count(distinct Sno)
from SC
where XKLB='选修'

T32.
计算学号为9512101的学生的考试总成绩之和

select sum(Grade)
from SC
where Sno='9512101'

T33.
计算课程“c01”的学生的考试平均成绩

select avg(Grade)
from SC
where Cno='C01'

T34.
查询选修了课程“c01”的学生的最高分和最低分

select max(Grade),min(Grade)
from SC
where Cno='C01'

T35.
统计每门课程的选课人数,列出课程号和人数

select Cno,count(Sno) as '选课人数'
from SC
group by Cno

T36.
查询每名学生的选课门数和平均成绩

select Sno,count(Cno) as '选课门数',avg(Grade) as '平均成绩'
from SC
group by Sno

T37.
查询选修了3门以上课程的学生的学号

select Sno
from SC
group by Sno
having count(Cno)>3

T38.
查询选课门数等于或大于4门的学生的平均成绩和选课门数

select Sno,avg(Grade) as '平均成绩',count(*) as '选课门数'
from SC
group by Sno
having count(*)>=4

四、多表查询

T39.
查询每个学生的情况及其选课的情况

select *
from Student left outer join SC on Student.Sno=SC.Sno

T40.
查询计算机系学生的选课情况,要求列出学生的名字,所修课的课程号和成绩

select Sname,Cno,Grade
from Student,SC
where Student.Sno=Sc.Sno and Sdept='计算机系'

T41.
查询信息系选修VB课程的学生的成绩,要求列出学生姓名,课程名和成绩

select Sname,Cname,Grade
from Student,SC,Course
where Student.Sno=SC.Sno and SC.Cno=Course.Cno and sdept='信息系' and Cname='VB'
select Sname,Cname,Grade
from Student join SC on Student.Sno=SC.Sno join Course on Course.Cno=SC.Cno
where Sdept = '信息系' and Cname = 'VB';

T42.
查询所有选修了VB课程的学生的情况,要求列出学生姓名和所在的系

select Sname,Sdept
from Student join SC on Student.Sno=SC.Sno join Course on Course.Cno=SC.Cno
where Cname='VB'

T43.
查询与刘晨在同一个系学习的学生的姓名和所在系

select Sname,Sdept
from Student
where Sdept=(select Sdeptfrom Studentwhere Sname='刘晨')
select s2.Sname,s2.Sdept
from Student as s1,Student as s2
where s1.Sname='刘晨' and s2.Sname !='刘晨' and s1.Sdept=s2.Sdept 

T44.
查询学生的选课情况,包括选修课程的学生和没有修课的学生

select *
from Student left join SC on Student.Sno=SC.Sno

T45.
查询数学系成绩在80分以上的学生的学号,姓名

select Student.Sno,Sname
from Student join SC on Student.Sno=SC.Sno
where Sdept='数学系' and Grade>80

T46.
查询计算机系考试成绩最高的学生的姓名

select Sname
from Student join SC on Student.Sno=SC.Sno
where Sdept='计算机系' and Grade=(select max(Grade)from Student join SC on Student.Sno=SC.SnoGroup by Sdepthaving Sdept='计算机系')

五、嵌套子查询

(T43)

T47.
查询成绩大于90分的学生的学号和姓名

select Sno,Sname
from Student
where Sno in (select Snofrom SCwhere Grade>90)

T48.
查询选修了“数据库基础”课程的学生的学号和姓名

select Sno,Sname
from Student
where Sno in (select Snofrom SC where Cno in (select Cnofrom Coursewhere Cname='数据库基础'))

T49.
查询选修了刘晨没有选修的课程的学生的学号和所在系

select Sno,Sdept
from Student
where Sno in (select Snofrom SCwhere Cno not in (select Cnofrom SCwhere Sno=(select Snofrom Studentwhere Sname='刘晨')))

T50.
查询选修了课程“c02”且成绩高于此课程的平均成绩的学生的学号和成绩

select Sno,Grade
from SC
where Cno='C02' and Grade>(select avg(Grade)from SCwhere Cno='C02')

T51.
查询选修了课程“c01”的学生姓名

select Sname
from Student
where Sno in (select Snofrom SCwhere Cno='C01')
select Sname
from Student
where exists (select *from SCwhere Sno=Student.Sno and Cno='C01')

PS.一般来说,在SQL中in子查询都可以用exists代替。EXISTS子查询可以看成是一个独立的查询系统,只为了获取真假逻辑值,EXISTS子查询与外查询查询的表是两个完全独立的毫无关系的表,当我们在子查询中添加了Sno关联之后,EXISTS子查询与外查询查询的表就统一了,是二者组合组建的虚表,是同一个表(这样当子查询查询到虚表中当前行的Cno为C01时,则将虚表当前行中对应的Sname查询到了).
  重点在于Sno关联之上,添加Sno关联,数据库会先将两张表通过Sno关联组合成一张虚表,所有的查询操作都在这张虚表上完成。


六、自查询

T52.查询所有成绩大于C01课程最高成绩的学生的学号

select SC2.Sno
from SC as SC1,SC as SC2
where SC1.Sno=SC2.Sno and SC1.Cno=SC2.Cno and SC2.Grade>all(select Gradefrom SCwhere SC.Cno='C01')

七、更新数据

T53.
将所有学生的年龄加1

update Student
set Sage=Sage+1

T54.
将“9512101”学生的年龄改为21岁

update Student
set Sage=21
where Sno='9512101'

T55.
将计算机系学生的成绩加5分

update SC
set Grade=Grade+5
where Sno in (select Snofrom Studentwhere Sdept='计算机系')

八、删除数据

T56.
删除所有学生的选课记录

DELETE FROM SC

T57.
删除所有不及格学生的选课记录

delete from SC
where Grade<60

T58.
删除计算机系不及格学生的选课记录

delete from SC
where Grade<60 and Sno in (select Snofrom Studentwhere Sdept='计算机系')

数据来源于网络,整理@lihui
测试代码:
建表代码
题目代码
测试环境:SQL Server 2017

数据库练习题(比较基础)相关推荐

  1. 六、MySQL 数据库练习题1(包含前5章练习题目及答案)

    文章目录 一.数据库概述练习题 二.MySQL 环境搭建练习题 三.查询练习 MySQL 数据库练习题(包含前5章所有知识点及答案) 前置知识: 一.数据库开发与实战专栏导学及数据库基础概念入门 二. ...

  2. 实验四 数据库SQL语言基础编程

    -- 实验四 数据库SQL语言基础编程 -- 实验目的: --  掌握数据库查询语句的编写方法 --  掌握利用查询语言完成基本查询 --  掌握利用SQL语句完成数据的添加.删除.修改操作 -- 实 ...

  3. 2.5.1 MySQL数据库备份恢复基础讲解

    MySQL数据库备份恢复基础 MySQL常见的故障类型 对于用户来说,数据库中保存的数据通常至关重要,所以要采取各种手段来防止各种可能的数据损失和数据故障. DBA主要任务就是维持数据库的高可靠性运行 ...

  4. 计算机数据库管理基本知识,2015年计算机四级考试《数据库技术》基础知识:概念篇...

    2015年计算机四级考试<数据库技术>基础知识:概念篇 信息与数据 1. 信息.物质.能量是组成客观世界并促进社会发展的三大基本要素; 2. 信息(Information)--是客观世界事 ...

  5. mysql数据库基础简介_MySQL数据库之MySQL 基础之MySQL简介

    本文主要向大家介绍了MySQL数据库之MySQL 基础之MySQL简介 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. MySQL基础 1.定义 开源的关系型数据库管理系统.现在 ...

  6. 《大型数据库技术》MySQL数据库的开发基础

    文章目录 注意 1.MySQL 的存储引擎 1.1 创建企业管理系统的数据库,命名为enterprisedb 1.2 创建一张雇员表,使用MyISAM引擎,命名为employee,包括如下字段:雇员工 ...

  7. Oracle数据库练习题(2)

    一.表展示 二.练习题及答案 11.列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称 (1)select t.empno, t.empname, d.dnamefrom (select a. ...

  8. Oracle数据库练习题(1)

    一.建表 create table empgj(empno number(4,0) primary key,ename varchar2(10), job varchar2(9),mgr number ...

  9. ORACLE数据库练习题整理(2)

    阅读目录 1. 2. 3. 4. 5. 6. 7. 8.MySql 9. 1. Oracle数据库的服务: OracleServiceOrcl/OracleServicesid:数据库实例服务,是数据 ...

  10. 数据库常用函数-基础

    数据库常用函数-基础 文章目录 数据库常用函数-基础 常见函数 1.统计函数-- count 2.sum 函数 3.avg函数 4.max min函数 5.字符串函数 1.几个比较常用的字符串函数(红 ...

最新文章

  1. C#.NET通用权限管理在DB2数据库上运行的脚本参考 - 序列创建脚本参考
  2. 动视暴雪员工大罢工:因CEO被曝多次包庇高管性侵下属、本人曾性骚扰助理
  3. 在Python中使用XGBoost
  4. js函数重写php,深入讲解js覆盖原有方法 提供重写方法
  5. aix卸载java,AIX系统学习之--卸载软件错误
  6. oracle 匿名段,这段匿名块看着没什么问题啊
  7. 从源码分析创建线程池的4种方式
  8. webpack打包样式资源_使用loader去打包css文件_打包less文件---webpack工作笔记004
  9. PHP导出MySQL数据字典 Summer-Mysql-Dic
  10. 玩转木浪云数据管理免费版使用篇之内容搜索与颗粒度恢复
  11. 修改rocketmq nameserver的默认端口号
  12. 什么是电磁兼容标准?IEC、EN、TC77、CISPR等的区别!
  13. C++ 偏微分数值计算库_「首席架构师推荐」数值分析软件精选
  14. 再读红宝书(第四版)第二章 html 中的 javascript
  15. 什么是上行带宽,什么是下行带宽
  16. python中科院_中科院闹乌龙,Python“换皮”成木兰
  17. python背包问题求最大价值 | 动态规划
  18. Android游戏引擎汇总,架构师花费近一年时间整理出来的安卓核心知识
  19. 毕设 疲劳驾驶检测系统 python
  20. cmd查看python库命令_怎么用命令查看python的库

热门文章

  1. 删除Linux中的.swp文件
  2. 微信屏蔽跳去App Store链接的解决方法
  3. Python 让多图排版更加美观
  4. 架构设计基础设施保障(laaS 云虚拟使用 存储 网络 DNS运用 CDN剖析和运用)
  5. 基于百度AI平台Python实现人像动漫画
  6. 采购证书有了解过吗?
  7. 小松的STM32教程(2)—— OLED显示
  8. 在php中如何实现cookie即时生效,不用刷新就可以使用 1
  9. array unshift php,php – 用于多维数组的array_unshift
  10. 纯干货:手把手地教你搭建Oracle Sharding数据库分片技术