下面分享关于SQL的题目,包括数据库和答案解析。希望对大家有帮助。

这属于基础题型,大家可以用于日常练习,虽然是基础题,但里面所以知识点都概括了。如果你能够全部理解透彻,真的,这你自己本身是能够感受到的一个提升,很大的提升。

(答案里面忽略大小写,建议大家在写SQL语句是时候,统一使用大写,如果喜欢小写,也可以,不过,最好统一大写或小写)

答案不唯一,下面是纯属个人思路,如果有更好的想法可以安排上,SQL可以有多种解题方法,不同的思路不同的做法。

先放上数据库,大家运行的时候,记得需要导入数据库。

-- 学生表 Student
create table Student(Sid varchar(6), Sname varchar(10), Sage datetime, Ssex varchar(10));
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-05-20' , '男');
insert into Student values('04' , '李云' , '1990-08-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-03-01' , '女');
insert into Student values('07' , '郑竹' , '1989-07-01' , '女');
insert into Student values('08' , '王菊' , '1990-01-20' , '女');-- 成绩表 SC
create table SC(Sid varchar(10), Cid varchar(10), score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);-- 课程表 Course
create table Course(Cid varchar(10),Cname varchar(10),Tid varchar(10));
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');-- 教师表 Teacher
create table Teacher(Tid varchar(10),Tname varchar(10));
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');

题目与答案:

1.    查询课程编号“02”的成绩比课程编号“01”课程低的所有同学的学号、姓名

分析:使用自连接

select s.Sid,c.Sname from SC s
left join Student c on c.Sid=s.Sid
where s.score >= (
select s2.score from  sc s2
where s.Sid = s2.Sid and s2.Cid = '02'
)
and s.Cid = '01'

2.列出每个学生的学生编号、姓名、课程名、授课老师姓名(没课程的学生不用列出)

分析:使用join on连接三个表相关联

SELECTs.Sid,s.Sname,c.Cid,c.Cname,t.Tname
FROMscJOIN student AS s ON sc.Sid = s.SidJOIN course AS c ON sc.Cid = c.CidJOIN teacher AS t ON c.Tid = t.Tid;

3.    查询所有的学生姓名和老师姓名(使用union)

分析:UNION 是一组集合操作,用于将两个SELECT语句的结果组合到一个结果集中,该结果集包 括属于 union 中 SELECT 语句的所有行。

SELECTs.Sname
FROMstudent AS s UNION
SELECTt.Tname
FROMteacher AS t;

4.修改Course表Cname字段类型为nvarchar,长度为100

分析:ALTER TABLE修改列的数据类型。直接使用语法套进去即可。

ALTER TABLE Course ALTER COLUMN Cname NVARCHAR(100);

5. 查询各学生的姓名、年龄(只按年份来计算)

分析:GETDATE() 当前的系统日期。

SELECTs.Sname,YEAR ( getdate() ) - YEAR ( s.Sage ) AS 年龄
FROMstudent AS s;

6.    查询 1990 年出生的学生信息

分析:使用YEAR(date) 返回指定日期的年份数值

 SELECT * FROM student AS s
WHERE YEAR ( s.Sage ) = '1990';

7、查询名字中含有「风」字的学生信息

分析: LIKE查找包指定含字符串的行。

通配符百分比( % ):任何零个或多个字符的字符串。

下划线( _ )通配符:任何单个字符。

SELECT * FROM Student R
WHERE R.Sname LIKE '_风%'

8.查询出只选修两门课程的学生学号和姓名

分析:这里需要查询两门课程,所以我使用子查询直接等于2

SELECTs.sid AS 学号,s.Sname AS 姓名
FROMstudent AS s
WHERE2 = ( SELECT COUNT(*) FROM sc WHERE sc.Sid = s.Sid );

9.查询成绩表中各科成绩前三名的信息以及排名

分析:COUNT() 函数返回每个组中的行数。DISTINCT 子句检索指定列列表中的唯一不同值,换句话说,它从结果集中删除列中的重复值。 DISTINCT 子句将所有 NULL 值视为相同的值。

SELECT s.*,sc.Cid, sc.score,( SELECT COUNT(DISTINCT t.score)
FROM sc AS t
WHERE t.Cid = sc.Cid AND t.score >= sc.score ) AS 排名
FROM sc
JOIN student AS s ON sc.Sid = s.Sid
WHERE ( SELECT COUNT(*)
FROM sc AS t
WHERE t.Cid = sc.Cid AND t.score >= sc.score ) <= 3
ORDER BYsc.Cid,sc.score DESC;

