where条件关键字的界别详解

2019-05-07 04:12 来源:未知

LEFT JOIN 关键字会从左表 (table_name壹) 这里回来全体的行,即便在右表 (table_name二) 中尚无相配的行。

数据库中left join,right join,inner join的不相同

 

数据库中left join,right join,inner join的异样

 

LEFT JOIN 关键字语法

切实详细表明

总的看:

  • JOIN:                                                                    有同盟的就赶回。
    • LEFT JOIN:                                                          右表中并未有,没提到,小编左表的整个回到。
    • HavalIGHT JOIN:                                                        左表中从不就空着,右表的上上下下回到。
    • FULL JOIN:                                                          俩表中有三个就回到。

常用的来讲,inner join,left join,在那之中inner join 平时省略了。

 

切切实实详尽表明

总的来讲:

  • JOIN:                                                                    有优秀的就重返。
    • LEFT JOIN:                                                          右表中从未,没涉及,小编左表的总体回来。
    • 哈弗IGHT JOIN:                                                        左表中从不就空着,右表的漫天回来。
    • FULL JOIN:                                                          俩表中有四个就回来。

常用的来讲,inner join,left join,当中inner join 平常省略了。

 

SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

1、内连接(等值连接)

将四个表中留存连结关系的字段符合连接条件的记录产生记录集。只回去八个表中联合字段相等的行

Select A.name,B.name from A inner join B on A.id=B.id和

Select A.name,B.name from A,B where A.id=B.id结果是平等的(内连接的inner关键字可粗略);

在表中留存至少1个男才女貌时,INNEENCOREJOIN 关键字再次回到行。

INNEPRADO JOIN 关键字语法

SELECT column_name(s)

FROM table_name1

INNER JOIN table_name2

ON table_name1.column_name=table_name2.column_name

 

二、外接连:分为左外连接和右外连接

left join左连接A、B表结果包涵A的整套记下和符合条件的B的记录。重回包蕴左表中的全部记录和右表中联合字段相等的笔录。

Select A.name,B.name from A Left Join B on A.id=B.id

其间LEFT JOIN 关键字会从左表 (table_name1) 这里回来全部的行,就算在右表 (table_name贰) 中未有匹配的行。

LEFT JOIN 关键字语法

SELECT column_name(s)

FROM table_name1

LEFT JOIN table_name2

ON table_name1.column_name=table_name2.column_name

接连常常能够在select语句的from子句或where子句中确立,其语法格式为:

select colunm_name1,colunm_name2

from table_name1

left join table_name2

on table_name1.colunmname=table_name2.colunmname

其中join_table建议参预连接操作的表名,连接能够对同二个表操作,也能够对多表操作,对同一个表操作的连日称为自连接, join_type 为总是类型,能够是left join 大概right join 可能inner join 。

 

left join与where共同使用

select a.*,b.*

from table1 a

left join table2 b on b.X=a.X

where XXX

如上:1旦选拔了left join,未有where条件时,左表table一会突显全体内容。使用了where,唯有满足where条件的记录才会议及展览示(左表展现部分也许全体不显得)

so。。。。

left join的狐疑:1旦增长where条件,则显得的结果十分inner join 

 

缘由剖析:

数据库在通过三番五次两张或多张表来回到记录时,都会生成一张中间的一时半刻表,然后再将那张近年来表重临给用户;

where条件是在近日表生成好后,再对一时半刻表进行过滤的典型;

所以:where 条件丰盛,已经未有left join的意思(必须回到右侧表的笔录)了,条件不为真的就全体过滤掉。 

 

消除方案:

一、where过滤结果作为子查询,和主表left,如下:

select a.*,tmp.*from table1 aleft join(

    select a.*,b.*

    from table1 a

    left join table2 b on b.X=a.X

    where XXX

)tmp

很明显,子查询语句无论 left join、inner join都没啥不相同了

二、查询条件放在on前面

select a.*,b.*

from table1 a

left join table2  b

       on b.X=a.X and XXX

注意:where XXX去掉,改为链接条件on后边的 and XXX

