数据库SQL语句练习

​Left join:即左连接,是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分。左连接全称为左外连接,是外连接的一种。

​Right join:即右连接,是以右表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将右表所有的查询信息列出,而左表只列出ON后条件与右表满足的部分。右连接全称为右外连接,是外连接的一种。​

​Inner join:即内连接,同时将两表作为参考对象,根据ON后给出的两表的条件将两表连接起来。结果则是两表同时满足ON后的条件的部分才会列出。

COUNT(*) 函数返回在给定的选择中被选的行数。

HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足

1.自行添加测试数据

2.查询平均成绩大于60分的同学的学号和平均成绩; 

1
2
3
SELECT  t1.sid, AVG (t2.number)
FROM  student t1  LEFT  JOIN  score t2  ON  t1.sid=t2.student_id
GROUP  BY  t1.sid  HAVING  AVG (t2.number)>60;

3.查询所有同学的学号、姓名、选课数、总成绩;

扫描二维码关注公众号,回复: 1257077 查看本文章
1
2
3
4
5
SELECT  t1.sid,t1.sname,t2.temp1,t3.temp2
FROM  student t1,( SELECT  student_id, COUNT (sid) temp1  FROM  score  GROUP  BY  student_id) t2,
( SELECT  student_id, SUM (number) temp2  FROM  score  GROUP  BY  student_id) t3
WHERE  t1.sid=t2.student_id  AND  t1.sid=t3.student_id;
#较复杂,有难度

4.查询姓“李”的老师的个数;

1
2
3
SELECT  COUNT (tid)
FROM  teacher
WHERE  tname  LIKE  '李%' ; 

5.查询没学过“叶平”老师课的同学的学号、姓名;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT  t1.`sid`,t1.`sname`
FROM  student t1
WHERE  t1.`sid`  NOT  IN ( SELECT  student_id
FROM  score
WHERE  course_id  IN ( SELECT  t2.cid
FROM  teacher t1  LEFT  JOIN  course t2  ON  t1.`tid`=t2.`teacher_id`
WHERE  t1.tname= '叶平'  ORDER  BY  t2.`cid`));
 
#子句
SELECT  student_id
FROM  score
WHERE  course_id  IN ( SELECT  t2.cid
FROM  teacher t1  LEFT  JOIN  course t2  ON  t1.`tid`=t2.`teacher_id`
WHERE  t1.tname= '叶平'  ORDER  BY  t2.`cid`);<br>#较复杂

6.查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#方法1
SELECT  t1.`student_id`,t2.`sname`
FROM  score t1  LEFT  JOIN  student t2  ON  t1.`student_id`=t2.`sid`
WHERE  course_id=1
UNION  ALL
SELECT  t1.`student_id`,t2.`sname`
FROM  score t1  LEFT  JOIN  student t2  ON  t1.`student_id`=t2.`sid`
WHERE  course_id=2;
#方法2
SELECT  t1.sid,t1.sname
FROM  ( SELECT  t1.`student_id` sid,t2.`sname` sname
FROM  score t1  LEFT  JOIN  student t2  ON  t1.`student_id`=t2.`sid`
WHERE  course_id=1
UNION  ALL
SELECT  t1.`student_id`,t2.`sname`
FROM  score t1  LEFT  JOIN  student t2  ON  t1.`student_id`=t2.`sid`
WHERE  course_id=2) t1
GROUP  BY  t1.sid  HAVING  COUNT (*)>1;

7.查询学过“叶平”老师所教的所有课的同学的学号、姓名;

1
2
3
4
5
6
7
8
9
10
SELECT  t1.`student_id`,t2.`sname`
FROM  score t1  LEFT  JOIN  student t2  ON  t1.`student_id`=t2.`sid`
WHERE  t1.`course_id`  IN ( SELECT  t2.cid
FROM  teacher t1  LEFT  JOIN  course t2  ON  t1.`tid`=t2.`teacher_id`
WHERE  t1.tname= '叶平'  ORDER  BY  t2.`cid`);
 
#子句
SELECT  t2.cid
FROM  teacher t1  LEFT  JOIN  course t2  ON  t1.`tid`=t2.`teacher_id`
WHERE  t1.tname= '叶平'  ORDER  BY  t2.`cid`;

