首頁  >  文章  >  資料庫  >  MySql中的連線查詢問題怎麼解決

MySql中的連線查詢問題怎麼解決

WBOY
WBOY轉載
2023-05-26 20:48:401225瀏覽

    連接查詢

    當進行多表連接查詢時需要指定字段所屬的表, 可以提高查詢效率, 如果不指定字段所屬的表,資料庫會從每個表中都找一下該欄位

    • e .欄位名稱: 表示取 emp 表的某個欄位

    • emp as e : 表的別名機制, 可以省略as 直接寫成emp e

    • #連接查詢:也可以叫跨表查詢,需要關聯多張表聯合起來查詢資料

    • #emp表和dept表聯合起來查詢數據,從emp表中取員工名字,從dept表中取部門名字

    注意: 做連接查詢的時候一定要寫上關聯條件避免笛卡爾積現象

    #連接查詢的分類

    根據語法的年代分類

    #SQL92:1992年的時候出現的語法

    • #sql92的缺點:結構不清晰,表的連接條件,和後期進一步篩選的條件,都放到了where後面

    SQL99:1999年的時候出現的語法(重點學習)

    • sql99優點:表的連接條件和查詢條件分離,連接之後如果還需要進一步篩選,再往後繼續添加where , 多個表進行連接的時候更清晰

    根據表連接的方式分類

    內連接:等值連接, 非等值連接, 自連接, inner 可以省略一般不加

    • 表A inner join 表B on 關聯條件

    外連接:左外連接(左連接), 右外連接(右連接), outer 可以省略一般不加

    • 表A left outer join 表B on 關聯條件

    • 表B right outer join 表A on 關聯條件

    • #左連接以左面的表為準和右邊的表比較,和左表相等的不相等都會顯示出來,而右表符合條件的顯示,不符合條件的不顯示(右連接恰恰相反)

    • 左連接能完成的功能右連接一定可以完成

    全連接, 連接的兩張表都是主表, 都能查詢出來

    #笛卡爾積現象

    當兩張表進行連接查詢,沒有指定連接條件的時候,最終查詢結果條數是兩張表條數的乘積,這種現象稱為:笛卡爾積現象(笛卡爾發現的,這是一個數學現象)

    避免笛卡爾積現象:連接多個表格時加連接條件,將滿足這個條件的記錄被篩選出來

    • #匹配的過程中匹配的次數沒有減少, 但是最終查詢的結果條數是變少了, 因為根據連接條件進行了篩選

    • 通過笛卡爾積現象得出,表的連接次數越多效率越低,盡量避免表的連接次數

    內連接之等值連接

    因為條件是等量關係,所以被稱為等值連接(連接條件相等的資料)

    查詢每個員工所在部門名稱,顯示員工名稱和部門

    emp e和dept d表進行連接, 連接條件是:e.deptno = d.deptno

    	--sql92的缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面
    
    	select 
    		e.ename,d.dname
    	from
    		emp e, dept d
    	where
    		e.deptno = d.deptno;
    		
    	--sql99优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where		
    	select 
    		e.ename,d.dname
    	from
    		emp e
    	--inner可以省略(带着inner可读性更好)
    	(inner) join
    		dept d
    	on
    		e.deptno = d.deptno;

    內連接之自連接

    因為只有一張表連接,具體的查詢方法是把一張表看作兩張表自己連接自己, 所以成為自連接

    查詢員工的上級領導,要求顯示員工名和對應的領導名

    一張表看成兩張表, emp e 代表了員工表,emp m 也代表了領導表

    連接條件: e.mgr = m.empno 員工的領導編號= 領導的員工編號

    --SQL92
    select e.ename, m.ename from emp e, emp m where e.mgr=m.empno;
    
    --SQL99
    select 
    	a.ename as '员工名', b.ename as '领导名'
    from
    	emp e
    join
    	emp m
    on
    	e.mgr = m.empno;

    內連接之非等值連接

    因為連接條件不是等量關係,所以稱為非等值連接

    顯示薪水大於2000 的員工信息,並顯示所屬的部門名稱

    --采用 SQL92 语法
    select 
    	e.ename, e.sal, d.dname 
    from 
    	emp e, dept d 
    where 
    	e.deptno=d.deptno and e.sal > 2000;
    	
    --采用 SQL99 语法
    select 
    	e.ename, e.sal, d.dname 
    from 
    	emp e 
    (inner) join 
    	dept d 
    on 
    	e.deptno=d.deptno 
    where 
    	e.sal>2000;

    找出每位員工的薪資等級,要求顯示員工名稱、薪資、薪資等級

    select 
    	e.ename, e.sal, s.grade
    from
    	emp e
    (inner) join
    	salgrade s
    on
    	e.sal between s.losal and s.hisal;

    外部連線

    外連接: 在外連接當中,兩張表連接產生了主次關係, 主要查詢的是主表的數據, 捎帶著關聯查詢次表, 即如果對方沒有記錄和我主表匹配, 那麼默認對方是null , outer關鍵字可以省略

    • 右外連接: 帶有right 的是右外連接,表示將join關鍵字右邊的這張表看成主表,主要是為了將這張表的資料全部查詢出來,捎帶著關聯查詢左邊的表

    • 左外連接: 帶有lef t的是左外連接, 表示將join關鍵字左邊的這張表看成主表,主要是為了將這張表的資料全部查詢出來,捎帶著關聯查詢右邊的表

    **注意: 任何一個右連接都有左連接的寫法, 任何一個左連接都有右連接的寫法**

    查询每个员工的上级领导,要求显示所有员工的名字和领导名 , 如果某个员工没有领导 , 那么该员工也必须显示出来

    --左连接
    select 
    	a.ename as '员工名', b.ename as '领导名'
    from
    	emp a
    left (outer) join
    	emp b
    on
    	a.mgr = b.empno; 
    
    --右连接
    select 
    	a.ename as '员工名', b.ename as '领导名'
    from
    	emp b
    right (outer) join
    	emp a
    on
    	a.mgr = b.empno;

    内连接和外连接的特点

    内连接:A表和B表连接,A和B两张表没有主次关系是平等的 , 查询时只是将能够匹配上连接条件的数据查询出来 , 即如果没有匹配的就查询不出来 , inner关键字可以省略

    外连接: 在外连接当中,两张表连接产生了主次关系 , 主要查询的是主表的数据 , 捎带着关联查询次表 , 即如果对方没有记录和我主表匹配 , 那么默认对方是null , outer关键字可以省略

    注意: 区分内外连接的办法是通过 right 和 left 关键字 , 不是通过 inner 和 outer 因为它们都可以省略 , 并且外连接的查询结果条数一定是大于等于内连接的查询结果条数

    显示员工信息,并显示所属的部门名称

    select 
    	e.ename,d.dname
    from
    	emp e
    join
    	dept d
    on
    	e.deptno = d.deptno;

    MySql中的連線查詢問題怎麼解決

    显示员工信息,并显示所属的部门名称,如果某一个部门没有员工,那么该部门也必须显示出来

    --外连接(右外连接)
    select 
    	e.ename,d.dname
    from
    	emp e 
    --outer是可以省略的,带着可读性强
    --right代表什么:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表
    right (outer) join 
    	dept d
    on
    	e.deptno = d.deptno;
    
    
    --外连接(左外连接)
    select 
    	e.ename,d.dname
    from
    	dept d 
    --outer是可以省略的,带着可读性强
    left (outer) join 
    	emp e
    on
    	e.deptno = d.deptno;

    MySql中的連線查詢問題怎麼解決

    多表连接

    一条SQL中内连接和外连接可以混合 , 都可以出现

    --表示一: a 和 b 进行内连接 , a 和 c 进行内连接 , a 和 d 进行右外连接(推荐)
    
    --表示二: a 和 b 的内连接结果去内连接 c 的结果再去右外连接 d
    select 
    	...
    from
    	a
    join
    	b
    on
    	a和b的连接条件
    join
    	c
    on
    	a和c的连接条件
    right join
    	d
    on
    	a和d的连接条件

    找出每个员工的部门名称以及工资等级,要求显示员工名、部门名、薪资、薪资等级

    	select 
    		e.ename,e.sal,d.dname,s.grade
    	from
    		emp e
    	join
    		dept d
    	on 
    		e.deptno = d.deptno
    	join
    		salgrade s
    	on
    		e.sal between s.losal and s.hisal;

    查询结果

    	+--------+---------+------------+-------+
    	| ename  | sal     | dname      | grade |
    	+--------+---------+------------+-------+
    	| SMITH  |  800.00 | RESEARCH   |     1 |
    	| ALLEN  | 1600.00 | SALES      |     3 |
    	| WARD   | 1250.00 | SALES      |     2 |
    	| JONES  | 2975.00 | RESEARCH   |     4 |
    	| MARTIN | 1250.00 | SALES      |     2 |
    	| BLAKE  | 2850.00 | SALES      |     4 |
    	| CLARK  | 2450.00 | ACCOUNTING |     4 |
    	| SCOTT  | 3000.00 | RESEARCH   |     4 |
    	| KING   | 5000.00 | ACCOUNTING |     5 |
    	| TURNER | 1500.00 | SALES      |     3 |
    	| ADAMS  | 1100.00 | RESEARCH   |     1 |
    	| JAMES  |  950.00 | SALES      |     1 |
    	| FORD   | 3000.00 | RESEARCH   |     4 |
    	| MILLER | 1300.00 | ACCOUNTING |     2 |
    	+--------+---------+------------+-------+

    找出每个员工的部门名称以及工资等级,还有上级领导,要求显示员工名、领导名、部门名、薪资、薪资等级

    	select 
    		e.ename,e.sal,d.dname,s.grade,l.ename
    	from
    		emp e
    	join
    		dept d
    	on 
    		e.deptno = d.deptno
    	join
    		salgrade s
    	on
    		e.sal between s.losal and s.hisal
    	left join
    		emp l
    	on
    		e.mgr = l.empno;

    查询结果

    	+--------+---------+------------+-------+-------+
    	| ename  | sal     | dname      | grade | ename |
    	+--------+---------+------------+-------+-------+
    	| SMITH  |  800.00 | RESEARCH   |     1 | FORD  |
    	| ALLEN  | 1600.00 | SALES      |     3 | BLAKE |
    	| WARD   | 1250.00 | SALES      |     2 | BLAKE |
    	| JONES  | 2975.00 | RESEARCH   |     4 | KING  |
    	| MARTIN | 1250.00 | SALES      |     2 | BLAKE |
    	| BLAKE  | 2850.00 | SALES      |     4 | KING  |
    	| CLARK  | 2450.00 | ACCOUNTING |     4 | KING  |
    	| SCOTT  | 3000.00 | RESEARCH   |     4 | JONES |
    	| KING   | 5000.00 | ACCOUNTING |     5 | NULL  |
    	| TURNER | 1500.00 | SALES      |     3 | BLAKE |
    	| ADAMS  | 1100.00 | RESEARCH   |     1 | SCOTT |
    	| JAMES  |  950.00 | SALES      |     1 | BLAKE |
    	| FORD   | 3000.00 | RESEARCH   |     4 | JONES |
    	| MILLER | 1300.00 | ACCOUNTING |     2 | CLARK |
    	+--------+---------+------------+-------+-------+

    以上是MySql中的連線查詢問題怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除