sql语句查询实例

sql语句查询实例

欢迎回来 Buddy!!!下面咱们再学习一个用sql语句查询的例子

一、有3个表 S, C, SC
S(SNO, SNAME) 代表(学号, 姓名)
C(CNO, CNAME, CTEACHER) 代表(课号, 课名, 教师)
SC(SNO, CNO, SCGRADE) 代表(学号, 课号, 成绩)

问题:

  • 1.找出没选过”黎明”老师的所有学生姓名.
  • 2.列出2门以上(含2门)不及格学生姓名及平均成绩.
  • 3.既学过1号课程又学过2号课程所有学生的姓名.

咱们可以先试着做一下 再看我的案列

在mysql客户端中或者是其他编译器中实现,咱们直接从创建表开始啦:
首先创建三张表

create table s(
  id int auto_increment primary key comment "主键自增",
  sno varchar(100) unique comment "学号",
  sname varchar(100) comment "姓名"
);
create table c(
  id int auto_increment primary key comment "主键自增",
  cno varchar(100) unique comment "课程号",
  cname varchar(100) comment "课名",
  teacher varchar(100) comment "老师"
);
create table sc(
  id int auto_increment primary key comment "主键自增",
  sno varchar(100) comment "学号",
  cno varchar(100) comment "课程号",
  sgrade int comment "成绩"
);
  • 查看表信息
show tables

±-----------------+
| Tables_in_day001 |
±-----------------+
| c |
| s |
| sc |
接下来往表中添加数据

insert into s(sno, sname) values("17378100316", "小乔"),
("17378100249", "小兵"),
("17388100002", "小赛"),
("17228100129", "小棋"),
("17228100031", “小云");
  • 查看s表中的数据
select * from s

±—±------------±------+
| id | sno | sname |
±—±------------±------+
| 1 | 17378100316 | 小乔 |
| 2 | 17378100249 | 小兵 |
| 3 | 17388100002 | 小赛 |
| 4 | 17228100129 | 小棋 |
| 5 | 17228100031 | 小云 |
±—±------------±------+

insert into c(cno, cname, teacher) values("001", "Python基础", "吕老师"),
("002", "Python全站实战开发", "崔老师"),
("003", "Django开发", "黎明"),
("004", "Django博客开发", "赵老师");
  • 查看c表中的数据
select * from c

±—±-----±-------------------±--------+
| id | cno | cname | teacher |
±—±-----±-------------------±--------+
| 1 | 001 | Python基础 | 吕老师 |
| 2 | 002 | Python全站实战开发 | 崔老师 |
| 3 | 003 | Django开发 | 黎明 |
| 4 | 004 | Django博客开发 | 赵老师 |
±—±-----±-------------------±--------+

insert into sc(sno, cno, sgrade) values("17378100316", "001", 5), ("17378100316", "002", 4), ("17378100316", "003", 3);
insert into sc(sno, cno, sgrade) values("17378100249", "001", 5),("17378100249", "002", 0),("17378100249", "004", 0);
insert into sc(sno, cno, sgrade) values("17388100002", "001", 5), ("17388100002", "004", 4);
insert into sc(sno, cno, sgrade) values("17228100129", "001", 0), ("17228100129", "004", 0);
insert into sc(sno, cno, sgrade) values("17228100031", "001", 0), ("17228100031", "004", 4);
  • 查看sc表中的数据
select * from sc

±—±------------±-----±-------+
| id | sno | cno | sgrade |
±—±------------±-----±-------+
| 1 | 17378100316 | 001 | 5 |
| 2 | 17378100316 | 002 | 4 |
| 3 | 17378100316 | 003 | 3 |
| 4 | 17378100249 | 001 | 5 |
| 5 | 17378100249 | 002 | 0 |
| 6 | 17378100249 | 004 | 0 |
| 7 | 17388100002 | 001 | 5 |
| 8 | 17388100002 | 004 | 4 |
| 9 | 17228100129 | 001 | 0 |
| 10 | 17228100129 | 004 | 0 |
| 11 | 17228100031 | 001 | 0 |
| 12 | 17228100031 | 004 | 4 |
±—±------------±-----±-------+
1.找出没选过”黎明”老师的所有学生姓名.

select stu.sname from s as stu where stu.sname not in (select s.sname from sc
   left join s on sc.sno = s.sno
   left join c on sc.cno = c.cno
   where c.teacher = "黎明"
   group by s.sname
);

±------+
| sname |
±------+
| 小兵 |
| 小赛 |
| 小棋 |
| 小云 |
±------+

2.列出2门以上(含2门)不及格学生姓名及平均成绩.

select s.sname, count(sc.sgrade=0 or null) as low_count, avg(sc.sgrade) as avg_sgrade from sc
 left join s on sc.sno = s.sno
 group by s.sname
 having low_count>=2;

±------±----------±-----------+
| sname | low_count | avg_sgrade |
±------±----------±-----------+
| 小兵 | 2 | 1.6667 |
| 小棋 | 2 | 0.0000 |
±------±----------±-----------+

3.既学过1号课程又学过2号课程所有学生的姓名.

第一种方法

select s.sname, count(sc.cno = "001" or null) as count001, count(sc.cno = "002" or null) as count002 from sc
   left join s on sc.sno = s.sno
   where sc.cno = "001" or sc.cno="002"
   group by s.sname
   having count001=1 and count002=1;

±------±---------±---------+
| sname | count001 | count002 |
±------±---------±---------+
| 小乔 | 1 | 1 |
| 小兵 | 1 | 1 |
±------±---------±---------+

第二种方法

select s.sname from sc
   left join s on sc.sno = s.sno
   where sc.cno = "001" or sc.cno="002"
   group by s.sname
   having count(sc.cno = "001" or null)=1 and count(sc.cno = "002" or null)=1;

±------+
| sname |
±------+
| 小乔 |
| 小兵 |
±------+
此案例到此结束!希望对你们有所帮助。
Make a little progress every day!

猜你喜欢

转载自blog.csdn.net/WJL0104/article/details/87377376