MySQL Lesson 7: SQL面试50-Part1

1.查询"01"课程比"02"课程成绩高的学生的信息及课程分数

SELECT t1.S_id,t1.Score,t2.Score FROM     
 (SELECT S_id,S_name,S_age,S_sex,C_id,C_name,Score FROM Total WHERE C_id= '01') t1  
JOIN 
 (SELECT S_id,S_name,S_age,S_sex,C_id,C_name,Score FROM Total WHERE C_id= '02') t2 
ON t1.S_id=t2.S_id  
WHERE t1.Score>t2.Score  

注:1)只需要学生id,“01”和“02”两门课程的成绩

        2)C_id='01',这里必须是'01',不能是01

2.查询"01"课程比"02"课程成绩低的学生的信息及课程分数

SELECT t1.S_id,Score1,Score2  FROM  
 (SELECT S_id,Score as Score1 FROM Total WHERE C_id='01') t1    
JOIN
 (SELECT S_id,Score as Score2 FROM Total WHERE C_id='02') t2 
ON t1.S_id=t2.S_id 
WHERE Score1<Score2

3.查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩 

SELECT S_id,S_name,avg(Score) 
FROM Total
GROUP BY S_id 
HAVING avg(Score)>60  

这里考到一个统计函数:avg()求平均

4.查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

SELECT Student.S_id,S_name,avg(Score) as avg
FROM Student LEFT JOIN Score ON Student.S_id = Score.S_id 
GROUP BY Student.S_id 
HAVING avg<60 

5.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

SELECT S_id,S_name,count(C_id),sum(Score)
FROM Total
GROUP BY S_id  

思路:1)选课总数用count(C_id)表示

           2)所有课程的总成绩用sum(Score)表示

           3)最后用GROUP BY 分组

6.查询"李"姓老师的数量

SELECT count(*) 
FROM Teacher 
WHERE T_name LIKE '李%' 

知识点:LIKE '李%' 可以匹配到所有姓李的老师,包括名字只有一个“李”字的人;

              如果要选出姓李并且名字只有一个字的老师,可以用 LIKE '李_'

7.查询学过"张三"老师授课的同学的信息

SELECT S_id,S_name,S_age,S_sex  
FROM Total
WHERE T_name ='张三' 

8.查询没学过"张三"老师授课的同学的信息

SELECT * FROM Student WHERE S_id NOT IN 
 (SELECT DISTINCT S_id FROM Total WHERE T_name='张三')     

知识点:col NOT IN () 表示列不在集合中 

错误写法:

SELECT S_id,S_name,S_age,S_sex
FROM Total
WHERE T_name not in ('张三')      

错误原因:

      有同学选了不止一门课,于是一个同学对应着多行。这么写只是把选了张三的课的行删除,选了别的老师的行依旧还在,于是该同学的信息仍会输出,但是该同学是选择了张三老师的,与题意不符。

9.查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

自己的思路:1)先找出学过编号为“01”的学生

                      2)再找出学过编号为“02”的学生

                      3)用 t1 INNER JOIN t2 ON t1.S_id = t2.S_id 连接,只保留 S_id 相等的 row ,即                                既学过“01”又学过“02”

SELECT t1.S_id,t1.S_name,t1.S_age,t1.S_sex FROM         
 (SELECT * FROM Total WHERE C_id='01') t1
  INNER JOIN 
 (SELECT * FROM Total WHERE C_id='02') t2
  ON t1.S_id = t2.S_id

思路二:1)先找出既学过 “01” 也学过 “02” 的学生的 id

               2)根据 id 找出学生的信息

SELECT * FROM Student 
WHERE S_id IN  (SELECT S_id FROM Score WHERE C_id='01')
 AND 
      S_id IN (SELECT S_id FROM Score WHERE C_id='02') 

整个 sql 语句就是一个 SELECT xx FROM xx WHERE col IN (子查询1) AND col IN(子查询2) 的形式 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值