码迷,mamicode.com
首页 > 数据库 > 详细

MySQL 基础教程-07 空值处理与多表查询

时间:2020-12-14 13:09:51      阅读:3      评论:0      收藏:0      [点我收藏+]

标签:独立   动物   检索   就是   from   not   联合   table   失败   


处理 NULL 值

NULL可能会令人惊讶,直到您习惯它。从概念上讲,NULL意味着“一个缺失的未知值”,它的处理方式与其他值有些不同。
要测试 NULL,请使用 IS NULL 和 IS NOT NULL 操作符,示例如下:
技术图片

不能使用诸如 =、< 或 <> 之类的算术比较运算符来测试 NULL。请尝试以下查询:
技术图片
由于与NULL进行任何算术比较的结果也为NULL,因此无法从此类比较中获得任何有意义的结果。
在MySQL中,0或NULL表示false,其他任何值都表示true。布尔运算的默认真值为1。
这就是为什么在之前的介绍中,要用 death is NOT NULL而不是 death <> NULL来确定哪些动物已经死亡。
两个NULL值在GROUP BY中被视为相等。
在用 ORDER BY 排序时,如果使用 ORDER BY ... ASC,NULL值会排在最前面,如果使用 ORDER BY ... DESC 则 NULL 值排在最后。
在处理 NULL 时,一个常见的错误是认为不能将零或空字符串插入定义为 NOT NULL 的列中,但事实并非如此。0和空值(‘‘)是确实存在的值,而 NULL 意味着“没有值”。可以使用IS [NOT] NULL 进行测试,如下所示:
技术图片
因此完全可以在非空列插入0或者空字符串(‘‘)。这些值都是非空值(NOT NULL)。

多表查询
pet表会记录你有哪些宠物。如果你想记录他们的其他信息,例如他们生活中的一些事情,比如看兽医或者生幼崽,这时需要另一张表。这张表应该是什么样子的?它需要包含以下信息:
● 宠物名字,这样你就知道每个事件都与哪种动物有关。
● 记录事件发生日期。
● 描述事件。
● 如果希望能够对事件进行分类,还需要事件类型字段。
考虑到这些因素,事件表的 CREATE TABLE 语句可能如下所示:
技术图片
与pet表类似,向表加载初始记录的最简单方式就是,创建一个文本文件,加入以下信息,每个字段用制表符分隔。

技术图片

用如下方式加载数据:

mysql> LOAD DATA LOCAL INFILE ‘event.txt‘ INTO TABLE event;

根据在pet表上运行查询中学到的知识,您可以对event表中的记录执行检索,检索原则是相同的。但如果当event表不足以独立回答您提出的问题呢?
假设你想知道每只宠物的产仔年龄。我们早先看到了如何从两个日期计算年龄。母亲的产仔日期在event表中,但要计算她在该日期的年龄,需要知道她的出生日期,该日期存储在pet表中。这意味着查询需要两个表:
技术图片
对于此查询,需要注意以下几点:
● FROM 子句连接两个表,因为查询需要从这两个表中提取信息。
● 联合多个表中的信息时,需要指定如何将一个表中的记录与另一个表中的记录匹配。这很容易,因为它们都有一个 name 列。查询使用 ON 子句根据 name 值匹配两个表中的记录。
查询使用 INNER JOIN 来联合表。当且仅当两个表都满足ON子句中指定的条件时,INNER JOIN 才允许两个表中的行出现在结果中。在本例中,ON 子句指定 pet 表中的 name 列必须与 event 表中的 name 列匹配。如果一个 name 出现在一个表中而没有在另一个表中,则该行将不会出现在结果中,因为 ON 子句中的条件匹配失败。
● 因为 name 列出现在两个表中,所以在引用列时必须具体说明所引用的表。这是通过在列名前加上表名来实现的。

执行联合不一定需要两个不同的表。有时,如果要将表中的记录与同一表中的其他记录进行比较,可以将表连接到自身。例如,要在您的宠物中查找繁殖配对,可以将pet表与自身连接起来,以生成同类物种的候选雄性和雌性配对:
技术图片
在这个查询中,我们为表名指定别名来引用列,并保持每个列引用与相应表实例关联。

MySQL 基础教程-07 空值处理与多表查询

标签:独立   动物   检索   就是   from   not   联合   table   失败   

原文地址:https://blog.51cto.com/15023289/2561183

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!