http://www.web008.net

浅谈MySQL中优化sql语句询问常用方法,优化数据库的秘诀

1、选拔最适用的字段属性

MySQL可以很好的帮衬大数据量的存取,可是日常,数据库中的表越小,在它上面试行的查询也就能够越快。由此,在创造表的时候,为了拿走越来越好的习性,大家得以将表中字段的幅度设得尽大概小。

比方,在概念邮编这些字段时,借使将其设置为CHACRUISER(255卡塔尔(英语:State of Qatar),分明给数据库扩大了不供给的空中,以至运用VARCHA昂Cora那连串型也是多余的,因为CHA中华V(6卡塔尔国就能够很好的成就职分了。相符的,即使得以的话,大家应有运用MEDIUMINT并不是BIGIN来定义整型字段。

除此以外一个升高功用的点子是在大概的情况下,应该尽恐怕把字段设置为NOTNULL,这样在未来实行查询的时候,数据库不用去相比NULL值。 对于某个文本字段,譬如“省份”也许“性别”,大家能够将它们定义为ENUM类型。因为在MySQL中,ENUM类型被视作数值型数据来拍卖,而数值型数据被拍卖起来的进度要比文本类型快得多。这样,大家又能够巩固数据库的性质。

1.对查询举办优化,应尽量防止全表扫描,首先应寻思在 where 及 order by 涉及的列上建设构造目录。

2、使用连接(JOIN)来替代子查询(Sub-Queries卡塔尔(قطر‎

MySQL从4.1起来扶持SQL的子查询。那些工夫可以利用SELECT语句来创立八个单列的询问结果,然后把那一个结果作为过滤条件用在另二个询问中。比方,大家要将顾客为主音讯表中绝非其余订单的顾客删除掉,就足以利用子查询先从发售音讯表中校所有发生订单的顾客ID收取来,然后将结果传递给主查询,如下所示:

DELETEFROMcustomerinfo

WHERECustomerIDNOTin(SELECTCustomerIDFROMsalesinfo)

使用子查询能够二遍性的做到非常多逻辑上要求七个步骤手艺不辱职务的SQL操作,同有的时候候也能够防止事务只怕表锁死,何况写起来也相当轻便。不过,有个别情状下,子查询能够被更有效用的总是(JOIN)..代替。举例,即使咱们要将具有未有订单记录的顾客收取来,能够用下边那些查询完结:

SELECT*FROMcustomerinfo

WHERECustomerIDNOTin(SELECTCustomerIDFROMsalesinfo)

借使运用连接(JOIN)..来形成这么些查询职业,速度将会快非常多。特别是当salesinfo表中对CustomerID建有目录的话,品质将会越来越好,查询如下:

SELECT*FROMcustomerinfo

LEFTJOINsalesinfoONcustomerinfo.CustomerID=salesinfo.CustomerID

WHEREsalesinfo.CustomerIDISNULL

老是(JOIN)..之所以更有效用一些,是因为MySQL没有必要在内存中创制有时表来成功这一个逻辑上的急需多少个步骤的查询专门的学业。

2.应尽量防止在 where 子句中应用!=或<>操作符,不然将引擎放任使用索引而進展全表扫描。

3、使用联合(UNION卡塔尔(英语:State of Qatar)来替代手动创制的不常表

MySQL从4.0的本子初步辅助union查询,它可以把须求接受不常表的两条或更加多的select查询归总的一个询问中。在顾客端的询问会话截至的时候,有时表会被机关删除,进而确定保障数据库有条不紊、高效。使用union来创建查询的时候,大家只要求用UNION作为重大字把四个select语句连接起来就足以了,要注意的是颇有select语句中的字段数目要想同。上面包车型地铁事例就演示了二个使用UNION的询问。

SELECTName,PhoneFROMclientUNION

SELECTName,BirthDateFROMauthorUNION

SELECTName,SupplierFROMproduct

3.应尽量防止在 where 子句中对字段进行 null 值判定,不然将促成蒸汽轮机废弃选择索引而开展全表扫描,如:

4、事务

尽管大家得以使用子查询(Sub-Queries)、连接(JOIN)和联合(UNION)来创造五花八门的询问,但不是具有的数据库操作都足以只用一条或少数几条SQL语句就足以做到的。更加多的时候是亟需用到一应有尽有的语句来成功某种工作。可是在此种意况下,当以此语句块中的某一条语句运营出错的时候,整个语句块的操作就能变得不分明起来。假造一下,要把某部数据相同的时间插入七个相关联的表中,也许会冒出那样的场地:第叁个表中打响更新后,数据库倏然现身意外情形,形成第二个表中的操作未有到位,那样,就能够招致数据的缺损,以致会破坏数据库中的数据。要防止这种意况,就相应运用专门的学问,它的效率是:要么语句块中每条语句都操作成功,要么都退步。换句话说,就是能够保证数据库中数据的风流罗曼蒂克致性和完整性。事物以BEGIN关键字从前,COMMIT关键字说尽。在那面包车型地铁一条SQL操作失败,那么,ROLLBACK命令就能够把数据库恢复到BEGIN开首早先的境况。

BEGIN; INSERTINTOsalesinfoSETCustomerID=14;UPDATEinventorySETQuantity=11WHEREitem='book';COMMIT;

职业的另三个第一意义是当多个客户同一时候接收同生龙活虎的多少源时,它可以运用锁定数据库的方式来为客商提供风华正茂种安全的拜会格局,那样能够保险客商的操作不被其它的客商所忧虑。

select id from t where num is null

5、锁定表

固然职业是爱戴数据库完整性的一个非常好的方法,但却因为它的独自占领性,一时会影响数据库的性质,越发是在相当的大的选择系列中。由于在职业试行的进度中,数据库将会被锁定,由此此外的客商须要只可以一时等候直到该事务甘休。如若贰个数据库系统独有些多少个客户来采用,事务形成的熏陶不会造成叁个太大的标题;但如果有数不清的顾客同一时候做客三个数据库系统,举个例子访谈一个电商网站,就能够生出相比较严重的响应延迟。

实在,某个情形下大家能够因此锁定表的措施来获得更加好的习性。下边包车型客车例子就用锁定表的艺术来成功前边二个例证安徽中华南理经济大学程公司作的作用。

LOCKTABLEinventoryWRITESELECTQuantityFROMinventoryWHEREItem='book';

...

UPDATEinventorySETQuantity=11WHEREItem='book';UNLOCKTABLES

此处,大家用叁个select语句收取开首数据,通过某些总括,用update语句将新值更新到表中。包含有WTucsonITE关键字的LOCKTABLE语句可以保障在UNLOCKTABLES命令被实践从前,不会有任何的探望来对inventory进行插队、更新可能去除的操作。

能够在num上安装暗中同意值0,确认保障表中num列未有null值,然后那样查询:

6、使用外键

锁定表的艺术能够维护数据的完整性,可是它却不能够保障数据的关联性。此时我们就可以运用外键。

诸如,外键能够确认保障每一条出卖记录都指向某叁个留存的客商。在这里地,外键能够把customerinfo表中的CustomerID映射到salesinfo表中CustomerID,任何一条未有合法CustomerID的记录都不会被更新或插队到salesinfo中。

CREATETABLEcustomerinfo( CustomerIDINTNOTNULL,PRIMARYKEY(CustomerID))TYPE=INNODB;

CREATETABLEsalesinfo( SalesIDINTNOTNULL,CustomerIDINTNOTNULL,

PRIMARYKEY(CustomerID,SalesID),

FOREIGNKEY(CustomerID)REFERENCEScustomerinfo(CustomerID)ONDELETECASCADE)TYPE=INNODB;

小心例子中的参数“ONDELETECASCADE”。该参数保障当customerinfo表中的一条客户记录被剔除的时候,salesinfo表中持有与该顾客有关的记录也会被机关删除。尽管要在MySQL中接收外键,一定要切记在创制表的时候将表的类型定义为专门的学业安全表InnoDB类型。该项目不是MySQL表的暗中认可类型。定义的不二法门是在CREATETABLE语句中加上TYPE=INNODB。如例中所示。

select id from t where num=0

7、使用索引

目录是拉长数据库质量的常用方法,它能够令数据库服务器以比未有索引快得多的速度检索特定的行,特别是在询问语句个中满含有MAX(卡塔尔(قطر‎,MIN(卡塔尔(قطر‎和O昂科威DERBY那个命令的时候,质量提升更加的分明。

那该对哪些字段创立目录呢?

通常,索引应创造在那七个将用以JOIN,WHERE判定和O君越DERBY排序的字段上。尽量不要对数据库中某些含有大批量重复的值的字段建构目录。对于三个ENUM类型的字段来讲,现身大批量重复值是很有希望的情事

举例customerinfo中的“province”..字段,在如此的字段上树立目录将不会有何扶助;相反,还应该有非常的大只怕下滑数据库的质量。我们在创设表的时候能够何况创制合适的目录,也得以选择ALTERTABLE或CREATEINDEX在后来创办索引。别的,MySQL从版本3.23.23始发扶持全文索引和寻找。全文索引在MySQL中是四个FULLTEXT类型索引,但仅能用来MyISAM类型的表。对于贰个大的数据库,将数据装载到二个未有FULLTEXT索引的表中,然后再利用ALTERTABLE或CREATEINDEX制造索引,将是不行快的。但如果将数据装载到八个早就有FULLTEXT索引的表中,推行进度将会非常慢。

4.应尽量幸免在 where 子句中选择 or 来三番两次条件,不然将招致蒸内燃机扬弃使用索引而进展全表扫描,如:

8、优化的查询语句

许多意况下,使用索引能够巩固查询的进程,但若是SQL语句使用不无独有偶的话,索引将不可能发挥它应该的功效。

下边是应当小心的多少个地点。

  • 首先,最佳是在平等类其余字段间开展相比较的操作。

在MySQL3.23版早先,那竟是是二个必需的规范。比如不能够将一个建有目录的INT字段和BIGINT字段张开比较;不过作为极其的情景,在CHA安德拉类型的字段和VARCHA汉兰达类型字段的字段大小同一时候,能够将它们举行相比较。

  • 协理,在建有目录的字段上尽恐怕不要接收函数进行操作。

譬喻说,在二个DATE类型的字段上行使YEAE(卡塔尔函数时,将会使索引不能表明应有的意义。所以,上边包车型地铁几个查询尽管回到的结果大器晚成致,但后面一个要比前边一个快得多。

  • 其三,在寻找字符型字段时,大家有时候会接收LIKE关键字和通配符,这种做法即便简易,但却也是以投身系统脾气为代价的。

比如下边包车型客车询问将会比较表中的每一条记下。

SELECT*FROMbooks

WHEREnamelike"MySQL%"

但是如若换用上边包车型大巴询问,重临的结果相近,但速度将要快上相当多:

SELECT*FROMbooks

WHEREname>="MySQL"andname<"MySQM"

末尾,应该小心幸免在询问中让MySQL进行活动类型转变,因为改动进程也会使索引变得不起效率。

select id from t where num=10 or num=20

优化SQL语句的方法

能够如此查询:

先是,对于where语句的注意事项:

1.应尽量幸免在 where 子句中对字段举办 null 值决断,否则将形成蒸热机吐弃使用索引而实行全表扫描,如: 
select id from t where num is null 
能够在num上安装暗许值0,确定保障表中num列未有null值,然后那样查询: 
select id from t where num=0

2.应尽量幸免在 where 子句中使用!=或<>操作符,不然将引擎遗弃行使索引而进行全表扫描

3.应尽量制止在 where 子句中采纳 or 来三番两次条件,否则将以致蒸汽轮机扬弃接纳索引而进展全表扫描,如: 
select id from t where num=10 or num=20 
能够如此查询: 
select id from t where num=10 
union all 
select id from t where num=20

4.上边包车型大巴查询也将变成全表扫描: 
select id from t where name like '%abc%' 
若要提升功用,能够思谋全文字笔迹核准索。 

5.in 和 not in 也要慎用,不然会招致全表扫描,如: 
select id from t where num in(1,2,3) 
对此接连几日来的数值,能用 between 就毫无用 in 了: 
select id from t where num between 1 and 3

6.应尽量防止在 where 子句中对字段进行表明式操作,那将引致内燃机放弃选取索引而进展全表扫描。如: 
select id from t where num/2=100 
应改为: 
select id from t where num=100*2

7.固然在 where 子句中运用参数,也会引致全表扫描。因为SQL独有在运营时才会分析局地变量,但优化程序不可能将探访安排的取舍推迟到运维时;它必得在编译时实行精选。然则,如若在编写翻译时确立访谈布置,变量的值依旧茫然不解的,因此不可能作为目录接收的输入项。如上边语句将拓宽全表扫描: 
select id from t where num=@num 
能够改为恐吓查询利用索引: 
select id from t with(index(索引名)) where num=@num

8.应尽量幸免在where子句中对字段实行函数操作,那将变成电动机放任使用索引而进行全表扫描。如: 
select id from t where substring(name,1,3)='abc'--name以abc开头的id 
select id from t where datediff(day,createdate,'2005-11-30')=0--'2005-11-30'生成的id 
应改为: 
select id from t where name like 'abc%' 
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

9.不用在 where 子句中的“=”右侧进行函数、算术运算或其余表明式运算,不然系统将也许不可能正确运用索引。

select id from t where num=10

其余优化注意事项:

1.对查询进行优化,应尽量制止全表扫描,首先应思虑在 where 及 order by 涉及的列上构建目录。

2.在采纳索引字段作为条件时,假使该索引是复合索引,那么必须使用到该索引中的第二个字段作为基定期技巧保险系统使用该索引,不然该索引将不会被运用,并且应尽大概的让字段顺序与索引顺序相平等。

3.不要写一些未曾意义的查询语句,举例需求生成三个空表构造: 
select col1,col2 into #t from t where 1=0 
那类代码不会再次来到任何结果集,不过会开销系统能源的,可以改成: 
create table #t(...)

4.对此多张大数据量的表JOIN,要先分页再JOIN,不然逻辑读会非常高,质量非常差。

5.别之处都毫不选择select * from t ,用实际的字段列表代替“*”,不要回来用不到的任何字段。

6.尽量行使数字型字段,若只含数值新闻的字段尽量不要设计为字符型,这会缩短查询和连接的品质,并会追加存款和储蓄花销。那是因为引擎在管理查询和三番若干遍时会每一个相比较字符串中每多个字符,而对于数字型来说只供给相比一次就够了。

7.索引实际不是越来越多越好。索引就算能够加强相应的 select 的功用,但同期也下跌了 insert 及 update 的频率,因为 insert 或 update 时有十分大希望会重新组建索引,所以怎么样建索引须求审慎构思,视具体意况而定。三个表的索引数最棒不要当先6个,若太多则应构思部分临时使用到的列上建的目录是还是不是有 必要。

8.Update 语句,假若只改造1、2个字段,不要Update全部字段,不然频仍调用会挑起明显的属性消耗,同不时候带给大气日记。

9.尽可能的选取varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,能够节省存款和储蓄空间,其次对于查询来讲,在一个相持非常的小的字段内搜寻频率明确要高些。

10.尽量利用数字型字段,若只含数值新闻的字段尽量不要设计为字符型,那会减低查询和连接的品质,并会大增存款和储蓄开支。那是因为引擎在管理查询和连接时会每种相比较字符串中每一个字符,而对此数字型来说只须求相比一回就够了。

11.应尽或许的制止更新 clustered 索引数据列,因为 clustered 索引数据列的生龙活虎后生可畏便是表记录的情理存款和储蓄顺序,黄金时代旦该列值退换将促成整个表记录的逐一的调节,会花费一定大的能源。若使用系统要求一再更新 clustered 索引数据列,那么供给思虑是否应将该索引建为 clustered 索引。

12.在新建有的时候表时,借使三回性插入数据量十分的大,那么可以应用 select into 取代 create table,幸免形成大量 log ,以增加速度;假若数据量相当的小,为了温度下落系统表的资源,应先create table,然后insert。

13.尽量选择表变量来代替有的时候表。假诺表变量包涵多量数据,请留意索引非常轻松(唯有主键索引)。

14.在新建有时表时,如若三次性插入数据量非常的大,那么能够使用 select into 代替 create table,防止产生大量 log ,以增长速度;假使数据量超小,为了缓解系统表的财富,应先create table,然后insert。

15. 制止频仍创建和删除有时表,以减掉系统表能源的花销。一时表并不是不行采取,适本地利用它们能够使有个别例程更平价,比如,当供给再一次引用大型表或常用表中的某些数据集时。不过,对于一次性事件, 最佳应用导出表。

16.假使使用到了有的时候表,在存储进程的尾声必须定会将具备的有时表显式删除,先 truncate table ,然后 drop table ,那样能够幸免系统表的较长期锁定。

17.在富有的储存进程和触发器的启幕处安装 SET NOCOUNT ON ,在终止时设置 SET NOCOUNT OFF 。没有供给在试行存款和储蓄进程和触发器的种种语句后向客商端发送 DONE_IN_PROC 消息。

18.利用基于游标的办法或一时表方法此前,应先找找基于集的解决方案来解决难点,基于集的主意日常更实用。

19.与有的时候表同样,游标而不是不足动用。对小型数据集使用 FAST_FO奇骏WA酷路泽D 游标日常要优惠别的逐行管理办法,尤其是在必需引用多少个表技术博取所需的数目时。在结果聚集包含“合计”的例程平常要比使用游标奉行的速度快。如果开拓时 间允许,基于游标的不二等秘书技和基于集的不二等秘书技都足以尝尝一下,看哪意气风发种格局的功效更加好。

20.尽量幸免向顾客端重临大数据量,若数据量过大,应该考虑相应要求是不是创造。

21.尽量制止大事务操作,提升系统现身技艺。

转自:

union all

select id from t where num=20

5.底下的查询也将导致全表扫描:

select id from t where name like '%abc%'

若要提升功用,可以考虑全文字笔迹核算索。

6.in 和 not in 也要慎用,不然会促成全表扫描,如:

select id from t where num in(1,2,3)

对于接二连三的数值,能用 between 就不用用 in 了:

select id from t where num between 1 and 3

7.要是在 where 子句中接受参数,也会产生全表扫描。因为SQL独有在运作时才会深入分析局地变量,但优化程序不能够将拜见陈设的选项推迟到运行时;它必得在编写翻译时打开分选。可是,借使在编写翻译时创建访问布署,变量的值照旧茫然不解的,由此不可能作为目录选拔的输入项。如上面语句将扩充全表扫描:

select id from t where num=@num

能够改为抑遏查询利用索引:

select id from t with(index(索引名)) where num=@num

8.应尽量防止在 where 子句中对字段进行表明式操作,那将变成斯特林发动机扬弃使用索引而进行全表扫描。如:

select id from t where num/2=100

应改为:

select id from t where num=100*2

9.应尽量防止在where子句中对字段实行函数操作,那将引致蒸外燃机吐弃行使索引而开展全表扫描。如:

select id from t where substring(name,1,3)='abc'--name以abc开头的id

select id from t where datediff(day,createdate,'2005-11-30')=0--'2005-11-30'生成的id

应改为:

select id from t where name like 'abc%'

select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

10.而不是在 where 子句中的“=”左边进行函数、算术运算或任何表达式运算,不然系统将大概不可能正确使用索引。

11.在应用索引字段作为基按时,要是该索引是复合索引,那么必得利用到该索引中的第三个字段作为条件时本领保障系统使用该索引,不然该索引将不会被利用,并且应尽恐怕的让字段顺序与索引顺序相平等。

12.并非写一些未曾意思的询问,如需求生成一个空表构造:

select col1,col2 into #t from t where 1=0

那类代码不会回来任何结果集,可是会花费系统能源的,应改成这么:

create table #t(...)

13.浩大时候用 exists 代替 in 是二个好的精选:

select num from a where num in(select num from b)

用下边的说话替换:

select num from a where exists(select 1 from b where num=a.num)

14.实际不是怀有索引对查询都灵验,SQL是依据表中数据来实行查询优化的,当索引列有恢宏数目再度时,SQL查询只怕不会去选拔索引,如一表中有字段sex,male、female差超少各六分之三,那么正是在sex上建了目录也对查询效能起持续效用。

15.索引实际不是更加多越好,索引固然能够升高相应的 select 的功能,但与此同时也减弱了 insert 及 update 的频率,因为 insert 或 update 时有非常大希望会重新建立索引,所以怎么建索引须求谨慎考虑,视具体景况而定。二个表的索引数最佳不用超越6个,若太多则应思虑部分不时使用到的列上建的目录是否有供给。

16.应竭尽的防止更新 clustered 索引数据列,因为 clustered 索引数据列的逐后生可畏便是表记录的情理存款和储蓄顺序,意气风发旦该列值更改将促成整个表记录的各类的调动,会损耗一定大的能源。若选拔系统必要频仍更新 clustered 索引数据列,那么供给构思是不是应将该索引建为 clustered 索引。

17.尽量利用数字型字段,若只含数值信息的字段尽量不要设计为字符型,那会减低查询和连接的性质,并会大增存储耗费。这是因为引擎在拍卖查询和连接时会每一个相比字符串中每多少个字符,而对此数字型来说只供给比较二回就够了。

18.尽大概的选择 varchar/nvarchar 取代 char/nchar ,因为首先变长字段存款和储蓄空间小,能够省去存款和储蓄空间,其次对于查询来讲,在八个绝对十分的小的字段内找出频率明确要高些。

19.别的地点都无须选取 select * from t ,用实际的字段列表代替“*”,不要回来用不到的别的字段。

20.尽量应用表变量来代替不时表。要是表变量满含大批量数据,请留意索引极其常有限(唯有主键索引)。

21.幸免频仍创设和删除有的时候表,以减小系统表能源的损耗。

22.有的时候表并非不可利用,适本地行使它们能够使一些例程更使得,举个例子,当需求再行引用大型表或常用表中的某部数据集时。不过,对于贰次性事件,最佳使用导出表。

23.在新建不时表时,尽管一回性插入数据量十分的大,那么可以选拔 select into 代替 create table,防止变成大批量 log ,以加强速度;尽管数据量相当的小,为了温度下跌系统表的能源,应先create table,然后insert。

24.风流浪漫旦选择到了一时表,在蕴藏进度的末段务一定会将富有的一时表显式删除,先 truncate table ,然后 drop table ,这样可防止止系统表的较长期锁定。

25.尽量防止使用游标,因为游标的频率非常差,假设游标操作的数额超越1万行,那么就应当构思改写。

26.行使基于游标的诀要或临时表方法以前,应先物色基于集的缓慢解决方案来减轻难题,基于集的章程日常更实惠。

27.与不经常表相同,游标实际不是不行选用。对微型数据集使用 FAST_FOTiguanWAHighlanderD 游标平时要优于其余逐行管理办法,非常是在必需援用多少个表能力拿到所需的数码时。在结果聚集满含“合计”的例程平日要比使用游标实行的进度快。假设开拓时间允许,基于游标的方法和依据集的法子都得以尝试一下,看哪生机勃勃种情势的功力越来越好。

28.在富有的蕴藏进度和触发器的开首处设置 SET NOCOUNT ON ,在截至时设置 SET NOCOUNT OFF 。无需在实施存款和储蓄进度和触发器的各样语句后向客商端发送 DONE_IN_PROC 消息。

29.尽量防止向客商端再次来到大数据量,若数据量过大,应该考虑相应必要是还是不是站得住。

30.尽量防止大事务操作,升高系统现身工夫。

31、接纳最适用的字段属性

MySQL能够很好的支撑大数据量的存取,可是普通,数据库中的表越小,在它上边施行的询问也就能够越快。因而,在创建表的时候,为了赢得更加好的习性,大家得以将表中字段的上升的幅度设得尽可能小。比方,在概念邮编那几个字段时,假设将其设置为CHA瑞鹰(255卡塔尔(قطر‎,显明给数据库增添了不供给的空中,以至动用VARCHA奥迪Q3那连串型也是多余的,因为CHAQashqai(6卡塔尔(英语:State of Qatar)就足以很好的落成职分了。相符的,倘诺得以的话,大家相应利用MEDIUMINT实际不是BIGIN来定义整型字段。

除此以外一个进步功效的主意是在或然的气象下,应该尽恐怕把字段设置为NOT NULL,那样在今后实践查询的时候,数据库不用去比较NULL值。

对于一些文本字段,比方“省份”恐怕“性别”,我们能够将它们定义为ENUM类型。因为在MySQL中,ENUM类型被视作数值型数据来管理,而数值型数据被拍卖起来的进程要比文本类型快得多。那样,大家又能够拉长数据库的属性。

32、使用连接(JOIN)来代替子查询(Sub-Queries卡塔尔(قطر‎

MySQL从4.1起来协理SQL的子查询。那个手艺能够运用SELECT语句来创建多个单列的询问结果,然后把这么些结果作为过滤条件用在另三个询问中。举例,大家要将客户为主音信表中并未有其它订单的客商删除掉,就足以利用子查询先从出售消息表中校全部发生订单的客户ID收取来,然后将结果传递给主查询,如下所示:

郑重声明:本文版权归美高梅163888所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。