WHCSRL 技术网

数据库PTA作业(一)

数据库PTA作业(一)

前言

最近一直在准备考试考证,虽然有一直在刷题,但都没有做什么记录。最近新开了数据库的课程,记录些做作业过程中的新手体会


提示:以下是本篇文章正文内容,下面案例可供参考

一、选择题

2-1下面关于SQL、DDL、DML 及DCL的描述错误的是__D___。(2分)
A.DDL是对SQL语句中完成数据定义功能部分的称呼
B.DML是对SQL语句中完成数据操纵功能部分的称呼
C.DCL是对SQL语句中完成数据控制功能部分的称呼
D.SQL与DDL、DML 、DCL没有关系,均是独立的语言
2-2已知关系student (sno,sname,age,gender,place), 查询姓名中含有”小”字的同学姓名,年龄的SQL语句,正确的是(D )。 (2分)
A.Select sname 姓名,age 年龄 From student Where sname = '小';
B.Select sname 姓名, age 年龄 From student Where sname like '小%%';
C.Select sname 姓名, age 年龄 From student Where sname like '_小%%';
D.Select sname 姓名, age 年龄 From student Where sname like '%%小%%';
2-3下列哪个SQL 语句属于DDL 语句( B)。(2分)
A.Select ( insert update delete select)
B.Grant (grant rovoke )
C.Create (create drop truncate)
D.Insert
2-4在SQL Server2008数据库中,从Product表中查询出Price(价格)高于Pname (产品名称)为“网通IP电话卡”的所有记录中的最高价格的查询语句是(B )。(2分)
A.SELECT * FROM Product WHERE max(Price)>’网通IP电话卡’
B.SELECT * FROM Product WHERE Price>(SELECT max(Price)FROM Product WHERE Pname=’ 网通IP电话卡’)
C.SELECT FROM Product WHERE Price>(SELECT max()FROM Product WHERE Pname=’ 网通IP电话卡’)**
D.SELECT * FROM Product WHERE EXISTS Pname=’网通IP电话卡’
2-5在SQL Server 2008中,已知Student表中有一个age列,数据类型是int,如果要限制该列的取值范围在18到28之间,可以使用以下哪个SQL语句(C )。(2分)
A.alter table Student add unique(age>=18 and age<=28)
B.alter table Student add set(age>=18 and age<=28)
C.alter table Student add check(age>=18 and age<=28)
D.alter table Student add defult(age>=18 and age<=28)

二、编程题

10-1 查询姓‘李’的学生记录
select sno as 学号,sname as 姓名,sex as 性别,mno as 专业,birdate as 出生日期,memo as 备注
from stu
where sname like '李%%'
  • 1
  • 2
  • 3
姓名这类的一般模糊查询,select * from 表名 where name like '%%李%%'
其中, '%%李%%' 是名字中任意位置有“李”字;'李%%'是以“李”字开头的;'%%李'是以“李”字结尾的
10-2 查询部分专业的学生
select sno as 学号,sname as 姓名,sex as 性别,mname as 专业
from stu,major
where stu.mno=major.mno and mname in ('计算机工程','软件工程')
order by sno;
  • 1
  • 2
  • 3
  • 4
10-3 单表查询:根据运费查询订单信息
select orderid,customerid,employeeid 
from orders 
where Freight between 10 and 50
  • 1
  • 2
  • 3
10-4 查询图书表中所有记录
select * from 图书
  • 1
10-5 查询员工表全部信息
select * from 员工
  • 1
10-6 查询学生表所有学生记录
select * from stu
  • 1
10-7 查询学生表中的女生信息
select sno as 学号,sname as 姓名
from stu
where sex=0
  • 1
  • 2
  • 3
10-8 查询所有学生的姓名及年龄,要求结果中列名显示中文
select sname as 姓名,(YEAR(CURDATE())-YEAR(bday)) as 年龄
from students
  • 1
  • 2
