内部联接

时间:2015-07-07 02:22:32

标签: mysql sql

我正在阅读docs中的MySql教程,并有以下表和SQL语句:

活动表:

+----------+------------+----------+------------------------------+
| name     | date       | type     | remark                       |
+----------+------------+----------+------------------------------+
| Fluffy   | 1995-05-15 | litter   | 4 kittens, 3 females, 1 male |
| Buffy    | 1993-06-23 | litter   | 5 puppies, 2 female, 3 male  |
| Buffy    | 1994-06-19 | litter   | 3 puppies, 3 female          |
| Chirpy   | 1999-03-21 | vet      | needed beak streightened     |
| Slim     | 1997-08-03 | vet      | broken rib                   |
| Bowser   | 1991-10-12 | kennel   | NULL                         |
| Fang     | 1991-10-12 | kennel   | NULL                         |
| Fang     | 1998-08-28 | birthday | Gave him new chew toy        |
| Claws    | 1998-03-17 | birthday | Gave him a flea collar       |
| Whistler | 1998-12-09 | birthday | First birthday               |
+----------+------------+----------+------------------------------+

宠物餐桌:

+----------+--------+---------+------+------------+------------+
| name     | owner  | species | sex  | birth      | death      |
+----------+--------+---------+------+------------+------------+
| Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |
| Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |
| Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |
| Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       |
| Bowser   | Diane  | dog     | m    | 1989-03-31 | 1995-07-29 |
| Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |
| Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |
| Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |
| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
| Jenny    | Robert | dog     | f    | 2004-01-01 | 2014-05-04 |
+----------+--------+---------+------+------------+------------+

SQL:

select pet.name,
( YEAR(date) - YEAR(birth) ) - ( RIGHT(date,5) < RIGHT(birth,5) ) AS age, remark
from pet inner join event
on pet.name = event.name
where event.type = 'litter';

我理解除了这个之外的SQL语句:

( YEAR(date) - YEAR(birth) ) - ( RIGHT(date,5) < RIGHT(birth,5) )

逐步解释会有很大帮助。我知道YEAR()函数用于从日期中提取年份。

3 个答案:

答案 0 :(得分:3)

正如您所提到的那样,YEAR()获得了该日期的年份。

我们将使用Fluffy作为birth = 1993-02-04date = 1995-05-15

的示例

第1步: 从两个日期( YEAR(date) - YEAR(birth) )中减去提取的年份  你现在有1995 - 1993年等于2

第2步: ( RIGHT(date,5) < RIGHT(birth,5) )这实际上会从右到左读取日期和出生字符串5步,所以如果你执行RIGHT(date,5),你将获得值0,如果你执行RIGHT(birth,5),你也会得到值为0.

第3步: 现在我们开始使用<运算符,如果它满足条件,则返回布尔值1或0。由于0 = 0,语句为false,因此它将返回0.

整个功能实际上会检查date的某一天是否小于birthdate上的那一天,这将决定您是否有一整年前的剩余天数。如果你这样做,它将返回1,这将从你之前执行的当前年度操作中减去。

但在我们的情况下,由于<将返回0,我们可以肯定地说Fluffy的年龄是2 - 0,即2。

但是,如果说Fluffy的birthdate是在1993-12-04,这将为1操作产生<值,这意味着年份不是但完成后会产生2 - 1的结果,即1。

抱歉,如果它有点乱。

答案 1 :(得分:1)

这是一种聪明的(?)方式,用于检查出生日期的月份和日期是否发生在事件发生之前或之后(垃圾),以便正确计算事件之间的年数(因为年份本身并不足够。

在这部分:

( YEAR(date) - YEAR(birth) ) - ( RIGHT(date,5) < RIGHT(birth,5) )

RIGHT(date,5)返回月份和日期部分(03-30)并执行小于比较的布尔值,返回0或1,具体取决于结果。然后从YEAR(date) - YEAR(birth)计算中减去该值,以便正确调整事件之间的年份。

答案 2 :(得分:1)

如果你出生于1980年并且我现在知道2015年,那么我可以几乎通过计算YEAR(date) - YEAR(birth) = 2015 - 1980 = 35来计算你的年龄。关键是你的生日可能还没有发生。那我怎么知道你的生日是否已经发生?假设您出生于1980年7月20日。然后在MySQL日期格式中,您的生日看起来像2015-06-20。如果我查看您生日的最后5个字符,最右侧 5个字符,或RIGHT(birth, 5)我会得到06-20。如果今天的最后5个字符的日期06-07小于你生日的最后5个字符,那么你的生日还没有发生。在这里,通过&#34;小于&#34;我们的意思是它会在&#34;之前排序。按正常的字符串顺序。所以,如果RIGHT(date, 5) < RIGHT(birth, 5)那么你的生日还没有发生。而且,幸运的是,MySQL会对待&#34; true&#34;数字1和&#34; false&#34;作为数字0。因此,只有在您的生日尚未结束时,上述内容才会从我们的日期计算中减去1