join用法深入分析,常用sql语法初级

博主在专门的职业中,平时须要运用sql语句来进行查询,总计开掘,灵活使用那多少个主题,就足以应付大多数简约情状。

1、内联接(规范的连结运算,使用像 =  或 <> 之类的可比运算符)。包涵相等联接和自然联接。    
内连接使用相比运算符依据各样表共有的列的值相配多个表中的行。举个例子,检索 students和courses表中学子标暗记雷同的具备行。  
   
2、外联接。
外联接能够是左向外对接、右向外对接或完整外界联接。    
在 FROM子句中钦赐外联接时,能够由下列几组第一字中的黄金年代组钦点:    
1)LEFT  JOIN或LEFT OUTER JOIN    
左向外对接的结果集富含  LEFT OUTE君越子句中钦命的左表的有着行,而不光是联接列所匹配的行。假使左表的某行在右表中尚无相配行,则在相关联的结果集行中右表的兼具选拔列表列均为空值。      
2)RIGHT  JOIN 或 RIGHT  OUTER  JOIN    
右向外过渡是左向外过渡的反向联接。将回来右表的具有行。假诺右表的某行在左表中一向不匹配行,则将为左表再次来到空值。      
3)FULL  JOIN 或 FULL OUTER JOIN
总体外界联接重回左表和右表中的全体行。当某行在另三个表中未有相称行时,则另三个表的精选列表列包罗空值。假如表之间有相称行,则整个结果集行李包裹蕴基表的数据值。  

引言

  左右联结的分别内联结去除全部不适合条件的记录,而外联结封存此中一些外中国左翼作家联盟结外右联结的界别在于风姿洒脱旦用A左联结BA中持有记录都会保留在结果中,那时B中只有切合统一条件的笔录,而右联结相反,那样也就不会搅乱了。

 

图片 1

数据库中left join,right join,inner join的间隔

 

一.连接:遵照四个或多少个表中的列之间的关联,从那个表中查询数据。

3、交叉联接   接力联接重临左表中的全数行,左表中的每生机勃勃行与右表中的全部行组合。交叉联接也称作笛Carl积。   
FROM 子句中的表或视图可经过内连接或完整外部联接按私下顺序点名;不过,用左或右向外过渡钦赐表或视图时,表或视图的依次很保护。有关使用左或右向外过渡排列表的越来越多音讯,请参见使用外联接。

生机勃勃.Join语法概述

join 用于多表中字段之间的联系,语法如下:

代码如下:

FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona

table1:左表;table2:右表。

切切实实详细表明

由此看来:

  • JOIN:                                                                    有同盟的就回来。
    • LEFT JOIN:                                                          右表中从不,没涉及,作者左表的任何回去。
    • CRUISERIGHT JOIN:                                                        左表中未有就空着,右表的全套赶回。
    • FULL JOIN:                                                          俩表中有三个就赶回。

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

 

  • JOIN或INNE陆风X8JOIN: 重回左表和右表中相互相配的行
  • LEFT JOIN: 再次来到左表和右表中相互协作的行,及左表中不相相称的行
  • LANDIGHT JOIN: 重回左表和右表中互相匹配的行,及右表中不相相配的行
  • FULL JOIN或FULL OUTEEscort JOIN: 重临左表和右表中相互相称的行,及不相相配的行
  • 图片 2 
  • 使用举例
  • 在某些标题中从未精晓的暗示景况下,使用哪生龙活虎种连接情势都能够;
  • 也会有风华正茂部分情状,只好选择一定的接连方式。

 

JOIN 功能分类

INNERAV4JOIN(内接二连三,或等值连接):猎取四个表中设有连接相配关系的记录。

LEFT JOIN(左连接):获得左表(table1)完全记录,便是右表(table2)并无对应协作记录。

RIGHT JOIN(右连接):与 LEFT JOIN 相反,获得右表(table2)完全记录,便是左表(table1)并无匹配对应记录。

留意:mysql不扶助Full join,但是能够经过UNION 关键字来统意气风发 LEFT JOIN 与 QX56IGHT JOIN来效仿FULL join.

接下去提交三个列子用于解释下面二种分类。如下多少个表(A,B)

代码如下:

