SQL中建视图关联表的一个字段有空值,导致视图中的数据不完整,想让空值到视图中也是空值怎么整

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL中建视图关联表的一个字段有空值,导致视图中的数据不完整,想让空值到视图中也是空值怎么整相关的知识,希望对你有一定的参考价值。

isnull(a,null)赋值不好用

我明白你的意思了,空值关联后没有了,所以你要union all上原来的空值,我举个例子,日志表log有空值,但是空值也需要,如下:
select * from log a
join users b
on a.user_id is not null and a.user_id = b.user_id
union all
select * from log a where a.user_id is null;
够详细吧,符合你的预期吗?
参考技术A 字段a本来是空值的话,到视图里面也还是空值啊,干嘛要用isnull(a,null).
isnull 的用法是,当a为null值时,你想显示什么值本回答被提问者采纳

sql视图实例

一个视图是一个或一组SQL语句,存储在数据库中相关的名称。一个视图实际上是一个预定义的SQL查询中的表的形式组成。

一个视图可以包含一个表的所有行,或选择表中的行。从一个或多个表上写SQL查询创建一个视图,视图可以被创建。

这是一种虚拟表的视图,允许用户执行以下操作:

  • 发现自然或直观的用户或用户类的结构数据的方式。

  • 限制访问的数据,例如,用户可以看到和(有时)修改正是他们所需要的并没有更多。

  • 总结从可以用于生成报告的各种表的数据。

创建视图:

使用CREATE VIEW语句创建数据库视图。从一个单一的表,多个表,或另一个视图也可以再创建视图。

要创建一个视图,用户根据具体的实施必须有相应的系统权限。

基本的CREATE VIEW语法如下:

CREATE VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];

在使用过程中正常的SQL SELECT查询,可以包含多个表的SELECT语句中的方式非常相似。

实例:

考虑CUSTOMERS表中有以下记录:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

现在,以下是从CUSTOMERS表中创建一个视图的例子。这个视图将被用来从CUSTOMERS表中有客户的姓名和年龄:

SQL > CREATE VIEW CUSTOMERS_VIEW AS
SELECT name, age
FROM  CUSTOMERS;

现在,可以查询CUSTOMERS_VIEW以类似方式作为查询一个实际的表。下面的例子:

SQL > SELECT * FROM CUSTOMERS_VIEW;

这将产生以下结果:

+----------+-----+
| name     | age |
+----------+-----+
| Ramesh   |  32 |
| Khilan   |  25 |
| kaushik  |  23 |
| Chaitali |  25 |
| Hardik   |  27 |
| Komal    |  22 |
| Muffy    |  24 |
+----------+-----+

WITH CHECK OPTION:

在视图定义中WITH CHECK OPTION是一个CREATE VIEW语句选项。 WITH CHECK OPTION的目的是为了确保所有的UPDATE和INSERT语句中满足条件。

如果他们不符合条件,UPDATE或INSERT会返回一个错误。

使用WITH CHECK OPTION创建相同的观点CUSTOMERS_VIEW下面是一个例子:

 

CREATE VIEW CUSTOMERS_VIEW AS
SELECT name, age
FROM  CUSTOMERS
WHERE age IS NOT NULL
WITH CHECK OPTION;

没有一个AGE列中的NULL值的数据,因为该视图定义了WITH CHECK OPTION在这种情况下,应该拒绝任何NULL值在视图的AGE列写入。

更新视图:

在一定条件下可以更新一个视图:

  • SELECT子句不包含关键字DISTINCT。

  • SELECT子句不包含汇总函数。

  • SELECT子句不包含设定的函数。

  • SELECT子句不包含集合运算符。

  • SELECT子句中不包含ORDER BY子句。

  • FROM子句可以包含多个表。

  • 在WHERE子句中不包含子查询。

  • 该查询不包含GROUP BY或HAVING。

  • 计算列可能不被更新。

  • 从基表中必须包括视图,以便INSERT查询功能所有NOT NULL列。

因此,如果一个视图满足上述所有规则,那么就可以更新视图。以下是一个例子,更新Ramesh的年龄:

SQL > UPDATE CUSTOMERS_VIEW
      SET AGE = 35
      WHERE name=Ramesh;

这将最终更新基表的客户,同样会反映在视图本身。现在尝试查询的基表,SELECT语句将产生以下结果:

 

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  35 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

插入一数据到视图:

行的数据可以被插入到一个视图。同样的规则也适用于UPDATE命令也适用于INSERT命令。

在这里,我们可以不插入行,因为我们并没有在该视图中的所有NOT NULL列在CUSTOMERS_VIEW,否则就可以在以类似方式,将其插入表中的插入行。

在视图中删除数据:

可以从视图中被删除的数据行。同样的规则也适用于UPDATE和INSERT命令适用于DELETE命令。

下面是一个例子,删除AGE =22一条记录。

SQL > DELETE FROM CUSTOMERS_VIEW
      WHERE age = 22;

最终,这将删除从基表中的客户和相同的行会反映在视图本身。现在尝试查询的基表,SELECT语句将产生以下结果:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  35 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

删除视图:

很显然,当需要一个丢弃视图,如果它不再需要。它的语法很简单,如下所示:

DROP VIEW view_name;

以下是一个例如,从CUSTOMERS表丢弃CUSTOMERS_VIEW:

DROP VIEW CUSTOMERS_VIEW;

 

以上是关于SQL中建视图关联表的一个字段有空值,导致视图中的数据不完整,想让空值到视图中也是空值怎么整的主要内容,如果未能解决你的问题,请参考以下文章

SQL 关联两个表的视图总结

关于SQL Server2005数据表字段关联问题

sql 两张表的联系是主表一个字段是由子表id加号拼接而成,请问怎么连

sql2005 中的把2个表创建成一个视图

怎么根据一个表的字段值修改另一个表的字段值

在Access表的设计视图中,不能对 进行修改。 A. 数据表视图中的字体 B. 主键 C. 数据表视图中的列标题 D.