分析:on条件是在转移权且表时使用的规范化,它不管on中的条件是还是不是为真,都会回来左边表中的笔录。

结论:过滤条件放在:

where后边:是先连接然生成一时查询结果,然后再筛选。

on前边:先依照条件过滤筛选,再连 生成暂时查询结果。

对此left join,不管on前边跟什么标准,左表的数额总体查出来,由此要想过滤需把标准放到where后面

对于inner join,满意on后边的准绳表的数目技艺搜查缴获,能够起到过滤效果。也能够把标准放到where前面。

 

1、内延续(等值连接)

将多个表中存在连结关系的字段符合连接条件的笔录形成记录集。只回去多个表中联合字段相等的行

Select A.name,B.name from A inner join B on A.id=B.id和

Select A.name,B.name from A,B where A.id=B.id结果是均等的(内接二连三的inner关键字可总结);

在表中设有至少三个卓殊时,INNE奥德赛JOIN 关键字重临行。

INNE奥德赛 JOIN 关键字语法

SELECT column_name(s)

FROM table_name1

INNER JOIN table_name2

ON table_name1.column_name=table_name2.column_name

 

二、外接连:分为左外连接和右外连接

left join左连接A、B表结果包涵A的方方面面记下和符合条件的B的笔录。重返包蕴左表中的全部记录和右表中群集字段相等的笔录。

Select A.name,B.name from A Left Join B on A.id=B.id

中间LEFT JOIN 关键字会从左表 (table_name一) 这里回来全体的行,固然在右表 (table_name二) 中未有相称的行。

LEFT JOIN 关键字语法

SELECT column_name(s)

FROM table_name1

LEFT JOIN table_name2

ON table_name1.column_name=table_name2.column_name

三番五次平时能够在select语句的from子句或where子句中树立,其语法格式为:

select colunm_name1,colunm_name2

from table_name1

left join table_name2

on table_name1.colunmname=table_name2.colunmname

其中join_table提议参与连接操作的表名,连接能够对同2个表操作,也能够对多表操作,对同叁个表操作的连天称为自连接, join_type 为总是类型,能够是left join 可能right join 或许inner join 。

 

left join与where共同利用

select a.*,b.*

from table1 a

left join table2 b on b.X=a.X

where XXX

如上:一旦选用了left join,没有where条件时,左表table壹会呈现全部内容。使用了where,唯有满意where条件的记录才会来得(左表彰显部分可能全体不显得)

so。。。。

left join的迷离:一旦拉长where条件,则显得的结果卓殊inner join 

 

缘由剖析:

数据库在通过接二连三两张或多张表来回到记录时,都会生成一张中间的近期表,然后再将那张最近表再次来到给用户;

where条件是在一时半刻表生成好后,再对一时半刻表举办过滤的尺码;

由此:where 条件丰富,已经远非left join的意思(必须再次回到右侧表的记录)了,条件不为真的就全体过滤掉。 

 

焚林而猎方案:

1、where过滤结果作为子查询,和主表left,如下:

select a.*,tmp.*from table1 aleft join(

    select a.*,b.*

    from table1 a

    left join table2 b on b.X=a.X

    where XXX

)tmp

很显眼,子查询语句无论 left join、inner join都没啥分裂了

二、查询条件放在on后边

select a.*,b.*

from table1 a

left join table2  b

       on b.X=a.X and XXX

注意:where XXX去掉,改为链接条件on前边的 and XXX

分析:on条件是在转换权且表时使用的规则,它不管on中的条件是还是不是为真,都会重回左边表中的笔录。

结论韦德国际1946官网,:过滤条件放在:

where后边:是先连接然生成如今查询结果,然后再筛选。

on前边:先依据条件过滤筛选,再连 生成一时半刻查询结果。

对于left join,不管on前面跟什么条件,左表的数码总体查出来,由此要想过滤需把尺度放到where前面

对此inner join,知足on前边的标准化表的数量手艺意识到,能够起到过滤效果。也能够把原则放到where前边。

 

