• 一些简单的sql练习


    • 准备数据
    CREATE TABLE students
    (sno VARCHAR(3) not null,
    sname VARCHAR(3) not null,
    ssex VARCHAR(2) not null,
    sbirthday datetime,
    class VARCHAR(5)
    )
    
    CREATE table courses(
    cno VARCHAR(5) not null,
    cname VARCHAR(10) not null,
    tno VARCHAR(10)not null
    )
    
    CREATE TABLE scores(
    sno VARCHAR(3) not null,
    cno VARCHAR(5) not null,
    degree NUMERIC(10,1)not null
    )
    
    CREATE TABLE teachers(
    tno VARCHAR(3) not null,
    tname VARCHAR(4) not null,
    tsex VARCHAR(2) not null,
    tbirthday datetime not null ,
    prof varchar(6),
    depart VARCHAR(10) not null
    )
    插入数据
    INSERT students (sno,sname,ssex,sbirthday,class)VALUES (108,'曾华','','1977-09-01',95033);
    INSERT students (sno,sname,ssex,sbirthday,class)VALUES (105,'匡明','','1975-10-02',95031);
    INSERT students (sno,sname,ssex,sbirthday,class)VALUES (107,'王丽','','1976-01-23',95033);
    INSERT students (sno,sname,ssex,sbirthday,class)VALUES (101,'李军','','1977-02-20',95033);
    INSERT students (sno,sname,ssex,sbirthday,class)VALUES (109,'王芳','','1977-02-10',95031);
    INSERT students (sno,sname,ssex,sbirthday,class)VALUES (103,'陆君','','1977-06-03',95031);
    
    INSERT courses(cno,cname,tno)values ('3-105','计算机导论',825);
    INSERT courses(cno,cname,tno)values ('3-245','操作系统',804);
    INSERT courses(cno,cname,tno)values ('6-166','数据电路',856);
    INSERT courses(cno,cname,tno)values ('9-888','高等数学',100);
    
    insert scores(sno,cno,degree)VALUES(103,'3-245',86);
    insert scores(sno,cno,degree)VALUES(105,'3-245',75);
    insert scores(sno,cno,degree)VALUES(109,'3-245',68);
    insert scores(sno,cno,degree)VALUES(103,'3-105',92);
    insert scores(sno,cno,degree)VALUES(105,'3-105',88);
    insert scores(sno,cno,degree)VALUES(109,'3-105',76);
    insert scores(sno,cno,degree)VALUES(101,'3-105',64);
    insert scores(sno,cno,degree)VALUES(107,'3-105',91);
    insert scores(sno,cno,degree)VALUES(108,'3-105',78);
    insert scores(sno,cno,degree)VALUES(101,'6-166',85);
    insert scores(sno,cno,degree)VALUES(107,'6-166',79);
    insert scores(sno,cno,degree)VALUES(108,'6-166',81);
    -- 多行插入
    INSERT teachers(tno,tname,tsex,tbirthday,prof,depart)VALUES
    (804,'李诚','','1958-12-02','副教授','计算机系'),
    (256,'张旭','','1969-03-12','讲师','电子工程系'),
    (825,'王萍','','1972-08-14','助教','计算机系'),
    (931,'刘冰','','1977-05-05','助教','电子工程系');
    • 题目及答案
      1 1.-- 查询students表中的所有记录sname、ssex和class列。
      2 SELECT sname,ssex,class from students;
      3 
      4 2.-- 查询教师所有的单位即不重复的depart列
      5 SELECT distinct depart from teachers;
      6 
      7 distinct 不寻常的有区别的
      8 3.-- 查询student表中的所有记录
      9 SELECT *from students;
     10 
     11 4.-- 查询score表中成绩在60到80之间的所有记录
     12 SELECT *from scores WHERE degree BETWEEN 60 and 80;
     13 
     14 between 在...之间
     15 5.-- 查询score表中成绩为85,86或88的记录
     16 SELECT *FROM scores where degree in (85,86,88);
     17 
     18 6.-- 查询student表中'95031'班或性别为'女'的同学记录
     19 SELECT *FROM students WHERE class='95031' or ssex='';
     20 
     21 SELECT * from students WHERE ssex='' 
     22 UNION
     23 SELECT * from students WHERE class='95031'
     24 
     25 7.-- 以class降序查询student表中的所有记录
     26 select *from students ORDER BY class DESC;
     27 
     28 order 顺序,次序
     29 8.-- 以cno升序 degree降序查询score表的所有记录
     30 SELECT *from scores ORDER BY cno asc,degree DESC;
     31 
     32 9.-- 查询'95031'班的人数
     33 SELECT COUNT(1) as stunum from students where class='95031';
     34 
     35 count 数,计数
     36 count1)计算一共有多少符合条件的行
     37 10.-- 查询score表中的最高分的学生学号和课程号.
     38 SELECT sno,cno from scores ORDER BY degree desc LIMIT 1;
     39 
     40 -- 11.查询'3-105'号课程的平均分
     41 SELECT AVG(degree) FROM scores WHERE cno='3-105';
     42 
     43 -- 12.查询score表中至少有5名学生选修的并以3
     44 开头的课程的平均数
     45 SELECT cno,avg(degree) 
     46 FROM scores 
     47 WHERE cno LIKE '3%' 
     48 GROUP BY cno 
     49 HAVING COUNT(*)>=5;
     50 
     51 -- 13.查询最低分大于70,最高分小于90的sno列
     52 SELECT sno 
     53 FROM scores 
     54 GROUP BY sno 
     55 HAVING MAX(degree)<90 AND min(degree)>70;
     56 
     57 -- 14.查询所有学生的sname.cno和degree列
     58  select sname,cno,degree 
     59  from students join scores 
     60  on students.sno=scores.sno 
     61  ORDER BY sname;
     62 
     63 -- 15.查询所有学生的sno.cname和degree列
     64 SELECT sno,cname,degree 
     65 FROM scores JOIN courses 
     66 on scores.cno=courses.cno 
     67 ORDER BY sno;
     68 
     69 -- 16.查询所有的学生的sname.cname和degree列
     70 SELECT sname,cname,degree
     71 FROM scores JOIN courses 
     72 ON scores.cno=courses.cno JOIN students 
     73 ON students.sno=scores.sno 
     74 ORDER BY sname;
     75 
     76 -- 17.查询'95033'班的所选课程的平均分
     77 SELECT  cname,AVG(degree)
     78 FROM scores JOIN students     #scores和students 建立连接
     79 ON scores.sno=students.sno      #条件 学生学号相同
     80 JOIN courses            #再与courses建立连接
     81 ON scores.cno=courses.cno        #课程的编号
     82 WHERE class='95033'            #条件student 95033 班的学生学号建立连接获取成绩参与平均分的算法,学生scores中课程编号与课程中编号对应的课程名字返回
     83 GROUP BY courses.cno    #以95033班所选的课程分组
     84 ORDER BY cname;
     85 
     86 -- 18
     87 
     88 -- 19.查询选修'3-105'课程的成绩高于109号同学成绩的所有记录
     89 SELECT s1.sno,s1.degree
     90 FROM scores s1 INNER JOIN scores s2
     91 on s1.cno =s2.cno AND s1.degree>s2.degree
     92 WHERE s1.cno='3-105' AND s2.sno='109'
     93 ORDER BY s1.sno
     94 
     95 -- 20.查询score中选学一门以上课程同学中分数为非最高分成绩的记录
     96 select *
     97 FROM scores
     98 GROUP BY sno
     99 HAVING COUNT(cno)>1 AND degree!=MAX(degree)
    100 
    101 -- 21.查询成绩高于学号为109 课程号为3-105的成绩的所有记录
    102 SELECT s1.sno,s1.degree
    103 FROM scores s1 JOIN scores s2
    104 on s1.cno=s2.cno AND s1.degree>s2.degree
    105 WHERE s1.cno='3-105' AND s2.sno='109'
    106 ORDER BY s1.sno
    107 
    108 -- 22.查询和学号为108的同学同年同月出售的所有学生的
    109 -- sno.sname和sbirthday列
    110 SELECT s1.sno,s1.sname,s1.sbirthday
    111 FROM students s1 JOIN students s2
    112 on YEAR(s1.sbirthday)=YEAR(s2.sbirthday)
    113 WHERE s2.sno='108'
    114 
    115 -- 23.查询'王萍'教师任课的学生成绩
    116 SELECT sno,degree
    117 FROM scores inner JOIN courses
    118 on scores.cno=courses.cno 
    119 INNER JOIN teachers
    120 on courses.tno=teachers.tno
    121 WHERE teachers.tname='王萍'
    122 -----另一种写法
    123 SELECT sno,degree
    124 FROM teachers ,courses,scores
    125 WHERE teachers.tname='王萍'
    126 
    127 -- 24.查询选修某课程的同学人数多于5人的教师姓名
    128 SELECT DISTINCT tname
    129 FROM scores INNER JOIN courses
    130 on scores.cno=courses.cno 
    131 JOIN teachers
    132 on courses.tno=teachers.tno
    133 WHERE courses.cno in (SELECT cno FROM scores GROUP BY cno HAVING COUNT(sno)>5)
    134 ------
    135 SELECT DISTINCT tname
    136 FROM teachers,courses,scores
    137 WHERE courses.cno=scores.cno AND courses.tno=teachers.tno AND
    138 courses.cno = (SELECT cno FROM scores GROUP BY cno HAVING COUNT(*)>5)
    139 ======
    140 SELECT DISTINCT tname ,cname
    141 FROM scores JOIN courses
    142 on scores.cno=courses.cno
    143 JOIN teachers
    144 on courses.tno=teachers.tno
    145 GROUP BY courses.cname 
    146 HAVING COUNT(sno)>5
    147 
    148 -- 25.查询95033班和95031班全体学生的记录
    149 SELECT *
    150 FROM students
    151 WHERE class in ('95033','95031')
    152 ORDER BY class
    153 
    154 -- 26.查询存在有85分以上成绩的课程cno
    155 SELECT DISTINCT cno
    156 FROM scores
    157 WHERE degree>85
    158 ----
    159 SELECT DISTINCT courses.cname
    160 FROM scores ,courses
    161 WHERE scores.cno=courses.cno AND degree>85
    162 
    163 -- 27.查询出计算机系教师所教课程的成绩表
    164 SELECT tname,cname,sname,degree
    165 FROM teachers JOIN courses
    166 on teachers.tno=courses.tno 
    167 JOIN scores
    168 on courses.cno=scores.cno 
    169 JOIN students
    170 on scores.sno=students.sno
    171 WHERE teachers.depart='计算机系'
    172 ORDER BY tname,cname,degree DESC
    173 
    174 -- 28.查出计算机系与电子工程系不同职称的教师的tname和prof
    175 SELECT tname,prof
    176 FROM teachers
    177 WHERE depart='计算机系' AND prof NOT in(
    178     SELECT DISTINCT prof
    179     FROM teachers
    180     WHERE depart='电子工程系')
    181 
    182 -- 29.查询选修编号为3-105 课程且成绩至少高于任意选修编号为3-245的同学的成绩的cno.sno和degree,并按degree从高到低次序排序
    183 SELECT cno,sno,degree
    184 FROM scores
    185 WHERE cno='3-105' and degree >any(
    186     SELECT degree
    187     FROM scores
    188     WHERE cno='3-245')
    189     ORDER BY degree DESC
    190  ----写完自己就看不懂了的写法
    191  SELECT DISTINCT s1.cno,s1.sno,s1.degree
    192 FROM scores s1 JOIN scores s2
    193 on s1.degree>s2.degree and
    194 s1.cno='3-105' and s2.cno='3-245'
    195 ORDER BY degree desc 
    196 
    197 --     30.查询选修编号为3-105 且成绩高于所有选修编号为3-245课程的同学的cno,sno和degree
    198 SELECT cno,sno,degree
    199 FROM scores
    200 WHERE cno='3-105' AND degree>ALL(
    201 SELECT degree
    202 FROM scores
    203 WHERE cno='3-245')
    204 ORDER BY degree desc
    205 any关键词可以理解为“对于子查询返回的列中的任一数值,如果比较结果为true,则返回true”。
    206 all的意思是“对于子查询返回的列中的所有值,如果比较结果为true,则返回true”
    207 
    208 --     31.查询所有教师和同学的name sex 和birthday
    209 SELECT sname ,ssex ,sbirthday
    210 FROM students
    211 UNION
    212 SELECT tname,tsex,tbirthday
    213 FROM teachers
    214 
    215 -- 32.查询所有女教师和女同学的name.sex和birthday
    216 SELECT sname,ssex,sbirthday
    217 FROM students
    218 WHERE ssex=''
    219 UNION
    220 SELECT tname,tsex,tbirthday
    221 FROM teachers
    222 WHERE tsex=''
    223 
    224 -- 33查询成绩比该课程平均成绩低的同学的成绩表
    225 SELECT s1.*
    226 FROM scores as s1 inner JOIN(
    227     SELECT cno,AVG(degree) as adegree
    228     FROM scores
    229     GROUP BY cno) s2
    230     on (s1.cno=s2.cno and s1.degree<s2.adegree)
    231 
    232 --     34查询所有任课教师的tname和depart
    233 SELECT tname,depart
    234 FROM teachers 
    235 WHERE tno in (
    236     SELECT tno
    237     FROM courses
    238 )
    239 
    240 --     35查询所有未讲课的教师的tname和depart
    241 SELECT tname,depart
    242 FROM teachers
    243 WHERE tno NOT in(
    244     SELECT tno
    245     FROM courses)
    246 
    247 --     36查询至少有2名男生的班号
    248 SELECT class,COUNT(1) as boyCount
    249 FROM students
    250 WHERE ssex=''
    251 GROUP BY class
    252 HAVING boyCount>=2
    253 
    254 -- 37.查询student表中不姓王的同学的记录
    255 SELECT *
    256 FROM students
    257 WHERE sname not LIKE '王%'
    258 
    259 -- 38.查询student表中每个学生的姓名和年龄
    260 SELECT sname,YEAR(NOW())-YEAR(sbirthday) as sage
    261 FROM students
    262 
    263 -- 39.查询student表中最大和最小的sbirthday日期值
    264 SELECT min(sbirthday),max(sbirthday)
    265 FROM students
    266 
    267 -- 40.以班号和年龄从大到小的顺序查询student表中的全部记录
    268 SELECT *
    269 FROM students
    270 ORDER BY class DESC ,sbirthday ASC;
    271 
    272 -- 41.查询男教师及其所上的课程
    273 SELECT teachers.tname,courses.cname
    274 FROM teachers JOIN courses
    275 ON teachers.tno=courses.tno
    276 WHERE teachers.tsex=''
    277 
    278 -- 42.查询最高分同学的sno.cno和degree列
    279 SELECT sno,cno,degree
    280 FROM scores
    281 GROUP BY cno
    282 HAVING degree=max(degree)
    283 
    284 -- 43.查询和李军同性别的所有同学的sname
    285 SELECT s1.sname 
    286 FROM students s1 JOIN students s2
    287 on s1.ssex=s2.ssex
    288 WHERE s2.sname='李军'
    289 
    290 -- 44.查询和李军同性别并同班的同学sname
    291 SELECT s1.sname
    292 FROM students as s1 JOIN students as s2
    293 on s1.ssex=s2.ssex AND s1.class=s2.class
    294 WHERE s2.sname='李军'
    295 
    296 -- 45.查询所有选项计算机导论课程的男同学的成绩表
    297 SELECT *
    298 FROM scores
    299 WHERE sno in(
    300     SELECT sno
    301     FROM students
    302     WHERE ssex='') AND
    303     cno in(
    304     SELECT cno
    305     FROM courses
    306     WHERE cname='计算机导论')
    307  ====other
    308  SELECT students.sno,students.sname,scores.degree,courses.cname,students.class
    309 from students JOIN scores
    310 on students.sno=scores.sno
    311 JOIN courses
    312 on scores.cno=courses.cno
    313 WHERE courses.cname='计算机导论' and students.ssex=''
    314 ORDER BY students.sno 
    signature:祸兮福所倚,福兮祸所伏
  • 相关阅读:
    2015hust暑假集训 0715 F
    hust2015暑假集训 0715 c a coprime
    0714c
    hdu_1019Least Common Multiple(最小公倍数)
    hdu_1576A/B(扩展欧几里得求逆元)
    hdu_5104 Primes Problem()
    hdu_3483A Very Simple Problem(C(m,n)+快速幂矩阵)
    hdu_2604Queuing(快速幂矩阵)
    hdu_3003Pupu(快速幂)
    神奇的读入读出
  • 原文地址:https://www.cnblogs.com/xnuuuu/p/12150121.html
Copyright © 2020-2023  润新知