
update
“表名”
set
“列名”=“值”
where
“列名”
is
null
你看行不行
注:“表名”
只是个代称
例子就是
实例数据库中的
Northwind
中
Products表
如:update
products
set
name='no
name'
where
name
is
null
就是把products表中的name
列下有空值的改为字符串no
name
上面的还是比较全的
此回答只适合菜鸟,嘿嘿。希望对你有所帮助
只有特定的视图才能被更新,而且更新视图有一些限制条件
但是通过视图去更新则必须注意以下条件:
1、如果视图有一个基本关系的简单查询生成,而且它还包含了基本关系中的主关键字或是候选关键字,则可以通过这个视图进行更新 *** 作。
2、不允许对涉及到多个基本关系的视图进行更新。
3、如果视图的生成中涉及到聚集或是分组 *** 作,则不允许通过这个视图进行更新。
ISO标准给出的视图的可更新充要条件为:
1、没有指定DISTINCT,即重复元组未从查询结果中消除;
2、定义查询的SELECT列表中的每个元素均为列名(而不是常量,表达式或聚合函数),且列名出现不能多于一次;
3、FROM子句只能指定一个表,即视图必须有一个源表且用户有请求该表的权限。如果源表本身就是一个视图,那么视图必须满足这些条件。因此,排除了基于连接、并(UNION)、交(INTERSECT)或差(EXCEPT) *** 作的所有视图;
4、where子句不能包含任何引用了FROM子句的表的嵌套SELECT *** 作。
5、定义查询不能有GROUP BY或HAVING子句。
在数据库中用sql语句就能实现啦
select aid,sum(bvalues)
from tableA a,tableB b
where aid = bid
group by aid
原则就是把表关联一下,然后再分组用聚合函数这样处理下呗~~ 应该没什么难处吧~
=============华丽的分割线===================
select a试卷id,b类型id,MAX(c分值)
from 试卷 a, 题库 b,试题信息 c
where a题目id = b题目id
and b题目id = c题目id
and a试卷id = '123'
group by a试卷id,b类型id
这个是检索出 试卷123的个类型题的最大分。 至于你说的还要总分集合,并明白是什么意思,不过题目解到这个程度,楼主自己稍微一琢磨就差不多了熬吧
数据库实验总结一
试验内容
1、 数据表的建立
基本表《简单的》带有主键
带有外码约束的(外码来自其他表或者本表)
2、 数据表的修改
添加删除列
修改列属性类型
添加删除约束(约束名)
元组的添加,修改,删除
删除数据表
试验过程
1、create table student
(
sno char(9) primary key , /sno是主码 列级完整性约束条件/
sname char(20) unique, /sname取唯一值/
ssex char(2),
sage smallint, /类型为smallint/
sdept char(20) /所在系/
);
create table course
(
cno char(4) primary key, /列级完整性约束条件,cno是主码/
cname char(40),
cpno char(4), /cpno的含义是先行课/
ccredit smallint,
foreign key (cpno) references course(cno)
/表级完整性约束条件,cpno是外码,被参照表是course,被参照列是cno/
);
create table sc
(
sno char(9),
cno char(4),
grade smallint,
primary key (sno,cno),
/主码有两个属性构成,必须作为表级完整性进行定义/
foreign key (sno) references student(sno),
/表级完整性约束条件,sno是外码,被参照表是student/
foreign key (cno) references course(cno),
/表级完整性约束条件,cno是外码,被参照表示course/
);
例1、create table s
(
cno varchar(3), /变长的字符串,输入2个字符就是两个字符不会补空格/
sname varchar(20),
status int,
city varchar(20),
constraint pk_sno primary key(sno), /约束条件的名字为pk_sno/
);
create table p
(
pno varchar(3),
pname varchar(20),
color varchar(3),
weight int,
constraint pk_pno primary key (pno), /约束条件的名字是pk_pno/
);
create table j
(
jno varchar(3),
jname varchar(20),
city varchar(20),
constraint pk_jno primary key(jno) /约束条件的名字为pk_jno/
);
例2、create table spj
(
sno varchar(3), /第一个表中的主码/
pno varchar(3),
jno varchar(3),
qty int, /数量/
constraint pk_spj primary key(sno,pno,jno), /主码由3个属性组成/
foreign key(sno) references s(sno),
/表级完整性约束条件,sno是外码,被参照表是s/
foreign key(pno) references p(pno),
/表级完整性约束条件,pno是外码,被参照表是p/
foreign key(jno) references j(jno),
/表级完整性约束条件,jno是外码,被参照表是j/
);
2、数据表的更改
在s表中添加一个concat 列
alter table s add concat varchar(20)
在s表中删除concat 列
alter table s drop column concat
更改s表 concat列的属性 把长度由20改为30
alter table s alter column concat varchar(30)
**** 名字为concat 修改属性为唯一的 属性名为con_concat
alter table s add constraint con_concat unique(concat)
删除约束关系con_concat
alter table s drop constraint con_concat
/插入一个元组/
insert into s valus(‘s1’,’精益’,20,’天津’) /20不能写成’20’/
试验中的问题的排除与总结:
1、在创建spj时
有三个实体所以从3个实体中取主码,还有一个数量属性也要写上
主码由那3个主码确定
2、更改一个数据库中数据表时一定要先使该数据库处于正在使用状态
3、constraint
是可选关键字,表示 primary key、not null、unique、foreign key 或 check 约束定义的开始。约束是特殊属性,用于强制数据完整性并可以为表及其列创建索引。
4、--go可以不加但是要注意顺序 注:go --注释 提示错误
5、注意添加一个空元素用 null
附 sql备份
--创建一个数据库 student
create database student
go
--在数据库student中创建表student course sc 注意顺序
use student
----------------------------------------------------------------
create table student
(
sno char(9) primary key, /sno是主码 列级完整性约束条件/
sname char(10) unique, /sname取唯一值/
ssex char(2),
sage smallint, /类型为smallint/
sdept char(20) /所在系/
); /;要加/
-----------
数据库实验总结二我在sql server 索引基础知识系列中,第一篇就讲了记录数据的基本格式。那里主要讲解的是,数据库的最小读存单元:数据页。一个数据页是8k大小。
对于数据库来说,它不会每次有一个数据页变化后,就存到硬盘。而是变化达到一定数量级后才会作这个 *** 作。 这时候,数据库并不是以数据页来作为 *** 作单元,而是以64k的数据(8个数据页,一个区)作为 *** 作单元。
区是管理空间的基本单位。一个区是八个物理上连续的页(即 64 kb)。这意味着 sql server 数据库中每 mb 有 16 个区。
为了使空间分配更有效,sql server 不会将所有区分配给包含少量数据的表。sql server 有两种类型的区:
统一区,由单个对象所有。区中的所有 8 页只能由所属对象使用。
混合区,最多可由八个对象共享。区中八页的每页可由不同的对象所有。
通常从混合区向新表或索引分配页。当表或索引增长到 8 页时,将变成使用统一区进行后续分配。如果对现有表创建索引,并且该表包含的行足以在索引中生成 8 页,则对该索引的所有分配都使用统一区进行。
为何会这样呢
其实很简单:
读或写 8kb 的时间与读或写 64 kb的时间几乎相同。
在 8 kb 到 64 kb 范围之内,单个磁盘 i/o 传输 *** 作所花的时间主要是磁盘取数臂和读/写磁头运动的时间。
因此,从数学上来讲,当需要传输 64 kb 以上的 sql 数据时,
尽可能地执行 64 kb 磁盘传输是有益的,即分成数个64k的 *** 作。
因为 64 kb 传输基本上与 8 kb 传输一样快,而每次传输的 sql server 数据是 8 kb 传输的 8 倍。
我们通过一个实例来看 有and *** 作符时候的最常见的一种情况。我们有下面一个表,
create table [dbo][member]( [member_no] [dbo][numeric_id] identity(1,1) not null, [lastname] [dbo][shortstring] not null, [firstname] [dbo][shortstring] not null, [middleinitial] [dbo][letter] null, [street] [dbo][shortstring] not null, [city] [dbo][shortstring] not null, [state_prov] [dbo][statecode] not null, [country] [dbo][countrycode] not null, [mail_code] [dbo][mailcode] not null, [phone_no] [dbo][phonenumber] null, [photograph] [image] null, [issue_dt] [datetime] not null default (getdate()), [expr_dt] [datetime] not null default (dateadd(year,1,getdate())), [region_no] [dbo][numeric_id] not null, [corp_no] [dbo][numeric_id] null, [prev_balance] [money] null default (0), [curr_balance] [money] null default (0), [member_code] [dbo][status_code] not null default (' '))
这个表具备下面的四个索引:
索引名 细节 索引的列
member_corporation_link nonclustered located on primary corp_no
member_ident clustered, unique, primary key located on primary member_no
member_region_link nonclustered located on primary region_no
memberfirstname nonclustered located on primary firstname
当我们执行下面的sql查询时候,
select mmember_no, mfirstname, mregion_nofrom dbomember as mwhere mfirstname like 'k%' and mregion_no > 6 and mmember_no < 5000go
sql server 会根据索引方式,优化成下面方式来执行。
select amember_no,afirstname,bregion_nofrom(select mmember_no, mfirstname from dbomember as m where mfirstname like 'k%' and mmember_no < 5000) a , -- 这个查询可以直接使用 memberfirstname 非聚集索引,而且这个非聚集索引覆盖了所有查询列-- 实际执行时,只需要 逻辑读取 3 次
(select mmember_no, mregion_no from dbomember as mwhere mregion_no > 6) b
-- 这个查询可以直接使用 member_region_link 非聚集索引,而且这个非聚集索引覆盖了所有查询列-- 实际执行时,只需要 逻辑读取 10 次
where amember_no = bmember_no
不信,你可以看这两个sql 的执行计划,以及逻辑读信息,都是一样的。
其实上面的sql,如果优化成下面的方式,实际的逻辑读消耗也是一样的。为何sql server 不会优化成下面的方式。是因为 and *** 作符优化的另外一个原则。
1/26 的数据和 1/6 的数据找交集的速度要比 1/52 的数据和 1/3 的数据找交集速度要慢。
select amember_no,afirstname,bregion_nofrom(select mmember_no, mfirstname from dbomember as mwhere mfirstname like 'k%' -- 1/26 数据) a,
(select mmember_no, mregion_no from dbomember as mwhere mregion_no > 6 and mmember_no < 5000-- 1/3 1/ 2 数据) bwhere amember_no = bmember_no
当然,我们要学习sql 如何优化的话,就会用到查询语句中的一个功能,指定查询使用哪个索引来进行。
比如下面的查询语句
select mmember_no, mfirstname, mregion_nofrom dbomember as m with (index (0))where mfirstname like 'k%' and mregion_no > 6 and mmember_no < 5000go
select mmember_no, mfirstname, mregion_nofrom dbomember as m with (index (1))where mfirstname like 'k%' and mregion_no > 6 and mmember_no < 5000goselect mmember_no, mfirstname, mregion_nofrom dbomember as m with (index (membercovering3))where mfirstname like 'k%' and mregion_no > 6 and mmember_no < 5000goselect mmember_no, mfirstname, mregion_nofrom dbomember as m with (index (memberfirstname, member_region_link))where mfirstname like 'k%' and mregion_no > 6 and mmember_no < 5000go
这里 index 计算符可以是 0 ,1, 指定的一个或者多个索引名字。对于 0 ,1 的意义如下:
如果存在聚集索引,则 index(0) 强制执行聚集索引扫描,index(1) 强制执行聚集索引扫描或查找(使用性能最高的一种)。
如果不存在聚集索引,则 index(0) 强制执行表扫描,index(1) 被解释为错误。
总结知识点:
简单来说,我们可以这么理解:sql server 对于每一条查询语句。会根据实际索引情况(sysindexes 系统表中存储这些信息),分析每种组合可能的成本。然后选择它认为成本最小的一种。作为它实际执行的计划。
成本代价计算的一个主要组成部分是逻辑i/o的数量,特别是对于单表的查询。
and *** 作要满足所有条件,这样,经常会要求对几个数据集作交集。数据集越小,数据集的交集计算越节省成本。
的项目中,竟然出现了滥用聚集索引的问题。看来没有培训最最基础的索引的意义,代价,使用场景,是一个非常大的失误。这篇博客就是从这个角度来罗列索引的基础知识。
使用索引的意义
索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。
使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。
使用索引的代价
索引需要占用数据表以外的物理存储空间。
创建索引和维护索引要花费一定的时间。
当对表进行更新 *** 作时,索引需要被重建,这样降低了数据的维护速度。
创建索引的列
主键
外键或在表联接 *** 作中经常用到的列
在经常查询的字段上最好建立索引
不创建索引的列
很少在查询中被引用
包含较少的惟一值
定义为 text、ntext 或者 image 数据类型的列
heaps是staging data的很好选择,当它没有任何index时
excellent for high performance data loading (parallel bulk load and parallel index creation after load)
excellent as a partition to a partitioned view or a partitioned table
聚集索引提高性能的方法,在前面几篇博客中分别提到过,下面只是一个简单的大纲,细节请参看前面几篇博客。
何时创建聚集索引
clustered index会提高大多数table的性能,尤其是当它满足以下条件时:
独特, 狭窄, 静止: 最重要的条件
持续增长的,最好是只向上增加。例如:
identity
date, identity
guid (only when using newsequentialid() function)
聚集索引唯一性(独特型的问题)
由于聚集索引的b+树结构的叶子节点必须指向具体数据。如果你要建立聚集索引的列不唯一,并且你指定的创建的聚集索引是非唯一的聚集索引,则会有以下情况:
如果未使用 unique 属性创建聚集索引,数据库引擎 将向表自动添加一个四字节 uniqueifier 列。必要时,数据库引擎 将向行自动添加一个 uniqueifier 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。
不知道你什么数据库
假设数据库A 与 数据库B 不在同一台机器上面。
一般情况下,是在 数据库 A 那里,创建一个 数据库链接, 也就是 DBLINLK
然后在 数据库 A 那里,1表 上, 创建一个触发器。
触发器的内容,就是把本次更新的内容,更新到 DBLINK 下的 2表上。
使用UPDATE语句更新数据
语法:
UPDATE 表名|视图名
SET 列名='新值'
WHERE 条件
例:将表jbxx中编号为020805的记录的部门号改为003
update jbxx
set department_id=’003’
where employee_id=’020805’
表建得不合理,不符合数据库规范化要求,课程并不是由学号所决定了,课程可作为一个独立的表,还有,成绩是有学号和课程号共同决定的,因此成绩表也应该列出来作为一个独立的表。
应该分为3个表来建立数据库
1、学生信息表(学号,姓名,性别,出生日期,联系电话)
2、课表(课程号,课程名)
3、成绩表(学号,课程号,成绩)
期中学号是学生表的主键,课程号是课表的主键,学号和课程号组合是成绩表的主键,两者共同决定成绩。
拆分出来后,避免了数据冗余的问题,消除专递依赖!
完整性参照很简单,你自己解决吧。
以上就是关于如何更新数据库中为Null的数据全部的内容,包括:如何更新数据库中为Null的数据、数据库上机实验 实验内容2创建的视图能否进行更新为什么、从数据库中一条条读出数据处理更新,用哪种方法好等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)