数据库&多表关联&增删改&数据库备份
多表关联
- 两表关联,必须有一个关联字段
-- 多表查询
SELECT * FROM `courses` a,`scores` b WHERE a.`cno`= b.`cno`;
- 关联方法
- where(原理)
- 第一步:拿两表数据做笛卡尔乘积
- 第二步:根据where条件进行筛选;
- 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;
- 左连接
- 左表为主表,左表中所有的数据都展示,右表中只显示满足条件的数据,
- 关键字 left join
- 格式select * from 表1 left join 表2 on 连接条件;
-- 查询所有学生的选课信息,如果没有选课信息以 null代替。
SELECT * FROM students a LEFT JOIN scores b ON a.`sno`=b.`sno`;
- 右连接
- 右表为主表,右表中所有的数据都展示,左表中只显示满足条件的数据,
- 关键字right join
- 格式select * from 表1 right join 表2 on 连接条件;
SELECT * FROM scores a RIGHT JOIN students b ON a.`sno`=b.`sno`;
- 全连接(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`;