解说:在好几数据库中, LEFT JOIN 称为 LEFT OUTEEscort JOIN。

on、where、having的区别

   on、where、having那三个都足以加条件的子句中,on是初次试行,where次之,having最终。有时候借使这先后顺序不影响中间结果的话,那最后结出是同一的。

  但因为on是先把不符合条件的记录过滤后才开始展览总计,它就足以减掉中间运算要拍卖的多少,按理说应该速度是最快的。       

   在多少个表联接时才用on的,所以在三个表的时候,就剩下where跟having相比了。在那单表查询总括的气象下,借使要过滤的标准化从不关系到要总结字段,那它们的结果是一致的。  
   若是要提到到总括的字段,就意味着在没总计此前,那一个字段的值是不分明的,根据上篇写的做事流程,where的作用时间是在测算以前就产生的,而having正是在总结后才起效果的,所以在那种景况下,两者的结果会不相同。     
   在多表联接查询时,on比where更早起作用。系统率先依照各类表之间的交接条件,把八个表合成一个一时表后,再由where进行过滤,然后再总括,总计完后再由having实行过滤。

  综上说述,要想过滤条件起到科学的功效,首先要明了这么些原则应该在哪天起效果,然后再决定放在那里  

 

 

 

规范的模板

select * from (

select 表A.*,表B.*

from 表A  left join 表B on 表A.x=表B.x )

where 表A.y<>表B.y or 表B.x is null;

 

left join是以A表的记录为根基的,A能够看做左表,B能够看做右表,left join是以左表为准的。

换句话说,左表(A)的记录将会全部意味出来,而右表(B)只会议及展览示符合查找条件的记录(例子中为: A.aID = B.bID)。B表记录不足的地点均为NULL。

 

right join右连接A、B表的结果和左连接B、A的结果是同样的,再次来到包涵右表中的全体记录和左表中集结字段相等的笔录。也等于说:

Select A.name,B.name from B Right Join A on B.id-A.id试行后的结果是同等的。

ENVISIONIGHT JOIN 关键字会右表 (table_name二) 这里回来全部的行,就算在左表 (table_name1) 中未有相称的行。

福特ExplorerIGHT JOIN 关键字语法

SELECT column_name(s)

FROM table_name1

RIGHT JOIN table_name2

ON table_name1.column_name=table_name2.column_name

 

一个误区:

想查询B表中的全数type为一的数据,A表中得知一些字段参加到B结果中。

正如下上面两句SQL

1.select * from A right join B on B.type=1 where A.id=B.aid;

2.select * from B left join A on A.id=B.aid where B.type=1 ;

本身原本是按第三句写的,结果出来时,小编以为很奇异。为啥right join,不能够把右钟表里type为一的数目总体收获出来。

 

率先句,先进行on部分,查出了全数B的数据,然后和A举办右连接,最终依照标准A.id=B.aid,筛选数据,那样借使不满意A.id=B.aid的数码,将会从结果中去除,包蕴B的数额!

其次句,先推行on部分,查出A中具备满意A.id=B.aid的数量,再拓展左连接,最终依据type=一做筛选。

可知,第一句sql才是不错的法子。

 

 

on、where、having的区别

   on、where、having那四个都能够加条件的子句中,on是初次施行,where次之,having最终。有时候倘诺那先后顺序不影响中间结果的话,那最终结出是壹致的。

  但因为on是先把不符合条件的记录过滤后才开始展览总括,它就足以减弱中间运算要拍卖的多少,按理说应该速度是最快的。       

   在七个表联接时才用on的,所以在叁个表的时候,就剩下where跟having相比较了。在那单表查询计算的气象下,要是要过滤的标准尚未提到到要总结字段,那它们的结果是千篇一律的。  
   如若要提到到总括的字段,就意味着在没总结在此之前,那一个字段的值是不分明的,依照上篇写的干活流程,where的功能时间是在总括以前就形成的,而having正是在图谋后才起效果的,所以在那种景色下,两者的结果会不一样。     
   在多表联接查询时,on比where更早起功效。系统率先依照各种表之间的连通条件,把七个表合成3个一时半刻表后,再由where进行过滤,然后再总括,总结完后再由having实行过滤。

  简单来讲,要想过滤条件起到科学的作用,首先要清楚这几个规范应该在几时起成效,然后再决定放在这里  

 

 

 

