-- 用户表
create table t_user(
id bigint(20)  PRIMARY KEY ,
username varchar(20) ,
age int 
);-- 科目表
create table t_subject(
id bigint(20)  PRIMARY KEY ,
subjectname varchar(20)  -- 科目名称
);-- 成绩表
create table t_score(
id bigint(20)  PRIMARY KEY ,
subject_id bigint(20),
user_id bigint(20),
score double
);要求:
1.查询每个人,所有科目的成绩 ,没有成绩的 显示null.
  显示:用户 科目  分数
2.查询有不及格科目的用户的所有成绩
  显示:用户 科目  分数
3.查询三门科目都有的用户
  显示:用户 科目  分数
4.查询 有成绩的用户的信息
  显示:用户 科目  分数

解决方案 »

  1.   

    -- 用户表
    create table t_user(
     id bigint(20)  PRIMARY KEY ,
     username varchar(20) ,
     age int 
     ); -- 科目表
    create table t_subject(
     id bigint(20)  PRIMARY KEY ,
     subjectname varchar(20)  -- 科目名称
    );-- 成绩表
    create table t_score(
     id bigint(20)  PRIMARY KEY ,
     subject_id bigint(20),
     user_id bigint(20),
     score double
     );insert into t_subject values (1,'语文');
    insert into t_subject values (2,'英语');
    insert into t_subject  values (3,'数学');insert into t_user values (1,'user_a',1);
    insert into t_user values (2,'user_b',2);
    insert into t_user  values (3,'user_c',1);insert into t_score values (1,1,1,76);
    insert into t_score values (2,2,1,50);
    insert into t_score values (4,3,1,70);
    insert into t_score  values (3,3,2,99);--查询科目成绩视图
    create view v_score_subject as 
    select  * from t_score  sc 
     right join t_subject su on su.id = sc.subject_id union all
    select  * from t_score  sc 
     left join t_subject su on su.id = sc.subject_id --3.查询三门科目都有的用户
    select userName,subjectName,score from (select * from t_user u left join v_score_subject v on u.id = v.user_id union  
    select * from t_user u right join v_score_subject v on u.id = v.user_id ) a
    join  (select count(*) as count ,user_id from v_score_subject group by user_id having count(*) > 2) b on a.user_id = b.user_id--4.查询 有成绩的用户的信息
    select userName,subjectName,score from t_user u left join v_score_subject v  on u.id = v.user_id where
    v.score is not null 2.查询有不及格科目的用户的所有成绩
    select userName,subjectName,score from t_user u left join v_score_subject v  on u.id = v.user_id where
    v.score < 60 --1.查询每个人,所有科目的成绩 ,没有成绩的 显示null.
    可以用程序加予处理(大体思想就是,把科目全查出,把存在数据用户成绩科目也查出,遍历用户成绩科目如果在科目结果集里没有就补上一条该用户成绩),纯sql的暂时没想到