mysql组合表表达式_mysql组合表表达式union,union distinct,union all详解

SELECT column, ...FROM table1

UNION [ALL | DISTINCT]

SELECT column, ...FROM table2

[UNION [ALL | DISTINCT]

SELECT column, ...FROM table3]

union:用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。

union distinct:同union

union all:用于合并两个或多个 SELECT 语句的结果集,保留表中重复行。

3.1 所有相关表表达式的select语句必须具有相同数目的表达式,并且放在一个表表达式下面的表表达式相同或可比较的数据类型。注意:如果两个数据类型相同或者如果表达式可以通过一个隐式条件转换为相同的数据类型,那么他们是可比较的。

3.2 来自多张表的数据,多次sql语句取出的列名可以不一致,但最终列名以第一个sql语句的列名为准。

3.3 order by只能最后的表表达式之后指定。在所有中间结果已经组合进来以后,排序对整个最终结果执行。

3.4 select 子句不必包含distinct(但允许),因为使用union的时候,mysql自动从最终结果中移除重复的行。

4.1 创建测试表

CREATE TABLE PLAYERS

(PLAYERNO INTEGER NOT NULL,

NAME CHAR(15) NOT NULL,

INITIALS CHAR(3) NOT NULL,

BIRTH_DATE DATE ,

SEX CHAR(1) NOT NULL,

JOINED SMALLINT NOT NULL,

STREET VARCHAR(30) NOT NULL,

HOUSENO CHAR(4) ,

POSTCODE CHAR(6) ,

TOWN VARCHAR(30) NOT NULL,

PHONENO CHAR(13) ,

LEAGUENO CHAR(4) ,

PRIMARY KEY (PLAYERNO));

CREATE TABLE PENALTIES

(PAYMENTNO INTEGER NOT NULL,

PLAYERNO INTEGER NOT NULL,

PAYMENT_DATE DATE NOT NULL,

AMOUNT DECIMAL(7,2) NOT NULL,

PRIMARY KEY (PAYMENTNO));    注:表PLAYERS为球员信息表,表PENALTIES为球员罚款记录表

4.2 插入测试数据

INSERT INTO PLAYERS VALUES (2, 'Everett', 'R', '1948-09-01', 'M', 1975, 'Stoney Road','43', '3575NH', 'Stratford', '070-237893', '2411');

INSERT INTO PLAYERS VALUES (6, 'Parmenter', 'R', '1964-06-25', 'M', 1977, 'Haseltine Lane','80', '1234KK', 'Stratford', '070-476537', '8467');

INSERT INTO PLAYERS VALUES (7, 'Wise', 'GWS', '1963-05-11', 'M', 1981, 'Edgecombe Way','39', '9758VB', 'Stratford', '070-347689', NULL);

INSERT INTO PLAYERS VALUES (8, 'Newcastle', 'B', '1962-07-08', 'F', 1980, 'Station Road','4', '6584WO', 'Inglewood', '070-458458', '2983');

INSERT INTO PLAYERS VALUES (27, 'Collins', 'DD', '1964-12-28', 'F', 1983, 'Long Drive','804', '8457DK', 'Eltham', '079-234857', '2513');

INSERT INTO PLAYERS VALUES (28, 'Collins', 'C', '1963-06-22', 'F', 1983, 'Old Main Road','10', '1294QK', 'Midhurst', '010-659599', NULL);

INSERT INTO PLAYERS VALUES (39, 'Bishop', 'D', '1956-10-29', 'M', 1980, 'Eaton Square','78', '9629CD', 'Stratford', '070-393435', NULL);

INSERT INTO PLAYERS VALUES (44, 'Baker', 'E', '1963-01-09', 'M', 1980, 'Lewis Street','23', '4444LJ', 'Inglewood', '070-368753', '1124');

INSERT INTO PLAYERS VALUES (57, 'Brown', 'M', '1971-08-17', 'M', 1985, 'Edgecombe Way','16', '4377CB', 'Stratford', '070-473458', '6409');

INSERT INTO PLAYERS VALUES (83, 'Hope', 'PK', '1956-11-11', 'M', 1982, 'Magdalene Road','16A', '1812UP', 'Stratford', '070-353548', '1608');

INSERT INTO PLAYERS VALUES (95, 'Miller', 'P', '1963-05-14', 'M', 1972, 'High Street','33A', '5746OP', 'Douglas', '070-867564', NULL);

INSERT INTO PLAYERS VALUES (100, 'Parmenter', 'P', '1963-02-28', 'M', 1979, 'Haseltine Lane','80', '6494SG', 'Stratford', '070-494593', '6524');

INSERT INTO PLAYERS VALUES (104, 'Moorman', 'D', '1970-05-10', 'F', 1984, 'Stout Street','65', '9437AO', 'Eltham', '079-987571', '7060');

INSERT INTO PLAYERS VALUES (112, 'Bailey', 'IP', '1963-10-01', 'F', 1984, 'Vixen Road','8', '6392LK', 'Plymouth', '010-548745', '1319');

INSERT INTO PENALTIES VALUES (1, 6, '1980-12-08',100);

INSERT INTO PENALTIES VALUES (2, 44, '1981-05-05', 75);

INSERT INTO PENALTIES VALUES (3, 27, '1983-09-10',100);

INSERT INTO PENALTIES VALUES (4,104, '1984-12-08', 50);

INSERT INTO PENALTIES VALUES (5, 44, '1980-12-08', 25);

INSERT INTO PENALTIES VALUES (6, 8, '1980-12-08', 25);

INSERT INTO PENALTIES VALUES (7, 44, '1982-12-30', 30);

INSERT INTO PENALTIES VALUES (8, 27, '1984-11-12', 75);

5.1 union

获取那些来自Inglewood和来自Plymouth的每个球员的号码和城市。

select playerno, town

from PLAYERS

where town = 'Inglewood'

union

select playerno, town

from PLAYERS

where town = 'Plymouth';

0818b9ca8b590ca3270a3433284dd417.png

如果union左右两张表为同一表,也可用or代替,为不同表则只能使用union,如下两个例子:

两表相同

select playerno, town

from PLAYERS

where town = 'Inglewood'

or

town = 'Plymouth';

0818b9ca8b590ca3270a3433284dd417.png

两表不同

select birth_date as dates

from PLAYERS

union

select payment_date

from PENALTIES;

0818b9ca8b590ca3270a3433284dd417.png

5.2 union all

union all与union的唯一区别是,当我们使用union重复的行会自动移除,使用union all,则保留重复的行。

select joined

from PLAYERS

where town = 'Stratford'

union all

select joined

from PLAYERS

where town = 'Inglewood';

0818b9ca8b590ca3270a3433284dd417.png

6.1 union与union all的效率

从效率上说,UNION ALL 要比UNION快很多。UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL。 ****************************************************************************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值