mysql> select A.id,A.name,B.name from A,B where A.id=B.id;
 ---- ----------- ------------- 
| id | name | name |
 ---- ----------- ------------- 
| 1 | Pirate | Rutabaga |
| 2 | Monkey | Pirate |
| 3 | Ninja | Darth Vader |
| 4 | Spaghetti | Ninja |
 ---- ----------- ------------- 
4 rows in set (0.00 sec)

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关键字可粗略);

在表中留存最少七个天造地设时,INNESportageJOIN 关键字重回行。

INNE宝马X3 JOIN 关键字语法

SELECT column_name(s)

FROM table_name1

INNER JOIN table_name2

ON table_name1.column_name=table_name2.column_name

 

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

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_name2) 中未有相配的行。

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

如上:一旦选用了left join,未有where条件时,左表table1会突显全部内容。使用了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都没啥差别了

2、查询条件放在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.join/inner join

上边是例证深入分析
表A记录如下: 

二.Inner join

内连接,也叫等值连接,inner join产生与此同有的时候间适合A和B的意气风发组数据。

代码如下:

mysql> select * from A inner join B on A.name = B.name;
 ---- -------- ---- -------- 
| id | name | id | name |
 ---- -------- ---- -------- 
| 1 | Pirate | 2 | Pirate |
| 3 | Ninja | 4 | Ninja |
 ---- -------- ---- -------- 

图片 3

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实行后的结果是千篇后生可畏律的。

中华VIGHT JOIN 关键字会右表 (table_name2) 这里回来全体的行,固然在左表 (table_name1) 中未有相称的行。

雷克萨斯RCIGHT 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,筛选数据,那样只要不满意A.id=B.aid的多少,将会从结果中去除,包涵B的多寡!

其次句,施夷光行on部分,查出A中有着满意A.id=B.aid的数额,再进行左连接,最后依照type=1做筛选。

足见,第二句sql才是不错的艺术。

 

 

一定要选用inner join的意况

aID        aNum 
1           a20050111 
2           a20050112 
3           a20050113 
4           a20050114 
5           a20050115 

三.Left join

代码如下:

mysql> select * from A left join B on A.name = B.name;
#或者:select * from A left outer join B on A.name = B.name;
 ---- ----------- ------ -------- 
| id | name | id | name |
 ---- ----------- ------ -------- 
| 1 | Pirate | 2 | Pirate |
| 2 | Monkey | NULL | NULL |
| 3 | Ninja | 4 | Ninja |
| 4 | Spaghetti | NULL | NULL |
 ---- ----------- ------ -------- 
4 rows in set (0.00 sec)

left join,(或left outer join:在Mysql中互相对等,推荐应用left join.)左连接从左表(A)爆发意气风发套完整的笔录,与协作的笔录(右表(B)) .若无相配,侧边将包蕴null。

图片 4

即便想只从左表(A)中发出大器晚成套记录,但不分包右表(B)的笔录,能够通过安装where语句来实施,如下:

 代码如下:

mysql> select * from A left join B on A.name=B.name where A.id is null or B.id is null;
 ---- ----------- ------ ------ 
| id | name | id | name |
 ---- ----------- ------ ------ 
| 2 | Monkey | NULL | NULL |
| 4 | Spaghetti | NULL | NULL |
 ---- ----------- ------ ------ 
2 rows in set (0.00 sec)

图片 5

同理,还足以依样画葫芦inner join. 如下:

 代码如下:

mysql> select * from A left join B on A.name=B.name where A.id is not null and B.id is not null;
 ---- -------- ------ -------- 
| id | name | id | name |
 ---- -------- ------ -------- 
| 1 | Pirate | 2 | Pirate |
| 3 | Ninja | 4 | Ninja |
 ---- -------- ------ -------- 
2 rows in set (0.00 sec)

求差集:

办事处方的事例能够求差集,如下:

 代码如下:

SELECT * FROM A LEFT JOIN B ON A.name = B.name
WHERE B.id IS NULL
union
SELECT * FROM A right JOIN B ON A.name = B.name
WHERE A.id IS NULL;
# 结果
 ------ ----------- ------ ------------- 
| id | name | id | name |
 ------ ----------- ------ ------------- 
