MySql中的資料查詢語言(DQL)三:連線查詢

少年西西發表於2020-12-17

一、概念

1、什麼是連線查詢?

連線查詢:也可以叫跨表查詢,需要關聯多個表進行查詢
在實際開發中,大部分的情況下都不是從單表中查詢資料,一般都是多張表聯合查詢取出最終的結果。
在實際開發中,一般一個業務都會對應多張表,比如:學生和班級,起碼兩張表。

學生和班級資訊儲存到一張表中,結果就像上面一樣,資料會存在大量的重複,導致資料的冗餘。

2、連線查詢的分類?

根據語法出現的年代來劃分的話,包括:
SQL92(一些老的DBA可能還在使用這種語法。DBA:DataBase Administrator,資料庫管理員)
SQL99(比較新的語法)
根據表的連線方式來劃分,包括:
內連線:

  • 等值連線
  • 非等值連線
  • 自連線

外連線

  • 左外連線(左連線)
  • 右外連線(右連線)
  • 全連線(這個不講,很少用!)

3、笛卡爾積現象

在表的連線查詢方面有一種現象被稱為:笛卡爾積現象。(笛卡爾乘積現象)
A集合和B集合相乘,包含了集合A中元素和集合B中元素相結合的所有的可能性。既兩個集合相乘得到的新集合的元素個數是 A集合的元素個數 × B集合的元素個數;
舉例:
案例:找出每一個員工的部門名稱,要求顯示員工名和部門名。
select ename,dname from emp,dept;
±-------±-----------+
| ename | dname |
±-------±-----------+
| SMITH | ACCOUNTING |
| SMITH | RESEARCH |
| SMITH | SALES |
| SMITH | OPERATIONS |
| ALLEN | ACCOUNTING |
| ALLEN | RESEARCH |
| ALLEN | SALES |
| ALLEN | OPERATIONS |

56 rows in set (0.00 sec)
笛卡爾積現象: 當兩張表進行連線查詢的時候,沒有任何條件進行限制,最終的查詢結果條數是兩張表記錄條數的乘積
關於表的別名:

select e.ename,d.dname from emp e,dept d;

表的別名有什麼好處?

  • 第一:執行效率高。
  • 第二:可讀性好。

4、怎麼避免笛卡爾積現象?

當然是加條件進行過濾。
思考:避免了笛卡爾積現象,會減少記錄的匹配次數嗎?
不會,次數還是56次。只不過顯示的是有效記錄。

案例:找出每一個員工的部門名稱,要求顯示員工名和部門名。

mysql> select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno;//SQL92,以後不用。

相關文章