各位用户为了找寻关于实例详解mysql子查询的资料费劲了很多周折。这里教程网为您整理了关于实例详解mysql子查询的相关资料,仅供查阅,以下为您介绍关于实例详解mysql子查询的详细内容
子查询分类
按返回结果集分类
子查询按返回结果集的不同分为4种:表子查询,行子查询,列子查询和标量子查询。 表子查询:返回的结果集是一个行的集合,n行n列(n>=1)。表子查询经常用于父查询的from子句中。 行子查询:返回的结果集是一个列的集合,一行n列(n>=1)。行子查询可以用于福查询的from子句和where子句中。 列子查询:返回的结果集是一个行的集合,n行一列(n>=1)。 标量子查询:返回的结果集是一个标量集合,一行一列,也就是一个标量值。可以指定一个标量表达式的任何地方,都可以用一个标量子查询。
从定义上讲,每个标量子查询也是一个行子查询和一个列子查询,反之则不是;每个行子查询和列子查询也是一个表子查询,反之也不是。
按照对返回结果的调用方法
子查询按对返回结果集的调用方法,可分为where型子查询,from型子查询及exists型子查询。
where型子查询:(把内层查询结果当作外层查询的比较条件)定义:where型的子查询就是把内层查询的结果当作外层查询的条件。 from型子查询:(把内层的查询结果供外层再次查询)定义:from子查询就是把子查询的结果(内存里的一张表)当作一张临时表,然后再对它进行处理。 exists型子查询:(把外层查询结果拿到内层,看内层的查询是否成立)定义:exists子查询就是对外层表进行循环,再对内表进行内层查询。和in ()差不多,但是它们还是有区别的。主要是看两个张表大小差的程度。若子查询表大则用exists(内层索引),子查询表小则用in(外层索引);
使用子查询原则
1.一个子查询必须放在圆括号中。
2.将子查询放在比较条件的右边以增加可读性。子查询不包含 order by 子句。对一个 select 语句只能用一个 order by 子句,并且如果指定了它就必须放在主 select 语句的最后。
3.在子查询中可以使用两种比较条件:单行运算符(>, =, >=, <, <>, <=) 和多行运算符(in, any, all)。
实例分析
创建测试表
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21create
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为有过罚款记录的球员信息列表。
插入测试数据
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23insert
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);
表子查询实例
如:获取编号小于10的男性球员的号码
? 1 2 3 4 5mysql>
select
playerno
from
(
select
playerno, sex
from
players
where
playerno < 10)
as
players10
where
sex=
'm'
;
行子查询实例
如:获取和100号球员性别相同并且居住在同一城市的球员号码。
? 1 2 3 4 5 6mysql>
select
playerno
from
players
where
(sex, town) = (
select
sex, town
from
players
where
playerno = 100);
说明:子查询的结果是带有两个值的一行:('m','stratford')。这个值和一个行表达式(sex,town)进行比较。
标量子查询实例
可以指定一个标量表达式的任何地方,几乎都可以使用一个标量子查询。 如:获取和27号球员出生在同一年的球员的号码
? 1 2 3 4 5 6 7mysql>
select
playerno
from
players
where
year
(birth_date) =
(
select
year
(birth_date)
from
players
where
playerno = 27)
and
playerno <> 27;
上面语句等同于:
? 1mysql>
select
playerno
from
players
where
year
(birth_date) = 1964
and
playerno <> 27;
列子查询实例
由于列子查询返回的结果集是 n 行一列,因此不能直接使用 = > < >= <= <> 这些比较标量结果的操作符。在列子查询中可以使用 in、any(some)和all操作符: in:在指定项内,同 in(项1,项2,…)。 any:与比较操作符联合使用,any关键字必须接在一个比较操作符的后面,表示与子查询返回的任何值比较为 true ,则返回 true 。 some:any 的别名,较少使用。 all:与比较操作符联合使用,all关键字必须接在一个比较操作符的后面,表示与子查询返回的所有值比较都为 true ,则返回 true 。
实例1(in):获取球员性别为女的所有球员的球员号,名字及所在城市。
? 1 2 3 4 5 6mysql>
select
playerno,
name
, town
from
players
where
playerno
in
(
select
playerno
from
players
where
sex =
'f'
);
实例2(any):获取至少比同城的另一球员年轻的所有球员的号码,日期和居住城市。
? 1 2 3 4 5 6mysql>
select
playerno, birth_date, town
from
players
as
p1
where
birth_date >
any
(
select
birth_date
from
players
as
p2
where
p1.town = p2.town);
实例3(all):获取最老球员的号码,名字及生日。(即出生日期数值小于或等于所有其它球员的球员)
? 1 2 3 4 5mysql>
select
playerno,
name
, birth_date
from
players
where
birth_date <=
all
(
select
birth_date
from
players);
xists关键字表示存在。使用exists关键字时,内层查询语句不返回查询的记录,而是返回一个真假值,如果内层查询语句查询到满足条件的记录,只要子查询中至少返回一个值,则exists语句的值就为true。就返回true,否则返回false。当返回的值为true时,外层查询语句将进行查询,否则不进行查询。not exists刚好与之相反。exists的用法和in ()差不多,但是它们还是有区别的。主要是看两个张表大小差的程度。若子查询表大则用exists(内层索引),子查询表小则用in(外层索引);
实例1(exists):获取那些至少支付了一次罚款的球员的名字和首字母。
? 1 2 3 4 5mysql>
select
name
, initials
from
players
where
exists
(
select
*
from
penalties
where
playerno = players.playerno);
实例2(not exists):获取那些从来没有罚款的球员的名字和首字母。
? 1 2 3 4 5mysql>
select
name
, initials
from
players
where
not
exists
(
select
*
from
penalties
where
playerno = players.playerno);
以上就是实例详解mysql子查询的详细内容,更多关于mysql子查询的资料请关注其它相关文章!
原文链接:https://cloud.tencent.com/developer/article/1639846