| 2 | Monkey | NULL | NULL |
| 4 | Spaghetti | NULL | NULL |
| NULL | NULL | 1 | Rutabaga |
| NULL | NULL | 3 | Darth Vader |
 ------ ----------- ------ ------------- 

图片 6

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: 纵然右表中尚无相称,也从左表再次回到全体的行
  • TiggoIGHT JOIN: 固然左表中未有相称,也从右表再次回到全体的行
  • FULL JOIN: 只要个中八个表中存在极其,就再次来到行

 

 

 

 

 多余:

三表联结查询

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

 

1  --查询所有未讲课的教师的Tname和Depart. 
2   select TNAME,DEPART 
3   from TEACHER 
4   where TNO not in(select TEACHER.TNO from COURSE inner join 
5   TEACHER on COURSE.TNO=TEACHER.TNO)
6   --或者使用 Except
7     select TNAME,DEPART from TEACHER
8     except
9     select TNAME,DEPART from COURSE join TEACHER on COURSE.TNO=TEACHER.TNO

表B记录如下:

四.Right join

代码如下:

mysql> select * from A right join B on A.name = B.name;
 ------ -------- ---- ------------- 
| id | name | id | name |
 ------ -------- ---- ------------- 
| NULL | NULL | 1 | Rutabaga |
| 1 | Pirate | 2 | Pirate |
| NULL | NULL | 3 | Darth Vader |
| 3 | Ninja | 4 | Ninja |
 ------ -------- ---- ------------- 
4 rows in set (0.00 sec)

同left join。

上边包车型客车sql语句中的“select TEACHER.TNO from COURAV4SE inner join TEACHE酷路泽 on COURAV4SE.TNO=TEACHE福特Explorer.TNO”中,只可以接纳inner join,使用left join、right join、full join都是荒诞的。

bID        bName 
1            2006032401 
2           2006032402 
3           2006032403 
4           2006032404 
8           2006032408 

五.Cross join

cross join:交叉连接,获得的结果是三个表的乘积,即笛Carl积

笛Carl(Descartes)乘积又叫直积。即便群集A={a,b},集结B={0,1,2},则几个聚众的笛Carl积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。能够扩展到五个集聚的事态。相像的例证有,假使A表示某高校学员的成团,B表示该学园享有科目标集纳,则A与B的笛Carl积表示富有相当的大或者的选课景况

代码如下:

mysql> select * from A cross join B;
 ---- ----------- ---- ------------- 
| id | name | id | name |
 ---- ----------- ---- ------------- 
| 1 | Pirate | 1 | Rutabaga |
| 2 | Monkey | 1 | Rutabaga |
| 3 | Ninja | 1 | Rutabaga |
| 4 | Spaghetti | 1 | Rutabaga |
| 1 | Pirate | 2 | Pirate |
| 2 | Monkey | 2 | Pirate |
| 3 | Ninja | 2 | Pirate |
| 4 | Spaghetti | 2 | Pirate |
| 1 | Pirate | 3 | Darth Vader |
| 2 | Monkey | 3 | Darth Vader |
| 3 | Ninja | 3 | Darth Vader |
| 4 | Spaghetti | 3 | Darth Vader |
| 1 | Pirate | 4 | Ninja |
| 2 | Monkey | 4 | Ninja |
| 3 | Ninja | 4 | Ninja |
| 4 | Spaghetti | 4 | Ninja |
 ---- ----------- ---- ------------- 
16 rows in set (0.00 sec)

#再执行:mysql> select * from A inner join B; 试一试

#在执行mysql> select * from A cross join B on A.name = B.name; 试一试