这题比较难的是只给了出生日期没有给年龄,需要计算。
方法一般有三种:
1、YEAR(CURDATE())-YEAR(bday)
2、year(2021-getdate())
3、datediff(year,birthday,getdate())
例:birthday = '2003-3-8' getDate()= '2008-7-7'
10-9 查询xsda表中的学号、姓名、性别三项信息,结果按照女生优先的顺序显示。
select 学号,姓名,性别
from xsda
order by 性别 desc;
  • 1
  • 2
  • 3
10-10 查询图书表中李凯所著的图书,要求查询结果中包括条形码,书名,作者,出版社4列。
select 条形码,书名,作者,出版社
from 图书
where 作者 like "李凯%%"
  • 1
  • 2
  • 3
10-11 查询所有学生的学号、姓名、性别和出生日期
select sno,sname,ssex,bday from students
  • 1
10-12 查询所有年龄小于等于25岁的女生的学号和姓名
select sno as 学号,sname as 姓名,ssex as 性别
from students
where ssex='女' and (year(curdate())-year(bday))<=25
  • 1
  • 2
  • 3
10-13 查询Students表中的所有系名,要求结果中系名不重复
select distinct sdept from students
  • 1
数据库里可能会包含重复值,而关键词 distinct用于返回唯一不同的值。
10-14 2-1-(e) 查询所有的男影星或者住址中含有4的影星
select name from MovieStar where gender='M' or address like '%%4%%'
  • 1
10-15 2-2-(a)查询价格低于1600美元的个人计算机的型号(model)、速度(speed)及硬盘容量(hd)
select model,speed,hd
from pc
where price<1600
  • 1
  • 2
  • 3
10-16 3-1-(e)查询比a1更富有的行政长官
select name
from MovieExec
where certID in(select presCertID from Studio) and netWorth>all(
    select netWorth
    from MovieExec
    where name='a1')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
这题就需要多想一下,先找名字再限定身份,注意有两张表
10-17 A1-5在顾客表中找出特定名字的顾客信息
select CustomerID,CompanyName
from customers
where CompanyName like'%%th%%'
  • 1
  • 2
  • 3
10-18 A2-1查找产品表中再次订购量大于15的产品信息
select ProductID,ProductName,SupplierID
from products
where ReorderLevel>15
  • 1
  • 2
  • 3
10-19 6-5 查询各种不同速度的PC的平均价格
select speed,avg(price) as avg_price from pc group by speed
  • 1
求平均直接用关键词avg。
group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。
PS:在使用group by的语句中,只能用于select分类的列(表达式),或聚合函数。where条件用于group by之前
10-20 查询S001学生选修而S003学生未选修的课程
select cno as 课程号
from sc
where cno not in(select s1.cno as 课程号
                 from sc as s1 inner join sc as s2 on s1.cno = s2.cno
                 where(s1.sno = 'S001' and s2.sno = 'S003'))
      and sno = 's001';

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
看表会发现001、002和003都选的课里只有C001,直接从1和2共同选课中排除就行
10-21 A1-2根据所在国家查找订单信息
select OrderID,CustomerID
from orders
where ShipCountry='Germany' or ShipCountry='Brazil' or ShipCountry='France'
  • 1
  • 2
  • 3
10-22 A1-3查询顾客表中所有不重复的城市
select distinct City
from customers
  • 1
  • 2
10-23 3-1-(d)查询比电影《M1》时间更长的电影
select title,year
from Movie 
where length>100
  • 1
  • 2
  • 3
10-24 A1-8查询传真号码不为空的供货商信息
select SupplierID,CompanyName
from suppliers
where Fax is not NULL
  • 1
  • 2
  • 3
不为空用 is not null 或者 !=0 都行
10-25 A2-3查询产品表中单价不在范围内的的产品信息
select ProductID,ProductName,CategoryID
from products
where UnitPrice<15 or UnitPrice>45
  • 1
  • 2
  • 3
10-26 A3-4查询产品表中最大库存量
select max(UnitsInStock) as maxUnitsInStock
from products
  • 1
  • 2
10-27 查询平均成绩高于75分的学生
select sno as 学号,avg(grade) as 平均成绩
from sc
group by 学号
having 平均成绩>75
  • 1
  • 2
  • 3
  • 4
10-28 输出有成绩的学生学号和课号
select sno,cno
from sc
where score is not NULL
  • 1
  • 2
  • 3
