数据库表自关联如何进行SQL查询?

2022-10-0308:09:54数据库教程Comments1,907 views字数 1082阅读模式

自关联映射:一个表自己关联自己,此时从同一个表中查询,通过起别名将一张表变成两张表,使用join语句。

实例1:id自关联文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/28167.html

隐式内连接:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/28167.html

数据库表自关联如何进行SQL查询?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/28167.html

数据库表自关联如何进行SQL查询?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/28167.html

实例二:编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id 。返回结果 不要求顺序 。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/28167.html

查询结果格式如下例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/28167.html

Weather
+----+------------+-------------+
| id | recordDate | Temperature |
+----+------------+-------------+
| 1  | 2015-01-01 | 10          |
| 2  | 2015-01-02 | 25          |
| 3  | 2015-01-03 | 20          |
| 4  | 2015-01-04 | 30          |
+----+------------+-------------+

Result table:
+----+
| id |
+----+
| 2  |
| 4  |
+----+
2015-01-02 的温度比前一天高(10 -> 25)
2015-01-04 的温度比前一天高(20 -> 30)

SQL:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/28167.html

SELECT
    weather.id AS 'Id'
FROM
    weather
        JOIN
    weather w ON DATEDIFF(weather.date, w.date) = 1
        AND weather.Temperature > w.Temperature;

因此,我们可以通过将 weather 与自身相结合,并使用 DATEDIFF() 函数自关联文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/28167.html

实例三:超过经理收入的员工文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/28167.html

Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/28167.html

+----+-------+--------+-----------+
| Id | Name  | Salary | ManagerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | NULL      |
| 4  | Max   | 90000  | NULL      |
+----+-------+--------+-----------+

给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/28167.html

+----------+
| Employee |
+----------+
| Joe      |
+----------+

SQL:id自关联文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/28167.html

SELECT
     a.NAME AS Employee
FROM Employee AS a JOIN Employee AS b
     ON a.ManagerId = b.Id
     AND a.Salary > b.Salary;
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/28167.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/28167.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定