├── README.md └── sql.md /README.md: -------------------------------------------------------------------------------- 1 | # SQLTest 2 | SQL笔试经典50题 3 | -------------------------------------------------------------------------------- /sql.md: -------------------------------------------------------------------------------- 1 | ## 建表语句: 2 | 3 | ```sql 4 | create table Student(sid varchar(10),sname varchar(10),sage datetime,ssex nvarchar(10)); 5 | insert into Student values('01' , '赵雷' , '1990-01-01' , '男'); 6 | insert into Student values('02' , '钱电' , '1990-12-21' , '男'); 7 | insert into Student values('03' , '孙风' , '1990-05-20' , '男'); 8 | insert into Student values('04' , '李云' , '1990-08-06' , '男'); 9 | insert into Student values('05' , '周梅' , '1991-12-01' , '女'); 10 | insert into Student values('06' , '吴兰' , '1992-03-01' , '女'); 11 | insert into Student values('07' , '郑竹' , '1989-07-01' , '女'); 12 | insert into Student values('08' , '王菊' , '1990-01-20' , '女'); 13 | create table Course(cid varchar(10),cname varchar(10),tid varchar(10)); 14 | insert into Course values('01' , '语文' , '02'); 15 | insert into Course values('02' , '数学' , '01'); 16 | insert into Course values('03' , '英语' , '03'); 17 | create table Teacher(tid varchar(10),tname varchar(10)); 18 | insert into Teacher values('01' , '张三'); 19 | insert into Teacher values('02' , '李四'); 20 | insert into Teacher values('03' , '王五'); 21 | create table SC(sid varchar(10),cid varchar(10),score decimal(18,1)); 22 | insert into SC values('01' , '01' , 80); 23 | insert into SC values('01' , '02' , 90); 24 | insert into SC values('01' , '03' , 99); 25 | insert into SC values('02' , '01' , 70); 26 | insert into SC values('02' , '02' , 60); 27 | insert into SC values('02' , '03' , 80); 28 | insert into SC values('03' , '01' , 80); 29 | insert into SC values('03' , '02' , 80); 30 | insert into SC values('03' , '03' , 80); 31 | insert into SC values('04' , '01' , 50); 32 | insert into SC values('04' , '02' , 30); 33 | insert into SC values('04' , '03' , 20); 34 | insert into SC values('05' , '01' , 76); 35 | insert into SC values('05' , '02' , 87); 36 | insert into SC values('06' , '01' , 31); 37 | insert into SC values('06' , '03' , 34); 38 | insert into SC values('07' , '02' , 89); 39 | insert into SC values('07' , '03' , 98); 40 | ``` 41 | 42 | ## 表结构: 43 | 44 | - 学生表 Student 45 | 46 | SId 学生编号 Sname 学生姓名 Sage 出生年月 Ssex 学生性别 47 | 48 | - 课程表 Course 49 | 50 | CId 课程编号 Cname 课程名称 TId 教师编号 51 | 52 | - 教师表 Teacher 53 | 54 | TId 教师编号 Tname 教师姓名 55 | 56 | - 成绩表 SC 57 | 58 | SId 学生编号 CId 课程编号 score 分数 59 | 60 | ## 题目: 61 | 62 | 1、查询“01”课程比“02”课程成绩高的所有学生的学号: 63 | 64 | ```sql 65 | SELECT s1.sid 66 | FROM 67 | ( SELECT * FROM SC WHERE cid = 01 ) s1 68 | LEFT JOIN ( SELECT * FROM SC WHERE cid = 02 ) s2 ON s1.sid = s2.sid 69 | WHERE 70 | s1.score > s2.score; 71 | ``` 72 | 73 | 2、查询平均成绩大于60分的同学的学号和平均成绩; 74 | 75 | ```sql 76 | SELECT sid,AVG( score ) 77 | FROM SC 78 | GROUP BY sid 79 | HAVING AVG( score ) > 60; 80 | ``` 81 | 82 | 3、查询所有同学的学号、姓名、选课数、总成绩 83 | 84 | ```sql 85 | SELECT Student.sid,Student.sname,COUNT(DISTINCT cid),SUM(DISTINCT score) 86 | FROM Student LEFT JOIN SC 87 | ON Student.sid = SC.sid 88 | GROUP BY Student.sid,Student.sid 89 | ``` 90 | 91 | 4、查询姓“李”的老师的个数; 92 | 93 | ```sql 94 | SELECT COUNT(DISTINCT tid) AS teacher_cnt 95 | FROM Teacher 96 | WHERE tname LIKE "李%" 97 | ``` 98 | 99 | 5、查询没学过“张三”老师课的同学的学号、姓名; 100 | 101 | ```sql 102 | select s.sid, s.sname 103 | from Student s 104 | where s.sid not in ( 105 | SELECT s.sid 106 | from Student s 107 | join SC sc 108 | on sc.sid = s.sid 109 | join Course c 110 | on c.cid = sc.cid 111 | join Teacher t 112 | on t.tid = c.tid 113 | where t.tname = '张三' 114 | ) 115 | ``` 116 | 117 | 6、查询学过编号“01”并且也学过编号“02”课程的同学的学号、姓名; 118 | 119 | ```sql 120 | SELECT t.sid AS sid,Student.sname 121 | FROM 122 | (SELECT sid 123 | FROM SC 124 | GROUP BY sid 125 | HAVING COUNT(IF(cid = "01",score,NULL)) > 0 126 | AND 127 | COUNT(IF(cid = "02",score,NULL)) > 0) AS t 128 | LEFT JOIN Student 129 | ON t.sid = Student.sid; 130 | ``` 131 | 132 | 7、查询学过“张三”老师所教的课的同学的学号、姓名; 133 | 134 | ```sql 135 | SELECT s.sid,Student.sname 136 | FROM 137 | (SELECT SC.sid 138 | FROM 139 | (SELECT DISTINCT cid 140 | FROM Course LEFT JOIN Teacher 141 | ON Course.tid = Teacher.tid 142 | WHERE Teacher.tname = "张三") c 143 | LEFT JOIN SC ON c.cid = SC.cid) s 144 | LEFT JOIN Student ON s.sid = Student.sid 145 | ``` 146 | 147 | 8、查询课程编号“01”的成绩比课程编号“02”课程低的所有同学的学号、姓名; 148 | 149 | ```sql 150 | SELECT t.sid,Student.sname 151 | FROM 152 | (SELECT s1.sid 153 | FROM 154 | (SELECT sid,score 155 | FROM SC 156 | WHERE cid = "01" AND score IS NOT NULL) s1 157 | LEFT JOIN 158 | (SELECT sid,score 159 | FROM SC 160 | WHERE cid = "02" AND score IS NOT NULL) s2 161 | ON s1.sid = s2.sid 162 | WHERE s1.score < s2.score) t 163 | LEFT JOIN Student 164 | ON t.sid = Student.sid 165 | ``` 166 | 167 | 9、查询所有课程成绩小于60分的同学的学号、姓名; 168 | 169 | ```sql 170 | SELECT t.sid,Student.sname 171 | FROM 172 | (SELECT DISTINCT sid 173 | FROM SC 174 | GROUP BY sid 175 | HAVING MAX(score) < 60) t 176 | LEFT JOIN Student 177 | ON t.sid = Student.sid 178 | ``` 179 | 180 | 10、查询没有学全所有课的同学的学号、姓名; 181 | 182 | ```sql 183 | SELECT t.sid,Student.sname 184 | FROM 185 | (SELECT sid 186 | FROM SC 187 | GROUP BY sid 188 | HAVING COUNT(DISTINCT cid) < 189 | (SELECT COUNT(DISTINCT cid) 190 | FROM Course)) t 191 | LEFT JOIN Student 192 | ON t.sid = Student.sid 193 | ``` 194 | 195 | 11、查询至少有一门课与学号为“01”的同学所学相同的同学的学号和姓名; 196 | 197 | ```sql 198 | SELECT t.sid,Student.sname 199 | FROM 200 | (SELECT DISTINCT co.sid 201 | FROM 202 | (SELECT cid 203 | FROM SC 204 | WHERE sid = "01") c1 205 | LEFT JOIN 206 | (SELECT sid,cid 207 | FROM SC 208 | WHERE sid != "01") co 209 | ON c1.cid = co.cid) t 210 | LEFT JOIN Student 211 | ON t.sid = Student.sid 212 | ``` 213 | 214 | 12、查询和"01"号的同学学习的课程完全相同的其他同学的学号和姓名 215 | 216 | ```sql 217 | SELECT t.sid,Student.sname 218 | FROM 219 | (SELECT co.sid 220 | FROM 221 | (SELECT cid 222 | FROM SC 223 | WHERE sid = "01") c1 224 | LEFT JOIN 225 | (SELECT sid,cid 226 | FROM SC 227 | WHERE sid != "01") co 228 | ON c1.cid = co.cid 229 | GROUP BY co.sid 230 | HAVING COUNT(co.cid) = 231 | (SELECT COUNT(DISTINCT cid) 232 | FROM SC 233 | WHERE sid = "01")) t 234 | LEFT JOIN Student 235 | ON t.sid = Student.sid 236 | ``` 237 | 238 | 13、把“SC”表中“张三”老师教的课的成绩都更改为此课程的平均成绩; 239 | 240 | ```sql 241 | #暂跳过update题目 242 | ``` 243 | 244 | 14、查询没学过"张三"老师讲授的任一门课程的学生姓名 245 | 246 | ```sql 247 | SELECT sid,sname 248 | FROM Student 249 | WHERE sid NOT IN 250 | (SELECT DISTINCT sid 251 | FROM SC 252 | LEFT JOIN Course 253 | ON SC.cid = Course.cid 254 | LEFT JOIN Teacher 255 | ON Course.tid = Teacher.tid 256 | WHERE Teacher.tname = "张三") 257 | ``` 258 | 259 | 15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 260 | 261 | ```sql 262 | SELECT t.sid,Student.sname,t.avgScore 263 | FROM 264 | (SELECT sid,AVG(score) avgScore 265 | FROM SC 266 | GROUP BY sid 267 | HAVING COUNT(IF(score < 60,cid,NULL)) >= 2) t 268 | LEFT JOIN Student 269 | ON t.sid = Student.sid 270 | ``` 271 | 272 | 16、检索"01"课程分数小于60,按分数降序排列的学生信息 273 | 274 | ```sql 275 | SELECT Student.* 276 | FROM 277 | (SELECT DISTINCT sid 278 | FROM SC 279 | WHERE cid = "01" AND score < 60 280 | ORDER BY score DESC) t 281 | LEFT JOIN Student 282 | ON t.sid = Student.sid 283 | ``` 284 | 285 | 17、按平均成绩从高到低显示所有学生的平均成绩 286 | 287 | ```sql 288 | SELECT sid,AVG(score) 289 | FROM SC 290 | GROUP BY sid 291 | ORDER BY AVG(score) DESC 292 | ``` 293 | 294 | 18、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率 295 | 296 | ```sql 297 | SELECT SC.cid, Course.cname ,MAX(score) maxScore,MIN(score) minScore,AVG(score) avgScore, 298 | COUNT(IF(score > 60,sid,NULL)) / COUNT(sid) passRate 299 | FROM SC 300 | LEFT JOIN Course 301 | ON SC.cid = Course.cid 302 | GROUP BY SC.cid 303 | ``` 304 | 305 | 19、按各科平均成绩从低到高和及格率的百分数从高到低顺序 306 | 307 | ```sql 308 | SELECT SC.cid,AVG(score) avgScore, 309 | COUNT(IF(score > 60,sid,NULL)) / COUNT(sid) passRate 310 | FROM SC 311 | LEFT JOIN Course 312 | ON SC.cid = Course.cid 313 | GROUP BY SC.cid 314 | ORDER BY avgScore ASC, 315 | passRate DESC 316 | ``` 317 | 318 | 20、查询学生的总成绩并进行排名 319 | 320 | ```sql 321 | SELECT sid,SUM(score) sumScore 322 | FROM SC 323 | GROUP BY sid 324 | ORDER BY sumScore DESC 325 | ``` 326 | 327 | 21、查询不同老师所教不同课程平均分从高到低显示 328 | 329 | ```sql 330 | SELECT Course.tid,Course.cid,Course.cname,AVG(score) avgScore 331 | FROM SC 332 | LEFT JOIN Course 333 | ON SC.cid = Course.cid 334 | GROUP BY Course.tid,SC.cid 335 | ORDER BY avgScore DESC 336 | ``` 337 | 338 | 22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩 339 | 340 | ```sql 341 | ## oracle写法 342 | select 343 | sid,rank_num,score,cid 344 | from 345 | ( 346 | select 347 | rank() over(partition by cid order by score desc) as rank_num 348 | ,sid 349 | ,score 350 | ,cid 351 | from sc 352 | )t 353 | where rank_num in (2,3) 354 | ``` 355 | 356 | 23、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比 357 | 358 | ```sql 359 | select 360 | sc.cid 361 | ,cname 362 | ,count(if(score between 85 and 100,sid,null))/count(sid) 363 | ,count(if(score between 70 and 85,sid,null))/count(sid) 364 | ,count(if(score between 60 and 70,sid,null))/count(sid) 365 | ,count(if(score between 0 and 60,sid,null))/count(sid) 366 | from sc 367 | left join course 368 | on sc.cid=course.cid 369 | group by sc.cid,cname 370 | ``` 371 | 372 | 24、查询学生平均成绩及其名次 373 | 374 | ```sql 375 | ## oracle写法 376 | select 377 | sid 378 | ,avg_score 379 | ,rank() over (order by avg_score desc) 380 | from 381 | ( 382 | select 383 | sid 384 | ,avg(score) as avg_score 385 | from sc 386 | group by sid 387 | )t 388 | ``` 389 | 390 | 25、查询各科成绩前三名的记录 391 | 392 | ```sql 393 | ## oracle写法 394 | select 395 | sid,cid,rank1 396 | from 397 | ( 398 | select 399 | cid 400 | ,sid 401 | ,rank() over(partition by cid order by score desc) as rank1 402 | from sc 403 | )t 404 | where rank1<=3 405 | ``` 406 | 407 | 26、查询每门课程被选修的学生数 408 | 409 | ```sql 410 | select 411 | count(sid) 412 | ,cid 413 | from sc 414 | group by cid 415 | ``` 416 | 417 | 27、查询出只选修了一门课程的全部学生的学号和姓名 418 | 419 | ```sql 420 | select 421 | s.* 422 | from sc 423 | left join student s 424 | on s.sid = sc.sid 425 | group by sid 426 | having count(cid) =1 427 | ``` 428 | 429 | 28、查询男生、女生人数 430 | 431 | ```sql 432 | select 433 | ssex 434 | ,count(distinct sid) 435 | from student 436 | group by ssex 437 | ``` 438 | 439 | 29、查询名字中含有"风"字的学生信息 440 | 441 | ```sql 442 | select 443 | sid,sname 444 | from student 445 | where sname like '%风%' 446 | ``` 447 | 448 | 30、查询同名同性学生名单,并统计同名人数 449 | 450 | ```sql 451 | select 452 | ssex 453 | ,sname 454 | ,count(sid) 455 | from student 456 | group by ssex,sname 457 | having count(sid)>=2 458 | ``` 459 | 460 | 31、查询1990年出生的学生名单(注:Student表中Sage列的类型是datetime) 461 | 462 | ```sql 463 | select * 464 | from student s 465 | where year(s.sage) = 1990 466 | ``` 467 | 468 | 32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列 469 | 470 | ```sql 471 | select sc.cid, avg(sc.score) 472 | from sc 473 | group by sc.cid 474 | order by avg(sc.score), cid desc 475 | ``` 476 | 477 | 37、查询不及格的课程,并按课程号从大到小排列 478 | 479 | ```sql 480 | select distinct c.cid, c.cname 481 | from sc 482 | left join course c 483 | on c.cid = sc.cid 484 | where sc.score < 60 485 | order by sc.cid desc 486 | ``` 487 | 488 | 38、查询课程编号为"01"且课程成绩在60分以上的学生的学号和姓名; 489 | 490 | ```sql 491 | select s.sid, s.sname 492 | from sc 493 | left join course c 494 | on c.cid = sc.cid 495 | left join student s 496 | on s.sid = sc.sid 497 | where 1=1 498 | and c.cid = '01' 499 | and sc.score > 60 500 | ``` 501 | 502 | 40、查询选修“张三”老师所授课程的学生中,成绩最高的学生姓名及其成绩 503 | 504 | ```sql 505 | select s.sname, sc.score 506 | from sc 507 | inner join course c 508 | on c.cid = sc.cid 509 | inner join teacher t 510 | on t.tid = c.tid 511 | and t.tname = '张三' 512 | left join student s 513 | on s.sid = sc.sid 514 | order by sc.score desc 515 | limit 1 516 | ``` 517 | 518 | 42、查询每门功课成绩最好的前两名 519 | 520 | ```sql 521 | ## Oracle写法 522 | select 523 | cid,sid,rank1 524 | from 525 | ( 526 | select 527 | cid 528 | ,sid 529 | ,rank() over(partition by cid order by score desc) as rank1 530 | from sc 531 | )t 532 | where rank1 <=2 533 | ``` 534 | 535 | 43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列 536 | 537 | ```sql 538 | select c.cid, c.cname, count(sc.cid) 539 | from sc 540 | left join course c 541 | on c.cid = sc.cid 542 | group by sc.cid 543 | having count(sc.cid) > 5 544 | order by count(sc.cid) desc, sc.cid asc 545 | ``` 546 | 547 | 44、检索至少选修两门课程的学生学号 548 | 549 | ```sql 550 | select s.* 551 | from student s 552 | inner join sc 553 | on sc.sid = s.sid 554 | group by sc.sid 555 | having count(sc.cid) >= 2 556 | ``` 557 | 558 | 45、查询选修了全部课程的学生信息 559 | 560 | ```sql 561 | select s.* 562 | from student s 563 | inner join sc 564 | on sc.sid = s.sid 565 | group by sc.sid 566 | having count(sc.cid) = ( 567 | select count(distinct c.cid) 568 | from course c 569 | ) 570 | ``` 571 | 572 | 46、查询各学生的年龄 573 | 574 | ```sql 575 | select 576 | sid,sname,year(curdate())-year(sage) + 1 as sage 577 | from student 578 | ``` 579 | 580 | 47、查询本周过生日的学生 581 | 582 | ```sql 583 | select 584 | s.sid,s.sname,s.sage 585 | from student s 586 | where weekofyear(s.sage) = weekofyear(curdate()) 587 | ``` 588 | 589 | 48、查询下周过生日的学生 590 | 591 | ```sql 592 | select 593 | s.sid,s.sname,s.sage 594 | from student s 595 | where weekofyear(s.sage) = weekofyear(date_add(curdate(),interval 1 week)) 596 | ``` 597 | 598 | 49、查询本月过生日的学生 599 | 600 | ```sql 601 | select 602 | s.sid,s.sname,s.sage 603 | from student s 604 | where month(s.sage) = month(curdate()) 605 | ``` 606 | 607 | 50、查询下月过生日的学生 608 | 609 | ```sql 610 | select 611 | s.sid,s.sname,s.sage 612 | from student s 613 | where month(date_sub(s.sage,interval 1 month)) = month(curdate()) 614 | ``` 615 | 616 | --------------------------------------------------------------------------------