MySQL语句练习

一、背景

数据库名:Academic_affairs(教务)
数据库表:4个表,Student,Course,Teacher,SC
1、学生表
Student(SID,Sname,Sage,Ssex)
字段解释:SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别。
2、课程表
Course(CID,Cname,TID) --CID
字段解释:CID 课程编号,Cname 课程名称,TID 教师编号。
3、教师表
Teacher(TID,Tname)
字段解释:TID 教师编号,Tname 教师姓名。
4、成绩表
SC(SID,CID,score)
字段解释:SID 学生编号,CID 课程编号,score 分数。
首先:连接MySQL,创建数据库Academic_affairs,创建4个数据表,并向表中插入数据。
注意:空不空格要一致。DECIMAL(P,D)表示可以储存P位数字,小数点后D位。

二、SQL语句操作

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

由于有的学生两个课程都上了,有的可能只上了一门课所以分为两种情况。

1.1、查询同时存在"01"课程和"02"课程的情况

使用了where条件进行筛选

select a.* , b.score ,c.score  from Student a , SC b , SC c
where a.SID = b.SID and a.SID = c.SID and b.CID = '01' and c.CID = '02' and b.score > c.score;

1.2、查询同时存在"01"课程和"02"课程的情况和存在"01"课程但可能不存在"02"课程的情况(不存在时显示为null)

mysql的显示内连接和隐式内连接
显式内连接:inner join,语法 select 字段名 from 表1 join 表2 on 连接条件 [ join 表3 on 连接条件 … ] [ where 查询条件 … ];
隐式内连接: select 字段名 from 表1,表2 [ ,表3… ] where 连接条件 [ and 查询/连接条件 … ];
因为内连接相当于取两个表的交集(满足条件),若有为null的记录(不满足条件的)则不会显示。所以使用外连接中的left join,显示左表符合条件的全部信息,右表不符合的则为null。

select a.* , b.score 课程01的分数 ,c.score 课程02的分数 from Student a
left join SC b on a.SID = b.SID and b.CID = '01'
left join SC c on a.SID = c.SID and c.CID = '02'
where b.score > isnull(c.score);

解释:两个课程都有的查找,当某人有01课程,但02课程为null时也进行查找。为了可以比较,使用isnull()函数。
mysql中
1.isnull(exper) 判断exper是否为空,是则返回1,否则返回0
2.ifnull(exper1,exper2)判断exper1是否为空,是则用exper2代替
3.nullif(exper1,exper2)如果expr1= expr2 成立,那么返回值为NULL,否则返回值 expr1。
未完待续…

你可能感兴趣的:(数据库)