最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL數(shù)據(jù)庫學(xué)習(xí)之去重與連接查詢詳解

 更新時間:2022年07月24日 16:51:53   作者:世界盡頭與你  
這篇文章主要為大家詳細(xì)介紹一下MySQL數(shù)據(jù)庫中去重與連接查詢的使用,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)MySQL有一定幫助,需要的可以參考一下

1.去重

示例表內(nèi)容參考此文章

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

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

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

另一個示例:聯(lián)合去重,查找部門和崗位的獨(dú)有信息:

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)

另一個示例:現(xiàn)在我們想統(tǒng)計(jì)一下工作崗位的數(shù)量,結(jié)合使用count函數(shù):

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

2.連接查詢

我們已經(jīng)學(xué)會了如何在一張表中讀取數(shù)據(jù),這是相對簡單的,但是在真正的應(yīng)用中經(jīng)常需要從多個數(shù)據(jù)表中讀取數(shù)據(jù)。

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

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

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

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

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

使用where進(jìn)行多表連接查詢

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

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語句實(shí)際上效率很低,我們嘗試進(jìn)行優(yōu)化(給表起別名):(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)

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

內(nèi)連接 - 等值連接

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

內(nèi)連接,我們使用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的優(yōu)點(diǎn)是:表的連接是獨(dú)立的,不占用where的位置。使sql語句整體更加清晰

內(nèi)連接 - 非等值連接

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

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)

內(nèi)連接 - 自連接

案例:查詢員工的上級領(lǐng)導(dǎo),要求顯示員工名和對應(yīng)的領(lǐng)導(dǎo)名

我們可以發(fā)現(xiàn),員工和領(lǐng)導(dǎo)的關(guān)系在一張表中,此時需要用到自連接(技巧:一張表看成兩張表)

mysql> select
    -> a.ename as '員工名',b.ename as '領(lǐng)導(dǎo)名'
    -> from emp a
    -> join emp b
    -> on
    -> a.mgr = b.empno;
+-----------+-----------+
| 員工名    | 領(lǐng)導(dǎo)名      |
+-----------+-----------+
| 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)

外連接 - 左右外連接

外連接與內(nèi)連接的區(qū)別是,外連接沒有匹配成功的某一個表的記錄也會被取出

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

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)

同樣的,如果是左外連接,將查詢出左表的全部數(shù)據(jù),使用left join關(guān)鍵字即可

外連接的查詢結(jié)果條數(shù)一定是 >= 內(nèi)連接的查詢結(jié)果條數(shù)

三表連接

更為復(fù)雜的情況是,群表連接

我們來看一個案例:

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

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)

再來看一個更復(fù)雜的情況:

找出每個員工的部門名稱及工資等級及領(lǐng)導(dǎo)名稱。要求顯示員工名,部門名,領(lǐng)導(dǎo)名,薪資,薪資等級

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數(shù)據(jù)庫學(xué)習(xí)之去重與連接查詢詳解的詳細(xì)內(nèi)容,更多關(guān)于MySQL去重 連接查詢的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MySQL服務(wù)器 IO 100%的分析與優(yōu)化方案

    MySQL服務(wù)器 IO 100%的分析與優(yōu)化方案

    這篇文章主要給大家介紹了關(guān)于MySQL服務(wù)器 IO 100%的相關(guān)資料,文中通過示例代碼介紹的介紹非常詳細(xì),對大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • mysql?sql_mode數(shù)據(jù)驗(yàn)證檢查方法

    mysql?sql_mode數(shù)據(jù)驗(yàn)證檢查方法

    sql_mode?會影響MySQL支持的sql語法以及執(zhí)行的數(shù)據(jù)驗(yàn)證檢查,通過設(shè)置sql_mode?,可以完成不同嚴(yán)格程度的數(shù)據(jù)校驗(yàn),有效地保障數(shù)據(jù)準(zhǔn)確性,這篇文章主要介紹了mysql?sql_mode數(shù)據(jù)驗(yàn)證檢查,需要的朋友可以參考下
    2023-08-08
  • mysql忘記密碼怎么辦

    mysql忘記密碼怎么辦

    mysql忘記密碼怎么辦?這篇文章主要為大家詳細(xì)介紹了MySQL忘記密碼的解決辦法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • MySql中的longtext字段的返回問題及解決

    MySql中的longtext字段的返回問題及解決

    這篇文章主要介紹了MySql中的longtext字段的返回問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 非常實(shí)用的MySQL函數(shù)全面總結(jié)詳解示例分析教程

    非常實(shí)用的MySQL函數(shù)全面總結(jié)詳解示例分析教程

    這篇文章主要為大家介紹了非常實(shí)用的MySQL函數(shù)的詳解示例分析,文中全面的概括了MySQL函數(shù),并進(jìn)行了詳細(xì)的示例講解,有需要的朋友可以借鑒參考下
    2021-10-10
  • Mysql InnoDB多版本并發(fā)控制MVCC詳解

    Mysql InnoDB多版本并發(fā)控制MVCC詳解

    這篇文章主要介紹了Mysql InnoDB多版本并發(fā)控制MVCC詳解的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • MySQL 元數(shù)據(jù)查看及實(shí)例代碼

    MySQL 元數(shù)據(jù)查看及實(shí)例代碼

    這篇文章主要介紹了MySQL 元數(shù)據(jù)查看及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • MySQL 讀寫分離實(shí)例詳解

    MySQL 讀寫分離實(shí)例詳解

    這篇文章主要介紹了MySQL 讀寫分離實(shí)例詳解的相關(guān)資料,這里對讀寫MySQL分離進(jìn)行了簡單介紹,并附實(shí)例代碼,需要的朋友可以參考下
    2016-11-11
  • mysql判斷字符串是否存在幾種常見方式

    mysql判斷字符串是否存在幾種常見方式

    寫SQL語句我們經(jīng)常需要判斷一個字符串中是否包含另一個字符串,下面這篇文章主要給大家介紹了關(guān)于mysql判斷字符串是否存在的幾種常見方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • MySQL的Query Cache原理分析

    MySQL的Query Cache原理分析

    QueryCache(下面簡稱QC)是根據(jù)SQL語句來cache的。一個SQL查詢?nèi)绻詓elect開頭,那么MySQL服務(wù)器將嘗試對其使用QC。每個Cache都是以SQL文本作為key來存的。
    2008-07-07

最新評論

桑日县| 诸城市| 武安市| 潞西市| 洪洞县| 怀宁县| 蕲春县| 澄江县| 高雄县| 壶关县| 普陀区| 涞源县| 昌平区| 文安县| 桐庐县| 吉林市| 时尚| 新和县| 永年县| 大荔县| 平塘县| 博湖县| 文山县| 普兰县| 临沧市| 巨野县| 永昌县| 东至县| 蓝田县| 象州县| 迁安市| 齐河县| 广宗县| 桐乡市| 琼中| 若尔盖县| 陆川县| 色达县| 吕梁市| 嘉荫县| 乐安县|