写sql是程序员基本功课,找工作面试一般必有sql题,实际工作中对sql的需求更是千变万化,所以掌握好sql对于一个程序 员来说是件非常重要的事情.本文通过一个简单易懂的关系(学生/课程/成绩关系)尽量构造出各种各样的需求来提高我们写sql的功底 ,其中有些sql还是有一些难度的,大多数sql我都给出了思考思路,希望本人N天的劳动成果对您有所帮助.

限于本人水平有限,有些地方的sql写的并不完美,希望大家不吝赐教.最后提一点小小的要求,希望大家对本文积极进行评论,大家的评论是我改进和提高的动力,我希望在和大家的交流中得到提高.

表关系:


建表和初始化sql(本例子使用oralce数据库):

[sql] view plain copy print ?
  1. --创建表
  2. createtableT_STUDENT(snoNUMBERnotnull,snameVARCHAR2(30),sdreeVARCHAR2(50),sageNUMBER,ssexCHAR(2));
  3. altertableT_STUDENTaddprimarykey(SNO);
  4. createtableT_SCORE(snoNUMBER,cnoNUMBER,gradeNUMBER(4,1),tnoNUMBER,idNUMBERnotnull);
  5. altertableT_SCOREaddprimarykey(ID);
  6. createtableT_COURSE(cnoNUMBERnotnull,cnameVARCHAR2(30));
  7. altertableT_COURSEaddprimarykey(CNO);
  8. --初始化学生表
  9. insertintoT_STUDENT(SNO,SNAME,SDREE,SAGE,SSEX)values(1,'李坤','天融信',26,'男');
  10. insertintoT_STUDENT(SNO,SNAME,SDREE,SAGE,SSEX)values(2,'曹贵生','中银',26,'男');
  11. insertintoT_STUDENT(SNO,SNAME,SDREE,SAGE,SSEX)values(3,'柳波','淘宝',27,'男');
  12. insertintoT_STUDENT(SNO,SNAME,SDREE,SAGE,SSEX)values(4,'纪争光','IBM',23,'男');
  13. insertintoT_STUDENT(SNO,SNAME,SDREE,SAGE,SSEX)values(5,'李学宇','微软',25,'女');
  14. insertintoT_STUDENT(SNO,SNAME,SDREE,SAGE,SSEX)values(6,'李雪琪','文思',25,'女');
  15. insertintoT_STUDENT(SNO,SNAME,SDREE,SAGE,SSEX)values(7,'陈绪','百度',26,'男');
  16. insertintoT_STUDENT(SNO,SNAME,SDREE,SAGE,SSEX)values(8,'韩正阳','中海油',24,'男');
  17. insertintoT_STUDENT(SNO,SNAME,SDREE,SAGE,SSEX)values(9,'陈伟东','腾讯',24,'男');
  18. insertintoT_STUDENT(SNO,SNAME,SDREE,SAGE,SSEX)values(10,'刘兵','华为',24,'男');
  19. insertintoT_STUDENT(SNO,SNAME,SDREE,SAGE,SSEX)values(11,'丁成云','联想',25,'女');
  20. insertintoT_STUDENT(SNO,SNAME,SDREE,SAGE,SSEX)values(12,'王鹏','中兴',25,'男');
  21. commit;
  22. --初始化课程表
  23. insertintoT_COURSE(CNO,CNAME)values(1,'JAVA程序设计');
  24. insertintoT_COURSE(CNO,CNAME)values(2,'ORACLE开发');
  25. insertintoT_COURSE(CNO,CNAME)values(3,'C++程序设计');
  26. insertintoT_COURSE(CNO,CNAME)values(4,'C#程序设计');
  27. insertintoT_COURSE(CNO,CNAME)values(5,'Windows实战');
  28. insertintoT_COURSE(CNO,CNAME)values(6,'CenterOS教程');
  29. insertintoT_COURSE(CNO,CNAME)values(7,'Jsp/Servlet开发');
  30. insertintoT_COURSE(CNO,CNAME)values(8,'J2EE从入门到精通');
  31. insertintoT_COURSE(CNO,CNAME)values(9,'EJB及设计模式');
  32. insertintoT_COURSE(CNO,CNAME)values(10,'Javascript/jQuery实战');
  33. insertintoT_COURSE(CNO,CNAME)values(11,'Flash设计');
  34. insertintoT_COURSE(CNO,CNAME)values(12,'HTML/CSS/JAVASCRIPT实战');
  35. insertintoT_COURSE(CNO,CNAME)values(13,'精通ASP.NET');
  36. insertintoT_COURSE(CNO,CNAME)values(14,'JBoss入门');
  37. insertintoT_COURSE(CNO,CNAME)values(15,'Spring开发');
  38. commit;
  39. --初始化成绩表
  40. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(1,2,90.0,2,1);
  41. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(1,3,80.0,3,2);
  42. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(1,4,90.0,4,3);
  43. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,2,70.0,2,4);
  44. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(2,11,66.0,11,5);
  45. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(2,15,77.0,15,6);
  46. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(2,8,87.0,8,7);
  47. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(2,6,96.0,6,8);
  48. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(3,2,89.0,2,9);
  49. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(3,1,91.0,1,10);
  50. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(4,2,83.0,2,11);
  51. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(5,4,73.0,4,12);
  52. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(5,1,60.0,1,13);
  53. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(5,8,82.0,8,14);
  54. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(6,8,90.5,10,15);
  55. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(8,2,58.0,2,16);
  56. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,3,80.0,3,17);
  57. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(9,11,65.0,11,18);
  58. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(9,12,67.0,12,19);
  59. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(9,15,95.0,15,20);
  60. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(9,13,59.0,13,21);
  61. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(10,4,98.0,4,22);
  62. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(10,6,97.0,6,23);
  63. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(10,7,96.0,7,24);
  64. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,7,95.0,7,25);
  65. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(12,8,69.0,8,26);
  66. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(12,9,85.0,9,27);
  67. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(10,14,100.0,14,28);
  68. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(6,9,100.0,9,29);
  69. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,1,59.0,1,30);
  70. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,4,90.0,4,31);
  71. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,5,91.0,5,32);
  72. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,6,58.0,6,33);
  73. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,8,93.0,8,34);
  74. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,9,57.0,9,35);
  75. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,10,95.0,10,36);
  76. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,11,96.0,11,37);
  77. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,12,97.0,12,38);
  78. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,13,98.0,13,39);
  79. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,14,99.0,14,40);
  80. insertintoT_SCORE(SNO,CNO,GRADE,TNO,ID)values(11,15,89.0,15,41);
  81. commit;

