MySQL練習(二):多表查詢
阿新 • • 發佈:2021-01-09
建立相應的表,以及新增資料:
CREATE TABLE `stu` ( `sid` int(11) DEFAULT NULL, `sname` varchar(25) DEFAULT NULL, `age` int(11) DEFAULT NULL, `sex` char(6) DEFAULT NULL, `score` int(11) DEFAULT NULL, `cid` int(11) DEFAULT NULL, `groupLeaderId` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 往 stu 表中新增資料: INSERT INTO `stu` VALUES ('1001', '張三', '20', '男', '72', '1', '1003'); INSERT INTO `stu` VALUES ('1002', '李四', '15', '女', '78', '1', '1003'); INSERT INTO `stu` VALUES ('1003', '王五', '95', '男', '99', '1', '1010'); INSERT INTO `stu` VALUES ('1004', '趙六張', '65', '女', '60', '1', '1007'); INSERT INTO `stu` VALUES ('1005', '周七', '55', '男', '78', '3', '1007'); INSERT INTO `stu` VALUES ('1006', '茅十八', '75', '女', '96', '3', '1007'); INSERT INTO `stu` VALUES ('1007', '張三丰', '40', '男', '85', '3', '1010'); INSERT INTO `stu` VALUES ('1008', '李四方', '45', '女', '90', '2', '1010'); INSERT INTO `stu` VALUES ('1009', '艾三弗森', '45', '', '35', '4', '1008'); INSERT INTO `stu` VALUES ('1010', '三歐文', '35', '女', '49', '2', '1008'); 建立 class 表: CREATE TABLE `class` ( `cid` int(11) DEFAULT NULL, `cname` varchar(255) COLLATE utf8_bin NOT NULL, `caddress` varchar(255) COLLATE utf8_bin DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 在 class 中新增資料: INSERT INTO `class` VALUES ('1', 'BigData', '102'); INSERT INTO `class` VALUES ('2', 'HTML', '103'); INSERT INTO `class` VALUES ('3', 'VR', '104'); INSERT INTO `class` VALUES ('4', 'Java', '105');
一: 聯合查詢 - 合併結果集
將兩表的查詢結果縱向拼接在一起
union / union all
拼接的兩個表的欄位個數,型別,順序保證一致
union : 在拼接時會去重
union all : 將兩表的全部資料都拼接
select sid,sname from stu
union all
select cid,cname from class;
二: 連線查詢
表和表之間的關係
連線查詢就是將多個表多行資料相乘 —> 笛卡爾積
三: 內連線
內連線語法:
select * from 表一 inner join 表二 關聯條件
內連線只會保留完全符合關聯條件的資料
沒有關聯條件,會產生笛卡爾積 select * from stu inner join class; select * from stu inner join class on stu.cid = class.cid; 查詢每個學生的資訊,包括班級的全部資訊 查詢學生名稱,學生成績,班級名稱,班級地址 select sname,score,cname,caddress from stu inner join class on stu.cid = class.cid; 查詢學號為1007的學生名稱,學生成績,班級名稱,班級地址 給表取別名 select sname,score,cname,caddress from stu s inner join class c on s.cid = c.cid where s,sid = 1007; 內連線可以簡寫: select * from stu innerjoin class on stu.cid = class.cid; 簡寫成 select * from stu,class where stu.cid = class.cid;
四: 外連線
外連線: 會保留不滿足條件的資訊
左外連線: left outer join on 作用: 會保留左表中不符合條件的資料 右外連線: right outer join on 作用: 會保留右表中不符合條件的資料 ps:一般outer關鍵字可以省略 查詢全部學生的資訊,如果有班級資訊,一併查出: select * from stu s left outer join class c on s.cid = c.cid; 查詢全部班級資訊,如果有學生,將學生資訊查出 select * from stu s right outer join class c on s.cid = c.cid;
五: 子查詢
子查詢就是巢狀查詢 。
一般子查詢出現在:
from後:當做一張表使用
where後:當做條件使用
select 後
查詢與張三同一個班級的學生。
1.查詢張三的班級
select cid from stu where sname ='張三';
2.查村一班的學生
select * from stu where cid =1;
合併1,2SQL語句:
select * from stu where cid =(select cid from stu where sname ='張三');
成績高於3號班級所有人的學生資訊
1.找到三班最高分
select MAX(score) from stu where cid = 3;
2,找成績比96高的學生
select * from stu where score > 96;
合併:
select * from stu where score > (select MAX(score) from stu where cid =3);
有2個以上直接組員的學生資訊:
1.根據組長編號分組,計算分組人數,保留 > 2 的組
select grouppLeaderId,count(sid) from stu group by groupLeaderId having count(sid) >2;
2.查詢學號1007,1010學生的資訊
select * from stu where sid in(1007,1010);
合併1.2SQL
select * from stu where sid in(select groupLeaderId from stu group by groupLeaderId having count(sid) > 2);
自連線
自連線: 自己連線自己
s1擋組長,s2當做組員
select s1.sid,s1.sname from stu s1 ,stu s2 where s1.sid = s2.groupLeaderId = s2.sid group by s2.sid having count(s2.sid) >2;
stu s1 當做組員, stu s2 組長
select s2.sid,s2.sname from stu s1, stu s2 where s1.groupLeaderId = s2.sid group by s2.sid having count(s2.sid) > 2;
求1008學生編號.姓名,組長編號和組長姓名
1.找到1008學生的組長的編號
select groupLeaderId from stu where sid = 1008;
2.找到1010的編號和姓名
select sid,sname from stu where sid = 1010;
3.找1008編號和姓名
select sid,sname from stu where sid = 1008;
合併:
select s.sid,s.sname,b.sid,b.sname from stu s,(select sid,sname from stu where sid = (select groupLeaderId from stu where sid =1008))b where s.sid =1008;
自連結,s1 做學生表,s2座組長表
s1 的組長是s2中的學生
select s1.sid,s1.sname,s2.sid,s2.sname from stu s1, stu s2 where s1.groupLeaderId = s2.sid and s1.sid = 1008;
自連線,s1做組長,s2做學生
select s2.sid,s2.sname,s1.sid,s1.sname from stu s1,stu s2 where s2.groupLeaderId = s.sid and s2.sid = 1008;