SQL关联查询

阅读: 评论:0

SQL关联查询

SQL关联查询

 六种关联查询

  • 交叉连接(CROSS JOIN);
  • 内连接(INNER JOIN);
  • 外连接(LEFT JOIN/RIGHT JOIN);
  • 联合查询(UNION 与 UNION ALL);
  • 全连接(FULL JOIN)【在MySQL中本身不支持全连接,若要使用,得需要一些方法实现】.

1.交叉连接(CROSS JOIN)

SELECT * FROM A, B(, C) 或者
SELECT * FROM A CROSS JOIN B (CROSS JOIN C);

注:没有任何关联条件,结果是 笛卡尔积,结果集 会很大,没有意义,很少使用。 

2.内连接(INNER JOIN)

SELECT * FROM A, B WHERE A.id = B.id 或者
SELECT * FROM A INNER JOIN B ON A.id = B.id;

注:多表中同时符合某种条件的数据记录的集合。 

内连接分为三类:

      ① 等值连接:ON A.id = B.id
      ② 不等值连接:ON A.id > B.id;
      ③ 自连接:SELECT * FROM A T1 INNER JOIN A T2 ON T1.id = T2.pid;

3. 外链接

外链接又分为左外链接(LEFT JOIN)和右外链接(RIGHT JOIN)

  1)左外链接

   LEFT OUTER JOIN,以左表为主,先查询出左表,按照 ON 后的关联条件匹配右表,没有匹配到的用 NULL 填充,可以简写             成 LEFT JOIN.

  2)右外链接

   RIGHT OUTER JOIN,以右表为主,先查询出右表,按照 ON 后的关联条件匹配坐表,没有匹配到的用 NULL 填充,可以简写             成 RIGHT JOIN.

4.联合查询(UNION 与 UNION ALL)

SELECT * FROM A UNION SELECT * FROM B UNION ......

 注:

  • 就是把多个结果集集中在一起,UNION 前的结果为基准,需要注意的是联合查询的列数要相等,相同的记录行会合并(如果前者 select 和 后者 select 有重复,则会合并,且以前面的为基准);
  • 如果使用 UNION ALL,不会合并重复的记录行;
  • 在效率方面,UNION 高于 UNION ALL。

5.全连接(FULL JOIN)

SELECT * FROM A LEFT JOIN B ON A.id = B.id UNION SELECT * FROM A RIGHT JOIN B ON A.id = B.id;

MySQL本身不支持全连接,如果要使用全连接,可以使用 LEFT JOIN 和 UNION 和 RIGHT JOIN 联合使用

6)嵌套查询【不推荐使用,效率不可把控】
 

题解:为了记录足球比赛的结果,设计表如下:

team:参赛队伍表

字段名类型描述
teamIDint主键
teamNamevarchar(20)队伍名称

match:赛程表

字段名称类型描述
matchIDint主键
hostTeamIDint主队ID
guestTeamIDint客队ID
matchResultvarchar(20)比赛结果
matchTimedate比赛日期

其中,match赛程表 中的 hostTeamID 与 guestTeamID 都和 team表 中的 teamID关联,查询 2006-6-1 到 2006-7-1 之间举行的所有比赛,并且用以下形式列出:拜仁 2:0 不莱梅 2006-6-21。

解题思路:

  1.  先找出我们的结果需求:主队名称  比赛结果  客队名称  比赛日期
  2. 分析表与表之间的关联关系,match表中的主队ID(hostTeamID)和客队ID(guestTeamID)都和team表中的teamID关联,通过关联查询可以获得主队名称和客队名称
  3. 根据match表中的matchTime字段查询 2006-6-1到2006-7-1之间举行的比赛即可

方法一:

amName,m.amName,m.matchTime 
FROM`match` AS m LEFT JOIN team AS t1 ON m.hostTeamID = t1.teamIDLEFT JOIN team AS t2 ON m.guestTeamID = t2.teamID 
WHEREm.matchTime BETWEEN '2006-6-1' AND '2006-7-1';

方法二:

amName,M.amName,M.matchTime 
FROMteam T1,team T2,`match` M 
amId = M.hostTeamID amId = M.guestTeamID AND M.matchTime >= "2006-06-01“ and M.matchTime <=”2006-07-01";

最后的时间比较也可用 between ... and

本文发布于:2024-02-01 06:21:00,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170673966034512.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:SQL
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23