--创建表 create table T_STUDENT(sno NUMBER not null, sname VARCHAR2(30), sdree VARCHAR2(50), sage NUMBER, ssex CHAR(2)); alter table T_STUDENT add primary key (SNO); create table T_SCORE(sno NUMBER, cno NUMBER, grade NUMBER(4,1), tno NUMBER, id NUMBER not null); alter table T_SCORE add primary key (ID); create table T_COURSE(cno NUMBER not null, cname VARCHAR2(30)); alter table T_COURSE add primary key (CNO); --初始化学生表 insert into T_STUDENT (SNO, SNAME, SDREE, SAGE, SSEX) values (1, '李坤', '天融信', 26, '男'); insert into T_STUDENT (SNO, SNAME, SDREE, SAGE, SSEX) values (2, '曹贵生', '中银', 26, '男'); insert into T_STUDENT (SNO, SNAME, SDREE, SAGE, SSEX) values (3, '柳波', '淘宝', 27, '男'); insert into T_STUDENT (SNO, SNAME, SDREE, SAGE, SSEX) values (4, '纪争光', 'IBM', 23, '男'); insert into T_STUDENT (SNO, SNAME, SDREE, SAGE, SSEX) values (5, '李学宇', '微软', 25, '女'); insert into T_STUDENT (SNO, SNAME, SDREE, SAGE, SSEX) values (6, '李雪琪', '文思', 25, '女'); insert into T_STUDENT (SNO, SNAME, SDREE, SAGE, SSEX) values (7, '陈绪', '百度', 26, '男'); insert into T_STUDENT (SNO, SNAME, SDREE, SAGE, SSEX) values (8, '韩正阳', '中海油', 24, '男'); insert into T_STUDENT (SNO, SNAME, SDREE, SAGE, SSEX) values (9, '陈伟东', '腾讯', 24, '男'); insert into T_STUDENT (SNO, SNAME, SDREE, SAGE, SSEX) values (10, '刘兵', '华为', 24, '男'); insert into T_STUDENT (SNO, SNAME, SDREE, SAGE, SSEX) values (11, '丁成云', '联想', 25, '女'); insert into T_STUDENT (SNO, SNAME, SDREE, SAGE, SSEX) values (12, '王鹏', '中兴', 25, '男'); commit; --初始化课程表 insert into T_COURSE (CNO, CNAME) values (1, 'JAVA程序设计'); insert into T_COURSE (CNO, CNAME) values (2, 'ORACLE开发'); insert into T_COURSE (CNO, CNAME) values (3, 'C++程序设计'); insert into T_COURSE (CNO, CNAME) values (4, 'C#程序设计'); insert into T_COURSE (CNO, CNAME) values (5, 'Windows实战'); insert into T_COURSE (CNO, CNAME) values (6, 'Center OS教程'); insert into T_COURSE (CNO, CNAME) values (7, 'Jsp/Servlet开发'); insert into T_COURSE (CNO, CNAME) values (8, 'J2EE从入门到精通'); insert into T_COURSE (CNO, CNAME) values (9, 'EJB及设计模式'); insert into T_COURSE (CNO, CNAME) values (10, 'Javascript/jQuery实战'); insert into T_COURSE (CNO, CNAME) values (11, 'Flash设计'); insert into T_COURSE (CNO, CNAME) values (12, 'HTML/CSS/JAVASCRIPT实战'); insert into T_COURSE (CNO, CNAME) values (13, '精通ASP.NET'); insert into T_COURSE (CNO, CNAME) values (14, 'JBoss入门'); insert into T_COURSE (CNO, CNAME) values (15, 'Spring开发'); commit; --初始化成绩表 insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (1, 2, 90.0, 2, 1); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (1, 3, 80.0, 3, 2); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (1, 4, 90.0, 4, 3); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 2, 70.0, 2, 4); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (2, 11, 66.0, 11, 5); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (2, 15, 77.0, 15, 6); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (2, 8, 87.0, 8, 7); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (2, 6, 96.0, 6, 8); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (3, 2, 89.0, 2, 9); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (3, 1, 91.0, 1, 10); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (4, 2, 83.0, 2, 11); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (5, 4, 73.0, 4, 12); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (5, 1, 60.0, 1, 13); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (5, 8, 82.0, 8, 14); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (6, 8, 90.5, 10, 15); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (8, 2, 58.0, 2, 16); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 3, 80.0, 3, 17); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (9, 11, 65.0, 11, 18); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (9, 12, 67.0, 12, 19); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (9, 15, 95.0, 15, 20); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (9, 13, 59.0, 13, 21); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (10, 4, 98.0, 4, 22); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (10, 6, 97.0, 6, 23); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (10, 7, 96.0, 7, 24); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 7, 95.0, 7, 25); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (12, 8, 69.0, 8, 26); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (12, 9, 85.0, 9, 27); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (10, 14, 100.0, 14, 28); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (6, 9, 100.0, 9, 29); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 1, 59.0, 1, 30); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 4, 90.0, 4, 31); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 5, 91.0, 5, 32); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 6, 58.0, 6, 33); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 8, 93.0, 8, 34); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 9, 57.0, 9, 35); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 10, 95.0, 10, 36); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 11, 96.0, 11, 37); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 12, 97.0, 12, 38); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 13, 98.0, 13, 39); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 14, 99.0, 14, 40); insert into T_SCORE (SNO, CNO, GRADE, TNO, ID) values (11, 15, 89.0, 15, 41); commit; 在思维举重前,先来一个热身运动吧:

