欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

1.去重

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

有些 MySQL 數(shù)據(jù)表中可能存在重復(fù)的記錄,有些情況我們?cè)试S重復(fù)數(shù)據(jù)的存在,但有時(shí)候我們也需要?jiǎng)h除這些重復(fù)的數(shù)據(jù)。

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

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

另一個(gè)示例:聯(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)

另一個(gè)示例:現(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é)會(huì)了如何在一張表中讀取數(shù)據(jù),這是相對(duì)簡(jiǎn)單的,但是在真正的應(yīng)用中經(jīng)常需要從多個(gè)數(shù)據(jù)表中讀取數(shù)據(jù)。

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

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

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

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

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

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

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

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

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ù)越多,效率越低,請(qǐng)盡量減少表的連接次數(shù)!

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

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

內(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語(yǔ)句整體更加清晰

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

案例:找出每個(gè)員工的薪資等級(jí),要求顯示員工名,薪資,薪資等級(jí)

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)連接 - 自連接

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

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

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ū)別是,外連接沒(méi)有匹配成功的某一個(gè)表的記錄也會(huì)被取出

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

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ù)雜的情況是,群表連接

我們來(lái)看一個(gè)案例:

找出每個(gè)員工的部門名稱及工資等級(jí)。要求顯示員工名,部門名,薪資,薪資等級(jí)

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)

再來(lái)看一個(gè)更復(fù)雜的情況:

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

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ù)庫(kù)學(xué)習(xí)之去重與連接查詢?cè)斀獾脑敿?xì)內(nèi)容,更多關(guān)于MySQL去重 連接查詢的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • mysql delete 多表連接刪除功能

    mysql delete 多表連接刪除功能

    這篇文章主要介紹了mysql delete 多表連接刪除功能的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 一文帶你搞懂MySQL的MVCC機(jī)制

    一文帶你搞懂MySQL的MVCC機(jī)制

    MySQL中的MVCC機(jī)制想必大家都有所耳聞吧,雖然在平時(shí)MySQL使用過(guò)程中基本上用不到,但是面試中出場(chǎng)率十分高,那么你對(duì)MVCC機(jī)制了解多少呢,MVCC機(jī)制是用來(lái)干嘛的呢,底層的工作原理是怎么樣的呢,本文就帶你一探究竟
    2023-07-07
  • MySQL學(xué)習(xí)之InnoDB結(jié)構(gòu)探秘

    MySQL學(xué)習(xí)之InnoDB結(jié)構(gòu)探秘

    這篇文章主要是對(duì)InnoDB結(jié)構(gòu)的探秘,InnoDB是基于磁盤存儲(chǔ),其存儲(chǔ)的最基本單元是頁(yè),大小為16KB。而CPU和磁盤之間速度相差懸殊,所以通常使用內(nèi)存中的緩沖池來(lái)提高性能,感興趣的同學(xué)可以參考閱讀
    2023-03-03
  • mysql主從服務(wù)器配置特殊問(wèn)題

    mysql主從服務(wù)器配置特殊問(wèn)題

    如果修改了主服務(wù)器的配置,記得刪除從服務(wù)器上的master.info文件。否則從服務(wù)器使用的還是老配置,可能會(huì)導(dǎo)致錯(cuò)誤。
    2010-12-12
  • MySQL啟動(dòng)報(bào)錯(cuò)問(wèn)題InnoDB:Unable to lock/ibdata1 error

    MySQL啟動(dòng)報(bào)錯(cuò)問(wèn)題InnoDB:Unable to lock/ibdata1 error

    這篇文章主要介紹了MySQL啟動(dòng)報(bào)錯(cuò)問(wèn)題InnoDB:Unable to lock/ibdata1 error,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • mysql not in、left join、IS NULL、NOT EXISTS 效率問(wèn)題記錄

    mysql not in、left join、IS NULL、NOT EXISTS 效率問(wèn)題記錄

    mysql not in、left join、IS NULL、NOT EXISTS 效率問(wèn)題記錄,需要的朋友可以參考下。
    2011-12-12
  • Win下Mysql5.6升級(jí)到5.7的方法

    Win下Mysql5.6升級(jí)到5.7的方法

    MySQL的升級(jí)方式分為兩種:原地升級(jí)和邏輯升級(jí)。這兩種升級(jí)方式,本質(zhì)沒(méi)有什么區(qū)別的,下面通過(guò)本文給大家詳細(xì)介紹Win下Mysql5.6升級(jí)到5.7的方法,需要的的朋友參考下
    2017-04-04
  • sql格式化工具集合

    sql格式化工具集合

    如果想要我們的SQL語(yǔ)句看起來(lái)很美觀,除了自己平時(shí)注意外,還有一個(gè)懶人方法
    2011-08-08
  • mysql的group_concat函數(shù)使用示例

    mysql的group_concat函數(shù)使用示例

    這篇文章主要介紹了mysql的group_concat函數(shù)使用示例,需要的朋友可以參考下
    2014-04-04
  • MySQL存儲(chǔ)過(guò)程的傳參和流程控制示例講解

    MySQL存儲(chǔ)過(guò)程的傳參和流程控制示例講解

    這篇文章主要介紹了MySQL存儲(chǔ)過(guò)程的傳參和流程控制示例講解,?repeat和Loop區(qū)別是repeat有自己退出循環(huán)的語(yǔ)句until,Loop使用的是if判斷語(yǔ)句,本文結(jié)合示例代碼詳細(xì)講解,需要的朋友可以參考下
    2023-02-02

最新評(píng)論