10.检索" 01 "课程分数小于 60,按分数降序排列的学生信息和

分析:用and满足where的要求小于60,查询成绩DESC倒序

SELECTs.*,sc.score
FROMstudent AS sJOIN sc ON s.Sid = sc.Sid
WHEREsc.Cid = '01'AND sc.score < 60
ORDER BYsc.score DESC;

11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

分析:HAVING 子句通常与[GROUP BY]子句一起使用,以根据指定的条件列表过滤分组。

使用SUM()以获得总成绩

SELECT S.Sid,N.Sname,A.Cid , SUM(S.score) AS 平均成绩FROM SC S
LEFT JOIN Student N ON N.Sid=S.Sid
LEFT JOIN
Course A ON A.Cid=S.Cid
GROUP BY S.Sid,N.Sname,A.Cid
HAVING SUM(S.score)<6AND A.Cid>2

12.查询没学过"张三"老师讲授的任一门课程的学生姓名

分析: IN 查找值列表中具有值的行,我取消 IN 运算符,所以使用 NOT IN 运算符。DISTINCT 就是要从结果集中删除列中的重复值。

SELECT e.Sname
FROM Student e
WHERE e.Sid
NOT IN (
SELECT DISTINCT Sid
FROM SC eJOIN Course f ON f.Cid=e.CidJOIN Teacher m ON m.Tid=f.Tid
WHERE m.Tname='张三'
)

13.查询和" 01 "号的同学学习的课程完全相同的其他同学的信息

分析:这里使用in来查找值列表中具有值的行。并且等于01号同学学习的课程的总数,所以,我这里也用了COUNT()来查找总数。

SELECT *
FROM student AS s
WHERE s.Sid != '01'
AND (SELECT COUNT(*)
FROM sc
WHERE sc.Sid = s.SidAND sc.Cid IN
( SELECT sc.Cid FROM sc WHERE sc.Sid = '01' ))
= ( SELECT COUNT(*) FROM sc WHERE sc.Sid = '01' );

14.查询没有学全所有课程的学生的信息

分析:用COUNT()查出课程数,LEFT JOIN ON连接表,GROUP BY 查询哪些数据。首先,COUNT()查询成绩表的总数,然后,HAVINGG 子句过滤小于子查询里面的数据。

SELECT s.Sid,Sname,Sage,Ssex, COUNT(SC.Cid)AS 课程数
FROM Student s
LEFT JOIN SCON s.Sid=SC.Sid
GROUP BY s.Sid,Sname,Sage,Ssex
HAVING COUNT(SC.Cid)<(SELECT COUNT(DISTINCT Cid)FROM Course)

15.查询学过「张三」老师授课的同学的信息

分析:从学生表、老师表查询名称为‘张三’。

SELECT *
FROM Student,Teacher S
WHERE S.Tname='张三'

16.查有成绩的学生信息

分析:从学生表查询所有的学生,使用IN在里面嵌套一个子查询,因为题目要求有成绩的学生,所以大于1,为0就等于没有成绩,所以是大于1。


SELECT s.*
FROM Student s
WHERE Sid IN(
SELECT DISTINCT Sid
FROM SC
WHERE SC.score>1)

17.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )

分析:SUM(表达式) 返回表达式中所有的总和,忽略NULL值。

COUNT()返回总的选课数。

SELECT   r.Sid AS 学生编号,r.Sname AS 学生姓名,
(SELECT COUNT(*) FROM SC WHERE SC.Sid=r.Sid)AS 选课总数,
(SELECT SUM(SC.score) FROM SC WHERE SC.Sid=r.Sid) AS 总成绩
FROMStudent r 

18.查询在 SC 表存在成绩的学生信息

分析:使用LEFT JOIN ON 表与表之间的连接,ORDER BY 查询。

SELECT q.sid,q.score,w.sname,w.Sage,w.SsexFROM SC q
LEFT JOIN Student w ON w.Sid=q.Sid
ORDER BY q.score