[sql] view plain copy print ?
  1. --(一)查询选修课程名称为'JAVA程序设计'的学员学号和姓名
  2. --方法一:
  3. --1.查询'JAVA程序设计'这门课程的课程号
  4. --2.在成绩表中查询课程号为步骤1的课程号的成绩信息..
  5. --3.在学生表中查询学号为步骤2结果的学生信息
  6. selectst.sno,st.sname
  7. fromstudentst
  8. wherest.snoin
  9. (selectsno
  10. fromscoresc
  11. wheresc.cno=
  12. (selectco.cnofromcoursecowhereco.cname='JAVA程序设计'));
  13. --方法二:
  14. --1.查询'JAVA程序设计'这门课程的课程号
  15. --2.在成绩表和学生表关联结果中查询课程号等于步骤1的课程号的成绩信息.
  16. --sql86
  17. selectst.sno,st.sname
  18. fromstudentst,scoresc
  19. wherest.sno=sc.sno
  20. andsc.cno=
  21. (selectco.cnofromcoursecowhereco.cname='JAVA程序设计');
  22. --sql92
  23. selectst.sno,st.sname
  24. fromstudentst
  25. joinscoresc
  26. onst.sno=sc.sno
  27. wheresc.cno=
  28. (selectco.cnofromcoursecowhereco.cname='JAVA程序设计');
  29. --方法三:
  30. --1.在成绩表和课程表关联结果中查询选修了'JAVA程序设计'这门课的学生的学号
  31. --2.在学生表中查询步骤1中的学号的学生的详细信息.
  32. --sql86
  33. selectst.sno,st.sname
  34. fromstudentst
  35. wherest.snoin(selectsc.sno
  36. fromscoresc,courseco
  37. wheresc.cno=co.cno
  38. andco.cname='JAVA程序设计');
  39. --sql92
  40. selectst.sno,st.sname
  41. fromstudentst
  42. wherest.snoin(selectsc.sno
  43. fromscoresc
  44. joincourseco
  45. onsc.cno=co.cno
  46. whereco.cname='JAVA程序设计');
  47. --方法四:
  48. --在成绩表和课程表和学生表三表关联的结果中过滤得到选修了'JAVA程序设计'的学生基本信息
  49. --sql86
  50. selectst.sno,st.sname
  51. fromstudentst,scoresc,courseco
  52. wherest.sno=sc.sno
  53. andco.cno=sc.cno
  54. andco.cname='JAVA程序设计';
  55. --sql92(1)用where过滤
  56. selectst.sno,st.sname
  57. fromstudentst
  58. joinscoresc
  59. onst.sno=sc.sno
  60. joincourseco
  61. onco.cno=sc.cno
  62. whereco.cname='JAVA程序设计';
  63. --sql92(2)在关联条件中过滤
  64. selectst.sno,st.sname
  65. fromstudentst
  66. joinscoresc
  67. onst.sno=sc.sno
  68. joincourseco
  69. onco.cno=sc.cno
  70. andco.cname='JAVA程序设计';
  71. 注:1.对于sql86和sql92的区别见这篇文章:http://blog.csdn.net/lk_blog/article/details/7580300
  72. 2.如果您在看的过程中觉得不熟悉的地方很多,建议您先看此文:http://blog.csdn.net/lk_blog/article/details/7585501

--(一)查询选修课程名称为'JAVA程序设计'的学员学号和姓名 --方法一: --1.查询'JAVA程序设计'这门课程的课程号 --2.在成绩表中查询课程号为步骤1的课程号的成绩信息.. --3.在学生表中查询学号为步骤2结果的学生信息 select st.sno, st.sname from student st where st.sno in (select sno from score sc where sc.cno = (select co.cno from course co where co.cname = 'JAVA程序设计')); --方法二: --1.查询'JAVA程序设计'这门课程的课程号 --2.在成绩表和学生表关联结果中查询课程号等于步骤1的课程号的成绩信息. --sql86 select st.sno, st.sname from student st, score sc where st.sno = sc.sno and sc.cno = (select co.cno from course co where co.cname = 'JAVA程序设计'); --sql92 select st.sno, st.sname from student st join score sc on st.sno = sc.sno where sc.cno = (select co.cno from course co where co.cname = 'JAVA程序设计'); --方法三: --1.在成绩表和课程表关联结果中查询选修了'JAVA程序设计'这门课的学生的学号 --2.在学生表中查询步骤1中的学号的学生的详细信息. --sql86 select st.sno, st.sname from student st where st.sno in (select sc.sno from score sc, course co where sc.cno = co.cno and co.cname = 'JAVA程序设计'); --sql92 select st.sno, st.sname from student st where st.sno in (select sc.sno from score sc join course co on sc.cno = co.cno where co.cname = 'JAVA程序设计'); --方法四: --在成绩表和课程表和学生表三表关联的结果中过滤得到选修了 'JAVA程序设计'的学生基本信息 --sql86 select st.sno, st.sname from student st, score sc, course co where st.sno = sc.sno and co.cno = sc.cno and co.cname = 'JAVA程序设计'; --sql92(1) 用where过滤 select st.sno, st.sname from student st join score sc on st.sno = sc.sno join course co on co.cno = sc.cno where co.cname = 'JAVA程序设计'; --sql92(2) 在关联条件中过滤 select st.sno, st.sname from student st join score sc on st.sno = sc.sno join course co on co.cno = sc.cno and co.cname = 'JAVA程序设计'; 注: 1.对于sql86 和sql92的区别见这篇文章: http://blog.csdn.net/lk_blog/article/details/7580300 2.如果您在看的过程中觉得不熟悉的地方很多,建议您先看此文: http://blog.csdn.net/lk_blog/article/details/7585501
进入正文:

