2018-09-21数据库&多表关联&增删改&数据库备份

数据库&多表关联&增删改&数据库备份

多表关联

  • 两表关联,必须有一个关联字段
-- 多表查询
SELECT * FROM `courses` a,`scores` b WHERE a.`cno`= b.`cno`;
  • 关联方法
  1. where(原理)
  • 第一步:拿两表数据做笛卡尔乘积
  • 第二步:根据where条件进行筛选;
  1. join
  • 原理
    第一步:先用on条件进行数据筛选
    第二步:满足条件的显示,不满足条件的丢弃
  • 内连接
    1.只显示满足条件的数据
    2.关键字join --- inner join
    3.格式
    select * from 表1 inner join 表2 on 连接条件;
-- 查询成绩不及格的学生姓名
SELECT DISTINCT a.`sname` FROM students a INNER JOIN scores b ON a.`sno`=b.`sno` AND b.`degree`<60;

select * from 表1 join 表2 on 连接条件;

-- 查询成绩不及格的学生姓名
SELECT DISTINCT a.`sname` FROM students a  JOIN scores b ON a.`sno`=b.`sno` AND b.`degree`<60;
  1. 左连接
  • 左表为主表,左表中所有的数据都展示,右表中只显示满足条件的数据,
  • 关键字 left join
  • 格式select * from 表1 left join 表2 on 连接条件;
    -- 查询所有学生的选课信息,如果没有选课信息以 null代替。
SELECT * FROM students a LEFT JOIN scores b ON a.`sno`=b.`sno`;
  1. 右连接
  • 右表为主表,右表中所有的数据都展示,左表中只显示满足条件的数据,
  • 关键字right join
  • 格式select * from 表1 right join 表2 on 连接条件;
SELECT * FROM scores a RIGHT JOIN students b ON a.`sno`=b.`sno`;
  1. 全连接(sql 数据库无法使用)
    两张表都为主表,不满足条件的以null代替
    关键字full join
    格式select * from 表1 full join 表2 on 连接条件;
-- 统计出每个学生的面试数
SELECT schedule_id,COUNT(*) FROM `t_interview_interview` GROUP BY schedule_id;
 -- 统计出每个学生的面试数量并按从大到小的顺序排序
SELECT schedule_id,COUNT(*) FROM `t_interview_interview` GROUP BY schedule_id ORDER BY COUNT(*) DESC;

-- 找出最大的面试次数
SELECT COUNT(*) FROM `t_interview_interview` GROUP BY schedule_id ORDER BY COUNT(*) DESC LIMIT 0,1;
-- 找出面试次数最多的学生
SELECT schedule_id 学生,COUNT(*) 面试次数 FROM `t_interview_interview` GROUP BY schedule_id HAVING COUNT(*)=(SELECT COUNT(*) FROM `t_interview_interview` GROUP BY schedule_id ORDER BY COUNT(*) DESC LIMIT 0,1);

-- 多表查询
SELECT * FROM `courses` a,`scores` b WHERE a.`cno`= b.`cno`;
-- 查询选修计算机导论的所有学生编号
SELECT b.`sno` FROM courses a ,scores b WHERE a.`cno` = b.`cno` AND cname='计算机导论';
-- 查询选修计算机导论的学生人数
SELECT a.`cname`,COUNT(*) FROM courses a ,scores b WHERE a.`cno` = b.`cno` AND cname='计算机导论' GROUP BY a.`cname`;
-- 查询选修计算机导论和高等数学的所有学生信息
SELECT * FROM courses a ,scores b,students c WHERE a.`cno`= b.`cno` AND b.`sno`=c.`sno` AND a.`cname` IN ('计算机导论','高等数学');

-- 查询成绩不及格的学生姓名
SELECT DISTINCT a.`sname` FROM students a INNER JOIN scores b ON a.`sno`=b.`sno` AND b.`degree`<60;

-- 查询所有学生的选课信息,如果没有选课信息以    null代替。
SELECT * FROM students a LEFT JOIN scores b ON a.`sno`=b.`sno`;
SELECT * FROM scores a RIGHT JOIN students b ON a.`sno`=b.`sno`;

你可能感兴趣的:(2018-09-21数据库&多表关联&增删改&数据库备份)