10-29 查询所有姓“刘”的学生信息
select sno,sname,class,ssex,bday,bplace,IDNum,sdept,phone
from students
where sname like '刘%%'
  • 1
  • 2
  • 3
10-30 查询生源地不是“山东”省的学生信息
select sno,sname,class,ssex,bday,bplace,IDNum,sdept,phone
from students
where bplace not like '山东%%'
  • 1
  • 2
  • 3
10-31 查询名字中含有“明”字的男生的学生姓名和班级
select sname,class
from students
where sname like '%%明%%' and ssex='男'
  • 1
  • 2
  • 3
10-32 查询姓名是两个字的学生信息
select sno,sname,class,	ssex,bday,bplace,IDNum,sdept,phone
from students
where sname like '__'
  • 1
  • 2
  • 3
PS:查询两位用两个下划线表示即可
10-33 查询非信息学院和机电学院的学生信息
select sno,sname,class,ssex,bday,bplace,IDNum,sdept,phone
from students
where sdept not in('机电学院','信息学院')
  • 1
  • 2
  • 3
10-34 查询学生表中没有联系电话的学生信息
select sno,sname,class,ssex,bday,bplace,IDNum,sdept,phone
from students
where phone is null
  • 1
  • 2
  • 3
10-35 计算“0000001”课程的平均分、最高分和最低分
select avg(score) as 平均分, max(score) as 最高分, min(score) as 最低分
FROM sc
where cno ='0000001'
  • 1
  • 2
  • 3
10-36 统计输出各系学生的人数
select distinct sdept as,count(*) as 人数
from students 
group by sdept
  • 1
  • 2
  • 3
10-37 查询选修了“0000008”课程的学生的学号及其成绩,查询结果按分数降序排列
select sno,score
from sc
where cno = '0000008'
order by score desc
  • 1
  • 2
  • 3
  • 4
10-38 查询成绩不及格的学生学号、课号和成绩,并按成绩降序排列
select sno,cno,score
from sc
where score < 60
order by score desc
  • 1
  • 2
  • 3
  • 4
10-39 统计各系的男、女生人数
select sdept as 系别,ssex as 性别,count(*) as 人数
from students
group by 系别,性别
  • 1
  • 2
  • 3
10-40 统计不及格人数超过3人的课程号和人数
select cno as 课程号,count(*) as 不及格人数
from sc
where score <60 
group by cno
having count(*) >3
  • 1
  • 2
  • 3
  • 4
  • 5
10-41 查询信息学院的男生信息,查询结果按出生日期升序排序,出生日期相同的按生源地降序排序
select *
from students
where sdept='信息学院'and ssex= '男'
order by bday, bplace desc
  • 1
  • 2
  • 3
  • 4
10-42 统计选修人数最多的3门课
select distinct cno as 课程号,count(*) as 选修人数 
from sc 
group by cno
order by count(*) desc
limit 3;
  • 1
  • 2
  • 3
  • 4
  • 5
这题在PTA中有要求为MYSQL,而“TOP 3” 适用SQL service,所以此处只能用limit 3

总结

个人经验,如果有问题,欢迎大家留言给我意见指正。 以下是我在学习过程中的一些学习借鉴的地址
源地址:sql中order by和group by的区别 - konglingbin - 博客园 (cnblogs.com)
order by 和 group by 的区别:
1,order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。
2,group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。
3,在使用group by的语句中,只能select用于分类的列(表达式),或聚合函数。where条件用于group by之前,having用于group by 之后对结果进行筛选。

源地址:SQL中where与having的区别 - 永恒的回忆 - 博客园 (cnblogs.com)
1.where和having的区别
where:
where是一个约束声明,使用where来约束来自数据库的数据;
where是在结果返回之前起作用的;
where中不能使用聚合函数。
having:
having是一个过滤声明;
在查询返回结果集以后,对查询结果进行的过滤操作;
在having中可以使用聚合函数。
2.聚合函数和group by
聚合函数就是例如SUM, COUNT, MAX, AVG等对一组(多条)数据操作的函数,需要配合group by 来使用。
推荐阅读