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