데이터 베이스 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;

로그인 후 복사

插入以下测试数据:

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');

로그인 후 복사

UNION DISTINCT

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

UNION的语法如下:

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

로그인 후 복사

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

现在我运行以下sql语句:

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

로그인 후 복사

将会得到以下结果:

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

로그인 후 복사

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

|  1 | article1 | MySQL |

로그인 후 복사

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

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

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

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

UNION ALL

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

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

로그인 후 복사

你将会得到以下结果:

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

로그인 후 복사

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

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

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP의 빅데이터 구조 처리 능력 PHP의 빅데이터 구조 처리 능력 May 08, 2024 am 10:24 AM

PHP의 빅데이터 구조 처리 능력

PHP에서 MySQL 쿼리 성능을 최적화하는 방법은 무엇입니까? PHP에서 MySQL 쿼리 성능을 최적화하는 방법은 무엇입니까? Jun 03, 2024 pm 08:11 PM

PHP에서 MySQL 쿼리 성능을 최적화하는 방법은 무엇입니까?

PHP에서 MySQL 백업 및 복원을 사용하는 방법은 무엇입니까? PHP에서 MySQL 백업 및 복원을 사용하는 방법은 무엇입니까? Jun 03, 2024 pm 12:19 PM

PHP에서 MySQL 백업 및 복원을 사용하는 방법은 무엇입니까?

데이터베이스에서 Java 열거 유형의 애플리케이션 시나리오는 무엇입니까? 데이터베이스에서 Java 열거 유형의 애플리케이션 시나리오는 무엇입니까? May 05, 2024 am 09:06 AM

데이터베이스에서 Java 열거 유형의 애플리케이션 시나리오는 무엇입니까?

PHP를 사용하여 MySQL 테이블에 데이터를 삽입하는 방법은 무엇입니까? PHP를 사용하여 MySQL 테이블에 데이터를 삽입하는 방법은 무엇입니까? Jun 02, 2024 pm 02:26 PM

PHP를 사용하여 MySQL 테이블에 데이터를 삽입하는 방법은 무엇입니까?

MySQL 8.4에서 mysql_native_password가 로드되지 않음 오류를 수정하는 방법 MySQL 8.4에서 mysql_native_password가 로드되지 않음 오류를 수정하는 방법 Dec 09, 2024 am 11:42 AM

MySQL 8.4에서 mysql_native_password가 로드되지 않음 오류를 수정하는 방법

PHP에서 MySQL 저장 프로시저를 사용하는 방법은 무엇입니까? PHP에서 MySQL 저장 프로시저를 사용하는 방법은 무엇입니까? Jun 02, 2024 pm 02:13 PM

PHP에서 MySQL 저장 프로시저를 사용하는 방법은 무엇입니까?

PHP 배열 페이징을 위한 성능 최적화 전략 PHP 배열 페이징을 위한 성능 최적화 전략 May 02, 2024 am 09:27 AM

PHP 배열 페이징을 위한 성능 최적화 전략

See all articles