51Testing软件测试论坛
标题:
数据库 几个常用的 操作 应用. 呵呵
[打印本页]
作者:
阿七
时间:
2010-3-5 18:06
标题:
数据库 几个常用的 操作 应用. 呵呵
前言
:
前
2
天看到有朋友在问一个题目
.
一开始
,
都不知道怎么做
,
呵呵
数据库中的函数太多了
,
记不住
呵呵
,
后来翻了翻
,
找出来了
.
所以现在记录下来
.
免得以后又忘记了
题目是注意的
有
2
个表
其中一个表中有
1
列
为
full_name .
现在要把这列中的数据
以空格为界
,
分割开来
,
进而
插入到
第
2
个表中的
first_name
和
last name
中去
.
seven1
表
id full_name comments entrydate
1 bobo
哈哈
1905-6-12 0:00:00
2 seven bobo
哈哈
2 1905-6-12 0:00:00
3 bill bobo
哈哈
3 2009-1-20 0:00:00
4 bill sayhi
哈哈
4 2009-1-20 0:00:00
seven2
表
id first_name last_name comments entrydate
1 bobo
1905-6-12 0:00:00
2 seven bobo
1905-6-12 0:00:00
3 bill bobo
2009-1-20 0:00:00
4 bill sayhi
2009-1-20 0:00:00
这里会用到以下的
语句
:
select substring(full_name,1,charindex(' ',full_name,1)) AS first_name from seven1
--
首先
获取
full_name
中
,
空格的位置
,
然后截取
full_name
中
,
从开始位置到空格位置的值
,
记为
first_name
select substring(full_name,CHARindex(' ',full_name,1)+1,len(full_name)) AS full_name FROM seven1
--
首先
获取
full_name
中
,
空格的位置
,
然后截取
full_name
中
,
从空格位置的值
+1
到字段的最后位置
,
记为
last_name .
这里因为只有
2
部分
,
所以只需要判断一次空格
.
如果有多个空格
.
则需要多写几次这个命令了
.
--------------------------------------------
命令解释
!!!--------------------------------------------------------------------------
-- charindex('
关键字
',
字段
,n)
获取字段中
,
从第
n
个位置开始算起遇到关键字时候的位置
.
并且返回
,
下面以空格为例
.
--
比如
charindex(' ','222 3333 3333444 444',1)
获取第
1
个空格的位置
,
最后的一个
1
代表的意思为从起始位置算起
--
如
SELECT charindex(' ','222 3333 3333444 444',1)
结果为
4
--
如
SELECT charindex(' ','222 3333 3333444 444',5)
结果为
9
--
如
SELECT charindex(' ','222 3333 3333444 444',6)
结果为
9
-- substring(
字段
,
开始位置
,
截取数目
)
这是从字段中
,
截取从开始位置开始到截取位置结束的内容
,
并且返回
--
比如
substring('222 3333 3333444 444',1,5)
获取从第
1
个字符开始到
第
5
个结束的字段
.
--
如
select substring('222 3333 3333444 444',1,5)
结果为
'222 3'
--
如
select substring('222 3333 3333444 444',1,6)
结果为
'222 33'
--
如
select substring('222 3333 3333444 444',1,5)
结果为
'222 3'
--
如
select substring('222 3333 3333444 444',0,5)
结果为
'222 '
注意
0
--
如
select substring('222 3333 3333444 444',-1,5)
结果为
'222'
注意
-1 .
前面的参数
是可以为
负数的
.
-- len(full_name)
获取字段的长度
.
-----------------------------------------------------------------------------------------------------------------------------
好的
,
现在
基本的分解
工作
完成了
,
下面就需要
插入数据了
..
这里可以用
2
种方法来做
第
1
种
:
直接更新
(
如果
第
2
张表
不对行数
做限制的话
,
因为
这样插入
,
会增加行数
!
比如这个表为空表
)
INSERT INTO seven2(id,entrydate,comments,first_name,last_name)
-- full
为关键字
,
所以要用
""
标识
.
SELECT id,entrydate,comments,
substring(full_name,1,charindex(' ',full_name,1)),
substring(full_name,CHARindex(' ',full_name,1)+1,len(full_name)) from seven1
第
2
种
:
间接的更新
(
如果第
2
个表
有了一些数据
,
不希望更新而产生
新数据
,
则用
update
来做
.)
假设
,
表
seven1
同上
, seven2
为空
.
现在为了
seven2
要有数据
,
所以先生成一些
.
用
1
INSERT INTO seven2(id,entrydate,comments ) SELECT id,entrydate,comments FROM seven1
这个可以把
2
个对等的字段复制过来
.
实现
2
表之间的复制
.
OK ,
现在
seven1
和
seven2
表
条数是相等的
.
此时
,
如果用
第
1
种方法
,
行数就会不相等了
.
用
2
SELECT * FROM seven1 LEFT JOIN seven2 ON seven1.id=seven2.id
这个可以实现
2
个表互联查看
.
结果为
id full_name comments entrydate id first_name last_name comments entrydate
1 bobo 哈哈 1905-6-12 0:00:00 1 哈哈 1905-6-12 0:00:00
2 seven bobo 哈哈2 1905-6-12 0:00:00 2 哈哈2 1905-6-12 0:00:00
3 bill bobo 哈哈3 2009-1-20 0:00:00 3 哈哈3 2009-1-20 0:00:00
4 bill sayhi 哈哈4 2009-1-20 0:00:00 4 哈哈4 2009-1-20 0:00:00
用
3
UPDATE seven2 SET first_name= substring(full_name,1,charindex(' ',full_name,1)),
last_name = substring(full_name,CHARindex(' ',full_name,1)+1,len(full_name))
FROM seven2
LEFT JOIN seven1 ON seven2.id=seven1.id
到此
数据就这样更新好了
...
ps :
附带
新建
和插入数据的命令
CREATE TABLE seven1 (
id INT,
first_name VARCHAR(40),
last_name VARCHAR(40),
comments TEXT,
entrydate DATETIME
);
INSERT INTO seven1 VALUES (1,'bobo
阿七
','boy','mei
没什么写的
','2010-03-04 18:00');
[
本帖最后由 阿七 于 2010-3-5 18:13 编辑
]
作者:
阿七
时间:
2010-3-5 18:14
晕哦 发上来 格式都变形了呀!!!
作者:
smile665
时间:
2010-3-17 12:41
作者:
papeandpopo
时间:
2010-9-15 13:41
标题:
不错
不错,不错。呵呵
作者:
xiaobudian1104
时间:
2010-9-29 15:31
我不评价
作者:
msnshow
时间:
2010-10-6 13:34
看看帮助就会了
作者:
muyitudou
时间:
2010-10-12 11:20
谢谢,又学了一招
作者:
飘落的记忆
时间:
2010-11-8 14:56
看着好像好难的样子
作者:
he_jian
时间:
2010-11-11 21:34
不错,学习了
作者:
njjnyouyou
时间:
2011-1-17 09:34
回复
2#
阿七
-- 如select substring('222 3333 3333444 444',0,5)结果为'222 ' 注意 0
-- 如select substring('222 3333 3333444 444',-1,5)结果为'222' 注意 -1 .前面的参数是可以为负数的.
请问这2条的结果是怎么得出来的啊?谢谢
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2