最近一直在看数据库方面的问题,总结了一下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语句的查询实现,及数据的创建。的更多相关文章

  1. 超详细思路讲解SQL语句的查询实现,及数据的创建。

    最近一直在看数据库方面的问题,总结了一下SQL语句,这是部分详细的SQL问题,思路讲解: 第一步:创建数据库表,及插入数据信息 --Student(S#,Sname,Sage,Ssex) 学生表 CR ...

  2. sql语句,查询昨天的数据

    如果在程序中,有前台传来两个时间点:beginTime和endTime,在sql查询中的限制条件就是查询昨天的数据,那么可以这样写: 但是如果在这里要查询昨天的数据的话, 则不能简单地在开始时间的那里 ...

  3. sql语句中查询出的数据添加一列,并且添加默认值

    查询出数据,并且要添加一列表中都不存在的数据,且这一列的值都是相等的 select app_id,app_secret from wx_ticket group by app_id; 查询出的数据是 ...

  4. 清晰讲解SQL语句中的内连接,通用于Mysql和Oracle,全是干货哦

    本文章目的:力求清晰明了讲解SQL语句的内连接的各种应用,没有深奥的理解! 前奏:这篇文章和下篇文章会将内连接和外连接讲解清楚SQL语句的多表查询常用的有以下几种:两表联合查询(1)内连接(2)外连接 ...

  5. 面试、笔试中常用的SQL语句(数据库知识必杀)一共50个!!!

    Student(S#,Sname,Sage,Ssex) 学生表  Course(C#,Cname,T#) 课程表  SC(S#,C#,score) 成绩表  Teacher(T#,Tname) 教师表 ...

  6. php面试专题---17、MySQL的SQL语句编写考点

    php面试专题---17.MySQL的SQL语句编写考点 一.总结 一句话总结: 注意:只写精品 1.MySQL的关联UPDATE语句? 关键UPDATE A,B:UPDATE A,B SET A.c ...

  7. 如何在 Linux 上用 SQL 语句来查询 Apache 日志

    Linux 有一个显著的特点,在正常情况下,你可以通过日志分析系统日志来了解你的系统中发生了什么,或正在发生什么.的确,系统日志是系统管理员在解决系统和应用问题时最需要的第一手资源.我们将在这篇文章中 ...

  8. MySQL的EXPLAIN命令用于SQL语句的查询执行计划

    MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...

  9. SQL语句在查询分析器中可以执行,代码中不能执行

    问题:SQL语句在查询分析器中可以执行,代码中不能执行 解答:sql中包含数据库的关键字,将关键字用[]括起来,可以解决. 后记:建数据库的时候尽量避免使用关键字. 例子: sql.Format(&q ...

随机推荐

  1. thinkphp中assign()和display()区别和用法

  2. SSH框架执行自己定义的SQL语句

    直接上代码 String hsql = "delete XTable x where x.Userid= ?"; Query query = this.getSession().c ...

  3. 【转】数据库无关的GO语言ORM - hood

    项目地址:https://github.com/eaigner/hood 这是一个极具美感的ORM库. 特性 链式的api 事务支持 迁移和名字空间生成 模型变量 模型时间 数据库方言接口 没有含糊的 ...

  4. SSO单点登录实现原理与总结

    一.什么是单点登录SSO(Single Sign-On) SSO是一种统一认证和授权机制,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用 ...

  5. ORM实现原理

    1.什么是ORM ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的 ...

  6. Guava学习笔记目录

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...

  7. IClient for js开发之地图的加载

    进行web开发之前首先需要安装IServer以及iClient for JavaScript的开发包.在这两中都具备的前提下进行第一步,如何调用IServer中发布的服务 调用iServer 中发布的 ...

  8. 【精心挑选】15款最好的 jQuery 网格布局插件(Grid Plugins)

    如今,大多数网站设计要靠网格系统和布局,这能够提供给设计人员一个方便的途径来组织网页上的内容.网格的设计最常见于报纸和杂志的版面,由文字和图像构成的列组成. 这篇文章给大家分享精心挑选的15款最佳的 ...

  9. 常让人误解的一道js小题

    一道小题引发的深思 今天无意中看到一个js笔试题,不由得想起初学js那会被各种题目狂虐的心酸,虽说现在也会被笔试题所虐,但毕竟比之前好了很多,下面就是我的个人理解,欢迎拍砖.指正: var x = 1 ...

  10. SharePoint 2010 网站备份还原简单介绍

    今天尝试了SharePoint2010网站的备份和还原,从网上搜一些文档看看,然后自己试试,感觉和2007的操作没什么太大的区别,跟大家分享下自己尝试的命令行方式和数据库的方式,2007自己常用的也是 ...