正式的沙盘

select * from (

select 表A.*,表B.*

from 表A  left join 表B on 表A.x=表B.x )

where 表A.y<>表B.y or 表B.x is null;

 

left join是以A表的记录为根基的,A能够看做左表,B能够看做右表,left join是以左表为准的。

换句话说,左表(A)的记录将集会场全部象征出来,而右表(B)只会议及展览示符合查找条件的记录(例子中为: A.aID = B.bID)。B表记录不足的地点均为NULL。

 

right join右连接A、B表的结果和左连接B、A的结果是一致的,再次来到包罗右表中的全体记录和左表中集结字段相等的笔录。相当于说:

Select A.name,B.name from B Right Join A on B.id-A.id实施后的结果是如出壹辙的。

福睿斯IGHT JOIN 关键字会右表 (table_name二) 这里回来全数的行,固然在左表 (table_name一) 中从未匹配的行。

纳瓦拉IGHT JOIN 关键字语法

SELECT column_name(s)

FROM table_name1

RIGHT JOIN table_name2

ON table_name1.column_name=table_name2.column_name

 

一个误区:

想查询B表中的全数type为1的数码,A表中摸清一些字段出席到B结果中。

相比下下边两句SQL

1.select * from A right join B on B.type=1 where A.id=B.aid;

2.select * from B left join A on A.id=B.aid where B.type=1 ;

自家原来是按第二句写的,结果出来时,作者认为很奇怪。为啥right join,无法把左侧表里type为1的数额总体取得出来。

 

首先句,先进行on部分,查出了全体B的数码,然后和A举办右连接,最终依据标准A.id=B.aid,筛选数据,那样1旦不满意A.id=B.aid的多少,将会从结果中去除,包含B的多寡!

其次句,先进行on部分,查出A中全数满意A.id=B.aid的数额,再开始展览左连接,最后依据type=1做筛选。

可知,第叁句sql才是没有错的章程。

 

 

创立两张表并插入一些数目

3,全连接Full join

如若个中某些表存在合作,FULL JOIN 关键字就可以重临行。

FULL JOIN 关键字语法

SELECT column_name(s)

FROM table_name1

FULL JOIN table_name2

ON table_name1.column_name=table_name2.column_name

 

上面列出了这多少个能够接纳的 JOIN 类型,以及它们中间的区别。

  • JOIN: 倘若表中有最少一个金童玉女,则重回行
  • LEFT JOIN: 即使右表中并未有相配,也从左表重返全体的行
  • 凯雷德IGHT JOIN: 纵然左表中绝非匹配,也从右表再次回到全数的行
  • FULL JOIN: 只要在那之中三个表中存在突出,就重回行

 

 

 

 

 多余:

3表联结查询

select username,psw,gname,tel from (t1 left join t2 on t1.t1_id=t2.t1_id) left join t3 on t1.t1_id=t3.t1_id

 

多少个表音讯:

tems:商品表,item_visit_stats:商品访问表,item_trade_stats:商品出售表

 

SELECT i.num_iid, i.title, i.price, SUM(iv.user_visits) AS uv,it.buyer_num,it.item_num,it.item_num*i.price AS turnover
FROM (

items AS i RIGHT JOIN item_visit_stats AS iv ON i.num_iid=iv.num_iid)
LEFT JOIN (

SELECT num_iid,SUM(buyer_num) AS buyer_num,SUM(item_num) AS item_num FROM item_trade_stats
WHERE seller_nick="XXXX" AND business_day BETWEEN '2017-08-14' AND '2017-08-15' GROUP BY num_iid)
AS it ON it.num_iid=iv.num_iid 
WHERE i.nick="XXXX" AND iv.business_day BETWEEN '2017-08-14' AND '2017-08-15'
GROUP BY i.num_iid ORDER BY uv DESC

 

