數(shù)據(jù)庫(kù)&多表關(guān)聯(lián)&增刪改&數(shù)據(jù)庫(kù)備份
多表關(guān)聯(lián)
- 兩表關(guān)聯(lián),必須有一個(gè)關(guān)聯(lián)字段
-- 多表查詢
SELECT * FROM `courses` a,`scores` b WHERE a.`cno`= b.`cno`;
- 關(guān)聯(lián)方法
- where(原理)
- 第一步:拿兩表數(shù)據(jù)做笛卡爾乘積
- 第二步:根據(jù)where條件進(jìn)行篩選;
- join
- 原理
第一步:先用on條件進(jìn)行數(shù)據(jù)篩選
第二步:滿足條件的顯示,不滿足條件的丟棄 - 內(nèi)連接
1.只顯示滿足條件的數(shù)據(jù)
2.關(guān)鍵字join --- inner join
3.格式
select * from 表1 inner join 表2 on 連接條件;
-- 查詢成績(jī)不及格的學(xué)生姓名
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 連接條件;
-- 查詢成績(jī)不及格的學(xué)生姓名
SELECT DISTINCT a.`sname` FROM students a JOIN scores b ON a.`sno`=b.`sno` AND b.`degree`<60;
- 左連接
- 左表為主表,左表中所有的數(shù)據(jù)都展示,右表中只顯示滿足條件的數(shù)據(jù),
- 關(guān)鍵字 left join
- 格式select * from 表1 left join 表2 on 連接條件;
-- 查詢所有學(xué)生的選課信息,如果沒(méi)有選課信息以 null代替。
SELECT * FROM students a LEFT JOIN scores b ON a.`sno`=b.`sno`;
- 右連接
- 右表為主表,右表中所有的數(shù)據(jù)都展示,左表中只顯示滿足條件的數(shù)據(jù),
- 關(guān)鍵字right join
- 格式select * from 表1 right join 表2 on 連接條件;
SELECT * FROM scores a RIGHT JOIN students b ON a.`sno`=b.`sno`;
- 全連接(sql 數(shù)據(jù)庫(kù)無(wú)法使用)
兩張表都為主表,不滿足條件的以null代替
關(guān)鍵字full join
格式select * from 表1 full join 表2 on 連接條件;
-- 統(tǒng)計(jì)出每個(gè)學(xué)生的面試數(shù)
SELECT schedule_id,COUNT(*) FROM `t_interview_interview` GROUP BY schedule_id;
-- 統(tǒng)計(jì)出每個(gè)學(xué)生的面試數(shù)量并按從大到小的順序排序
SELECT schedule_id,COUNT(*) FROM `t_interview_interview` GROUP BY schedule_id ORDER BY COUNT(*) DESC;
-- 找出最大的面試次數(shù)
SELECT COUNT(*) FROM `t_interview_interview` GROUP BY schedule_id ORDER BY COUNT(*) DESC LIMIT 0,1;
-- 找出面試次數(shù)最多的學(xué)生
SELECT schedule_id 學(xué)生,COUNT(*) 面試次數(shù) 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`;
-- 查詢選修計(jì)算機(jī)導(dǎo)論的所有學(xué)生編號(hào)
SELECT b.`sno` FROM courses a ,scores b WHERE a.`cno` = b.`cno` AND cname='計(jì)算機(jī)導(dǎo)論';
-- 查詢選修計(jì)算機(jī)導(dǎo)論的學(xué)生人數(shù)
SELECT a.`cname`,COUNT(*) FROM courses a ,scores b WHERE a.`cno` = b.`cno` AND cname='計(jì)算機(jī)導(dǎo)論' GROUP BY a.`cname`;
-- 查詢選修計(jì)算機(jī)導(dǎo)論和高等數(shù)學(xué)的所有學(xué)生信息
SELECT * FROM courses a ,scores b,students c WHERE a.`cno`= b.`cno` AND b.`sno`=c.`sno` AND a.`cname` IN ('計(jì)算機(jī)導(dǎo)論','高等數(shù)學(xué)');
-- 查詢成績(jī)不及格的學(xué)生姓名
SELECT DISTINCT a.`sname` FROM students a INNER JOIN scores b ON a.`sno`=b.`sno` AND b.`degree`<60;
-- 查詢所有學(xué)生的選課信息,如果沒(méi)有選課信息以 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`;