本篇總結資料庫中對於多個表的操作,對於任何專案,資料庫裡都會有n張表,表之間也通過一對
一、多對一或者多對多的關係進行關聯,比如新聞管理系統,而通過多表操作即可實現大量資料的組合或者篩選,完成需求 ~
1、聯合查詢
select 查詢【決定欄位名字】
union 查詢選項
select 查詢
...
查詢選項:與select選項類似
示例如下:
(1)建立乙個表與t_40相同,並插入資料
create table t_42 like t_40;
insert into t_42 values(null,'犬夜叉','男',200,'神妖1班'),
(null,'日暮戈薇','女',16,'現代1班'),
(null,'桔梗','女',88,'法師1班'),
(null,'彌勒','男',28,'法師2班')
# 兩張表結構相同,可以理解為資料量太大,分表儲存。
(2)使用聯合查詢將兩張表的資料拼接到一起顯示
select * from t_40
union
select * from t_42;
(3)聯合查詢不要求字段型別一致,只對數量要求一致,而且欄位與第一條查詢語句相關
select name from t_40
union all
select age from t_40;
(4)如果使用where對資料進行篩選,where針對的是select指令,而不是針對union結果
select * from t_40
union all
select * from t_42
where gender = '女';
2、聯合查詢排序
例如:t_40表按年齡降序排序,t_42表按年齡公升序排序
# 無效方式
(select * from t_40 order by age desc)
union
(select * from t_42 order by age);
# 正確方式
(select * from t_40 order by age desc limit 99999)
union
(select * from t_42 order by age desc limit 99999);
連線查詢:join,將兩張表依據某個條件進行資料拼接
不同的連表有不同的連線方式,對於結果的處理也不同
連線查詢不限定表的數量,可以進行多表連線,只是表的連線需要乙個乙個的連(a join b join c …)
1、交叉連線
沒有實際資料價值,只是豐富了連線查詢的完整性
select * from t_41 cross join t_42;
2、內連線
內連線語法:左表 join 右表 on 連線條件
# 學生和專業在兩個表中,所以需要連表
# 學生必須有專業,而專業也必須存在,所以是內連線
# 連線條件:專業編號
# 兩張表有兩個字段衝突:id、name,所以需要使用別名
select t_43.*,t_44.name as course_name from t_43 inner join t_44 on t_43.course_no = t_44.id;
# 表名的使用也可以使用別名
select s.*,c.name as c_name from t_43 as s inner join t_44 c on s.course_no = c.id;
3、外連線
外連線有主表和從表之分
外連線是將主表的記錄去匹配從表的記錄
(1)查出所有的學生資訊,包括所在班級(左連線)
# 主要資料是學生,而且是全部學生:外連線、且學生表是主表
select s.*,c.name c_name from t_43 s left join t_44 c on s.course_no = c.id;
(2)查出所有班級裡的所有學生(右連線)
# 主表是班級
select s.*,c.name c_name from t_43 s right join t_44 c on s.course_no = c.id;
4、自然連線
自然連線條件匹配模式:自動尋找相同欄位名作為連線條件(欄位名相同)
select * from t_43 natural join t_44;
5、using關鍵字
例:查詢t_45中所有的學生資訊,包括所在班級名字
select s.*,c.c_name from t_45 s left join t_46 c using(c_id);
select * from t_45 s left join t_46 c using(c_id);
6、總結
(1)連線查詢是實際開發過程中應用最多的查詢方式
(2)連線查詢的效率沒有單錶查詢高,可適當用逆規範化來提公升效率
(3)連線查詢中使用較多的就是內連線和外連線
1、子查詢分類
按子查詢得到的結果分類
子查詢都需要使用括號()
進行包裹,必要時需要對子查詢結果進行別名處理(from子查詢)
2、標量子查詢
3、列子查詢
4、行子查詢
通常也是用來作為主查詢的結果條件
行子查詢是可以使用多個標量子查詢替代解決問題的,但是行子查詢的效率會比多個標量要高。
如果資料**不在一張表可以考慮使用多個標量子查詢實現
5、錶子查詢
6、exists子查詢
7、比較方式
any:滿足任意條件
some:滿足任意條件(與any完全一樣)
結果集:可以是直接的資料也可以是子查詢結果(通常是列子查詢)
比較方式其實很多都可以實現替代,越精準的資料匹配方式效率就越高
8、總結
子查詢的效率比連線查詢的效率低,適當選用
MySql之多表查詢
select e.empname,d.deptname from emp e,dept d where e.deptno d.deptno select e.empname d.deptname from emp e inner join dept d on e.deptno d.deptno se...
MySQL之多表查詢
1合併結果集,使用關鍵字union和union all,其區別是union會去掉合併中重複的部分而union all不會去掉重複的列。使用這個關鍵字的要求結果姐的列和型別必須相同。定義兩個表如下所示 a和b,兩個表分別有乙個整型的id和乙個字串的name。1.1使用union all 1.2使用un...
MySQL之多表查詢
準備資料 user info表 create table user info id int 2 primary key,user name varchar 12 unique,password varchar 15 not null,real name varchar 8 not null,age ...