CRUD *** 作(create 添加数据read读取数据 update 修改数据delete删除数据)
例如:
1、添加数据(create)
a: insert into + nation values('n002 ','回族 ')--加单引号是转为字符串,英文的
b: insert into nation values('n003',' ') 只添加一列 后面的是空 给所有的添加可以用
c: insert into nation(code,) values('n004') 给某一列添加可以用
d:给多列添加 insert into nation(code,name) values('n004','维吾尔族')
e: 专门添加自增长列的 insert into 表名 values('p001','p006') 自增长列不用管,直接写第二列
2、删除数据(delete)
delete from +表名称--删除表中所有内容
delete from +表名称 where ids=5 (删除此行)---where后面跟一个条件
3、修改数据(uodate)
update +表名称 set +列名称=' ' set(设置)---修改所有的内容这一列的
update +表名称 set +列名称='p006 ' where ids=6
update +表名称 set +列名称='p006 ',列名称='p002' where ids=6-----用逗号隔开可以修改多列
整数型(int)的不需要加单引号 0 (false)1(true)
4、查询数据(10种)
a1:简单查询
select from 表名称 ——查询表中所有数据 代表所有列
select code,name from 表名称——查询指定列数据
select code,name from 表名称——查指定列的数据
select code as'代号',name as'姓名' from 表名称——给列指定别名
a2:条件查询
select from 表名 where code=' ' 查这一行
select from 表名 where sex='true' and nation=' ' 表示并列,--多条件并的关系
select from 表名 where sex='true' or nation=' ' --多条件或的关系
a3:范围查询
select from 表名 where 列名>40 and 列名<50
select from 表名 where 列名 between 40 and 50 --专用于范围查询
a4:离散查询
select from 表名 where 列名 in (' ',' ',' ')
select from 表名 where 列名 not in (' ',' ',' ') 反选,不在里面的
a5:模糊查询
select from 表名 where 列名 like '%宝马%'——查包含宝马的
select from 表名 where 列名 like '宝马%'——查以宝马开头的
select from 表名 where 列名 like '%宝马'——查以宝马结尾的
select from 表名 where 列名 like '宝马'——查等于宝马的
select from 表名 where 列名 like '--E'——查第三个是E的
% 代表是任意多个字符
- 下划线 代表是一个字符
a6:排序查询
select from 表名 order by 列名——默认升序排序
select from 表名 order by 列名 desc——降序排列
select from 表名 order by 列名 desc, 列名 asc——多个条件排序 , 前面是主条件 后面是次要条件
desc 降序 ,asc 升序, order by 排序 根据哪一列排序
a7:分页查询
select top 5 from 表名——查询前5条数据
select top 5 from 表名 where code not in (select top 5 code from car)
a8:去重查询(去掉重复的)
select distinct 列名 from
a9:分组查询
select Brand from 表名 group by Brand having count()>2
group by having ——表示根据一列分组 ,count()>2——每一组的数量
a10:聚合函数(统计查询)
select count () from 表名——查询所有数据条数(每一列的)
select count (列名主键) from 表名——查询这列的所有数据条数(执行快)
select sum (列名) from 表名——求和
select avg (列名) from 表名——求平均值
select max (列名) from 表名——求最大值
select min (列名) from 表名——求最小值
alter table table2121 add [名称] varchar(20) default "cor22"
alter table table2121 add [名称] varchar(20) default "cor22"
如果 PL/SQL 文本导入器只有 1 列,可能是由于以下原因之一:
文件配置错误: 文件配置错误可能导致 PL/SQL 文本导入器只读取了文件的第一列。检查文件配置是否正确。
文件格式错误: 如果文件格式不正确,可能导致 PL/SQL 文本导入器只能读取一列。检查文件是否按照 PL/SQL 文本导入器要求的格式进行编写。
程序编写错误: 如果程序编写错误,可能导致 PL/SQL 文本导入器只能读取一列。检查程序是否正确编写,确保读取多列的代码正确。
数据库配置问题: 如果数据库配置不正确,可能导致 PL/SQL 文本导入器只能读取一列。检查数据库配置是否正确。
传统情况
我们先回顾一下,在没有 "立刻加列" 功能时,加列 *** 作是怎么完成的。我们也借此来熟悉一下本期的图例:
当进行 加列 *** 作 时,所有的数据行 都必须要 增加一段数据(图中的 列 4 数据)
如上一期图解所讲,当改变数据行的长度,就需要 重建表空间(图中灰蓝的部分为发生变更的部分)
数据字典中的列定义也会被更新
以上 *** 作的问题在于 每次加列 *** 作都需要重建表空间,这就需要大量 IO以及大量的时间
立刻加列
"立刻加列" 的过程如下图:
"立刻加列" 时,只会变更数据字典中的内容,包括:
在列定义中增加 新列的定义
增加 新列的默认值
"立刻加列" 后,当要读取表中的数据时:
由于 "立刻加列" 没有 变更行数据,读取的行数据只有 3 列
MySQL 会将 新增的第 4 列的默认值,追加到 读取的数据后
以上过程描述了 如何读取 在 "立刻加列" 之前写入的数据,其实质是:在读取数据的过程中,"伪造" 了一个新列出来
那么如何读取 在 "立刻加列" 之后 写入的数据呢 过程如下图:
当读取 行 4 时:
通过判断 数据行的头信息中的instant 标志位,可以知道该行的格式是 "新格式":该行头信息后有一个新字段 "列数"
通过读取 数据行的 "列数" 字段,可以知道 该行数据中多少列有 "真实" 的数据,从而按列数读取数据
通过上图可以看到:读取 在"立刻加列" 前/后写入的数据是不同的流程
通过以上的讨论,我们可以总结 "立刻加列" 之所以高效的原因是:
在执行 "立刻加列" 时,不变更数据行的结构
读取 "旧" 数据时,"伪造" 新增的列,使结果正确
写入 "新" 数据时,使用了新的数据格式(增加了instant标志位 和 "列数" 字段),以区分新旧数据
读取 "新" 数据时,可以如实读取数据
那么 我们是否能一直 "伪造" 下去 "伪造" 何时会被拆穿
考虑以下场景:
用 "立刻加列" 增加列 A
写入数据行 1
用 "立刻加列" 增加列 B
写入数据行 2
删除列 B
我们推测一下 "删除列 B" 的最小代价:需要修改 数据行中的instant标志位或 "列数" 字段,这至少会影响到 "立刻加列" 之后写入的数据行,成本类似于重建数据
从以上推测可知:当出现 与 "立刻加列" *** 作不兼容 的 DDL *** 作时,数据表需要进行重建,如下图所示:
扩展思考题:是否能设计其他的数据格式,取代instant标志位和 "列数" 字段,使得 加列/删列 *** 作都能 "立刻完成" (提示:考虑 加列 - 删列 - 再加列 的情况)
使用限制
在了解原理之后,我们来看看 "立刻加列" 的使用限制,就很容易能理解其中的前两项:
"立刻加列" 的加列位置只能在表的最后,而不能加在其他列之间
在元数据中,只记录了 数据行 应有多少列,而没有记录 这些列 应出现的位置。所以无法实现指定列的位置
"立刻加列" 不能添加主键列
加列 不能涉及聚簇索引的变更,否则就变成了 "重建" *** 作,不是 "立刻" 完成了
"立刻加列"不支持压缩的表格式
按照 WL 的说法:"COMPRESSED is no need to supported"(没必要支持不怎么用的格式)
总结回顾
我们总结一下上面的讨论:
"立刻加列" 之所以高效的原因是:
在执行 "立刻加列" 时,不变更数据行的结构
读取 "旧" 数据时,"伪造" 新增的列,使结果正确
写入 "新" 数据时,使用了新的数据格式 (增加了 instant 标志位 和 "列数" 字段),以区分新旧数据
读取 "新" 数据时,可以如实读取数据
"立刻加列" 的 "伪造" 手法,不能一直维持下去。当发生 与 "立刻加列" *** 作不兼容 的 DDL 时,表数据就会发生重建
回到之前遗留的两个问题:
"立刻加列" 是如何工作的
我们已经解答了这个问题
所谓 "立刻加列" 是否完全不影响业务,是否是真正的 "立刻" 完成
可以看到:就算是 "立刻加列",也需要变更 数据字典,那么 该上的锁还是逃不掉的。也就是说 这里的 "立刻" 指的是 "不变更数据行的结构",而并非指 "零成本地完成任务"
思路大概是这样:
实用ltrim或者rtrim函数去掉左边或右边符合条件的字符。
如果是oracle环境,看你这里都是字母在前数字在后的格式,假设旧列叫 col_old,新的字母列是col_str,新的数字列是col_num
update table1 set
col_str=rtrim(col_old,'1234567890'),
col_num=to_number(ltrim(col_old,rtrim(col_old,'1234567890')))
sql server 有没有这个函数不知道了,反正这是一个思路吧。供参考而已
sql没有这个东西,那我就给你提个思路吧,语句你自己写了,我没有环境。
用ASCII码和sql的ltrim和rtrim来做,你需要循环找到从左起每个字符都是ASCII>=65(9以上即字母)的,直到找到ASCII<=64的就结束,这样可以把这个字符部分的长度得到,在用trim函数截取一下就可以了。
sql server中建了一张表后,还想在表中增加一列的步骤如下:
1、打开数据库,进入--安全性--登录名--新建登录名
2、在常规这个选项卡中,创建登陆名,并设置默认的数据库
3、在表中新建表
4、在表的代码编程栏中输入代码:
alter table 表名 add 列名 nvarchar(20) null
go
UPDATE 表名 SET stuName = N'some_value' WHERE 列名 IS NULL
ALTER TABLE 表名 ALTER COLUMN 列名 NVARCHAR(20) NOT NULL
go
我不懂C#,玩过asp和office 的VBA,这里有点思路以供借鉴:
1、使用OBDC对象
OBDC是windows 提供的一种通用数据接口(c#肯定支持),你可以利用OBDC对EXCEL进行 *** 作。这时候你可以将一个EXCEL工作簿理解为一个数据库,一个EXCEL工作表理解为一个数据的表。作为数据库,你不必管最后一条数据在多少行,直接添加即可。不过,EXCEL对OBDC的支持不是很好(功能上有点折扣),不知能否满足你的要求。
2、利用excel对象进行访问:
下面是我在access中的VBA访问EXCEL的代码,我不懂C#,希望你能参考一下:
Set xlapp = CreateObject("ExcelApplication") '创建EXCEL对象
Set xlbook = xlappWorkbooksOpen(“excel文件名”) '创建对象并打开excel文件
Set xlsheet = xlbookWorksheets("工作表名称") '创建对象并打开指定的工作表
这种方法你要判断最后一行的位置,让后将数据写在最后一行之后。xlsheetcells(行号, 列号)=“内容”进行写入 *** 作。
最后:
xlbookSave '保存该execl文件
xlappQuit '退出excel对象
数据库类型中没有布尔类型,你可以用字符型或者数值型表示。
用字符型时可以存'1'/'0'或'true'/'false'或'真'/'假'或'T'/'F'都可以,自己决定。
用数值型时一般存1或0,1表示真,0表示假。
设表名为T1,列名为C1,C2,现加一个C3。然后对C3赋值。
alter table T1 add C3 varchar(2);
update T1 set C3='真' where C1>C2;
update T1 set C3='假' where C1<=C2;
这样做不是很好,因为以后C1和C2值修改之后C3并不能跟着修改,除非做触发器等。
最好是不在表中加字段,在查询时通过伪列实现。如:
select C1,C2,case when C1>C2 then 'true' else 'false' end C3 from T1;
以上就是关于数据库CRUD *** 作是什么全部的内容,包括:数据库CRUD *** 作是什么、怎么在sql数据库中插入一列相同的数据、plsql文本导入器只有1列等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)