实际上,在 MySQL 中(仅限于 MySQLCROSS JOIN INNER JOIN 的显现是一样的,在不点名 ON 条件获得的结果皆以笛Carl积,反之获得五个表完全相配的结果。 INNE途胜 JOIN 与 CROSS JOIN 能够归纳 INNE安德拉 或 CROSS 关键字,因而下边包车型地铁 SQL 效果是同风流倜傥的:

代码如下:

... FROM table1 INNER JOIN table2
... FROM table1 CROSS JOIN table2
... FROM table1 JOIN table2

 2.left join和right join 

 

六.Full join

代码如下:

mysql> select * from A left join B on B.name = A.name 
-> union 
-> select * from A right join B on B.name = A.name;
 ------ ----------- ------ ------------- 
| id | name | id | name |
 ------ ----------- ------ ------------- 
| 1 | Pirate | 2 | Pirate |
| 2 | Monkey | NULL | NULL |
| 3 | Ninja | 4 | Ninja |
| 4 | Spaghetti | NULL | NULL |
| NULL | NULL | 1 | Rutabaga |
| NULL | NULL | 3 | Darth Vader |
 ------ ----------- ------ ------------- 
6 rows in set (0.00 sec)

全连接产生的怀有记录(双方相称记录)在表A和表B。如果未曾相配,则对面将包含null

图片 7

行使了left join 的情状,交流一下表的地点,就能够用right join替换;反之亦然。

试验如下:

七.品质优化

1 --查询所有学生的Sname、Cname和Degree列。
2 select SNAME,CNAME,DEGREE 
3 from STUDENT left join SCORE on STUDENT.SNO=SCORE.SNO 
4 left join COURSE on SCORE.CNO=COURSE.CNO

1.left join(左联接)---外连接

1.显示(explicit) inner join VS 隐式(implicit) inner join

如:

代码如下:

select * from
table a inner join table b
on a.id = b.id;

VS

代码如下:

select a.*, b.*
from table a, table b
where a.id = b.id;

自己在数据库中相比(10w数据)得之,它们用时差不离大器晚成致,第二个是映现的inner join,后八个是隐式的inner join。

也足以写成

sql语句如下: 

2.left join/right join VS inner join

尽量用inner join.避免 LEFT JOIN 和 NULL.

在应用left join(或right join)时,应该了解的明白以下几点:

1 select SNAME,CNAME,DEGREE 
2  from score  right join STUDENT on STUDENT.SNO=SCORE.SNO 
3 right join COURSE on SCORE.CNO=COURSE.CNO
SELECT * FROM a LEFT JOIN  b  ON a.aID =b.bID 

2.1 on与 where的进行各类

ON 条件(“A LEFT JOIN B ON 条件表明式”中的ON)用来支配怎么着从 B 表中找找数据行。假如 B 表中未有任何一行数据相称 ON 的标准,将会额外生成豆蔻年华行全部列为 NULL 的数目,在优越阶段 WHERE 子句的原则都不会被选用。仅在合作阶段完结之后WHERE 子句条件才会被选用。ON将从合营阶段爆发的多寡探究过滤

据此大家要注意:在采取Left (right) join的时候,必定要在先交付用尽全力多的相称满足条件,收缩Where的施行。如:

PASS

代码如下:

select * from A
inner join B on B.name = A.name
left join C on C.name = B.name
left join D on D.id = C.id
where C.status>1 and D.status=1;

Great

代码如下:

select * from A
inner join B on B.name = A.name
left join C on C.name = B.name and C.status>1
left join D on D.id = C.id and D.status=1

从上边例子可以看看,用尽了全力餍足ON的原则,而少用Where的条件。从实践品质来看第三个明显越发勤苦。

 3.使用full join的图景少之甚少,暂且还并未有用到。

结果如下:

2.2 注意ON 子句和 WHERE 子句的不等

如笔者举了贰个列子:

代码如下:

 

mysql> SELECT * FROM product LEFT JOIN product_details
ON (product.id = product_details.id)
AND product_details.id=2;
 ---- -------- ------ -------- ------- 
| id | amount | id | weight | exist |
 ---- -------- ------ -------- ------- 
| 1 | 100 | NULL | NULL | NULL |
| 2 | 200 | 2 | 22 | 0 |
| 3 | 300 | NULL | NULL | NULL |
| 4 | 400 | NULL | NULL | NULL |
 ---- -------- ------ -------- ------- 
4 rows in set (0.00 sec)


mysql> SELECT * FROM product LEFT JOIN product_details
ON (product.id = product_details.id)
WHERE product_details.id=2;
 ---- -------- ---- -------- ------- 
| id | amount | id | weight | exist |
 ---- -------- ---- -------- ------- 
| 2 | 200 | 2 | 22 | 0 |
 ---- -------- ---- -------- ------- 
1 row in set (0.01 sec)

从上能够,第一条查询利用 ON 条件决定了从 LEFT JOIN的 product_details表中找找相符的有着数据行。第二条查询做了轻巧的LEFT JOIN,然后利用 WHERE 子句从 LEFT JOIN的数码中过滤掉不相符条件的数据行。

 

aID        aNum                   bID           bName 
1            a20050111         1               2006032401 
2            a20050112         2              2006032402 
3            a20050113         3              2006032403 
4            a20050114         4              2006032404 
5            a20050115         NULL       NULL 
(所影响的行数为 5 行) 

2.3 尽量制止子查询,而用join

一再品质那玩意儿,愈来愈多时候体今后数据量一点都不小的时候,那个时候,我们相应幸免复杂的子查询。如下:

PASS

 代码如下:

insert into t1(a1) select b1 from t2 where not exists(select 1 from t1 where t1.id = t2.r_id);

Great

代码如下:

insert into t1(a1) 
select b1 from t2 
left join (select distinct t1.id from t1 ) t1 on t1.id = t2.r_id 
where t1.id is null;  

 

二、嵌套

结果证实:
        left join是以A表的记录为根基的,A能够当做左表,B能够充任右表,left join是以左表为准的.
换句话说,左表(A)的笔录将集会场全数意味着出来,而右表(B)只博览会示相符查找条件的笔录(例子中为: A.aID = B.bID).
B表记录不足之处均为NULL. 

八.测量试验题(多表连接join查询)

在sql语言中,一个select-from-where语句成为一个查询块。

 

1. 题目

  现存如下2个保存学园班级比赛的表,三个表保存班级id和班级名,此外三个表保存主场班级id,主场班级id和比赛场数,今后亟需一而再查询生成主场班级名,主场班级名,竞比赛场合数的表,求具体落到实处的sql语句.

将三个询问块嵌套在另三个查询块的where子句或having短语的口径中的查询成为嵌套查询。

2.right join(右联接) ----外连接

1.1 班级表

mysql> select * from class;
 ------ -------- 
| c_id | c_name |
 ------ -------- 
|    1 | 1班    |
|    2 | 2班    |
|    3 | 3班    |
|    4 | 4班    |
 ------ -------- 
4 rows in set (0.00 sec)

 SQL语言允超级多层嵌套查询,但要注意的是,子查询的select语句中无法选择order 不要子句,order by子句只可以对最后查询结果排序。

sql语句如下: 

1.2 比赛表

mysql> select * from team;
 ------ ------ ------ 
| h_id | g_id | num  |
 ------ ------ ------ 
|    1 |    2 |   34 |
|    2 |    4 |   37 |
 ------ ------ ------ 
2 rows in set (0.00 sec)

当左右了sql语句的实践顺序后,就能够对这些范围的开始和结果有更加深切的知晓。

SELECT  * FROM a RIGHT JOING b  ON a.aID = b.bID 

2. 详解

举例

结果如下:

2.1 分析

  发现要生成2个班级名的表,而贰次join连接能够生成一个,则须求2次join接连,由于class表和team表连接内容一定要合营,所以使用内连接.

子查询在where子句中

aID        aNum                   bID           bName 
1            a20050111         1               2006032401 
2            a20050112         2              2006032402 
3            a20050113         3              2006032403 
4            a20050114         4              2006032404 
NULL    NULL                   8              2006032408 
(所影响的行数为 5 行) 

2.2 结果

mysql> select ct.h_name,class.c_name as g_name,ct.num from (select class.c_name as h_name,team.* from class join team on class.c_id=team.h_id) as ct join class on ct.g_id=class.c_id;
 -------- -------- ------ 
| h_name | g_name | num  |
 -------- -------- ------ 
| 1班    | 2班    |   34 |
| 2班    | 4班    |   37 |
 -------- -------- ------ 
2 rows in set (0.00 sec)

 

注:原作链接

1 --查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
2 select * from SCORE where DEGREE>(select DEGREE from SCORE where SNO='109' and CNO='3-105')

结果印证:
        细心观察一下,就能够发觉,和left join的结果正好相反,这一次是以右表(B)为根基的,A表不足之处用NULL填充. 

 

 

三、子查询

3.inner join(相等联接或内连接)

上层的查询块称为外层查询大概父查询,下层查询块称为内层查询也许子查询。

sql语句如下: 

子查询的职位能够很灵活,明白那或多或少,认为sql学习就有了非常的大的进展。

SELECT * FROM  a INNER JOIN  b ON a.aID =b.bID 

1.子查询可以停放where子句或having短语的尺度中,那就是大家地方所介绍的嵌套查询

相仿以下SQL句:

2.子查询能够出以往from子句中,这个时候子查询生成的近日派生表,称为主查询的询问对象

SELECT *  FROM a,b WHERE a.aID = b.bID 
1 --查询所有选修了1号课程的学生姓名  (当然也可以使用嵌套查询)
2 select Sname from Student,(select * from SC where cno='1') SC1 where Student.sno=SC1.sno

结果如下:

3.子查询能够嵌套在INSERT语句中用于生成要插入的批量数额

aID        aNum                   bID           bName 
1            a20050111         1               2006032401 
2            a20050112         2              2006032402 
3            a20050113         3              2006032403 
4            a20050114         4              2006032404 
1 --对每个系,求学生的平均年龄,再把结果插入Dept_age(Sdept,Avg_age)中
2 insert  into Dept_age(Sdept,Avg_age)
3 select Sdept.AVG(Sage)
4 from Student
5 group by Sdept

结果证实:
        很明朗,这里只展现出了 A.aID = B.bID的记录.那表明inner join并不以什么人为根基,它只显示符合条件的记录. 

 

 

要点总括

4.全连接

1.连接:inner join、right join、left join 、full join

sql语句如下:

2.嵌套:将一个查询块嵌套在另叁个查询块的where子句或having短语的规范中

SELECT * FROM  a full join JOIN  b ON a.aID =b.bID 

3.子查询的职位能够很灵巧

结果如下:

aID        aNum                   bID           bName 
1            a20050111         1               2006032401 
2            a20050112         2              2006032402 
3            a20050113         3              2006032403 
4            a20050114         4              2006032404 
NULL         NULL              8              2006032408 
5            a20050115         NULL             NULL 

结果表明:
全体外界联接再次回到左表和右表中的全体行。当某行在另二个表中未有相称行时,则另二个表的取舍列表列蕴涵空值。假设表之间有相称行,则全体结果集行包括基表的数据值。

 

 

5.交叉连接(取笛卡儿积)
概念:未有where条件的穿插连接将发出连接表所涉及的笛Carl积。即TableA的行数*TableB的行数的结果集。(TableA 5行*TableB 5行=25行)

sql语句:

SELECT * FROM  a cross join JOIN  b;

 

结果如下:

aID        aNum                bID        bName 
1           a20050111       1           2006032401
2           a20050112       1           2006032401
3           a20050113       1           2006032401
4           a20050114       1           2006032401
5           a20050115       1           2006032401
1           a20050111       2           2006032402
2           a20050112       2           2006032402
3           a20050113       2           2006032402
4           a20050114       2           2006032402
5           a20050115       2           2006032402
1           a20050111       3           2006032403 
2           a20050112       3           2006032403 
3           a20050113       3           2006032403 
4           a20050114       3           2006032403 
5           a20050115       3           2006032403 
1           a20050111       4           2006032404
2           a20050112       4           2006032404
3           a20050113       4           2006032404
4           a20050114       4           2006032404
5           a20050115       4           2006032404
1           a20050111       8           2006032408
2           a20050112       8           2006032408
3           a20050113       8           2006032408
4           a20050114       8           2006032408
5           a20050115       8           2006032408

 

 

上述写法等效于:

select * from a,b

 

6.本来连接(转自:)

两张表:

图片 8

当然连接

透过MySql自身的决断完毕连接进程,不供给钦点连接条件。MySql会采纳表内的,相同的字段,作为三番五次条件。

理所必然连接分为上下之分。

内:natural join

图片 9

外:左外natural left join、右外natural right join

图片 10

 

注:select * from one natural join two;

select * from one inner join two using(public_field);

两岸是如出后生可畏辙的。

图片 11

同理,下面也是相像的:

natural left join & left join

图片 12

natural right join & right join

图片 13

 

本文由星彩网app下载发布于星彩彩票app下载,转载请注明出处:join用法深入分析,常用sql语法初级

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。