8.查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#子句1
SELECT  number
FROM  score
WHERE  course_id=2;
#子句2
SELECT  number
FROM  score t1
WHERE  t1.`course_id`=1;
#总语句
SELECT  t3.`sid`,t3.`sname`
FROM  ( SELECT  student_id,number
FROM  score
WHERE  course_id=2) t1,( SELECT  student_id,number
FROM  score
WHERE  course_id=1) t2,student t3
WHERE  t1.student_id=t3.sid  AND  t2.student_id=t3.sid  AND  t1.number<t2.number;

9.查询有课程成绩小于60分的同学的学号、姓名;

1
2
3
4
5
6
7
8
9
#方法1
SELECT  DISTINCT  t1.student_id,t2.`sname`
FROM  score t1  LEFT  JOIN  student t2  ON  t1.`student_id`=t2.`sid`
WHERE  t1.number<60;
 
#方法2
SELECT  t1.sid,t1.sname
FROM  student t1,( SELECT  student_id  FROM  score  WHERE  number<60  GROUP  BY  student_id) t2
WHERE  t1.sid=t2.student_id;

10.查询没有学全所有课的同学的学号、姓名;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#总语句
SELECT  sid,sname
FROM  student
WHERE  sid  NOT  IN ( SELECT  student_id
FROM  score
GROUP  BY  student_id  HAVING  COUNT (course_id)=( SELECT  COUNT (cid)  FROM  course));
 
#子句
SELECT  sid,sname
FROM  student
WHERE  sid  NOT  IN ();
 
#子句:学全了的学生编号
SELECT  student_id
FROM  score
GROUP  BY  student_id  HAVING  COUNT (course_id)=( SELECT  COUNT (cid)  FROM  course);
 
#子句:课程的总数
SELECT  COUNT (cid)  FROM  course;

11.查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;

1
2
3
4
5
6
7
8
9
10
11
#总语句
SELECT  DISTINCT  t1.student_id,t2.`sname`
FROM  score t1  LEFT  JOIN  student t2  ON  t1.`student_id`=t2.`sid`
WHERE  course_id  IN ( SELECT  course_id
FROM  score
WHERE  student_id=1);
 
#子句:学号1所选所有课程
SELECT  course_id
FROM  score
WHERE  student_id=1

首先还是介绍一下这三个的定义

​Left join:即左连接,是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分。左连接全称为左外连接,是外连接的一种。

​Right join:即右连接,是以右表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将右表所有的查询信息列出,而左表只列出ON后条件与右表满足的部分。右连接全称为右外连接,是外连接的一种。​

​Inner join:即内连接,同时将两表作为参考对象,根据ON后给出的两表的条件将两表连接起来。结果则是两表同时满足ON后的条件的部分才会列出。

MySQL中没有全外连接,所以这里没做解释了。

1.自行添加测试数据

2.查询平均成绩大于60分的同学的学号和平均成绩; 

1
2
3
SELECT  t1.sid, AVG (t2.number)
FROM  student t1  LEFT  JOIN  score t2  ON  t1.sid=t2.student_id
GROUP  BY  t1.sid  HAVING  AVG (t2.number)>60;

3.查询所有同学的学号、姓名、选课数、总成绩;

1
2
3
4
5
SELECT  t1.sid,t1.sname,t2.temp1,t3.temp2
FROM  student t1,( SELECT  student_id, COUNT (sid) temp1  FROM  score  GROUP  BY  student_id) t2,
( SELECT  student_id, SUM (number) temp2  FROM  score  GROUP  BY  student_id) t3
WHERE  t1.sid=t2.student_id  AND  t1.sid=t3.student_id;
#较复杂,有难度

4.查询姓“李”的老师的个数;

1
2
3
SELECT  COUNT (tid)
FROM  teacher
WHERE  tname  LIKE  '李%' ; 

5.查询没学过“叶平”老师课的同学的学号、姓名;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT  t1.`sid`,t1.`sname`
FROM  student t1
WHERE  t1.`sid`  NOT  IN ( SELECT  student_id
FROM  score
WHERE  course_id  IN ( SELECT  t2.cid
FROM  teacher t1  LEFT  JOIN  course t2  ON  t1.`tid`=t2.`teacher_id`
WHERE  t1.tname= '叶平'  ORDER  BY  t2.`cid`));
 
