select查詢不但可以從一張表查詢資料,還可以從多張表同時查詢資料。查詢多張表的語法是:select * from 《表1> 《表2>,普通多表查詢會獲取m x n行記錄,所以一般使用連線查詢或子查詢獲取多張表的資料;
連線查詢對多個表進行 join 運算,簡單地說,就是先確定乙個主表作為結果集,然後,把其他表的行有選擇性地「連線」在主表結果集上。
連線查詢分為內連線和外連線,內連線只返回同時存在於兩張表的行資料,外連線返回右表都存在的行。如果某一行僅在右表存在,那麼結果集就會以null
填充剩下的字段。
內連線是最常用的一種join查詢,內連線查詢的語法格式:
# 標準語法,inner可省略
select ... from 表1 join 表2 on 連線條件 ;
# 衍生語法1(where與on的作用相同)
select ... from 表1 join 表2 where 連線條件 ;
# 衍生語法2
select ... from 表1 , 表2 where 連線條件 ;
查詢例項:
# 連線員工表與部門表兩張表
select e.empno,e.ename,d.dname
from t_emp e
join t_dept d on e.deptno=d.deptno ;
# 連線員工表、部門表、登記表三張表
select e.empno,e.ename,d.dname,e.sal,e.job,s.grade
from t_emp e
join t_dept d on e.deptno=d.deptno
join t_salgrade s on e.sal between s.losal and s.hisal;
# 連線自身:查詢與scott同部門的人
select e2.ename
from t_emp e1
join t_emp e2 on e1.deptno=e2.deptno
where e1.ename="scott" and e2.ename!="scott";
# 高階練習1:查詢員工表中工資超過平均工資的人
# 與where一樣,on子句也不能使用聚合函式,這裡將聚合結果作為一張表來連線
select e.ename,e.sal
from t_emp e
join (select **g(sal) **g from t_emp) t on e.sal>=t.**g;
內連線的資料表不一定需要同名字段或外來鍵關聯,只需欄位之間符合邏輯關係即可由於內連線只返回同時存在於兩張表的行資料,如果員工表中有部門編號為null的特殊員工,使用內連線就會遺漏這個員工的資訊,這時候就需要使用外連線,外連線分為
left [outer] join
、right [outer] join
、full [outer] join
,左右相對join關鍵字前後的表而言的:
左連線例項1:查詢所有員工(包括部門為null)的部門資訊
select e.ename,d.dname
from t_emp e
left join t_dept d on e.deptno=d.deptno;
左連線例項2:查詢所有部門的人數
select d.dname,count(e.deptno)
from t_dept d
left join t_emp e on d.deptno=e.deptno
group by d.deptno;
mysql資料庫不支援全連線查詢,可使用union
關鍵字實現全連線:
(select d.dname,count(e.deptno)
from t_dept d
left join t_emp e on d.deptno=e.deptno
group by d.deptno)
union
(select d.dname,count(*)
from t_dept d
right join t_emp e on d.deptno=e.deptno
group by d.deptno);
內連線中,on與where的用法一樣;外連線中不太一樣,where能篩選掉更多資料。根據所在位置,子查詢可分為where、from、select子查詢。對於where、select子查詢,每次比較都會執行一次,非常低效,不推薦使用,一般轉化為表連線查詢。對於from子查詢只會執行一次,可以經常使用。
根據子查詢的返回結果,可以分為單行和多行子查詢,單行子查詢即子查詢返回乙個值,很容易使用。對於多行子查詢,可以使用in、all、any、[not] exists關鍵字來處理
mysql多表 MySQL 多表查詢
多表查詢 select listname from tablename1,tablename2 笛卡爾積 多表查詢中,如果沒有連線條件,則會產生笛卡爾積 數學中的定義 假設集合a 集合b 則兩個集合的笛卡爾積為 實際執行環境下,應避免使用笛卡爾積 解決方案 在where加入有效的連線條件 等值連線 ...
mysql多表查詢方式 MySQL多表查詢方式問題
你的 sql 沒有用到任何索引,對 a b 兩個表都是全表掃瞄,在資料量小的時候是沒有問題的,但是如果資料量超過 100 萬,效能問題就會突顯出來。這裡不清楚你的 created at 欄位是什麼型別,不過從你的 date format created at,y m d 看來,應該是 datetim...
mysql 多表查詢or MySQL 多表查詢
前期準備 建表create table dep id int,name varchar 20 create table emp id int primary key auto increment,name varchar 20 enum male female not null default ma...