mySQL UNION演算子のデフォルト規則研究
3501 ワード
/* */
create table td_base_data( id int(10) not null auto_increment,userId int(10) default '0',primary key (`id`))ENGINE=MyISAM DEFAULT CHARSET=gbk;
create table td_base_data_20090527( id int(10) not null auto_increment,userId int(10) default '0',primary key (`id`))ENGINE=MyISAM DEFAULT CHARSET=gbk;
/* */
insert into td_base_data(userId) values(1);
insert into td_base_data(userId) values(45);
insert into td_base_data(userId) values(45);
insert into td_base_data(userId) values(1);
insert into td_base_data(userId) values(45);
insert into td_base_data_20090527(userId) values(1);
insert into td_base_data_20090527(userId) values(45);
insert into td_base_data_20090527(userId) values(45);
insert into td_base_data_20090527(userId) values(1);
insert into td_base_data_20090527(userId) values(45);
insert into td_base_data_20090527(userId) values(45);
/* */
select count(userId) as cnumber from td_base_data where userId = '45';
/* 3 */
select count(userId) as cnumber from td_base_data_20090527 where userId = '45';
/* 4 */
select (select count(userId) from td_base_data where userId = '45') + (select count(userId) from td_base_data_20090527 where userId = '45') as cnumber;
/* 7 */
select count(*) from
(
select id from td_base_data where userId = '45'
union
select id from td_base_data_20090527 where userId = '45'
) as tx;
/* 4 */
select count(*) from
(
select * from td_base_data where userId = '45'
union
select * from td_base_data_20090527 where userId = '45'
) as tx;
/* 4 */
/* mysql ,union */
/* */
/*
mysqlリファレンスを検索するには、次の手順に従います.
13.2.7.2. UNION構文
UNIONに対してキーワードALLを使用しない場合は、結果セット全体にDISTINCTを使用したように、返されるすべてのローが一意になります.ALLを指定すると、使用したすべてのSELECT文から一致するすべての行が得られます.
DISTINCTキーワードは1つの選択語で、何の役にも立たないが、SQL標準の要求によって、文法の中で採用することを許可する.(MySQLでは、DISTINCTは共通体のデフォルトの動作特性を表します.)
*/
/*mysqlでunionがデフォルトでDISTINCTであることを証明*/
/*
クエリーmssqlリファレンスマニュアル:
Transact-SQLリファレンス
UNION演算子:
UNIONを使用して2つのクエリの結果セットを結合する2つの基本ルールは、次のとおりです.
1.すべてのクエリのカラム数とカラムの順序は同じでなければなりません.
2.データ型は互換性がある必要があります.
パラメータ:
UNION
複数の結果セットを組み合わせて単一の結果セットとして返すことを指定します.
ALL
結果には、重複する行を含むすべての行が含まれます.指定されていない場合は、重複行を削除します.
*/
/*mssqlでunionデフォルトもDISTINCTであることを証明*/
/*クエリー基準定義*/
/*
SQL 2003標準の問合せ:
Transact-SQLリファレンス
4.10.6.2 Operators that operate on multisets and return multisets
MULTISET UNION is an operator that computes the union of two multisets. There are two variants, specified using ALL or DISTINCT, to either retain duplicates or remove duplicates.
7.13
Syntax Rules
6) If UNION, EXCEPT, or INTERSECT is specified and neither ALL nor DISTINCT is specified, then DISTINCT is implicit.
*/
/*SQL 2003規格はDISTINCTがunionのデフォルト値であることを定義しています*/
/*正しくクエリーされ、両方のテーブルのuserIdフィールドにインデックスを付けてクエリーを高速化する必要があります*/
select count(userId) as cnumber from
(
select userId from td_base_data where userId = '45'
union all
select userId from td_base_data_20090527 where userId = '45'
) as tx;