3,全连接Full join

只要当中有个别表存在万分,FULL JOIN 关键字就能重返行。

FULL JOIN 关键字语法

SELECT column_name(s)

FROM table_name1

FULL JOIN table_name2

ON table_name1.column_name=table_name2.column_name

 

上边列出了那多少个能够使用的 JOIN 类型,以及它们中间的出入。

  • JOIN: 假诺表中有起码二个男才女貌,则重临行
  • LEFT JOIN: 即便右表中并未有相称,也从左表重返全体的行
  • 奥迪Q三IGHT JOIN: 纵然左表中未有相称,也从右表再次回到全部的行
  • FULL JOIN: 只要个中三个表中存在至极,就重返行

 

 

 

 

 多余:

3表联结查询

select username,psw,gname,tel from (t1 left join t2 on t1.t1_id=t2.t1_id) left join t3 on t1.t1_id=t3.t1_id

 

多少个表消息:

tems:商品表,item_visit_stats:商品访问表,item_trade_stats:商品出卖表

 

SELECT i.num_iid, i.title, i.price, SUM(iv.user_visits) AS uv,it.buyer_num,it.item_num,it.item_num*i.price AS turnover
FROM (

items AS i RIGHT JOIN item_visit_stats AS iv ON i.num_iid=iv.num_iid)
LEFT JOIN (

SELECT num_iid,SUM(buyer_num) AS buyer_num,SUM(item_num) AS item_num FROM item_trade_stats
WHERE seller_nick="XXXX" AND business_day BETWEEN '2017-08-14' AND '2017-08-15' GROUP BY num_iid)
AS it ON it.num_iid=iv.num_iid 
WHERE i.nick="XXXX" AND iv.business_day BETWEEN '2017-08-14' AND '2017-08-15'
GROUP BY i.num_iid ORDER BY uv DESC

 

create table class(
 class_id int,
 class_name varchar(20),
 class_grade char(1)
);
insert into class values (1,'语文','A');
insert into class values (2,'数学','B');
insert into class values (3,'英语','C');
create table score(
 class_id int,
 stu_id varchar(20),
 Score int
);
insert into score values (1,'A001',91);
insert into score values (2,'A001',95);
insert into score values (1,'A002',82);
insert into score values (2,'A002',87);
insert into score values (3,'B003',65);

翻看表中的数据

mysql> select * from class;
 ---------- ------------ ------------- 
| class_id | class_name | class_grade |
 ---------- ------------ ------------- 
|    1 | 语文    | A      |
|    2 | 数学    | B      |
|    3 | 英语    | C      |
 ---------- ------------ ------------- 
3 rows in set (0.00 sec)
mysql> select * from score;
 ---------- -------- ------- 
| class_id | stu_id | Score |
 ---------- -------- ------- 
|    1 | A001  |  91 |
|    2 | A001  |  95 |
|    1 | A002  |  82 |
|    2 | A002  |  87 |
|    3 | B003  |  65 |
 ---------- -------- ------- 
5 rows in set (0.00 sec)
mysql>

正如下边几组查询结果

--即使你对left join丰裕熟识的话,先不用看结果,是或不是足以一贯表露上面查询的结果

mysql> select * from class A left join score B on A.class_id=B.class_id;
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    1 | 语文    | A      |    1 | A001  |  91 |
|    2 | 数学    | B      |    2 | A001  |  95 |
|    1 | 语文    | A      |    1 | A002  |  82 |
|    2 | 数学    | B      |    2 | A002  |  87 |
|    3 | 英语    | C      |    3 | B003  |  65 |
 ---------- ------------ ------------- ---------- -------- ------- 
