mysql查询语句select-⼦查询
在⼀个表表达中可以调⽤另⼀个表表达式,这个被调⽤的表表达式叫做⼦查询(subquery),我么也称作⼦选择(subselect)或内嵌选择(inner select)。⼦查询的结果传递给调⽤它的表表达式继续处理。
2.1 按返回结果集分类
⼦查询按返回结果集的不同分为4种:表⼦查询,⾏⼦查询,列⼦查询和标量⼦查询。
表⼦查询:返回的结果集是⼀个⾏的集合,N⾏N列(N>=1)。表⼦查询经常⽤于⽗查询的FROM⼦句中。
⾏⼦查询:返回的结果集是⼀个列的集合,⼀⾏N列(N>=1)。⾏⼦查询可以⽤于福查询的FROM⼦句和WHERE⼦句中。
列⼦查询:返回的结果集是⼀个⾏的集合,N⾏⼀列(N>=1)。
标量⼦查询:返回的结果集是⼀个标量集合,⼀⾏⼀列,也就是⼀个标量值。可以指定⼀个标量表达式的任何地⽅,都可以⽤⼀个标量⼦查询。
栅栏密码对照图从定义上讲,每个标量⼦查询也是⼀个⾏⼦查询和⼀个列⼦查询,反之则不是;每个⾏⼦查询和列⼦查询也是⼀个表⼦查询,反之也不是。
2.2 按照对返回结果的调⽤⽅法
⼦查询按对返回结果集的调⽤⽅法,可分为where型⼦查询,from型⼦查询及exists型⼦查询。
where型⼦查询:(把内层查询结果当作外层查询的⽐较条件)
定义:where型的⼦查询就是把内层查询的结果当作外层查询的条件。
from型⼦查询:(把内层的查询结果供外层再次查询)
定义:from⼦查询就是把⼦查询的结果(内存⾥的⼀张表)当作⼀张临时表,然后再对它进⾏处理。
exists型⼦查询:(把外层查询结果拿到内层,看内层的查询是否成⽴)
定义:exists⼦查询就是对外层表进⾏循环,再对内表进⾏内层查询。和in ()差不多,但是它们还是有区别的。主要是看两个张表⼤⼩差的程度。若⼦查询表⼤则⽤exists(内层索引),⼦查询表⼩则⽤in(外层索引);
1.⼀个⼦查询必须放在圆括号中。
2.将⼦查询放在⽐较条件的右边以增加可读性。c语言取字符串中的一段
⼦查询不包含 ORDER BY ⼦句。对⼀个 SELECT 语句只能⽤⼀个 ORDER BY ⼦句,并且如果指定了它就必须放在主 SELECT 语句的最后。
3.在⼦查询中可以使⽤两种⽐较条件:单⾏运算符(>, =, >=, <, <>, <=) 和多⾏运算符(IN, ANY, ALL)。
4.1 创建测试表
CREATE TABLE `players` (
`PLAYERNO` int(11) NOT NULL,
`NAME` char(15) NOT NULL,
`INITIALS` char(3) NOT NULL,
`BIRTH_DATE` date DEFAULT NULL,
`SEX` char(1) NOT NULL,
`JOINED` smallint(6) NOT NULL,
`STREET` varchar(30) NOT NULL,
`HOUSENO` char(4) DEFAULT NULL,
`POSTCODE` char(6) DEFAULT NULL,
`TOWN` varchar(30) NOT NULL,
`PHONENO` char(13) DEFAULT NULL,
`LEAGUENO` char(4) DEFAULT NULL,
PRIMARY KEY (`PLAYERNO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `penalties` (
`PAYMENTNO` int(11) NOT NULL,
数据结构链表c语言`PLAYERNO` int(11) NOT NULL,
mysql语句多表查询`PAYMENT_DATE` date NOT NULL,
`AMOUNT` decimal(7,2) NOT NULL,
PRIMARY KEY (`PAYMENTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
注:表players为球员信息基本表,表penalties为有过记录的球员信息列表。
4.2 插⼊测试数据
1. INSERT INTO PLAYERS VALUES (2, 'Everett', 'R', '1948-09-01', 'M', 1975, 'Stoney Road','43', '3575NH', 'Stratford', '070-
237893', '2411');
2. INSERT INTO PLAYERS VALUES (6, 'Parmenter', 'R', '1964-06-25', 'M', 1977, 'Haseltine Lane','80', '1234KK', 'Stratford', '070-
476537', '8467');
3. INSERT INTO PLAYERS VALUES (7, 'Wise', 'GWS', '1963-05-11', 'M', 1981, 'Edgecombe Way','39', '9758VB', 'Stratford', '070-
347689', NULL);
4. INSERT INTO PLAYERS VALUES (8, 'Newcastle', 'B', '1962-07-08', 'F', 1980, 'Station Road','4', '6584WO', 'Inglewood', '070-
458458', '2983');
5. INSERT INTO PLAYERS VALUES (27, 'Collins', 'DD', '1964-12-28', 'F', 1983, 'Long Drive','804', '8457DK', 'Eltham', '079-
234857', '2513');
6. INSERT INTO PLAYERS VALUES (28, 'Collins', 'C', '1963-06-22', 'F', 1983, 'Old Main Road','10', '1294QK', 'Midhurst', '010-
659599', NULL);
7. INSERT INTO PLAYERS VALUES (39, 'Bishop', 'D', '1956-10-29', 'M', 1980, 'Eaton Square','78', '9629CD', 'Stratford', '070-
393435', NULL);
opengl编程指南 第9版 pdf8. INSERT INTO PLAYERS VALUES (44, 'Baker', 'E', '1963-01-09', 'M', 1980, 'Lewis Street','23', '4444LJ', 'Inglewood', '070-
368753', '1124');
9. INSERT INTO PLAYERS VALUES (57, 'Brown', 'M', '1971-08-17', 'M', 1985, 'Edgecombe Way','16', '4377CB', 'Stratford', '070-
473458', '6409');
10. INSERT INTO PLAYERS VALUES (83, 'Hope', 'PK', '1956-11-11', 'M', 1982, 'Magdalene Road','16A', '1812UP', 'Stratford', '070-
353548', '1608');
11. INSERT INTO PLAYERS VALUES (95, 'Miller', 'P', '1963-05-14', 'M', 1972, 'High Street','33A', '5746OP', 'Douglas', '070-
867564', NULL);
12. INSERT INTO PLAYERS VALUES (100, 'Parmenter', 'P', '1963-02-28', 'M', 1979, 'Haseltine Lane','80', '6494SG', 'Stratford', '070-
494593', '6524');
13. INSERT INTO PLAYERS VALUES (104, 'Moorman', 'D', '1970-05-10', 'F', 1984, 'Stout Street','65', '9437AO', 'Eltham', '079-
987571', '7060');
14. INSERT INTO PLAYERS VALUES (112, 'Bailey', 'IP', '1963-10-01', 'F', 1984, 'Vixen Road','8', '6392LK', 'Plymouth', '010-
548745', '1319');
15.
16. INSERT INTO PENALTIES VALUES (1, 6, '1980-12-08',100);
17. INSERT INTO PENALTIES VALUES (2, 44, '1981-05-05', 75);
18. INSERT INTO PENALTIES VALUES (3, 27, '1983-09-10',100);
19. INSERT INTO PENALTIES VALUES (4,104, '1984-12-08', 50);
20. INSERT INTO PENALTIES VALUES (5, 44, '1980-12-08', 25);
21. INSERT INTO PENALTIES VALUES (6, 8, '1980-12-08', 25);
22. INSERT INTO PENALTIES VALUES (7, 44, '1982-12-30', 30);
23. INSERT INTO PENALTIES VALUES (8, 27, '1984-11-12', 75);
4.3 表⼦查询实例
如:获取编号⼩于10的男性球员的号码
1. mysql> select playerno from (
2. select playerno, sex
3. from players
4. where playerno < 10)
5. as players10 where sex='M';
4.4 ⾏⼦查询实例javalib入口
如:获取和100号球员性别相同并且居住在同⼀城市的球员号码。
1. mysql> select playerno
2. from players
3. where (sex, town) = (
4. select sex, town
5. from players
6. where playerno = 100);
说明:⼦查询的结果是带有两个值的⼀⾏:('M','stratford')。这个值和⼀个⾏表达式(sex,town)进⾏⽐较。
4.5 标量⼦查询实例
可以指定⼀个标量表达式的任何地⽅,⼏乎都可以使⽤⼀个标量⼦查询。
如:获取和27号球员出⽣在同⼀年的球员的号码
1. mysql> select playerno
2. from players
3. where year(birth_date) =
4. (select year(birth_date)
5. from players
6. where playerno = 27)
7. and playerno <> 27;
4.6 列⼦查询实例
由于列⼦查询返回的结果集是 N ⾏⼀列,因此不能直接使⽤ = > < >= <= <> 这些⽐较标量结果的操作符。在列⼦查询中可以使⽤IN、ANY(SOME)和ALL操作符:
IN:在指定项内,同 IN(项1,项2,…)。
ANY:与⽐较操作符联合使⽤,ANY关键字必须接在⼀个⽐较操作符的后⾯,表⽰与⼦查询返回的任何值⽐较为 TRUE ,则返回 TRUE 。
SOME:ANY 的别名,较少使⽤。
ALL:与⽐较操作符联合使⽤,ALL关键字必须接在⼀个⽐较操作符的后⾯,表⽰与⼦查询返回的所有值⽐较都为 TRUE ,则返回 TRUE 。
实例1(in):获取球员性别为⼥的所有球员的球员号,名字及所在城市。
1. mysql> select playerno, name, town
2. from players
3. where playerno in
4. (select playerno
5. from players
6. where sex = 'F');
实例2(any):获取⾄少⽐同城的另⼀球员年轻的所有球员的号码,⽇期和居住城市。
1. mysql> select playerno, birth_date, town
2. from players as p1
3. where birth_date > any
4. (select birth_date
5. from players as p2
6. wn = p2.town);
实例3(all):获取最⽼球员的号码,名字及⽣⽇。(即出⽣⽇期数值⼩于或等于所有其它球员的球员)
1. mysql> select playerno, name, birth_date
2. from players
3. where birth_date <= all
4. (select birth_date
5. from players);
4.7 where型⼦查询
参考4.4节⼦查询语句
4.8 from型⼦查询
参考4.3节⼦查询语句
4.9 exists型⼦查询
EXISTS关键字表⽰存在。使⽤EXISTS关键字时,内层查询语句不返回查询的记录,⽽是返回⼀个真假值,如果内层查询语句查询到满⾜条件的记录,只要⼦查询中⾄少返回⼀个值,则EXISTS语句的值就为True。就返回true,否则返回false。当返回的值为true时,外层查询语句将进⾏查询,否则不进⾏查询。NOT EXISTS刚好与之相反。exists的⽤法和in ()差不多,但是它们还是有区别的。主要是看两个张表⼤⼩差的程度。若⼦查询表⼤则⽤exists(内层索引),⼦查询表⼩则⽤in(外层索引);
实例1(exists):获取那些⾄少⽀付了⼀次的球员的名字和⾸字母。
1. mysql> select name, initials
2. from players
3. where exists
4. (select * from penalties
5. where playerno = players.playerno);
实例2(not exists):获取那些从来没有的球员的名字和⾸字母。
1. mysql> select name, initials
2. from players
3. where not exists
4. (select * from penalties
5. where playerno = players.playerno);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论