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 两张表的联系是主表一个字段是由子表id加号拼接而成,请问怎么连
在Access表的设计视图中,不能对 进行修改。 A. 数据表视图中的字体 B. 主键 C. 数据表视图中的列标题 D.