Rumah pangkalan data tutorial mysql 初步介绍MySQL中的集合操作_MySQL

初步介绍MySQL中的集合操作_MySQL

Jun 01, 2016 pm 01:00 PM
mysql

啥是集合操作?

通常来说,将联接操作看作是表之间的水平操作,因为该操作生成的虚拟表包含两个表中的列。而我这里总结的集合操作,一般将这些操作看作是垂直操作。MySQL数据库支持两种集合操作:UNION DISTINCT和UNION ALL。

与联接操作一样,集合操作也是对两个输入进行操作,并生成一个虚拟表。在联接操作中,一般把输入表称为左输入和右输入。集合操作的两个输入必须拥有相同的列数,若数据类型不同,MySQL数据库自动将进行隐式转换。同时,结果列的名称由左输入决定。
前期准备

准备测试表table1和table2:

create table table1 
      (aid int not null auto_increment, 
      title varchar(20), 
      tag varchar(10), 
      primary key(aid)) 
      engine=innodb default charset=utf8;

create table table2 
      (bid int not null auto_increment, 
      title varchar(20), 
      tag varchar(10), 
      primary key(bid)) 
      engine=innodb default charset=utf8;

Salin selepas log masuk

插入以下测试数据:

insert into table1(aid, title, tag) values(1, 'article1', 'MySQL');
insert into table1(aid, title, tag) values(2, 'article2', 'PHP');
insert into table1(aid, title, tag) values(3, 'article3', 'CPP');

insert into table2(bid, title, tag) values(1, 'article1', 'MySQL');
insert into table2(bid, title, tag) values(2, 'article2', 'CPP');
insert into table2(bid, title, tag) values(3, 'article3', 'C');

Salin selepas log masuk

UNION DISTINCT

UNION DISTINCT组合两个输入,并应用DISTINCT过滤重复项,一般可以直接省略DISTINCT关键字,直接使用UNION。

UNION的语法如下:

SELECT column,... FROM table1 
UNION [ALL]
SELECT column,... FROM table2
...

Salin selepas log masuk

在多个SELECT语句中,对应的列应该具有相同的字段属性,且第一个SELECT语句中被使用的字段名称也被用于结果的字段名称。

现在我运行以下sql语句:

(select * from table1) union (select * from table2);

Salin selepas log masuk

将会得到以下结果:

+-----+----------+-------+
| aid | title  | tag  |
+-----+----------+-------+
|  1 | article1 | MySQL |
|  2 | article2 | PHP  |
|  3 | article3 | CPP  |
|  2 | article2 | CPP  |
|  3 | article3 | C   |
+-----+----------+-------+

Salin selepas log masuk

我们发现,表table1和表table2中的重复数据项:

|  1 | article1 | MySQL |

Salin selepas log masuk

只出现了一次,这就是UNION的作用效果。

MySQL数据库目前对UNION DISTINCT的实现方式如下:

  • 创建一张临时表,也就是虚拟表;
  • 对这张临时表的列添加唯一索引;
  • 将输入的数据插入临时表;
  • 返回虚拟表。

因为添加了唯一索引,所以可以过滤掉集合中重复的数据项。这里重复的意思是SELECT所选的字段完全相同时,才会算作是重复的。

UNION ALL

UNION ALL的意思是不会排除掉重复的数据项,比如我运行以下的sql语句:

(select * from table1) union all (select * from table2);

Salin selepas log masuk

你将会得到以下结果:

+-----+----------+-------+
| aid | title  | tag  |
+-----+----------+-------+
|  1 | article1 | MySQL |
|  2 | article2 | PHP  |
|  3 | article3 | CPP  |
|  1 | article1 | MySQL |
|  2 | article2 | CPP  |
|  3 | article3 | C   |
+-----+----------+-------+

Salin selepas log masuk

发现重复的数据并不会被筛选掉。

在使用UNION DISTINCT的时候,由于向临时表中添加了唯一索引,插入的速度显然会因此而受到影响。如果确认进行UNION操作的两个集合中没有重复的选项,最有效的办法应该是使用UNION ALL。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Kemahiran pemprosesan struktur data besar PHP Kemahiran pemprosesan struktur data besar PHP May 08, 2024 am 10:24 AM

Kemahiran pemprosesan struktur data besar PHP

Bagaimana untuk mengoptimumkan prestasi pertanyaan MySQL dalam PHP? Bagaimana untuk mengoptimumkan prestasi pertanyaan MySQL dalam PHP? Jun 03, 2024 pm 08:11 PM

Bagaimana untuk mengoptimumkan prestasi pertanyaan MySQL dalam PHP?

Bagaimana untuk menggunakan sandaran dan pemulihan MySQL dalam PHP? Bagaimana untuk menggunakan sandaran dan pemulihan MySQL dalam PHP? Jun 03, 2024 pm 12:19 PM

Bagaimana untuk menggunakan sandaran dan pemulihan MySQL dalam PHP?

Apakah senario aplikasi jenis penghitungan Java dalam pangkalan data? Apakah senario aplikasi jenis penghitungan Java dalam pangkalan data? May 05, 2024 am 09:06 AM

Apakah senario aplikasi jenis penghitungan Java dalam pangkalan data?

Bagaimana untuk memasukkan data ke dalam jadual MySQL menggunakan PHP? Bagaimana untuk memasukkan data ke dalam jadual MySQL menggunakan PHP? Jun 02, 2024 pm 02:26 PM

Bagaimana untuk memasukkan data ke dalam jadual MySQL menggunakan PHP?

Bagaimana untuk membetulkan ralat mysql_native_password tidak dimuatkan pada MySQL 8.4 Bagaimana untuk membetulkan ralat mysql_native_password tidak dimuatkan pada MySQL 8.4 Dec 09, 2024 am 11:42 AM

Bagaimana untuk membetulkan ralat mysql_native_password tidak dimuatkan pada MySQL 8.4

Bagaimana untuk menggunakan prosedur tersimpan MySQL dalam PHP? Bagaimana untuk menggunakan prosedur tersimpan MySQL dalam PHP? Jun 02, 2024 pm 02:13 PM

Bagaimana untuk menggunakan prosedur tersimpan MySQL dalam PHP?

Strategi pengoptimuman prestasi untuk halaman tatasusunan PHP Strategi pengoptimuman prestasi untuk halaman tatasusunan PHP May 02, 2024 am 09:27 AM

Strategi pengoptimuman prestasi untuk halaman tatasusunan PHP

See all articles