亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

MySQL從零開始 17-union合并查詢,表的自我復(fù)制

來源:轉(zhuǎn)載 發(fā)布時間:2018-07-03 17:44:20 閱讀量:1215

除了之前介紹的多表查詢,單表查詢之外,還可以使用union/union all集合操作符將多個多個select的執(zhí)行結(jié)果進(jìn)行合并然后進(jìn)行查詢。

?同樣,本次的測試用數(shù)據(jù)庫還是為scott數(shù)據(jù)庫,大家可以在我的GitHub進(jìn)行scott數(shù)據(jù)庫創(chuàng)建腳本的下載。

1. 合并查詢

1.1 union

?union用于取得兩個結(jié)果集的并集。當(dāng)使用該操作符時,會自動去掉結(jié)果集中的重復(fù)行。

  • 例1:將工資大于25000和職位是MANAGER的人找出來。

mysql> select ename, sal, job from emp where sal>2500 union select ename, sal, job from emp where job='MANAGER';
+-------+---------+-----------+| ename | sal     | job       |
+-------+---------+-----------+| JONES | 2975.00 | MANAGER   |
| BLAKE | 2850.00 | MANAGER   |
| SCOTT | 3000.00 | ANALYST   |
| KING  | 5000.00 | PRESIDENT |
| FORD  | 3000.00 | ANALYST   || CLARK | 2450.00 | MANAGER   |
+-------+---------+-----------+6 rows in set (0.00 sec)123456789101112

1.2 union all

?顧名思義,union all用于取得兩個結(jié)果集的并集。當(dāng)使用該操作符時,不會去掉結(jié)果集中的重復(fù)行。

?我們繼續(xù)使用例1的查詢場景。

mysql> select ename, sal, job from emp where sal>2500 union all select ename, sal, job from emp where job='MANAGER';
+-------+---------+-----------+| ename | sal     | job       |
+-------+---------+-----------+| JONES | 2975.00 | MANAGER   |
| BLAKE | 2850.00 | MANAGER   |
| SCOTT | 3000.00 | ANALYST   |
| KING  | 5000.00 | PRESIDENT |
| FORD  | 3000.00 | ANALYST   |
| JONES | 2975.00 | MANAGER   |
| BLAKE | 2850.00 | MANAGER   || CLARK | 2450.00 | MANAGER   |
+-------+---------+-----------+8 rows in set (0.00 sec)1234567891011121314

?我們可以看到,union all查詢出來的結(jié)果要比union查詢出來的結(jié)果多兩行。

2. 自我復(fù)制

?自我復(fù)制又叫蠕蟲復(fù)制,是一種很有用的技巧,我們可以使用它進(jìn)行大量測試數(shù)據(jù)的創(chuàng)建,復(fù)制表以及刪除表中重復(fù)記錄等場景下的應(yīng)用。

2.1 大量測試數(shù)據(jù)的創(chuàng)建

?我們以scott數(shù)據(jù)庫的emp表為樣板。

mysql> select * from emp;
+--------+--------+-----------+------+---------------------+---------+---------+--------+| empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+--------+--------+-----------+------+---------------------+---------+---------+--------+| 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 || 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+14 rows in set (0.00 sec)1234567891011121314151617181920

?我們可以看到,emp中有14條記錄,現(xiàn)在我們要讓它迅速擴(kuò)充到100w以上的數(shù)據(jù)。

示例1

示例2

?我們可以看到,在不到1分鐘的時間里,我們就進(jìn)行了100w以上條數(shù)據(jù)的插入,這也是數(shù)據(jù)庫的魅力之一。

2.2 復(fù)制表

?MySQL中沒有提供復(fù)制操作,所以我們可以使用自我復(fù)制,進(jìn)行表的復(fù)制。

  • 例1:將scott數(shù)據(jù)庫dept表進(jìn)行復(fù)制,復(fù)制之后的表叫做copy_emp,實例如下:

mysql> create table copy_dept like dept;
Query OK, 0 rows affected (0.23 sec)mysql> insert into copy_dept select * from dept;
Query OK, 4 rows affected (0.11 sec)
Records: 4  Duplicates: 0  Warnings: 0mysql> select * from copy_dept;
+--------+------------+----------+| deptno | dname      | loc      |
+--------+------------+----------+|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  ||     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+4 rows in set (0.00 sec)1234567891011121314151617

2.3 刪除表中重復(fù)記錄

?刪除表中重復(fù)記錄也是實際場景之一,我們可以通過distinct配合select進(jìn)行該操作。

  • 例2:將上例中自我復(fù)制過的emp表中重復(fù)數(shù)據(jù)進(jìn)行刪除。

-- 第一步:創(chuàng)建一個與原表表結(jié)構(gòu)相同的空表,使用like關(guān)鍵字
mysql> create table temp like emp;
Query OK, 0 rows affected (0.06 sec)-- 第二步:使用distinct將重復(fù)元素過濾之后插入空表中
mysql> insert into temp select distinct * from emp;
Query OK, 14 rows affected (6.37 sec)
Records: 14  Duplicates: 0  Warnings: 0-- 第三步:刪除原表
mysql> drop table emp;
Query OK, 0 rows affected (0.01 sec)-- 第四步:將新建的表表名改為原表表名(貍貓換太子)
mysql> alter table temp rename emp;
Query OK, 0 rows affected (0.03 sec)mysql> select * from emp;
+--------+--------+-----------+------+---------------------+---------+---------+--------+| empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+--------+--------+-----------+------+---------------------+---------+---------+--------+| 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 || 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+14 rows in set (0.01 sec)12345678910111213141516171819202122232425262728293031323334353637

?細(xì)心的同學(xué)們可以發(fā)現(xiàn),100w條數(shù)據(jù)的數(shù)據(jù)庫刪除只花費(fèi)了0.01秒,這是除了數(shù)據(jù)庫之外任何工具都不可能實現(xiàn)的,這也印證了數(shù)據(jù)庫是大量數(shù)據(jù)操作的必備之選。當(dāng)然,由于我們在emp表中存在了大量的數(shù)據(jù),所以在第二步使用distinct查找數(shù)據(jù)時花費(fèi)了大量的時間,但這沒關(guān)系,在之后的章節(jié)中,這個問題會被解決。

原文地址https://blog.csdn.net/weixin_40739833/article/details/80851861

標(biāo)簽: 數(shù)據(jù)庫
分享:
評論:
你還沒有登錄,請先