#子句
SELECT  student_id
FROM  score
WHERE  course_id  IN ( SELECT  t2.cid
FROM  teacher t1  LEFT  JOIN  course t2  ON  t1.`tid`=t2.`teacher_id`
WHERE  t1.tname= '叶平'  ORDER  BY  t2.`cid`);<br>#较复杂

6.查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#方法1
SELECT  t1.`student_id`,t2.`sname`
FROM  score t1  LEFT  JOIN  student t2  ON  t1.`student_id`=t2.`sid`
WHERE  course_id=1
UNION  ALL
SELECT  t1.`student_id`,t2.`sname`
FROM  score t1  LEFT  JOIN  student t2  ON  t1.`student_id`=t2.`sid`
WHERE  course_id=2;
#方法2
SELECT  t1.sid,t1.sname
FROM  ( SELECT  t1.`student_id` sid,t2.`sname` sname
FROM  score t1  LEFT  JOIN  student t2  ON  t1.`student_id`=t2.`sid`
WHERE  course_id=1
UNION  ALL
SELECT  t1.`student_id`,t2.`sname`
FROM  score t1  LEFT  JOIN  student t2  ON  t1.`student_id`=t2.`sid`
WHERE  course_id=2) t1
GROUP  BY  t1.sid  HAVING  COUNT (*)>1;

7.查询学过“叶平”老师所教的所有课的同学的学号、姓名;

1
2
3
4
5
6
7
8
9
10
SELECT  t1.`student_id`,t2.`sname`
FROM  score t1  LEFT  JOIN  student t2  ON  t1.`student_id`=t2.`sid`
WHERE  t1.`course_id`  IN ( SELECT  t2.cid
FROM  teacher t1  LEFT  JOIN  course t2  ON  t1.`tid`=t2.`teacher_id`
WHERE  t1.tname= '叶平'  ORDER  BY  t2.`cid`);
 
#子句
SELECT  t2.cid
FROM  teacher t1  LEFT  JOIN  course t2  ON  t1.`tid`=t2.`teacher_id`
WHERE  t1.tname= '叶平'  ORDER  BY  t2.`cid`;

8.查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#子句1
SELECT  number
FROM  score
WHERE  course_id=2;
#子句2
SELECT  number
FROM  score t1
WHERE  t1.`course_id`=1;
#总语句
SELECT  t3.`sid`,t3.`sname`
FROM  ( SELECT  student_id,number
FROM  score
WHERE  course_id=2) t1,( SELECT  student_id,number
FROM  score
WHERE  course_id=1) t2,student t3
WHERE  t1.student_id=t3.sid  AND  t2.student_id=t3.sid  AND  t1.number<t2.number;

9.查询有课程成绩小于60分的同学的学号、姓名;

1
2
3
4
5
6
7
8
9
#方法1
SELECT  DISTINCT  t1.student_id,t2.`sname`
FROM  score t1  LEFT  JOIN  student t2  ON  t1.`student_id`=t2.`sid`
WHERE  t1.number<60;
 
#方法2
SELECT  t1.sid,t1.sname
FROM  student t1,( SELECT  student_id  FROM  score  WHERE  number<60  GROUP  BY  student_id) t2
WHERE  t1.sid=t2.student_id;

10.查询没有学全所有课的同学的学号、姓名;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#总语句
SELECT  sid,sname
FROM  student
WHERE  sid  NOT  IN ( SELECT  student_id
FROM  score
GROUP  BY  student_id  HAVING  COUNT (course_id)=( SELECT  COUNT (cid)  FROM  course));
 
#子句
SELECT  sid,sname
FROM  student
WHERE  sid  NOT  IN ();
 
#子句:学全了的学生编号
SELECT  student_id
FROM  score
GROUP  BY  student_id  HAVING  COUNT (course_id)=( SELECT  COUNT (cid)  FROM  course);
 
#子句:课程的总数
SELECT  COUNT (cid)  FROM  course;

11.查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;

1
2
3
4
5
6
7
8
9
10
11
#总语句
SELECT  DISTINCT  t1.student_id,t2.`sname`
FROM  score t1  LEFT  JOIN  student t2  ON  t1.`student_id`=t2.`sid`
WHERE  course_id  IN ( SELECT  course_id
FROM  score
WHERE  student_id=1);
 
#子句:学号1所选所有课程
SELECT  course_id
FROM  score
WHERE  student_id=1

猜你喜欢

转载自blog.csdn.net/yanshuanche3765/article/details/80519345