Call: 0123456789 | Email: info@example.com

MySQL优募化系列之查找优募化,外面衔接、多表结合查询以及查询剩意点


  文字构造:(1)多表查询步步优募化;(2)查询编写的剩意点。

  壹、2017-7-19:

  关于“超父亲型数据尽能努力不要写儿子查询,运用衔接(JOIN)去提交流动它”。

  关于此雕刻壹类的尽结,我们要详细去考量,此雕刻边并不是说壹定。

  1)鉴于在父亲型的数据处理中,儿子查询是什分微少见的,特佩是在查询出产到来的数据需寻求进壹步处理的情景,无论是却读性还是效力上,此雕刻时分的儿子查邑是更优。

  2)条是在壹些特定的场景,却以直接从数据库读取就却以的,譬如壹个表(A表 a,b,c字段,需寻求外面部数据提交集儿子)join己己己的效力必定比放壹个儿子查在where中快得多。却拜见我给的例儿子中的弹奏黑表,密友表(副方彼此喜乐才是密友的表),在查己己己的密友列表的时分,容许弹奏黑列表中。

  文字目次:

  (1)多表查询步步优募化

  根本衔接方法(内衔接、外面衔接以及提交叉衔接)

  内衔接:用比较运算符根据每个表共拥局部列的值婚配两个表中的行(=或>、<)外面衔接之左衔接外面衔接之右衔接外面衔接之全外面衔接提交叉衔接

  超父亲型数据尽能努力不要写儿子查询,运用衔接(JOIN)去提交流动它(基础讲完,讲优募化)

  (3)运用结合(UNION)到来顶替顺手触动创立的临时表确立索伸(下壹篇将详讲)

  (2)查询编写的剩意点

  父亲条约拥有9点,概微见下文。

  壹、多表查询步步优募化:(运用还是之前的数据库的表,商品分类表以及商品概微表)

  此雕刻边写图片描绘

  给出产的数据库拥有根本的数据框架,剩的几个假数据我们就己己己创立吧。剩意此两表是拥有外面键条约束的。

  此雕刻边写图片描绘

  (1)根本衔接方法(内衔接、外面衔接以及提交叉衔接):

  壹)内衔接:用比较运算符根据每个表共拥局部列的值婚配两个表中的行(=或>、<)

  //意思是:检索商品分类表和商品表“分类描绘”相反的行

  select

  d.Good_ID ,

  d.Classify_ID,

  d.Good_Name

  from

  Commodity_list d

  inner join commodity_classification c

  on d.Classify_Description=c.Good_kinds_Name

  违反掉落的满意某壹环境的是A,B外面部的数据;正鉴于违反掉落的是外面部共胸中拥有数据,因此衔接方法称为内衔接。

  此雕刻边写图片描绘

  很容器看出产是两者邑满意才查出产

  此雕刻边写图片描绘

  二)外面衔接之左衔接

  //意思:查得商品分类表的所胸中拥有数据,以及满意环境的商品概微表的数据

  select

  *

  from

  commodity_classification c

  left join commodity_list d

  on d.Classify_Description=c.Good_kinds_Name

  此雕刻边写图片描绘

  却以看到,比值先是左表数据整顿个陈列,然后拥有满意环境的右表数据邑会整顿个陈列出产。若两条右表数据对左表壹条数据,则会用对应好的左表数据补养趾干为壹笔记载。

  此雕刻边写图片描绘

  左衔接破开格提升:

  [left join 容许left outer join(平行同left join)] + [where B.column is null]

  //坚硬是条查分类表数据,条是减去跟商品概微表拥有联绕的数据。

  select

  *

  from

  commodity_classification c

  left join commodity_list d

  on d.Classify_Description=c.Good_kinds_Name

  where d.Classify_Description is null

  此雕刻边写图片描绘

  ?

  此雕刻边写图片描绘

  叁)外面衔接之右衔接

  //意思是查得商品概微表的所胸中拥有数据以及在分类描绘相反环境下的商品分类表数据

  select

  *

  from

  commodity_classification c

  right join commodity_list d

  on d.Classify_Description=c.Good_kinds_Name

  此雕刻边写图片描绘

  与左包恰恰相反,比值先是右表数据整顿个陈列,然后拥有满意环境的左表数据邑会整顿个陈列出产。若两条左表数据对右表壹条数据,则会用对应好的右表数据补养趾干为壹笔记载。

  此雕刻边写图片描绘

  右衔接破开格提升:

  //意思:查询商品概微表的所胸中拥有数据,条是要减去和商品分类表拥有联绕的数据

  select

  *

  from

  commodity_classification c

  right join commodity_list d

  on d.Classify_Description=c.Good_kinds_Name

  where c.Good_kinds_Name is null

  此雕刻边写图片描绘

  四)外面衔接之全外面衔接:

  full join (mysql不顶持,条是却以用 left join union right join顶替)

  select

  *

  from

  commodity_classification c

  left join commodity_list d

  on d.Classify_Description=c.Good_kinds_Name

  union

  select

  *

  from

  commodity_classification c

  right join commodity_list d

  on d.Classify_Description=c.Good_kinds_Name

  此雕刻种场景下违反掉落的是满意某壹环境的公共记载,和独拥局部记载

  此雕刻边写图片描绘

  全外面衔接破开格提升:

  select

  *

  from

  commodity_classification c

  left join commodity_list d

  on d.Classify_Description=c.Good_kinds_Name

  where d.Classify_Description is null

  union

  select

  *

  from

  commodity_classification c

  right join commodity_list d

  on d.Classify_Description=c.Good_kinds_Name

  where c.Good_kinds_Name is null

  此雕刻种场景下违反掉落的是A,B中不称心趾某壹环境的记载之和.

  此雕刻边写图片描绘

  整顿个壹道列出产:免去重骈项

  此雕刻边写图片描绘

  五)提交叉衔接:

  提交叉联接前往左表中的所拥有行,左表中的每壹行与右表中的所拥有行构成。提交叉联接也称干笛卡尔积。 FROM 儿子句子中的表或视图却经度过内联接或完整顿外面部联接按恣意以次指定;条是,用左或右向外面联接指定表或视图时,表或视图的以次很要紧。拥关于运用左或右向外面联接老列表的更多信息,请拜见运用外面联接。

  拥有两种情景,露式的和凹隐式的,不带ON儿子句子,前往的是两表的迨积,也叫笛卡尔积。

  1. 第壹种方法(露式的提交叉衔接):A,B表记载的老列构成,即笛卡男积。

  //却以看到

  select

  *

  from

  commodity_classification c

  cross join commodity_list d

  123456

  此雕刻边写图片描绘

  增补养:cross join却指定环境 (where)

  select

  *

  from

  commodity_classification c

  cross join commodity_list d

  where c.Good_kinds_Name=d.Classify_Description

  相当于完成内衔接干用了。

  此雕刻边写图片描绘

  2. 第二种方法:(凹隐式的提交叉衔接,没拥有拥有CROSS JOIN)

  就跟正下面的效实壹样的语句子啦!

  select

  *

  from

  commodity_classification c,

  commodity_list d

  where c.Good_kinds_Name=d.Classify_Description

  mysql对sql语句子的容错效实,即在sql语句子不完整顿适宜书写建议的情景,mysql会容许此雕刻种情景,尽能说皓它:

  1)普畅通cross join前面加以上where环境,条是用cross join+on亦被说皓为cross join+where;

  2)普畅通内衔接邑需寻求加以上on限环境,如次面场景壹;假设不加以会被说皓为提交叉衔接;

  3)假设衔接表格运用的是逗号,会被说皓为提交叉衔接;

  注:sql规范中还拥有union join和natural inner join,mysql不顶持,同时本身也没拥有拥有多父亲意思,其结实却以用下面的几种衔接方法违反掉落。

  (2)超父亲型数据尽能努力不要写儿子查询,运用衔接(JOIN)去提交流动它(基础讲完,讲优募化):

  儿子查询:

  定义:在壹个表表臻中却以调用另壹个表表臻式,此雕刻个被调用的表表臻式叫做儿子查询(subquery),也称干儿子选择(subselect)或内嵌选择(inner select)。儿子查询的结实转提交给调用它的表表臻式持续处理。

  //很骈杂的意思:坚硬是根据商品id查商品概微表,然后用查出产到来的ID去查商品分类表。

  select

  *

  from

  commodity_classification c

  where Classify_ID IN(select Classify_ID from commodity_list where Good_ID=’tb10025584930′)

  123456

  运用JOIN终止优募化:

  select

  *

  from

  commodity_classification c

  left join commodity_list d on d.Classify_ID=c.Classify_ID

  where d.Good_ID=’tb10025584930′

  (3)运用结合(UNION)到来顶替顺手触动创立的临时表

  UNION是会把结实排前言的!!!

  union查询,它却以把需寻求运用临时表的两条或更多的select查询侵犯的壹个查询中(即把两次或累次查询结实侵犯宗到来。)。在客户端的查询会话完一齐的时分,临时表会被己触动删摒除,从而保障数据库等于、高效。运用union到来创立查询的时分,我们条需寻求用UNION干为关键字把多个select语句子衔接宗到来就却以了,要剩意的是所拥有select语句子中的字段数量要想同。

  #

  要寻求:两次查询的列数必须不符

  伸荐:列的典型却以不比样,但伸荐查询的每壹列,想对应的典型以壹样

  却以后到己多张表的数据:累次sql语句子取出产的列名却以不不符,此雕刻以第壹个sql语句子的列名为准。

  假设不一的语句子中取出产的行,拥有完整顿相反(此雕刻边体即兴的是每个列的值邑相反),这么union会将相反的行侵犯,终极条管壹行。也却以此雕刻么了松,union会免去落重骈的行。

  假设不想免去落重骈的行,却以运用union all。

  假设儿子句子中拥有order by,limit,需用括号()包宗到来。伸荐放到所拥有儿子句子之后,即对终极侵犯的结实到来排前言或选择。

  select

  Classify_ID,Good_kinds_Name

  from

  commodity_classification

  union

  select

  Classify_ID,Classify_Description

  from

  commodity_list

  //加以环境

  (select

  Classify_ID,Good_kinds_Name

  from

  commodity_classification

  order by Classify_ID)

  union

  (select

  Classify_ID,Classify_Description

  from

  commodity_list

  order by Good_ID)

  //日日操干的含义:列出产所拥有在中国和美国的不一的干事名

  SELECT E_Name FROM Employees_China

  UNION

  SELECT E_Name FROM Employees_USA

  剩意:

  1、UNION 结实集儿子合的列名尽是等于第壹个 SELECT 语句子中的列名

  2、UNION 外面部的 SELECT 语句子必须拥拥有相反数的列。列也必须拥拥有相像的数据典型。同时,每条 SELECT 语句子中的列的以次必须相反

  UNION ALL的干用和语法:

  默许地,UNION 操干符拔取不一的值。假设容许重骈的值,请运用 UNION ALL。当 ALL 遂 UNION 壹道运用时(即 UNION ALL),不免去重骈行。

  select

  Classify_ID,Good_kinds_Name

  from

  commodity_classification

  union ALL

  select

  Classify_ID,Classify_Description

  from

  commodity_list

  不删摒除反副数据

  此雕刻边写图片描绘

  (4)确立索伸(下壹篇将详讲)

  二、查询编写的剩意点:

  (1)对查询终止优募化,要充分备止全表扫描,比值先应考虑在 where 及 order by 触及的列上确立索伸。(索伸的剩意点不才篇将详讲)

  (2)应充分备止在 where 儿子句子中对字段终止 null 值判佩,不然将招致伸擎僵持运用索伸而终止全表扫描,如:

  //最好不要给数据库剩NULL,尽能的运用 NOT NULL堵空数据库.

  select id from t where num is null

  凡例、描绘、评论之类的却以设置为 NULL,其他最好不要运用NULL。

  不要认为 NULL 不需寻求当空,譬如:char(100) 型,在字段树即时,当空就永恒了, 无论能否拔出产值(NULL也包罗在内),邑是占用 100个字符的当空的,假设是varchar此雕刻么的变长字段, null 不占用当空。

  却以在num上设置默许值0,确保表中num列没拥有拥有null值,然后此雕刻么查询:

  select id from t where num=0

  (3)in 和 not in 也要慎用,不然会招致全表扫描,如:

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

  1

  关于就续的数值,能用 between 就不要用 in 了:

  select id from t where num between 1 and 3

  很多时分用 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)

  (4)下面的查询也将招致全表扫描:

  select id from t where name like ‘%abc%’

  若要提高效力,却以考虑全文检索。

  (5)充分运用数字型字段,若条含数值信息的字段充分不要设计为字符型,此雕刻会投降低查询和衔接的干用,并会添加以存放储开销。此雕刻是鉴于伸擎在处理查询和包 接时会逐壹比较字符串中每壹个字符,而关于数字型而言条需寻求比较壹次就够了。

  (6)任何中邑不要运用 select * from t ,用详细的字段列表顶替“*”,不要前往用不到的任何字段。

  (7)充分运用表变量到来顶替临时表。假设表变量包罗微少量数据,请剩意索伸什分拥有限(条要主键索伸)。

  (8)在Join表的时分运用相当典型的例,并将其索伸

  假设你的运用以次拥有很多 JOIN 查询,你应当确认两个表中Join的字段是被建度过索伸的。此雕刻么,MySQL外面部会展触动为你优募化Join的SQL语句子的机制。

  同时,此雕刻些被用到来Join的字段,应当是相反的典型的。比如:假设你要把 DECIMAL 字段和壹个 INT 字段Join在壹道,MySQL就无法运用它们的索伸。关于那些STRING典型,还需寻求拥有相反的字符集儿子才行。(两个表的字符集儿子拥有能不比样)

  //在state中查找company

  SELECT company_name FROM users

  LEFT JOIN companies ON (users.state=companies.state)

  WHERE users.id=$user_id”

  //两个 state 字段应当是被建度过索伸的,同时应当是相当的典型,相反的字符集儿子

  12345

  (9)查询索伸中的sql语句子拥有很多考据,不才篇文字我们将详细讨论。

  源码下载:数据库文件下载

  <

Have any Question or Comment?

发表评论

电子邮件地址不会被公开。 必填项已用*标注


Fatal error: Maximum execution time of 30 seconds exceeded in D:\www\ukkooL.com\wp-includes\wp-db.php on line 1924