[sql] view plain copy print ?
  1. --(一)查询不选修课程编号为'1'的学员姓名和所属单位
  2. --1.在成绩表中查询课程号为'1'的所有学生学号
  3. --2.在学生表中查询学号不在步骤1中的学生的基本信息.
  4. selectst.sname,st.sdree
  5. fromt_studentst
  6. wherest.snonotin(selectsc.snofromt_scorescwheresc.cno='1');
  7. --(二)查询平均成绩大于85的所有学生的学号、姓名和平均成绩?
  8. selectsc.sno,st.sname
  9. fromt_scoresc
  10. joint_studentst
  11. onsc.sno=st.sno
  12. groupbysc.sno,st.sname
  13. havingavg(sc.grade)>85;
  14. --(三)查询课程名称为"JAVA程序设计",且分数低于60的学生姓名和分数
  15. select*
  16. fromt_scoresc
  17. joint_courseco
  18. onsc.cno=co.cno
  19. wheresc.grade<60
  20. andco.cname='JAVA程序设计'
  21. select*
  22. fromt_scoresc
  23. joint_courseco
  24. onsc.cno=co.cno
  25. andsc.grade<60
  26. andco.cname='JAVA程序设计'
  27. --(四)查询任何一门课程成绩全部都在70分以上的姓名、课程名称和分数?
  28. --1.查询出成绩小于70分的学生的学号.
  29. --2.将学生,成绩,课程三张表作关联.
  30. --3.在关联表中过滤出不在步骤1查询结果中的学生信息.
  31. selectst.sname,co.cname,sc.grade
  32. fromt_studentst
  33. joint_scoresc
  34. onst.sno=sc.sno
  35. joint_courseco
  36. onsc.cno=co.cno
  37. wherest.snonotin(selectsc1.cnofromt_scoresc1wheresc1.grade<70);
  38. --(五)查询出选了课的学生的人数.
  39. selectcount(distinct(sc.sno))fromt_scoresc;
  40. --(六)查询每门课程被选课的学生数
  41. selectsc.cno,count(distinct(sc.sno))fromt_scorescgroupbysc.cno;
  42. --(七)查询选了全部课程的学员姓名和所属单位
  43. --1.在课程表中查询出所有课程的数量
  44. --2.在成绩表中查询出学生选课数等于步骤1中总选课数的学生的学号,注意要用distinct,having中可以使用count,where中不能使用count.
  45. --3.在学生表中查出步骤2中学生的基本信息.
  46. selectst.sname,st.sdree
  47. fromt_studentst
  48. wherest.snoin
  49. (selectsc.sno
  50. fromt_scoresc
  51. groupbysc.sno
  52. havingcount(distinctsc.cno)=(selectcount(distinctsc1.cno)
  53. fromt_coursesc1));
  54. --(八)查询没有学全所有课的同学的学号、姓名
  55. selectst.sname,st.sdree
  56. fromt_studentst
  57. wherest.snoin
  58. (selectsc.sno
  59. fromt_scoresc
  60. groupbysc.sno
  61. havingcount(distinctsc.cno)!=(selectcount(*)fromt_course));
  62. --(九)查询选修课程超过5门的学员学号和所属单位
  63. --1.在成绩表中查询出选课程超过5门的学生学号.
  64. --2.在学生表中查询步骤1中学号的学生的基本信息.
  65. selectst.sname,st.sdree
  66. fromt_studentst
  67. wherest.snoin(selectsc.sno
  68. fromt_scoresc
  69. groupbysc.sno
  70. havingcount(distinctsc.cno)>5);
  71. --(十)查询出没有选课的学生基本信息
  72. --1.在成绩表中查询出所有选过课的学生的学号.
  73. --2.在学生表中查询出步骤1中学生的基本信息.
  74. select*
  75. fromt_studentst
  76. wherest.snonotin(selectsc.snofromt_scoresc);
  77. --下面的两个sql等价,在成绩表中数据量很大时使用下面的sql
  78. select*
  79. fromt_studentst
  80. wherest.snonotin(selectdistinct(sc.sno)fromt_scoresc);
  81. select*
  82. fromt_studentst
  83. wherest.snonotin(selectsc.snofromt_scorescgroupbysc.sno);
  84. --(十一)列出有二门以上不及格课程的学生姓名及其平均成绩
  85. --方法一
  86. --1.在成绩表中查询出2门不及格学生的学号,结果记作t1
  87. --2.将学生表和t1和成绩表三表作关联得到关联表,在关联表中取学生基本信息和平均成绩.
  88. --sql92
  89. selectst.sno,st.sname,avg(sc.grade)
  90. fromt_studentst
  91. join(selectsc.sno
  92. fromt_scoresc
  93. wheresc.grade<60
  94. groupbysc.sno
  95. havingcount(distinctsc.cno)>2)t1
  96. onst.sno=t1.sno
  97. joint_scoresc
  98. onsc.sno=t1.sno
  99. groupbyst.sno,st.sname;
  100. --sql86
  101. selectst.sno,st.sname,avg(sc.grade)
  102. fromt_studentst,
  103. t_scoresc,
  104. (selectsc.sno
  105. fromt_scoresc
  106. wheresc.grade<60
  107. groupbysc.sno
  108. havingcount(distinctsc.cno)>2)t1
  109. wherest.sno=t1.sno
  110. andsc.sno=t1.sno
  111. groupbyst.sno,st.sname;
  112. --方法二:
  113. --1.在成绩表中查询出2门不及格学生的学号
  114. --2.将学生表和成绩表通过学号作关联并根据步骤1中的结果作过滤,在关联结果中取出学生基本信息和平均成绩
  115. selectst.sno,st.sname,avg(sc.grade)
  116. fromt_studentst
  117. joint_scoresc
  118. onst.sno=sc.sno
  119. wherest.snoin(selectsc.sno
  120. fromt_scoresc
  121. wheresc.grade<60
  122. groupbysc.sno
  123. havingcount(distinctsc.cno)>2)
  124. groupbyst.sno,st.sname;
  125. --(十二)查询平均成绩大于60分的同学的学号和平均成绩
  126. --学生表和课程表关联,在having子句中过滤平均成绩大于60分.
  127. selectst.sno,avg(sc.grade)
  128. fromt_studentst,t_scoresc
  129. wherest.sno=sc.sno
  130. groupbyst.sno
  131. havingavg(sc.grade)>60;
  132. --1.学生表和课程表关联,将关联的结果记作t1
  133. --2.在t1中过滤平均成绩大于60的学生学号.
  134. selectt1.sno,t1.avg_grade
  135. from(selectst.sno,avg(sc.grade)avg_grade
  136. fromt_studentst,t_scoresc
  137. wherest.sno=sc.sno
  138. groupbyst.sno)t1
  139. wheret1.avg_grade>60;
  140. --(十三)查询出只选修了一门课程的全部学生的学号和姓名
  141. --方法一:
  142. --1.将学生表和成绩表作关联,在分组函数中使用having子句过滤出只选了一门课程的学生基本信息.
  143. selectsc.sno,st.sname
  144. fromt_scoresc
  145. joint_studentst
  146. onsc.sno=st.sno
  147. groupbysc.sno,st.sname
  148. havingcount(distinctsc.cno)=1;
  149. --方法二:
  150. --1.在成绩表中查找学号,分组函数的过滤条件判断只选择了一门课程的学生.
  151. --2.在学生表中查找学号在步骤1中的值的学生的基本信息
  152. selectst.sno,st.sname
  153. fromt_studentst
  154. wherest.snoin(selectsc.sno
  155. fromt_scoresc
  156. groupbysc.sno
  157. havingcount(distinctsc.cno)=1);
  158. --(十四)查询至少有一门课与学号为"1"的同学所学相同的同学的学号和姓名
  159. selectst.sno,st.sname
  160. fromt_studentst
  161. joint_scoresc1
  162. onst.sno=sc1.sno
  163. wheresc1.cnoin(selectsc.cnofromt_scorescwheresc.sno='1')
  164. groupbyst.sno,st.sname;
  165. --(十五)列出既学过"1"号课程,又学过"2"号课程的所有学生姓名
  166. --1.将成绩表和课程表作关联,在关联条件中作过滤查询出既选过课程'1'又选过课程'2'的学生的学号,注意看co.cnoin('1','2')和havingcount(distinctsc.cno)=2的位置.
  167. --2.在学生表中根据步骤1的结果作过滤查询出学生的基本信息.
  168. --方法一:
  169. --sql86
  170. selectst.sno,st.sname
  171. fromt_studentst,
  172. (selectsc.sno
  173. fromt_scoresc,t_courseco
  174. wheresc.cno=co.cno
  175. andco.cnoin('1','2')
  176. groupbysc.sno
  177. havingcount(distinctsc.cno)=2)t1
  178. wherest.sno=t1.sno;
  179. --sql92
  180. selectst.sno,st.sname
  181. fromt_studentstjoin
  182. (selectsc.sno
  183. fromt_scorescjoint_courseco
  184. onsc.cno=co.cno
  185. andco.cnoin('1','2')
  186. groupbysc.sno
  187. havingcount(distinctsc.cno)=2)t1
  188. onst.sno=t1.sno;
  189. --方法二:
  190. --sql86
  191. selectst.sno,st.sname
  192. fromt_studentst
  193. wherest.snoin(selectsc.sno
  194. fromt_scoresc,t_courseco
  195. wheresc.cno=co.cno
  196. andco.cnoin('1','2')
  197. groupbysc.sno
  198. havingcount(distinctsc.cno)=2);
  199. --sql92
  200. selectst.sno,st.sname
  201. fromt_studentst
  202. wherest.snoin(selectsc.sno
  203. fromt_scoresc
  204. joint_courseco
  205. onsc.cno=co.cno
  206. andco.cnoin('1','2')
  207. groupbysc.sno
  208. havingcount(distinctsc.cno)=2);
  209. --(十六)查询至少学过学号为"1"的同学所有门课的同学学号和姓名
  210. --1.查询出'1'号同学学习的全部课程.
  211. --2.查询出'1'号同学学习全部课程的数量.
  212. --3.将课程表和成绩表做关联,在关联表中查询出学生的学号,关联条件中加入过滤条件[课程号在步骤1查询结果范围内],过滤条件中加入数量等级步骤2中得到的数量.
  213. --4.在学生表中查询步骤3中的学号的学生的基本信息.
  214. selectst.sno,st.sname
  215. fromt_studentst
  216. wherest.snoin
  217. (selectsc.sno
  218. fromt_scoresc
  219. joint_courseco
  220. onsc.cno=co.cno
  221. andco.cnoin(selectsc.cnofromt_scorescwheresc.sno='1')
  222. groupbysc.sno
  223. havingcount(distinctsc.cno)=(selectcount(distinctsc.cno)
  224. fromt_scoresc
  225. wheresc.sno='1'))
  226. --(十七)查询和"6"号同学学习的课程完全相同的同学的学号和姓名
  227. --分析:要查询与6号同学完全相同的课程的学生信息,等价于学过6号同学的学过的所有课程并且选课数量与6同学选课数量相等.
  228. --方法一:
  229. --1.查询出'1'号同学学习的全部课程.
  230. --2.查询出'1'号同学学习全部课程的数量.
  231. --3.将课程表和成绩表做关联,在关联表中查询出学生的学号和选课数量,记作t2,关联条件中加入过滤条件[课程号在步骤1查询结果范围内],过滤条件中加入数量等级步骤2中得到的数量.
  232. --4.在成绩表中查询出学号和每个学生选课数量.得到结果记作:t1
  233. --5.将步骤3中的t2和步骤4中的t1通过学生学号关联,添加过滤条件,t1中的选课数量等于t2中的选课数量.
  234. --6.在学生表中查询不步骤5的学生学号的基本信息.
  235. selectst.sno,st.sname
  236. fromt_studentst
  237. wherest.snoin
  238. (selectt1.sno
  239. from(selectsc_a.sno,count(distinctsc_a.cno)num_outer
  240. fromt_scoresc_a
  241. groupbysc_a.sno)t1
  242. join(selectsc.sno,count(distinctsc.cno)num_inner
  243. fromt_scoresc
  244. joint_courseco
  245. onsc.cno=co.cno
  246. andco.cnoin
  247. (selectsc.cnofromt_scorescwheresc.sno='6')
  248. groupbysc.sno
  249. havingcount(distinctsc.cno)=(selectcount(distinctsc.cno)
  250. fromt_scoresc
  251. wheresc.sno='6'))t2
  252. ont1.sno=t2.sno
  253. wheret1.num_outer=t2.num_inner);
  254. --(十八)列出"1"号课成绩比"2"号课成绩高的所有学生的学号及其"1"号课和"2"号课的成绩
  255. --1.将学生表和课程表作两次关联,一次关联用于取该学生课程'1'的成绩,另一次关联用于取该学生课程'2'的成绩.
  256. --sql86
  257. selectst.sno,st.sname,sc_a.grade,sc_b.grade
  258. fromt_studentst,t_scoresc_a,t_scoresc_b
  259. wheresc_a.cno='1'
  260. andsc_b.cno='2'
  261. andst.sno=sc_a.sno
  262. andst.sno=sc_b.sno
  263. andsc_a.grade>sc_b.grade
  264. --sql92
  265. selectst.sno,st.sname,sc_a.grade,sc_b.grade
  266. fromt_studentst
  267. joint_scoresc_a
  268. onst.sno=sc_a.sno
  269. joint_scoresc_b
  270. onst.sno=sc_b.sno
  271. wheresc_a.cno='1'
  272. andsc_b.cno='2'
  273. andsc_a.grade>sc_b.grade
  274. --(十九)查询所有同学的学号、姓名、选课数、总成绩
  275. selectst.sno,st.sname,count(sc.cno),sum(sc.grade)
  276. fromt_studentst,t_scoresc
  277. wherest.sno=sc.sno
  278. groupbyst.sno,st.sname;
  279. --(二十)查询课程成绩小于60分的同学的学号,姓名,课程名,成绩
  280. --下面两条sql虽然结果相同,但意义不同,注意理解一下哦.
  281. --1.将学生表,课程表,成绩表作关联
  282. --2.对关联后的结果作过滤,过滤出成绩小于60的学生基本信息.
  283. selectst.sno,st.sname,co.cname,sc.grade
  284. fromt_scoresc
  285. joint_studentst
  286. onsc.sno=st.sno
  287. joint_courseco
  288. onsc.cno=co.cno
  289. wheresc.grade<60
  290. --1.将学生表,课程表,成绩表作关联,在关联条件中过滤成绩小于60.
  291. selectst.sno,st.sname,co.cname,sc.grade
  292. fromt_scoresc
  293. joint_studentst
  294. onsc.sno=st.sno
  295. joint_courseco
  296. onsc.cno=co.cno
  297. andsc.grade<60
  298. --(二十一)按平均成绩从到低显示所有学生的"JAVA程序设计"、"J2EE从入门到精通"、"EJB及设计模式"三门的课程成绩,
  299. --并按如下形式显示:学生ID,姓名,JAVA程序设计,J2EE从入门到精通,EJB及设计模式,有效课程数,有效课程平均分
  300. --1.将成绩表和课程表关联得到结果记作:t1,关联时的条件选择只统计以上三门课程.
  301. --2.按题目中的要求组织统计结果.
  302. selectst.sno,
  303. st.sname,
  304. sum(decode(t1.cname,'JAVA程序设计',t1.grade))JAVA程序设计,
  305. sum(decode(t1.cname,'J2EE从入门到精通',t1.grade))J2EE从入门到精通,
  306. sum(decode(t1.cname,'EJB及设计模式',t1.grade))EJB及设计模式,
  307. count(distinctt1.grade)有效课程数,
  308. avg(t1.grade)有效课程平均分
  309. fromt_studentst
  310. join(select*
  311. fromt_scoresc
  312. joint_courseco
  313. onsc.cno=co.cno
  314. andco.cnamein
  315. ('JAVA程序设计','J2EE从入门到精通','EJB及设计模式'))t1
  316. onst.sno=t1.sno
  317. groupbyst.sno,st.sname
  318. --将decode可以换成casewhen第一种形式
  319. selectst.sno,
  320. st.sname,
  321. sum(caset1.cname
  322. when'JAVA程序设计'then
  323. t1.grade
  324. end)JAVA程序设计,
  325. sum(caset1.cname
  326. when'J2EE从入门到精通'then
  327. t1.grade
  328. end)J2EE从入门到精通,
  329. sum(caset1.cname
  330. when'EJB及设计模式'then
  331. t1.grade
  332. end)EJB及设计模式,
  333. count(distinctt1.grade)有效课程数,
  334. avg(t1.grade)有效课程平均分
  335. fromt_studentst
  336. join(select*
  337. fromt_scoresc
  338. joint_courseco
  339. onsc.cno=co.cno
  340. andco.cnamein
  341. ('JAVA程序设计','J2EE从入门到精通','EJB及设计模式'))t1
  342. onst.sno=t1.sno
  343. groupbyst.sno,st.sname
  344. --将decode可以换成casewhen第二种形式
  345. selectst.sno,
  346. st.sname,
  347. sum(case
  348. whent1.cname='JAVA程序设计'then
  349. t1.grade
  350. end)JAVA程序设计,
  351. sum(case
  352. whent1.cname='J2EE从入门到精通'then
  353. t1.grade
  354. end)J2EE从入门到精通,
  355. sum(case
  356. whent1.cname='EJB及设计模式'then
  357. t1.grade
  358. end)EJB及设计模式,
  359. count(distinctt1.grade)有效课程数,
  360. avg(t1.grade)有效课程平均分
  361. fromt_studentst
  362. join(select*
  363. fromt_scoresc
  364. joint_courseco
  365. onsc.cno=co.cno
  366. andco.cnamein
  367. ('JAVA程序设计','J2EE从入门到精通','EJB及设计模式'))t1
  368. onst.sno=t1.sno
  369. groupbyst.sno,st.sname
  370. --(二十二)查询各科成绩最高和最低的分:以如下形式显示:课程ID,课程名,最高分,最低分
  371. selectsc.cno,co.cname,max(grade),min(grade)
  372. fromt_scoresc
  373. joint_courseco
  374. onsc.cno=co.cno
  375. groupbysc.cno,co.cname
  376. --(二十三)按各科平均成绩从低到高和及格率的百分数从高到低顺序
  377. --1.在成绩表中查出课程号,平均成绩,课程人数,记作:t1
  378. --2.在成绩表中查出课程号,及格的课程人数,记作:t2
  379. --3.将步骤1中的成绩和步骤2中的课程2关联,查出所要的结果并排序.
  380. selectt1.cno,t1.avg_num平均成绩,(count_num1/count_num)*100及格率
  381. from(selectsc.cno,avg(grade)avg_num,count(distinctsc.sno)count_num
  382. fromt_scoresc
  383. groupbysc.cno)t1
  384. join(selectsc1.cno,count(distinctsc1.sno)count_num1
  385. fromt_scoresc1
  386. wheresc1.grade>60
  387. groupbysc1.cno)t2
  388. ont1.cno=t2.cno
  389. orderbyt1.avg_numasc,及格率desc
  390. --(二十四)统计各科成绩,各分数段人数:课程ID,课程名称,[100-90]优,[90-80]良,[80-70]中,[70-60]一般,[<60]不及格
  391. --1.在成绩表中根据成绩值分段
  392. --2.将步骤1中的结果与课程表关联.
  393. selectsc.cno,co.cname,
  394. sum(case
  395. whensc.grade>90then
  396. 1
  397. end)优,
  398. sum(case
  399. whensc.grade>80andsc.grade<90then
  400. 1
  401. end)良,
  402. sum(case
  403. whensc.grade>70andsc.grade<80then
  404. 1
  405. end)中,
  406. sum(case
  407. whensc.grade>60andsc.grade<70then
  408. 1
  409. end)一般,
  410. sum(case
  411. whensc.grade<60then
  412. 1
  413. end)不及格
  414. fromt_scorescjoint_coursecoonsc.cno=co.cno
  415. groupbysc.cno,co.cname
  416. --(二十五)查询学生平均成绩及其名次
  417. selectst.sno,st.sname,avg(sc.grade)avg_num
  418. fromt_scoresc
  419. joint_studentst
  420. onsc.sno=st.sno
  421. groupbyst.sno,st.sname
  422. orderbyavg_numdesc
  423. --(二十六)查询课程号分别为1,2,3的课程,成绩前三名的学生基本信息:(不考虑成绩并列情况)
  424. --方法一:
  425. --1.分别查出1,2,3各自的前3名的学生的学号,并用unionall将结果集关联.
  426. --2.在学生表中查询步骤1中查到的id的学生的基本信息.
  427. select*
  428. fromt_student
  429. wheresnoin(selectt1.sno
  430. from(selectsc1.*
  431. fromt_scoresc1
  432. wheresc1.cno=1
  433. orderbysc1.gradedesc)t1
  434. whererownum<4
  435. unionall
  436. selectt1.sno
  437. from(selectsc1.*
  438. fromt_scoresc1
  439. wheresc1.cno=2
  440. orderbysc1.gradedesc)t1
  441. whererownum<4
  442. unionall
  443. selectt1.sno
  444. from(selectsc1.*
  445. fromt_scoresc1
  446. wheresc1.cno=3
  447. orderbysc1.gradedesc)t1
  448. whererownum<4)
  449. --方法二:
  450. --rank()over(Partition..orderby...)是按照某个字段的值进行分组并编号
  451. selectt1.cno,t1.sno,t1.grade,r
  452. from(selectsc.sno,
  453. sc.cno,
  454. sc.grade,
  455. rank()over(partitionbysc.cnoorderbygradedesc)r
  456. fromt_scoresc)t1
  457. wherer<4
  458. andt1.cnoin(1,2,3)
  459. orderbyt1.cno,t1.sno,r;
  460. --(二十七)查询各科成绩前三名的记录(不考虑成绩并列情况)
  461. --rank()over(Partition..orderby...)是按照某个字段的值进行分组并编号
  462. selectt1.cno,t1.sno,t1.grade,r
  463. from(selectsc.sno,
  464. sc.cno,
  465. sc.grade,
  466. rank()over(partitionbysc.cnoorderbygradedesc)r
  467. fromt_scoresc)t1
  468. wherer<4
  469. orderbyt1.cno,t1.sno,r;