SQL基础题型(内含数据库和答案),帮你更加熟练运用SQL相关推荐

  1. sql 基础语法 创建数据库和数据表 数据增删改查 分组查询 子查询回顾

    参考链接: SQL教程 MySQL教程 一.创建数据库语法 --用master数据库 use master --判断数据库是否存在,若存在则删除 if exists (select * from sy ...

  2. oracle数据库sql基础知识,Oracle数据库基础知识为内部培训资料.doc

    PAGE 1 课程 IL001100 ORACLE数据库基础知识 ISSUE1.0 开心Java整理 IL001100 ORACLE数据库基础知识 ISSUE1.0 目录 PAGE 1 PAGE 45 ...

  3. SQL基础知识整理—数据库相关基本概念

    一.数据建模 1.理解和分析业务需求.数据建模中最重要的一步. 2.构建业务的概念模型.包括识别业务中的实体.事物或概念以及它们之间的关系. 3.构建逻辑模型.独立于数据技术的抽象数据模型. 4.构建 ...

  4. SQL基础知识回顾--(Go/Python/Beego ORM/Django ORM/原生Sql)

    序言 Filecoin即将上线.我们知道filecoin是由goLang编写的,所以在此间歇期,我打算同时复习一下go和python的知识,本文的侧重点在于如何高效率的使用orm-sql语句. Go操 ...

  5. SQL面试题: 数据库中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列 ,当B列大于C列时选择B列否则选择C列 ,...

    1.用一条sql语句 select (case when a>b then a else b end ),(case when b>c then b esle c end)  from 表 ...

  6. 获取oracle数据库war报告,Oracle 数据库开发及SQL基础实战

    Oracle 数据库开发及SQL基础实战 一.数据库基础 主键(Primary Key): 1.某一列或某些列的组合,构成一个主键,在这张二维表里,主键必须不重复.用于在这些行之间进行唯一的区别. 2 ...

  7. SQL基础教程|第一章:数据库和SQL

    前言: 1.本书在知识点提炼时侧重于实践效果,所以有些理论部分的知识点不会涉及或者几笔带过. 2.在语法实践时将会带入更多的例子和问题以便于理解数据库语法. 3.在所有关于SQL基础教程的文章中的语句 ...

  8. MySQL入门:建模和设计数据库,SQL基础

    MySQL入门 第二章 建模和设计数据库 数据库设计过程 需求分析:确定并记下需要从数据库中获取的内容,将存储哪些数据,以及数据项之间的相互关系. 概念设计:将需求提炼成数据库设计的正式描述. 逻辑设 ...

  9. SQL实战篇:SQL基础及执行顺序

    对于数据分析师来说,不管什么行业,大多数岗位要求都需要熟练使用SQL,尤其在互联网行业要求更是严格,海量的数据存储在数据库中,不懂SQL就寸步难行,更何谈数据分析了,而写的一手好SQL,却可以让自己提 ...

最新文章

  1. Centos8 安装并使用Ansible(一)
  2. Struts2 (三)OGLN
  3. 在服务器生成ssl认证
  4. linux rpm安装软件笔记
  5. 十八般武艺玩转GaussDB(DWS)性能调优(二):坏味道SQL识别
  6. 【OpenCV学习】cvConvert的使用
  7. activeMQ 的kahadb存储引擎分析
  8. 基于卷积神经网络的大豆病害识别
  9. 函数内联inline
  10. SQL datediff()函数 时间差
  11. javascript 正则
  12. Solaris 简单命令
  13. C4D快速入门教程——倒角
  14. 产品读书《创新者的窘境》
  15. 【Jmeter测试】03—— post请求测试
  16. [ACCESS]档案数字化加工录入系统使用说明(干部职工退休档案)
  17. 普度大学计算机科学博士,Top15普渡大学计算机博士全奖录取
  18. 央视 315 晚会曝光数据泄露
  19. 蓝桥杯java B组历年省赛真题汇总及题目详解
  20. Hoppscotch - 免费开源的轻量级 API 接口开发/测试/调试工具,代替 Postman

热门文章

  1. tomcat7和tomcat8的websocket区别
  2. 游戏开发物语方案点数分配_游戏开发物语可分配点数 | 手游网游页游攻略大全...
  3. Intouch/ifix语音报警系统制作(1-初步添加插件和简单使用)
  4. m4v如何转换成mp4,只需这几步即可
  5. 数字字符串转换为整型数
  6. 搭建ADG过程中复制报错 RMAN-03009 ORA-03113
  7. 数据库:触发器,作用,分类,触发器与存储过程的区别
  8. redhat enterprise linux as4下载,RedHat Enterprise Linux AS4下安装小企鹅输入法.doc
  9. 【Unity3D日常开发】Unity3D的证书认证
  10. WRF和WPS安装和编译时遇到的问题