多测师拱墅校区__肖sir__三表

三表:
表结构:
Student学生表(学号、姓名、性别、年龄、编辑)
Course课程表(编号、课程名称)
sc选课表(选课编号、学号、课程编号、成绩)
(1)写一个SQL语句,查询选修了“计算机原理”的学生学号和姓名
(2)写一个SQL语句,查询“小明”同学选修的课程名称
(3)写一个SQL语句,查询选修了5门课程的学生学号和姓名

========================
create table student(
stu_no int,
stu_name varchar(10),
sex char(1),
age int(3),
edit varchar(20) )
DEFAULT charset=utf8;
insert into student values
(1,‘wang’,‘男’,21,‘hello’),
(2,‘小明’,‘女’,22,‘haha2’),
(3,‘hu’,‘女’,23,‘haha3’),
(4,‘li’,‘男’,25,‘haha4’);
create table course(
c_no int,
c_name varchar(10)
)
DEFAULT charset=utf8;
insert into course values
(1,‘计算机原理’),
(2,‘java’),
(3,‘c’),
(4,‘php’),
(5,‘py’);
#drop table sc;
create table sc(
sc_no int,
stu_no int,
c_no int,
score int(3))
DEFAULT charset=utf8;
insert into sc values
(1,1,1,80),
(2,2,2,90),
(3,2,1,85),
(4,2,3,70),
(5,2,4,95),
(6,2,5,89);

=====================
Student学生表(学号、姓名、性别、年龄、编辑)
在这里插入图片描述
Course课程表(课程编号、课程名称)
在这里插入图片描述
sc选课表(选课编号、学号、课程编号、成绩)
在这里插入图片描述

三表连接格式:
(1)隐藏内连接
select * from 表1,表2,表3 where 表1.关联字段=表3.关联字段 and 表2.关联字段=表3.关联字段
案例:select * from student as a ,course as b, sc as c where a.stu_no=c.stu_no and b.c_no=c.c_no ;
(2)普通内连接
select * from 表1 inner join 表3 on 表1.关联字段=表3.关联字段 inner join 表2 on 表2.关联字段=表3.关联字段
(3)左连接
select * from 表1 left join 表3 on 表1.关联字段=表3.关联字段 left join 表2 on 表2.关联字段=表3.关联字段
(4)右连接
select * from 表1 right join 表3 on 表1.关联字段=表3.关联字段 right join 表2 on 表2.关联字段=表3.关联字段
(5)先合表,在连一个表
select * from (合表表1,表3)别名 ,表2 on 别名 .关联字段=表2.关联字段

===================================================================
详解:
(1)

(1)写一个SQL语句,查询选修了“计算机原理”的学生学号和姓名
结果: stu_no ,stu_name student
条件:c_name=‘计算机原理’
方法1:
select a.stu_no,a.stu_name from student as a ,course as b, sc as c where a.stu_no=c.stu_no and b.c_no=c.c_no and b.c_name=“计算机原理” ;
方法2:
select a.stu_no,a.stu_name from student as a INNER JOIN sc c on a.stu_no=c.stu_no INNER JOIN
course as b on b.c_no=c.c_no where b.c_name=“计算机原理”
方法3:
select a.stu_no,a.stu_name from student as a LEFT JOIN sc c on a.stu_no=c.stu_no LEFT JOIN course as b on b.c_no=c.c_no where b.c_name=“计算机原理”
方法4:
select a.stu_no,a.stu_name from student as a right JOIN sc c on a.stu_no=c.stu_no right JOIN course as b on b.c_no=c.c_no where b.c_name=“计算机原理”
方法5:
SELECT s.stu_no,s.stu_name from student s INNER JOIN (select sc.stu_no,c.c_name from course c INNER JOIN sc on c.c_no=sc.c_no)b on s.stu_no=b.stu_no where b.c_name=‘计算机原理’;

(2)写一个SQL语句,查询“小明”同学选修的课程名称
结果:c _name
条件:stu_name=‘小明’
方法1:
SELECT b.c_name FROM student a ,course b ,sc c WHERE a.stu_no=c.stu_no and b.c_no=c.c_no AND a.stu_name=“小明”;
方法2:SELECT b.c_name FROM course b INNER JOIN sc c ON b.c_no=c.c_no INNER JOIN student a ON a.stu_no=c.stu_no WHERE a.stu_name=“小明”;
方法3:SELECT b.c_name FROM course b left JOIN sc c ON b.c_no=c.c_no left JOIN student a ON a.stu_no=c.stu_no WHERE a.stu_name=“小明”;
方法4:SELECT b.c_name FROM course b right JOIN sc c ON b.c_no=c.c_no right JOIN student a ON a.stu_no=c.stu_no WHERE a.stu_name=“小明”
方法5:SELECT b.c_name FROM course b INNER JOIN (SELECT c.c_no,a.stu_name FROM sc c INNER JOIN student a ON c.stu_no=a.stu_no) d ON d.c_no=b.c_no WHERE stu_name=“小明”;
方法6:
select c_name from course where c_no in(
select c.c_no from sc c left JOIN student s on c.stu_no=s.stu_no
where stu_name=‘小明’);

(3)写一个SQL语句,查询选修了5门课程的学生学号和姓名
结果:stu_no ,stu_name student
条件:sc_no=5
方法1
select *
from student,course,sc
where student.stu_no=sc.stu_no and sc.c_no=course.c_no group by student.stu_no having count(*)=5

方法2:
SELECT student.stu_no,student.stu_name from student,course,sc where student.stu_no=sc.stu_no and course.c_no=sc.c_no group by stu_no HAVING count(student.stu_no)=5;

方法3:
SELECT stu_no,stu_name from student where student.stu_no in(SELECT sc.stu_no from sc GROUP BY stu_no HAVING COUNT(stu_no)=5);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多测师软件测试培训师肖sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值