• 溫馨提示×

    MySQL數據庫中去重與連接查詢的方法

    發布時間:2022-07-25 10:41:44 來源:億速云 閱讀:59 作者:栢白 欄目:開發技術

    本篇文章和大家了解一下MySQL數據庫中去重與連接查詢的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

    目錄
    • 1.去重

    • 2.連接查詢

      • 使用where進行多表連接查詢

      • 內連接 - 等值連接

      • 內連接 - 非等值連接

      • 內連接 - 自連接

      • 外連接 - 左右外連接

      • 三表連接

    1.去重

    示例表內容參考此文章

    有些 MySQL 數據表中可能存在重復的記錄,有些情況我們允許重復數據的存在,但有時候我們也需要刪除這些重復的數據。

    例如:去重顯示崗位信息:

    mysql> select distinct job from emp;
    +-----------+
    | job       |
    +-----------+
    | CLERK     |
    | SALESMAN  |
    | MANAGER   |
    | ANALYST   |
    | PRESIDENT |
    +-----------+
    5 rows in set (0.02 sec)

    另一個示例:聯合去重,查找部門和崗位的獨有信息:

    mysql> select distinct job,deptno from emp;
    +-----------+--------+
    | job       | deptno |
    +-----------+--------+
    | CLERK     |     20 |
    | SALESMAN  |     30 |
    | MANAGER   |     20 |
    | MANAGER   |     30 |
    | MANAGER   |     10 |
    | ANALYST   |     20 |
    | PRESIDENT |     10 |
    | CLERK     |     30 |
    | CLERK     |     10 |
    +-----------+--------+
    9 rows in set (0.00 sec)

    另一個示例:現在我們想統計一下工作崗位的數量,結合使用count函數:

    mysql> select count(distinct job) from emp;
    +---------------------+
    | count(distinct job) |
    +---------------------+
    |                   5 |
    +---------------------+
    1 row in set (0.00 sec)

    2.連接查詢

    我們已經學會了如何在一張表中讀取數據,這是相對簡單的,但是在真正的應用中經常需要從多個數據表中讀取數據。

    JOIN 按照功能大致分為如下三類:

    INNER JOIN(內連接,或等值連接):獲取兩個表中字段匹配關系的記錄。

    LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。

    RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用于獲取右表所有記錄,即使左表沒有對應匹配的記錄。

    多表連接的機制是:從其中一個表中取出每一條數據,從另一個表中的數據行進行匹配。這就涉及到了效率控制問題

    使用where進行多表連接查詢

    現在我們來演示一個例子:取出每個員工的名字和部門名字:

    mysql> select ename,dname
        -> from emp,dept
        -> where emp.deptno = dept.deptno;
    +--------+------------+
    | ename  | dname      |
    +--------+------------+
    | SMITH  | RESEARCH   |
    | ALLEN  | SALES      |
    | WARD   | SALES      |
    | JONES  | RESEARCH   |
    | MARTIN | SALES      |
    | BLAKE  | SALES      |
    | CLARK  | ACCOUNTING |
    | SCOTT  | RESEARCH   |
    | KING   | ACCOUNTING |
    | TURNER | SALES      |
    | ADAMS  | RESEARCH   |
    | JAMES  | SALES      |
    | FORD   | RESEARCH   |
    | MILLER | ACCOUNTING |
    +--------+------------+
    14 rows in set (0.00 sec)

    上面的sql語句實際上效率很低,我們嘗試進行優化(給表起別名):(sql92語法)

    mysql> select e.ename,d.dname
        -> from emp e,dept d
        -> where e.deptno = d.deptno;
    +--------+------------+
    | ename  | dname      |
    +--------+------------+
    | SMITH  | RESEARCH   |
    | ALLEN  | SALES      |
    | WARD   | SALES      |
    | JONES  | RESEARCH   |
    | MARTIN | SALES      |
    | BLAKE  | SALES      |
    | CLARK  | ACCOUNTING |
    | SCOTT  | RESEARCH   |
    | KING   | ACCOUNTING |
    | TURNER | SALES      |
    | ADAMS  | RESEARCH   |
    | JAMES  | SALES      |
    | FORD   | RESEARCH   |
    | MILLER | ACCOUNTING |
    +--------+------------+
    14 rows in set (0.00 sec)

    注意:表的連接次數越多,效率越低,請盡量減少表的連接次數!

    內連接 - 等值連接

    還是上面的例子,取出每個員工的名字和部門名字:(sql99語法)

    內連接,我們使用inner

    mysql> select e.ename,d.dname
        -> from emp e
        -> inner join
        -> dept d
        -> on
        -> e.deptno = d.deptno;
    +--------+------------+
    | ename  | dname      |
    +--------+------------+
    | SMITH  | RESEARCH   |
    | ALLEN  | SALES      |
    | WARD   | SALES      |
    | JONES  | RESEARCH   |
    | MARTIN | SALES      |
    | BLAKE  | SALES      |
    | CLARK  | ACCOUNTING |
    | SCOTT  | RESEARCH   |
    | KING   | ACCOUNTING |
    | TURNER | SALES      |
    | ADAMS  | RESEARCH   |
    | JAMES  | SALES      |
    | FORD   | RESEARCH   |
    | MILLER | ACCOUNTING |
    +--------+------------+
    14 rows in set (0.00 sec)

    sql99的優點是:表的連接是獨立的,不占用where的位置。使sql語句整體更加清晰

    內連接 - 非等值連接

    案例:找出每個員工的薪資等級,要求顯示員工名,薪資,薪資等級

    mysql> select
        -> e.ename,e.sal,s.grade
        -> from
        -> emp e
        -> inner join
        -> salgrade s
        -> on
        -> e.sal between s.losal and s.hisal;
    +--------+---------+-------+
    | ename  | sal     | grade |
    +--------+---------+-------+
    | SMITH  |  800.00 |     1 |
    | ALLEN  | 1600.00 |     3 |
    | WARD   | 1250.00 |     2 |
    | JONES  | 2975.00 |     4 |
    | MARTIN | 1250.00 |     2 |
    | BLAKE  | 2850.00 |     4 |
    | CLARK  | 2450.00 |     4 |
    | SCOTT  | 3000.00 |     4 |
    | KING   | 5000.00 |     5 |
    | TURNER | 1500.00 |     3 |
    | ADAMS  | 1100.00 |     1 |
    | JAMES  |  950.00 |     1 |
    | FORD   | 3000.00 |     4 |
    | MILLER | 1300.00 |     2 |
    +--------+---------+-------+
    14 rows in set (0.01 sec)

    內連接 - 自連接

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

    我們可以發現,員工和領導的關系在一張表中,此時需要用到自連接(技巧:一張表看成兩張表)

    mysql> select
        -> a.ename as '員工名',b.ename as '領導名'
        -> from emp a
        -> join emp b
        -> on
        -> a.mgr = b.empno;
    +-----------+-----------+
    | 員工名    | 領導名      |
    +-----------+-----------+
    | SMITH     | FORD      |
    | ALLEN     | BLAKE     |
    | WARD      | BLAKE     |
    | JONES     | KING      |
    | MARTIN    | BLAKE     |
    | BLAKE     | KING      |
    | CLARK     | KING      |
    | SCOTT     | JONES     |
    | TURNER    | BLAKE     |
    | ADAMS     | SCOTT     |
    | JAMES     | BLAKE     |
    | FORD      | JONES     |
    | MILLER    | CLARK     |
    +-----------+-----------+
    13 rows in set (0.00 sec)

    外連接 - 左右外連接

    外連接與內連接的區別是,外連接沒有匹配成功的某一個表的記錄也會被取出

    案例:查找員工的部門信息。要求部門即使沒有員工也要查出

    mysql> select
        -> e.ename,d.dname
        -> from emp e
        -> right join dept d
        -> on
        -> e.deptno = d.deptno;
    +--------+------------+
    | ename  | dname      |
    +--------+------------+
    | SMITH  | RESEARCH   |
    | ALLEN  | SALES      |
    | WARD   | SALES      |
    | JONES  | RESEARCH   |
    | MARTIN | SALES      |
    | BLAKE  | SALES      |
    | CLARK  | ACCOUNTING |
    | SCOTT  | RESEARCH   |
    | KING   | ACCOUNTING |
    | TURNER | SALES      |
    | ADAMS  | RESEARCH   |
    | JAMES  | SALES      |
    | FORD   | RESEARCH   |
    | MILLER | ACCOUNTING |
    | NULL   | OPERATIONS |
    +--------+------------+
    15 rows in set (0.00 sec)

    同樣的,如果是左外連接,將查詢出左表的全部數據,使用left join關鍵字即可

    外連接的查詢結果條數一定是 >= 內連接的查詢結果條數

    三表連接

    更為復雜的情況是,群表連接

    我們來看一個案例:

    找出每個員工的部門名稱及工資等級。要求顯示員工名,部門名,薪資,薪資等級

    mysql> 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 |
    +--------+---------+------------+-------+
    14 rows in set (0.00 sec)

    再來看一個更復雜的情況:

    找出每個員工的部門名稱及工資等級及領導名稱。要求顯示員工名,部門名,領導名,薪資,薪資等級

    mysql> 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 |
    +--------+---------+------------+-------+-------+
    14 rows in set (0.00 sec)

    以上就是MySQL數據庫中去重與連接查詢的方法的簡略介紹,當然詳細使用上面的不同還得要大家自己使用過才領會。如果想了解更多,歡迎關注億速云行業資訊頻道哦!

    推薦閱讀:Mysql數據庫連接查詢

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    主題地圖

    高清国产一级婬片A免费,亚洲无码免费,两个人的BD免费完整高清视频