高级程序员必修课--sql思维举重训练 .相关推荐

  1. 高级程序员必修课--sql思维举重训练

    出处:http://blog.csdn.net/lk_blog/article/details/7585540 写sql是程序员基本功课,找工作面试一般必有sql题,实际工作中对sql的需求更是千变万 ...

  2. 程序员必修课--sql思维举重训练

    写sql是程序员基本功课,找工作面试一般必有sql题,实际工作中对sql的需求更是千变万化,所以掌握好sql对于一个程序员来说是件非常重要的事情.本文通过一个简单易懂的关系(学生/课程/成绩关系)尽量 ...

  3. sql -高级程序员必修课

    --创建表 create table T_STUDENT(sno NUMBER not null,  sname VARCHAR2(30),  sdree VARCHAR2(50),  sage  N ...

  4. 程序员必修课-sql语句

    sql是硬伤,以下这篇文章于我真是饕餮大餐,享受之余转来分享~~ 写sql是程序员基本功课,找工作面试一般必有sql题,实际工作中对sql的需求更是千变万化,所以掌握好sql对于一个程序员来说是件非常 ...

  5. 专门为程序员打造的思维“必修课”

    这是第一篇正式文章,来介绍一本最近刚刚出版的书吧! 对!就是它--<程序员的底层思维>. 介绍这本书的原因有三. 它适合几乎所有IT从业者阅读 内容零门槛,且十分具有启发性. 书中一共介绍 ...

  6. SqlServer注意事项总结,高级程序员必背。

    本篇文章主要介绍SqlServer使用时的注意事项. 想成为一个高级程序员,数据库的使用是必须要会的.而数据库的使用纯熟程度,也侧面反映了一个开发的水平. 下面介绍SqlServer在使用和设计的过程 ...

  7. java 面试,java 后端面试,数据库方面对初级和高级程序员的要求

    本内容摘自 java web轻量级开发面试教程 对于合格的程序员,需要有基本的数据库操作技能,具体体现在以下三个方面. l  第一,针对一类数据库(比如MySQL.Oracle.SQL Server等 ...

  8. 高级程序员必会的程序设计原则 —— 墨菲定律及防呆设计

    前言 如果你或你带领的团队经常会写出一些BUG,日常不是在解决BUG就是在解决BUG的路上,那么你的项目一定是应验了墨菲定律,并且在开发时并没有足够考虑防呆设计.团队越是疲于奔命,错的越是多. 简记 ...

  9. 初级,中级,高级程序员需要具备的能力

    1:团队精神和协作能力 把它作为基本素质,并不是不重要,恰恰相反,这是程序员应该具备的最基本的,也是最重要的安身立命之本.把高水平程序员说成独行侠的都是在呓语,任何个人的力量都是有限的,即便如linu ...

最新文章

  1. 规格表管理之删除规格表数据
  2. python 逗号作用 语句间_Python中逗号的三种作用
  3. C# Datatable排序与取前几行数据
  4. innodb_memcache之配置
  5. 12款白帽子用于黑客渗透测试的操作系统
  6. 前端学习(623):交换两个变量的值
  7. java 反射执行语句_JAVA反射机制
  8. source code怎么用_code-builder代码生成器
  9. windows域策略——配置组策略刷新间隔
  10. Python set模块使用方法
  11. 基于汽车运动学模型的LQR控制
  12. (附源码)ssm牙科诊所预约网站 毕业设计 260952
  13. 浙江丽水龙泉计算机培训,浙江丽水龙泉中等职业学校
  14. 树莓派 40pin IO引脚测试
  15. 初学,这个报错怎么解决
  16. 从turtlesim到贪吃蛇……
  17. 平面、柱面、球面投影
  18. Win部署Flask服务_NSSM
  19. 含泪整理最优质鲜肉VRay材质球素材,你想要的这里都有
  20. ios是什么,ios是什么意思

热门文章

  1. 旁路电容的PCB布局布线透彻详解(4)
  2. 获取小程序二维码携带的参数
  3. 二进制 八进制 十进制 十六进制的相互转换(精简总结)
  4. 基于深度学习的小目标检测方法综述
  5. IM即时通讯-推荐框架
  6. 101003计算机应用基础闭,2017/2018学年第一学期2017级 《信息处理技术》《计算机应用基础》课程期末考试安排表...
  7. JS|TS - 去除对象和数组中的假值
  8. 每周分享第 48 期
  9. 前端使用navigator.mediaDevices.getUserMedia和window.MediaRecorder实现调用摄像头录制视屏
  10. hao123劫持ie的拯救