(企业面试部分)超详细思路讲解SQL语句的查询实现,及数据的创建。
最近一直在看数据库方面的问题,总结了一下SQL语句,这是部分详细的SQL问题,思路讲解:
- 第一步:创建数据库表,及插入数据信息
--Student(S#,Sname,Sage,Ssex) 学生表
CREATE TABLE student(
sno VARCHAR2(5) PRIMARY KEY,
sname VARCHAR2(30) NOT NULL,
sage NUMBER(3),
ssex VARCHAR2(5)
);
INSERT INTO student(sno,sname,sage,ssex) VALUES('','张三','','男');
INSERT INTO student(sno,sname,sage,ssex) VALUES('','李四','','女');
INSERT INTO student(sno,sname,sage,ssex) VALUES('','王五','','男');
INSERT INTO student(sno,sname,sage,ssex) VALUES('','王八','','男');
COMMIT;
SELECT * FROM student; --Teacher(T#,Tname) 教师表
CREATE TABLE teacher(
tno VARCHAR2(5) PRIMARY KEY,
tname VARCHAR2(30) NOT NULL
);
INSERT INTO teacher VALUES('','孔老师');
INSERT INTO teacher VALUES('','李老师1');
INSERT INTO teacher VALUES('','李老师2'); --提交
COMMIT; SELECT * FROM teacher; --Course(C#,Cname,T#) 课程表 CREATE TABLE course(
cno VARCHAR2(5) PRIMARY KEY,
cname VARCHAR2(30) NOT NULL,
tno VARCHAR2(5)
);
--创立外键关系
ALTER TABLE course
ADD CONSTRAINT fk_tno FOREIGN KEY(tno) REFERENCES teacher(tno); INSERT INTO course VALUES('','JAVA面向对象','');
INSERT INTO course VALUES('','JSP/SERVLET网站开发','');
-- INSERT INTO course VALUES('003','Oracle数据库','001'); INSERT INTO course VALUES('','JAVA基础','');
INSERT INTO course VALUES('','C#开发','');
INSERT INTO course VALUES('','数据库基础',''); SELECT * FROM course; COMMIT; --SC(S#,C#,score) 成绩表 CREATE TABLE sc(
sno VARCHAR2(5) NOT NULL,
cno VARCHAR2(5) NOT NULL,
score NUMBER(4,1) NOT NULL
); --创立外键关系
ALTER TABLE sc
ADD CONSTRAINT fk_sno FOREIGN KEY(sno) REFERENCES student(sno); --创立外键关系
ALTER TABLE sc
ADD CONSTRAINT fk_cno FOREIGN KEY(cno) REFERENCES course(cno); --创立外键关系
ALTER TABLE sc
ADD CONSTRAINT fk_sno_cno PRIMARY KEY(sno,cno); INSERT INTO sc VALUES('','','');
INSERT INTO sc VALUES('','','');
INSERT INTO sc VALUES('','',''); INSERT INTO sc VALUES('','','');
INSERT INTO sc VALUES('','','');
INSERT INTO sc VALUES('','',''); INSERT INTO sc VALUES('','','');
INSERT INTO sc VALUES('','',''); --提交
COMMIT; select * from sc; --成绩表
select * from Teacher; --教师表
select * from Course; --课程表
select * from Student; --学生表- Student(SNO,Sname,Sage,Ssex) 学生表
- Course(CNO,Cname,TNO) 课程表
- SC(SNO,CNO,score) 成绩表
- Teacher(TNO,Tname) 教师表
- 问题:1、查询“001”课程比“002”课程成绩高的所有学生的学号;
- 思路:先查出001课程的学生成绩,在查出002课程的学生成绩,
- 使用内联的方式查询
SELECT A.sno ,
A.score,B.score
FROM
(SELECT * FROM sc WHERE cno='') A
INNER OIN
(SELECT * FROM sc WHERE cno='') B
ON A.sno=B.sno
WHERE A.score>B.score;
- 2 、查询平均成绩大于85分的同学的学号和平均成绩;
- 思路:使用学生分组的形式
SELECT SNO,AVG(SCORE) FROM SC GROUP BY SNO HAVING (AVG(SCORE )>85);
- 3 、查询所有同学的学号、姓名、选课数、总成绩;
- 思路:先把学生编号,计算选课数、总成绩 分组查出来
- 再使用左联接的方式把要查的数据查出
- 知识点补充:
- --INNER JOIN 是查询两张表之间共同拥有的部分的数据
- --LEFT JOIN 是以左边的数据表为基准先查,而右边的表相关的数据查询出来填充左边的表数据中,如果没有用null填充
- --RIGHT JOIN 是以右边的数据表为基准先查,而左边的表相关的数据查询出来填充右边的表数据中,如果没有用null填充
SELECT S.SNO,S.SNAME,A.C_NO,A.S_SCORE
FROM STUDENT S
LEFT JOIN
(SELECT SNO ,COUNT(CNO) AS C_NO,SUM(SCORE) AS S_SCORE FROM SC GROUP BY SNO) A
ON S.SNO=A.SNO- 4 、查询姓“李”的老师的个数;
- 思路:使用模糊查询的方法
- SELECT COUNT(TNAME) FROM TEACHER WHERE TNAME LIKE '李%';
- 5 、查询没学过孔老师课的同学的学号、姓名;
- 思路:使用逆向思维把学过孔老师课的学生查出来(两表之间用内联,也可用子查询)
- 根据学生学的课程,查询所学的科目里没有孔老师所教的科目
- 知识补充:DISTINCT 查询唯一的不重复的列
--方式一:
SELECT SNO,SNAME FROM STUDENT WHERE SNO NOT IN( SELECT DISTINCT SNO FROM SC WHERE CNO IN( SELECT C.CNO FROM COURSE C INNER JOIN TEACHER T ON C.TNO=T.TNO WHERE TNAME='孔老师')
) --方式二:
SELECT SNO,SNAME FROM student WHERE not exists(
SELECT 1 FROM sc WHERE exists (
SELECT 1
FROM Course c INNER JOIN Teacher t ON c.tno=t.tno
WHERE t.tname='孔老师' and sc.cno=c.cno )
and student.sno= sc.sno
)- 6 、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
- 思路:先根据成绩表查出学过001课程的同学
- 再查出学过002课程的同学
- 再两个表内联查询都学过的部分
SELECT SNO ,SNAME FROM STUDENT S WHERE SNO IN(
SELECT A.SNO FROM
( SELECT SNO FROM SC WHERE CNO ='') A
INNER JOIN
( SELECT SNO FROM SC WHERE CNO ='') B
ON A.SNO=B.SNO
)- 7 、查询学过“孔老师”所教的所有课的同学的学号、姓名;
- 思路:先查处孔老师教过哪些课程,教了几门课程
- 再看看哪些学生学过孔老师的课程(三表联查)
SELECT SNO,SNAME FROM STUDENT WHERE SNO IN (
SELECT A.SNO FROM
( SELECT SC.SNO ,SC.CNO FROM SC
INNER JOIN COURSE C ON SC.CNO=C.CNO
INNER JOIN TEACHER T ON C.TNO=T.TNO
WHERE T.TNAME='孔老师'
)A
GROUP BY A.SNO HAVING (COUNT(1)=
(SELECT COUNT(CNO) FROM COURSE C
INNER JOIN
TEACHER T ON C.TNO=T.TNO
WHERE TNAME='孔老师'
)
)
)- 8 、查询所有课程成绩小于90分的同学的学号、姓名;
- 思路:先查出同学所有科目的最高分
- 如果最高分小于90分的话,就查出该学生的学号和姓名
SELECT SNO ,SNAME FROM STUDENT WHERE SNO= (
SELECT SNO, MAX(SCORE) FROM SC GROUP BY SNO HAVING (MAX(SCORE)<90));- 9 、查询各科成绩最高和最低的分:形式显示:课程编号,最高分,最低分
- 思路:使用函数查询,并根据学生编号来分组
- SELECT CNO,MAX(SCORE) MAX_SC,MIN(SCORE) MIN_SC FROM SC GROUP BY CNO;
- 10 、查询每门课成绩最好的前两名
- 思路:
- 先查出每门课的成绩进行排序
- 在根据课程来排序
- 知识补充:DENSE_RANK(),名词排序,如果同名词的,则依次排列
SELECT * FROM (
SELECT SNO,CNO ,SCORE, DENSE_RANK() OVER(PARTITION BY CNO ORDER BY SCORE DESC ) AS DRK FROM SC
)
WHERE DRK<=2 ORDER BY CNO,DRK;
(企业面试部分)超详细思路讲解SQL语句的查询实现,及数据的创建。的更多相关文章
- 超详细思路讲解SQL语句的查询实现,及数据的创建。
最近一直在看数据库方面的问题,总结了一下SQL语句,这是部分详细的SQL问题,思路讲解: 第一步:创建数据库表,及插入数据信息 --Student(S#,Sname,Sage,Ssex) 学生表 CR ...
- sql语句,查询昨天的数据
如果在程序中,有前台传来两个时间点:beginTime和endTime,在sql查询中的限制条件就是查询昨天的数据,那么可以这样写: 但是如果在这里要查询昨天的数据的话, 则不能简单地在开始时间的那里 ...
- sql语句中查询出的数据添加一列,并且添加默认值
查询出数据,并且要添加一列表中都不存在的数据,且这一列的值都是相等的 select app_id,app_secret from wx_ticket group by app_id; 查询出的数据是 ...
- 清晰讲解SQL语句中的内连接,通用于Mysql和Oracle,全是干货哦
本文章目的:力求清晰明了讲解SQL语句的内连接的各种应用,没有深奥的理解! 前奏:这篇文章和下篇文章会将内连接和外连接讲解清楚SQL语句的多表查询常用的有以下几种:两表联合查询(1)内连接(2)外连接 ...
- 面试、笔试中常用的SQL语句(数据库知识必杀)一共50个!!!
Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 ...
- php面试专题---17、MySQL的SQL语句编写考点
php面试专题---17.MySQL的SQL语句编写考点 一.总结 一句话总结: 注意:只写精品 1.MySQL的关联UPDATE语句? 关键UPDATE A,B:UPDATE A,B SET A.c ...
- 如何在 Linux 上用 SQL 语句来查询 Apache 日志
Linux 有一个显著的特点,在正常情况下,你可以通过日志分析系统日志来了解你的系统中发生了什么,或正在发生什么.的确,系统日志是系统管理员在解决系统和应用问题时最需要的第一手资源.我们将在这篇文章中 ...
- MySQL的EXPLAIN命令用于SQL语句的查询执行计划
MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...
- SQL语句在查询分析器中可以执行,代码中不能执行
问题:SQL语句在查询分析器中可以执行,代码中不能执行 解答:sql中包含数据库的关键字,将关键字用[]括起来,可以解决. 后记:建数据库的时候尽量避免使用关键字. 例子: sql.Format(&q ...
随机推荐
- MongoDB学习-安装流程
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型. ...
- 泛函编程(36)-泛函Stream IO:IO数据源-IO Source & Sink
上期我们讨论了IO处理过程:Process[I,O].我们说Process就像电视信号盒子一样有输入端和输出端两头.Process之间可以用一个Process的输出端与另一个Process的输入端连接 ...
- sp_get_menu函数使用分析
function sp_get_menu($id="main",$effected_id="mainmenu",$filetpl="<span ...
- C#中委托实现的异步编程
所谓同步:如果在代码中调用了一个方法,则必须等待该方法所有的代码执行完毕之后,才能回到原来的地方执行下一行代码. 异步:如果不等待调用的方法执行完,就执行下一行代码. 1.0 同步例子: class ...
- 每天一命令 git checkout
检出 checkout 是git常用命令之一.主要用于创建切换分支,覆盖本地修改等 git checkout 用于显示工作区,暂存区,版本库中文件的区别 git checkout -b branch ...
- 20款时尚的 WordPress 简洁主题【免费下载】
在这篇文章中,我们收集了20款时尚的 WordPress 简洁模板.WordPress 是最流行的博客系统,插件众多,易于扩充功能.安装和使用都非常方便,而且有许多第三方开发的免费模板,安装方式简单易 ...
- angularJs , json,html片段,bootstrap timepicker angular
css .demotest { width: %; height: auto; overflow: auto; position: relative; margin: auto; margin-top ...
- JScript中的条件注释详解(转载自网络)
JScript中的条件注释详解-转载 这篇文章主要介绍了JScript中的条件注释详解,本文讲解了@cc_on.@if.@set.@_win32.@_win16.@_mac等条件注释语句及可用于条件编 ...
- Jquery在线引用地址
Jquery在线引用地址: 1. 很多网站都是使用这种方式引入,客户的浏览器可能已经缓存过了 jquery.可以直接调用本地的,速度更快… 2. Google code 使用了 cdn 技术在很多地方 ...
- button与input[type=”button”]的区别
button与input[type="button"]的区别 特别感谢 @守护晴天 ,指出了博客中不细致不严谨的地方,也让我学到了更多,更多是觉得抱歉,由于自己的不细致可能误导了一 ...