1. 程式人生 > 資料庫 >MySQL練習(二):多表查詢

MySQL練習(二):多表查詢

建立相應的表,以及新增資料:

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;

二: 連線查詢

表和表之間的關係
一對一
一對一以及一對N
一對多
連線查詢就是將多個表多行資料相乘 —> 笛卡爾積

三: 內連線

內連線語法:

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;