5 rows in set (0.00 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id and 1=1;
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    1 | 语文    | A      |    1 | A001  |  91 |
|    2 | 数学    | B      |    2 | A001  |  95 |
|    1 | 语文    | A      |    1 | A002  |  82 |
|    2 | 数学    | B      |    2 | A002  |  87 |
|    3 | 英语    | C      |    3 | B003  |  65 |
 ---------- ------------ ------------- ---------- -------- ------- 
5 rows in set (0.01 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id and 1=0;
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    1 | 语文    | A      |   NULL | NULL  | NULL |
|    2 | 数学    | B      |   NULL | NULL  | NULL |
|    3 | 英语    | C      |   NULL | NULL  | NULL |
 ---------- ------------ ------------- ---------- -------- ------- 
3 rows in set (0.00 sec)
mysql> select * from class A left join score B on 1=0;
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    1 | 语文    | A      |   NULL | NULL  | NULL |
|    2 | 数学    | B      |   NULL | NULL  | NULL |
|    3 | 英语    | C      |   NULL | NULL  | NULL |
 ---------- ------------ ------------- ---------- -------- ------- 
3 rows in set (0.00 sec)

mysql> left join的最要紧特色是:不管on前边是如何标准,都会回去左表中的全体行!

mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='语文';
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    1 | 语文    | A      |    1 | A001  |  91 |
|    1 | 语文    | A      |    1 | A002  |  82 |
|    2 | 数学    | B      |   NULL | NULL  | NULL |
|    3 | 英语    | C      |   NULL | NULL  | NULL |
 ---------- ------------ ------------- ---------- -------- ------- 
4 rows in set (0.00 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='数学';
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    2 | 数学    | B      |    2 | A001  |  95 |
|    2 | 数学    | B      |    2 | A002  |  87 |
|    1 | 语文    | A      |   NULL | NULL  | NULL |
|    3 | 英语    | C      |   NULL | NULL  | NULL |
 ---------- ------------ ------------- ---------- -------- ------- 
4 rows in set (0.00 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='英语';
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    3 | 英语    | C      |    3 | B003  |  65 |
|    1 | 语文    | A      |   NULL | NULL  | NULL |
|    2 | 数学    | B      |   NULL | NULL  | NULL |
 ---------- ------------ ------------- ---------- -------- ------- 
3 rows in set (0.01 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='体育';
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    1 | 语文    | A      |   NULL | NULL  | NULL |
|    2 | 数学    | B      |   NULL | NULL  | NULL |
|    3 | 英语    | C      |   NULL | NULL  | NULL |
 ---------- ------------ ------------- ---------- -------- ------- 
3 rows in set (0.00 sec)
mysql>

借使on前面包车型大巴标准是左表中的列(and leftTable.colName='***'),左表中满意条件的行和右表中的行开始展览相配(遵照on leftTable.id=rightTable.id);左表中不满足条件的行,直接出口,其相应的右表中的列皆以null。

mysql> select * from class A left join score B on A.class_id=B.class_id and B.Score=90;
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    1 | 语文    | A      |   NULL | NULL  | NULL |
|    2 | 数学    | B      |   NULL | NULL  | NULL |
|    3 | 英语    | C      |   NULL | NULL  | NULL |
 ---------- ------------ ------------- ---------- -------- ------- 
3 rows in set (0.01 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id and B.Score=65;
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    3 | 英语    | C      |    3 | B003  |  65 |
|    1 | 语文    | A      |   NULL | NULL  | NULL |
|    2 | 数学    | B      |   NULL | NULL  | NULL |
 ---------- ------------ ------------- ---------- -------- ------- 
3 rows in set (0.01 sec)
mysql>

只要on后边的规范是右表中的列(and rightTable.colName='***'),首先会基于(and rightTable.colName='***')过滤掉右表中不满意条件的行;然后,左表中的行依据(on leftTable.id=rightTable.id)和右表中满足条件的行开始展览相称。

mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='语文' and B.Score=90;
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    1 | 语文    | A      |   NULL | NULL  | NULL |
|    2 | 数学    | B      |   NULL | NULL  | NULL |
|    3 | 英语    | C      |   NULL | NULL  | NULL |
 ---------- ------------ ------------- ---------- -------- ------- 
3 rows in set (0.00 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='语文' and B.Score=91;
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    1 | 语文    | A      |    1 | A001  |  91 |
|    2 | 数学    | B      |   NULL | NULL  | NULL |
|    3 | 英语    | C      |   NULL | NULL  | NULL |
 ---------- ------------ ------------- ---------- -------- ------- 
3 rows in set (0.01 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='体育' and B.Score=90;
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    1 | 语文    | A      |   NULL | NULL  | NULL |
|    2 | 数学    | B      |   NULL | NULL  | NULL |
|    3 | 英语    | C      |   NULL | NULL  | NULL |
 ---------- ------------ ------------- ---------- -------- ------- 
3 rows in set (0.00 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id and A.class_name='体育' and B.Score=82;
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    1 | 语文    | A      |   NULL | NULL  | NULL |
|    2 | 数学    | B      |   NULL | NULL  | NULL |
|    3 | 英语    | C      |   NULL | NULL  | NULL |
 ---------- ------------ ------------- ---------- -------- ------- 
3 rows in set (0.00 sec)
mysql>

/**********************过滤条件在on中时**********************/

小结一下,假如 left join on leftTable.id=rightTable.id 后还有别的规范化:

(1)and leftTable.colName='***',过滤左表,不过左表不满意条件的行直接出口,并将右表对应部分置为null
(2)and rightTable.colName='***',过滤右表,对左表未有影响
(3)and leftTable.colName='***' and rightTable.colName='***',正是地方(一)和(贰)一同发挥效用

不管on后边有怎么样规范,left join都要回来左表中的全体行!

mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='语文';
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    1 | 语文    | A      |    1 | A001  |  91 |
|    1 | 语文    | A      |    1 | A002  |  82 |
 ---------- ------------ ------------- ---------- -------- ------- 
2 rows in set (0.01 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='数学';
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    2 | 数学    | B      |    2 | A001  |  95 |
|    2 | 数学    | B      |    2 | A002  |  87 |
 ---------- ------------ ------------- ---------- -------- ------- 
2 rows in set (0.00 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='英语';
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    3 | 英语    | C      |    3 | B003  |  65 |
 ---------- ------------ ------------- ---------- -------- ------- 
1 row in set (0.00 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='体育';
Empty set (0.00 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id where B.Score=90;
Empty set (0.01 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id where B.Score=91;
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    1 | 语文    | A      |    1 | A001  |  91 |
 ---------- ------------ ------------- ---------- -------- ------- 
1 row in set (0.00 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='语文' and B.Score=90;
Empty set (0.00 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='语文' and B.Score=91;
 ---------- ------------ ------------- ---------- -------- ------- 
| class_id | class_name | class_grade | class_id | stu_id | Score |
 ---------- ------------ ------------- ---------- -------- ------- 
|    1 | 语文    | A      |    1 | A001  |  91 |
 ---------- ------------ ------------- ---------- -------- ------- 
1 row in set (0.00 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='体育' and B.Score=90;
Empty set (0.00 sec)
mysql> select * from class A left join score B on A.class_id=B.class_id where A.class_name='体育' and B.Score=91;
Empty set (0.00 sec)
mysql>

/**********************过滤条件在where中时**********************/

过滤条件写在where中时,先根据where条件对表举行过滤,然后再进行left join

总结

如上所述是作者给我们介绍的sql中的left join及on、where关键字的分别详解,希望对我们全部帮忙,如若我们有任何疑问请给笔者留言,作者会及时苏醒大家的。在此也十二分谢谢大家对台本之家网址的支撑!

你或然感兴趣的篇章:

  • 解析sql语句中left_join、inner_join中的on与where的区别
  • 解析mysql left( right ) join使用on与where筛选的差距
  • MySQL Left JOIN时钦赐NULL列再次来到特定值详解
  • mysql not in、left join、IS NULL、NOT EXISTS 作用难点记录
  • sql 左连接和右连接的利用技术(left join and right join)
  • 超详细mysql left join,right join,inner join用法分析
TAG标签: 韦德娱乐1946
版权声明:本文由韦德娱乐1946_韦德娱乐1946网页版|韦德国际1946官网发布于韦德国际1946官网,转载请注明出处:where条件关键字的界别详解