最近一直在看数据库方面的问题,总结了一下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. Failed to create the Java Virtual Machine.问题的解决

    运行Eclipse,出现了"Failed to create the Java Virtual Machine."错误: 解决的办法是在Eclipse的解压目录下找到eclipse ...

  2. jdk1.6与Myeclipse的冲突造成的

    出现这样的错误时:ERROR:JDWP   Unable   to   get   JNI   1.2   environment   ,jvm-> GetEvn()   return   =- ...

  3. 设置Xshell中支持中文

    执行echo $LANG命令输出的是当前的编码方式,执行locale命令得到系统中所有可用的编码方式.要让Xshell不显示乱码,则要将编码方式改为UTF-8. 在Xshell中[file]-> ...

  4. Maven搭建SpringMVC+Mybatis项目详解

    前言 最近比较闲,复习搭建一下项目,这次主要使用spring+SpringMVC+Mybatis.项目持久层使用Mybatis3,控制层使用SpringMVC4.1,使用Spring4.1管理控制器, ...

  5. [css] CSS3中的单位

    FROM http://www.qianduan.net/understand-the-unit-of-length-in-the-css.html CSS3中的单位: css3中引入了一些新的单位: ...

  6. rabbitmq启动异常之error,{not_a_dets_file recovery.dets

    中午,公司群里面测试人员@笔者说,早上测试服务器异常,MQ起不来,重启os了也起不来,报错,上去看下了早上又因为内存oom被内核killed了,启动了下,确实启动报错,erl vm进程起来了,但是be ...

  7. 【初探HTML本相】道之真谛不过自然,html标签脱俗还真

    前言 须弥般若有无空,阴阳道化真虚同:洗尽前恩本非相,还吾面目下九重. 咳咳,其实老夫对佛教文化有点点研究啦,说以我们这里来了一点很有哲理的东西,因为我这里准备干一件很戳的事情,我准备来看看我们的ht ...

  8. 使用Unity3D的50个技巧

    使用Unity3D的50个技巧 刚开始学习Unity3D时间不长,在看各种资料.除了官方的手册以外,其他人的经验也是非常有益的.偶尔看到老外这篇文章,觉得还不错,于是翻译过来和大家共享.原文地址:ht ...

  9. sharepoint2010问卷调查(4)-实现问卷的重复答复次数(采用自定义字段类型和JS)

    sharepoint的问卷调查可以设置重复和一次答复.但是设置一次后,调查过的用户再进行答复.会提示如下图: 分析下:该提示用户体验很不好.给用户感觉是系统出问题了.因此网上有人提出用eventhan ...

  10. [web安全]Web应用漏洞攻击分析与防范

    网站攻击主要分为以下几类: (1) sql注入攻击 SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.它是利 ...