-
2009年5月8日星期五
2009年4月22日星期三
11 Birthday
日子过得真快,昨天是宇11岁生日了,慢慢长大了,父母在外.没有同其过生日,只有电话问候与祝生日快乐,正好前天也是其期中考试结果出来,本以为对自己生日的礼物,但成绩不太理想,加油啊...希望你过得越来越开心,学习进步;
2009年4月10日星期五
数据库面试题集合
摘录 http://blog.csdn.net/sandyzhs/archive/2009/04/09/4059709.aspx
在整理准备数据库面试的过程中,先是在网上一顿海搜,找到历史面试题,然后一个骨头一个骨头的啃完,现在基本上这些问题(或者说叫做实践)都没有问题了。遇到的困难是:PL/SQL居多,T-SQL太少,所以需要筛选,修改答案,甚至有一些在T-SQL里面还没有支持。
下一步再把数据库T-SQL经典教程在翻看一遍,基本上对数据库就算告一段落了,前前后后共整整1个多月的时间(去年10.1是二周,下载是三周),学习的还行吧。
下面的就是全部内容,大段摘录的,或者是抄的,我都写了出处;有一些实在忘记了,请见谅:向大家共享知识,想必也是作者的本愿吧。
1. 三个范式
即: 属性唯一, 记录唯一, 表唯一
第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系: 关键字段 → 非关键字段x → 非关键字段y
2. 一些常识:http://www.enet.com.cn/article/2007/0802/
A20070802755140.shtml
² 简要叙述一下SQL Server 2000中使用的一些数据库对象
表格、视图、用户定义的函数,存储过程,触发器等。
² NULL是什么意思
NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。假设您的SQL Server数据库里有ANSI_NULLS,当然在默认情况下会有,对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 UNKNOWN值进行比较,并在逻辑上希望获得一个答案。您必须使用IS NULL操作符。
使用ISNULL(var,value)来进行NULL判断:当var为NULL的时候,var = value,并且返回value
² 什么是索引?SQL Server 2000里有什么类型的索引?
索引是一个数据结构,用来快速访问数据库表格或者视图里的数据。在SQL Server里,它们有两种形式:聚集索引和非聚集索引。聚集索引在索引的叶级保存数据。这意味着不论聚集索引里有表格的哪个(或哪些)字段,这些字段都会按顺序被保存在表格,物理顺序和逻辑顺序一致。由于存在这种排序,所以每个表格只会有一个聚集索引。非聚集索引在索引的叶级有一个行标识符。它允许每个表格有多个非聚集索引。
² 什么是主键?什么是外键?
主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表(可能是同一表)里的字段。那么这些相连的字段就是外键。
² 什么是触发器?SQL Server 2000有什么不同类型的触发器?
有INSTEAD-OF和AFTER两种触发器。触发器是一种专用类型的存储过程,它被捆绑到表格或者视图上。INSTEAD-OF触发器是替代数据操控语言(DML)语句对表格执行语句的存储过程。例如,如果我有一个用于TableA的INSTEAD-OF-UPDATE触发器,同时对这个表格执行一个更新语句,那么INSTEAD-OF-UPDATE触发器里的代码会执行,而不是我执行的更新语句则不会执行操作。
AFTER触发器要在DML语句在数据库里使用之后才执行。这些类型的触发器对于监视发生在数据库表格里的数据变化十分好用。
² 您如何确一个带有名为Fld1字段的TableB表格里只具有Fld1字段里的那些值,而这些值同时在名为TableA的表格的Fld1字段里?
第一个答案(而且是您希望听到的答案)是使用外键限制。外键限制用来维护引用的完整性integrity。它被用来确保表格里的字段只保存有已经在不同的(或者相同的)表格里的另一个字段里定义了的值。这个字段就是候选键(通常是另外一个表格的主键)。
另外一种答案是触发器。触发器可以被用来保证以另外一种方式实现与限制相同的作用,但是它非常难设置与维护,而且性能一般都很糟糕。由于这个原因,微软建议开发人员使用外键限制而不是触发器来维护引用的完整性。
² 对一个投入使用的在线事务处理表格(OLTP)有过多索引需要有什么样的性能考虑?
对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。
² 你可以用什么来确保表格里的字段只接受特定范围里的值?
Check限制,它在数据库表格里被定义,用来限制输入该列的值。
触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。
² 返回参数总是由存储过程返回,它用来表示存储过程是成功还是失败。返回参数总是INT数据类型。
OUTPUT参数明确要求由开发人员来指定,它可以返回其他类型的数据,例如字符型和数值型的值。(可以用作输出参数的数据类型是有一些限制的。)您可以在一个存储过程里使用多个OUTPUT参数,而您只能够使用一个返回参数。
² 什么是相关子查询?如何使用这些查询?
相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会真正请求外部查询的值,从而形成一个类似于循环的状况。
11. 某一列允许NULL值,但希望确保所有的非空(Non-NULL)值都是唯一的
SQL Server没有实现非NULL值唯一性的内建机制,因此需要通过自定义的trigger:
Create trigger mytrigger on t1 for insert, update as
BEGIN
IF (select max(cnt) from (select count(i.c1)as cnt
from t1, inserted i where t1.c1=i.c1 group by i.c1) x) > 1
ROLLBACK TRAN
END
3. 某列里最大或最小的前几个,或是大于或小于某一个值(最大值或平均值)的数据
http://www.blogjava.net/looline/archive/2006/12/08/86367.html
** HAVING子句对GROUP BY子句设置条件的方式与WHERE子句和SELECT语句交互的方式类似。WHERE子句搜索条件在进行分组操作之前应用;而HAVING搜索条件在进行分组操作之后应用。HAVING语法与WHERE语法类似,但HAVING可以包含聚合函数。HAVING子句可以引用选择列表中出现的任意项。
² 显示数据库中的最后一条记录的所有字段(ID是自增的)
SELECT top 1 * FROM Table_Name ORDER BY ID DESC -- 或者
SELECT * FROM Table_Name WHERE ID=(SELECT MAX (ID) FROM Table_Name)
² 显示数据库中的最后十条记录的所有字段(ID 是自增的 DESC 做降序 ASC 做升序)
SELECT top 10 * FROM Table_Name ORDER BY ID DESC
² 对来自表 authors 的前十个作者的 state 列进行更新
UPDATE s SET s.saleprice = s.saleprice+2
FROM (SELECT TOP 10 * FROM sales ORDER BY saleid) AS t1, sales s
WHERE s.saleid=t1.saleid
-- 或者
UPDATE s SET s.saleprice = s.saleprice+2 FROM sales s
WHERE s.saleid in (SELECT TOP 10 saleid FROM sales ORDER BY saleid)
² 找出公司里收入最高的前三名员工
select top 3 * from t1 order by a desc --或者
Select top 3 *, ROW_NUMBER() OVER(order by a DESC) as No from t1
(根据分析,执行计划中的顺序:sort (order by )+ top 3, 然后是where等条件)
² 找出公司里收入最高(低)的三->五名员工
select top 3 a from t1 where a in ( select top 5 a from t1 order by a asc) order by a desc
--弊端:参与排序的一定要是index,或者unique,且选出来的只能是单一的一个列
-- 所以用下面的方法
SELECT top (10-3+1) * FROM (SELECT TOP 10 * FROM customers Order by zip asc)t order by zip desc
² 取出表A中第31条到第40条记录(SQLServer,以自动增长的ID为主键,注意:ID可能不是连续的。)
-- top 10 可以省略
SELECT top 10 * FROM A WHERE ID not in (SELECT top 30 id FROM A)
² 显示出员工的平均工资大于3000元的部门名称(用SQL语句)
注意Full outer join,left join, right join,inner join区别和联系
SELECT Dept_Name
FROM t_Dept
WHERE ID in (SELECT Dept_IDFROM t_Salary
GROUP BY Dept_ID --对部门分组(即:相同部门的,进行同一操作)
Having avg(Salary)>3000)
² 找出那些工资高于他们所在部门的平均工资的员工
select last_name, dept_id, salary from s_emp a
where salary>(select avg(salary) from s_emp where dept_id=a.dept_id)
² 找出那些工资高于他们所在部门的 manager 的工资的员工。
select id, last_name, salary, manager_id from s_emp a
where salary>(select salary from s_emp where id=a.manager_id)
² 有两个表分别如下:
表A(varchar(32) NAME,int GRADE)
数据:ZHANGSHAN 80, LISI 60, WANGWU 84
表B(varchar(32) NAME,int AGE)
数据:ZHANGSHAN 26, LISI 24, WANGWU 26, WUTIAN 26
1)写SQL语句得到如下查询结果:
NAME GRADE AGE
ZHANGSHAN 80 26
LISI 60 24
WANGWU 84 26
WUTIAN NULL 26
答:select * from A right join B on A.NAME = B.NAME
2)写SQl语句根据名字(NAME)相同按年龄(AGE)分组得到不同年龄的人的平均成绩,并写出结果。
答:avg(grade) group by name, age
4. 横表竖起来
请写出 SQl 语句实现题目要求的结果:写一个 SQL完成左边的表变成右边的表。
表的结构
要求结果
ProductID SALE_YEAR SALES
001 2001 10
002 2001 15
003 2002 12
003 2003 10
productID 2001 2002 2003
001 10
002 15
003 12 10
² 交叉表的列数是确定的
select name,
sum(case subject when '数学' then source else 0 end) as '数学',
sum(case subject when '英语' then source else 0 end) as '英语',
sum(case subject when '语文' then source else 0 end) as '语文'
from test group by name
² 交叉表的列数是不确定的
declare @sql varchar(8000)
set @sql = 'select name,'
select @sql = @sql + 'sum(case subject when '''+subject+'''
then source else 0 end) as '''+subject+''','
from (select distinct subject from test) as a
select @sql = left(@sql,len(@sql)-1) + ' from test group by name'
exec(@sql)
5. SQLServer删除重复数据记录
http://www.cnblogs.com/luohoufu/archive/2008/06/05/1214286.html
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复。
² 写出 SQl 语句(或 SQL 语句组),查询所有 id_no 重复的记录。
select dept_ID from salary
group by dept_ID having count(dept_ID) > 1
² 对于第一种重复,比较容易解决,使用
select distinct * from tableName
就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
select distinct * into #Tmp from tableName
truncate table tableName
select * into tableName from #Tmp
drop table #Tmp
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
² 这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下:
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
² 部分关键字段重复,且记录中有ID. (***这个比较实用***)
第一种方法可一次删除所有重复的..(只保留重复中ID最小的记录)。
delete from table where id not in ( select min(id) from table group by name)第二种方法每次只删除重复中ID最大的一条记录。
delete from table where id in ( select max(id) from table group by name having count(*)>1)
² 使用SQL程序删除
declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0
² 自己还得出的办法:
select * from user1 where id not in (select top 1 id from user1 where name = user1.name) -- 两个name相等比较重要,否则就不对了。但是group by更加好一些
删就这样写
delete from user1 where id not in (select top 1 id from user1 where name=user1.name)
或
delete from user where id not in ( select max(id) from user where name=user.name)
delete from user where id not in (select max(id) from user group by name having count(*) > 1)
其他方法
A:保留id最大(或者最小)的行,删除其它行
--方法1
delete [user] from [user] t
inner join(select name,max(id) as id from [user] group by name) a
on t.name = a.name and t.id <> a.id
--方法2
delete [user] from [user] t
where exists(select * from [user] where name = t.name and id > t.id)
B:删除所有重复的name行,一行也不留
delete [user] from [user] t
inner join
(select id from [user] a where exists(select * from [user] where name = a.name group by name having count(*) > 1)) as b
on t.id = b.id
6. 一些高难度的SQL
http://www.teecool.com/post/2007072807.html
² 如果表的结构和数据:
表1:usertable
USERID USERNAME
1 user1
2 null
3 user3
4 null
5 user5
6 user6
表2: usergrade;
USERID USERNAME GRADE
1 user1 90
2 null 80
7 user7 80
8 user8 90
那么,执行语句 select count(*) from usergrade where username not in (select username from usertable);
select count(*) from usergrade g where not exists (select null from usertable t where t.userid=g.userid and t.username=g.username);
结果为:语句1( 0 ) 语句2 ( 3 ) A: 0 B:1 C:2 D:3 E:NULL --- 不懂
² 在以下的表的显示结果中,以下语句的执行结果是(知识点:in/exists+rownum)
SQL> select * from usertable;
USERID USERNAME
1 user1
2 user2
3 user3
4 user4
5 user5
SQL> select * from usergrade;
USERNAME GRADE
user9 90
user8 80
user7 80
user2 90
user1 100
user1 80
那么,执行语句Select count(*) from usertable t1 where username in
(select username from usergrade t2);
Select count(*) from usertable t1 where exists
(select 'x' from usergrade t2 where t1.username=t2.username );
以上语句的执行结果是:( c) (c ) A: 0 B: 1 C: 2 D: 3
count(*)和count(GRADE)有区别:前者统计NULL行;后者忽略NULL行
² 关联更新
有表一的查询结果如下,该表为学生成绩表select id,grade from student_grade
ID GRADE
1 50
2 40
3 70
4 80
5 30
6 90
表二为补考成绩表 select id,grade from student_makeup
ID GRADE
1 60
2 80
5 60
执行语句:
update student_grade s set s.grade =
(select t.grade from student_makeup t where s.id=t.id);
-- 这里,把1、2、5更新为对应的结果,但是3、4、6也会被更新,但是由于没有对应的值,所以都被更新为了NULL
请问之后查询: select GRADE from student_grade where id = 3;结果为: (c)
A: 0 B: 70 C: null D: 以上都不对
7. 英文
http://www.teecool.com/post/2007072808.html
² Question 1: calculating the Number of Days in a Month
declare @now datetime
--select @now = getdate()
select @now = '20090211'
-- 方法是:下月日-本月日的日期差。所以先构造本月日,在构造下月日,减
select datediff(dd, dateadd(dd, -1* datepart(dd, @now) + 1, @now),
dateadd(MM, 1, dateadd(dd, -1* datepart(dd, @now) + 1, @now)) )
-- 方法:下月日的前一天就是本月的月末,这一天的‘dd’就是本月天数。
select datepart(dd,
dateadd(dd,-1,dateadd(mm,1,cast(cast(year(getdate()) as varchar)
+'-'+cast(month(getdate()) as varchar)+'-01' as datetime))));
² Question2:How can I print "10 to 20" for books that sell for between $10 and $20,"unknown" for books whose price is null, and "other" for all other prices?
select bookid,bookname,
price=case when price is null then 'unknown'
when price between 10 and 20 then '10 to 20' else price end
from books
Question3:to find duplicate values! Find authors with the same last name?
You can use the table authors in datatabase pubs. I want to get the result:
au_lname number_dups
Ringer 2
Answer 3
select au_lname,number_dups=count(1) from authors group by au_lname
--count(1)和count(*)结果一样,都是根据au_lname分组进行的组内全部统计
² Question4:Can you create a cross-tab report in my SQL Server!
How can I get the report about sale quality for each store and each quarter and the total sale quality for each quarter at year 1993?
You can use the table sales and stores in datatabase pubs.
Table Sales record all sale detail item for each store. Column store_id is the id of each store, ord_date is the order date of each sale item, and column qty is the sale quality. Table stores record all store information.
I want to get the result look like as below:
Output:
stor_name Total Qtr1 Qtr2 Qtr3 Qtr4
Barnum's 50 0 50 0 0
Bookbeat 55 25 30 0 0
Doc-U-Mat: 85 0 85 0 0
Fricative 60 35 0 0 25
Total 250 60 165 0 25
Answer 4:用动态SQL实现,前面有。不过看起来很复杂
use pubs
declare @s varchar(8000)
set @s='select isnull(stores.stor_name,''Total'') '
select @s=@s + ',[Qtr' + cast(datepart(q,ord_date) as char(1))
+ ']=sum(case when datepart(q,ord_date)='''
+ cast(datepart(q,ord_date) as char(1)) + ''' then qty else 0 end)'
from Sales
group by datepart(q,ord_date)
set @s=@s + ' ,sum(qty) "Total" from Sales inner join stores on Sales.stor_id = stores.stor_id '
set @s=@s + ' where datepart(yyyy,ord_date) = ''1993'' '
set @s=@s + ' group by stores.stor_name WITH ROLLUP '
set @s=@s + ' order by stores.stor_name '
print @s
exec(@s)
-- print @s的结果是这样的:
select isnull(stores.stor_name,'Total') , -- isnull把rollup造成的NULL值改成了Total,技巧
[Qtr1]=sum(case when datepart(q,ord_date)='1' then qty else 0 end),
[Qtr2]=sum(case when datepart(q,ord_date)='2' then qty else 0 end),
[Qtr3]=sum(case when datepart(q,ord_date)='3' then qty else 0 end),
[Qtr4]=sum(case when datepart(q,ord_date)='4' then qty else 0 end),
sum(qty) "Total"
from Sales inner join stores on Sales.stor_id = stores.stor_id
where datepart(yyyy,ord_date) = '1993'
group by stores.stor_name WITH ROLLUP -- rollup是一个很重要的东西
order by stores.stor_name -- order by,貌似不需要,或者用desc更好
² Question5: The Fastest Way to Recompile All Stored Procedures
I have a problem with a database running in SQL Server 6.5 (Service Pack 4). We moved the database (object transfer) from one machine to another last night, and an error (specific to a stored procedure) is cropping up. However, I can't tell which procedure is causing it. Permissions are granted in all of our stored procedures; is there a way from the isql utility to force all stored procedures to recompile?
Tips: sp_recompile can recomplie a store procedure each time
Answer 5:在执行存储过程时,使用 with recompile 选项强制编译新的计划;使用sp_recompile系统存储过程强制在下次运行时进行重新编译
Question6: How can I add row numbers to my result set?
In database pubs, have a table titles , now I want the result shown as below,each row have a row number, how can you do that?
line-no title_id
1 BU1032
2 BU1111
3 BU2075
4 BU7832
5 MC2222
6 MC3021
7 MC3026
Answer 6:
-- row_number()的这种用法据我了解不行,他必须和over连用
select row_number() over(order by title_id) as line_no ,title_id from titles
² Question 7: the difference of two SQL statements at performance of execution?
Statement 1:
if NOT EXISTS ( select * from publishers where state = ‘NY’)
SELECT ‘Sales force needs to penetrate New York market’
else
SELECT ‘We have publishers in New York’
Statement 2:
if EXISTS ( select * from publishers where state = ‘NY’)
SELECT ‘We have publishers in New York’
else
SELECT ‘Sales force needs to penetrate New York market’
Answer 7:
不同点:初步感觉应该是第二个性能比较好,因为不需要遍历整个数据表,只要有一个存在的就可以结束。但是从执行计划的时间和IO看,结果是一样的。
² Question9: How can I get a list of the stores that have bought both ‘bussiness’ and ‘mod_cook’ type books?
In database pubs, use three table stores,sales and titles to implement this requestment. Now I want to get the result as below:
stor_id stor_name
...
7896 Fricative Bookshop
...
...
...
Answer 9:
use pubs
select distinct a.stor_id, a.stor_name from stores a,sales b,titles c
where a.stor_id=b.stor_id and b.title_id=c.title_id and c.type='business' and
exists(select 1 from sales k,titles g where stor_id=b.stor_id
and k.title_id=g.title_id and g.type='mod_cook');
-- 或者使用个连续的join也可以
select distinct a.stor_id, a.stor_name from stores a
join sales b on a.stor_id=b.stor_id
join titles c on b.title_id=c.title_id and c.type='business'
and exists (select * from sales k,titles g where stor_id=b.stor_id
and k.title_id=g.title_id and g.type='mod_cook')
Question11: How can I list all book with prices greather than the average price of books of the same type?
In database pubs, have a table named titles , its column named price mean the price of the book, and another named type mean the type of books.
Now I want to get the result as below:
type title price
business The Busy Executive’s Database Guide 19.9900
...
...
Answer 11:
select distinct t1.price, t1.type from titles t1, titles t2
where t1.price <
( select avg(price) from titles t2 where t1.type = t2.type group by type )
-- 或者
select distinct t1.price, t1.type from titles t1
join titles
on t1.price <
( select avg(price) from titles t2 where t1.type = t2.type group by type )
8. 其他
http://www.teecool.com/post/2007071809.html
² 有订单表SO_Table,单号字段RefNo VARCHAR(10),需要实现自动编号,格式为YYYYMMXXXX,其中XXXX为序号,如:2004050001,2004050002……2004059999等,采用Transact-SQL实现新订单编号的思路。
思路:
1,IDENTITY(smallint, 100, 1)只有在select…into这样的数据插入里面可用;
2,6位长度的年月可以用:convert(char(6), getdate(), 112);
或者cast(datepart(YY, @date) as varchar(4)) +
right(cast(datepart(MM, @date)+100 as varchar(3)), 2)
3, 如果必须在SP里面工作的话,可以获得上次的最大序号,加1
² 有表T1,T2,现有一事务,在向表T1添加数据时,同时也必须向T2也添加数据,如何确何数据的完整性。
使用trigger可以做到;另外,添加过程要在一个transaction中进行;
² 如何求表中相邻(按聚集索引相邻)的两条记录的某字段的值之差。
select s2.saleid, p=(s1.saleprice-s2.saleprice)
from
(select *, id=row_number() over(order by saleid) from sales) s1,
(select *, id=row_number() over(order by saleid) from sales) s2
where s2.id-s1.id=1
-- 下面的办法不行,因为如果相邻的ID不是连续的就不行了。另外,可以使用cursor
select a.source - b.source from test a, test b
where (a.id - b.id) = 1
order by a.id
² 如何删除表中的重复数据。上面有答案。
² 人员情况表(employee)中字段包括,员工号(ID),姓名(name),年龄(age),文化程度(wh):包括四种情况(本科以上,大专,高中,初中以下),现在我要根据年龄字段查询统计出:表中文化程度为本科以上,大专,高中,初中以下,各有多少人,占总人数多少。结果如下:
学历 年龄 人数 百分比
本科以上 20 34 14
大专 20 33 13
高中 20 33 13
初中以下 20 100 40
本科以上 21 50 20
。。。。。。
Transact-SQL查询语句如何写?
-- Count(*) * 100 由group by限定;SELECT Count(*) FROM是总数。
SELECT wh AS 学历,age as 年龄, Count(*) AS 人数,
Count(*) * 100 /(SELECT Count(*) FROM employee) AS 百分比
FROM employee GROUP BY wh,age
² 表一(AAA)
商品名称a 商品总量b
A 100
B 120
表二(BBB)
商品名称a 出库数量b
A 10
A 20
B 10
B 20
B 30
用一条Transact-SQL语句算出商品A,B目前还剩多少?
select sum(b)
from (select * from a
union all select a, b*(-1) from b) x
group by a
² 找到连续编号中断的那一个的最小值
select min(t.id) as id from (select id=id+1 from tt) t
where id not in (select id from tt)
9. 实际应用
A) 为管理岗位业务培训信息,建立3个表:
S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
C (C#,CN ) C#,CN 分别代表课程编号、课程名称
SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩
² 查询选修课程名称为’税收基础’的学员学号和姓名
Select SN,SD FROM S -- 实际上,使用3个join才是合理的
Where [S#] IN(
Select [S#] FROM C,SC
Where C.[C#]=SC.[C#]
AND CN=N'税收基础')
² 查询选修课程编号为’C2’的学员姓名和所属单位
Select S.SN,S.SD FROM S,SC
Where S.[S#]=SC.[S#]
AND SC.[C#]='C2'
² 查询不选修课程编号为’C5’的学员姓名和所属单位
Select SN,SD FROM S
Where [S#] NOT IN( -- not in是正确的。不能使用=,会遗漏
Select [S#] FROM SC
Where [C#]='C5')
² 4. 查询选修全部课程的学员姓名和所属单位
-- 1)RIGHT JOIN可产生NULL行;2)COUNT(*),COUNT(S#)的结果不同
-- 解释:如果COUNT(*)<>COUNT(S#),
-- 说明C中有某个C#没有在sc中出现,也就是说:这门课程没有被S#同学选中。
Select SN,SD FROM S
Where [S#] IN(
Select [S#] FROM SC
RIGHT JOIN
C ON SC.[C#]=C.[C#] GROUP BY [S#]
HAVING COUNT(*)=COUNT([S#]))
² 5. 查询选修了课程的学员人数
Select 学员人数=COUNT(DISTINCT [S#]) FROM SC
² 6. 查询选修课程超过5门的学员学号和所属单位
-- 关注having子句中的count()等聚合函数的使用
Select SN,SD FROM S
Where [S#] IN(
Select [S#] FROM SC
GROUP BY [S#]
HAVING COUNT(DISTINCT [C#])>5)
B)该题目中,很多都有歧义,所以只要掌握的基本的方法,不需要深究细节。
/*
S (SNO,SNAME) 学生关系。SNO 为学号,SNAME 为姓名
C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师
SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩
*/
² 找出没有选修过“李”老师讲授课程的所有学生姓名
select distinct sname from s
where s.sno not in --因为有这种情况:S.SNO不在SC中存在。
(select sno from sc,c where sc.CNO=c.cno and cteacher = '李')
² 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩
Select S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)
FROM S,SC,(
Select SNO FROM SC Where SCGRADE<60
GROUP BY SNO HAVING COUNT(DISTINCT CNO)>=2
)A -- 实际上,使用 IN 进行条件连接也行
-- where控制条件,having控制分组条件并聚合
Where S.SNO=A.SNO AND SC.SNO=A.SNO
GROUP BY S.SNO,S.SNAME
--下面是错误结果:它只是把没有及格的科目进行了avg,并不是所有的科目的avg
select avg(sc.scgrade), s.sname
from s
join sc on sc.sno = s.sno and sc.scgrade < 60
group by s.sname having count(sc.scgrade)>=2
² 列出既学过“c1”号课程,又学过“c2”号课程的所有学生姓名
select s.sname
from s, (select * from sc
where sc.sno in (select sc.sno from sc where sc.cno = 'c1')
and sc.cno = 'c2') SS -- 把sc.sno in换为exists也可以。两种方案
where s.sno = ss.sno
² 列出“c1”号课成绩比“s2”号同学该门课成绩高的所有学生的学号
select sc.sno, sc.scgrade from sc
where sc.cno='c1' and
sc.scgrade>(select sc.scgrade from sc where sc.cno='c1' and sc.sno='s2')
² 列出“c1”号课成绩比“c2”号课成绩高的所有学生的学号及其“c1”号课和“c2”号课的成绩
select sc1.sno, sc1.cno, sc1.scgrade
from sc sc1,
(select sc1.sno, sc1.cno, sc1.scgrade
from sc sc1, sc sc2
where sc1.cno='c1' and sc2.cno='c2' and sc1.scgrade>sc2.scgrade
and sc1.sno=sc2.sno) sc2
where sc2.sno=sc1.sno and (sc1.cno='c1' or sc1.cno='c2')
1. 老外的一套题
我需要一个模式和一些数据来运行所要考核的查询,列表A创建了所需的这些数据:
IF OBJECT_ID('Sales')>0 DROP TABLE Sales
GO
IF OBJECT_ID('Customers')>0 DROP TABLE Customers
GO
IF OBJECT_ID('Products')>0 DROP TABLE Products
GO
CREATE TABLE Customers(CustomerID INT IDENTITY PRIMARY KEY ,
FirstName VARCHAR(50),
LastName VARCHAR(50),
City VARCHAR(50),
State CHAR(2),
Zip VARCHAR(10) )
GO
CREATE TABLE Products(
ProductID TINYINT IDENTITY PRIMARY KEY ,
ProductName VARCHAR(20),
RecommendedPrice MONEY,
Category VARCHAR(10))
GO
CREATE TABLE Sales(SaleID INT IDENTITY PRIMARY KEY ,
ProductID TINYINT NOT NULL REFERENCES Products(ProductID),
CustomerID INT NOT NULL REFERENCES Customers(CustomerID),
SalePrice MONEY NOT NULL,SaleDate SMALLDATETIME NOT NULL)
GO
INSERT INTO Products(ProductName,RecommendedPrice,Category)VALUES('DVD',105,'LivingRoom')
INSERT INTO Products(ProductName,RecommendedPrice,Category)VALUES('Microwave',98,'Kitchen')
INSERT INTO Products(ProductName,RecommendedPrice,Category)VALUES('Monitor',200,'Office')
INSERT INTO Products(ProductName,RecommendedPrice,Category)VALUES('Speakers',85,'Office')
INSERT INTO Products(ProductName,RecommendedPrice,Category)VALUES('Refrigerator',900,'Kitchen')
INSERT INTO Products(ProductName,RecommendedPrice,Category)VALUES('VCR',165,'LivingRoom')
INSERT INTO Products(ProductName,RecommendedPrice,Category)VALUES('CoffeePot',35,'Kitchen')
GO
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('John','Miller','Asbury','NY','23433')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Fred','Hammill','Basham','AK','85675')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Stan','Mellish','Callahan','WY','38556')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Adrian','Caparzo','Denver','CO','12377')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Mike','Horvath','Easton','IN','47130')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Irwin','Wade','Frankfurt','KY','45902')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('George','Marshall','Gallipoli','ND','34908')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Frank','Costello','Honolulu','HI','23905')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Billy','Costigan','Immice','SC','75389')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Shelly','Sipes','Lights','AZ','35263')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Chirsty','Melton','Spade','CA','97505')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Amanda','Owens','Flask','CN','50386')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Brittany','Smits','Bourbon','KY','24207')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Kristy','Bryant','Tarp','FL','58960')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Kelly','Street','TableTop','ID','57732')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Tricia','Hill','Camera','ME','46738')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Holly','Raines','Compact','MS','35735')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Natalie','Woods','Woods','IN','87219')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Wendy','Hilton','Action','KY','47093')
GO
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(1,1,130,'2/6/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(2,2,97,'1/7/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(3,3,200,'8/8/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(4,4,80,'4/9/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(5,5,899,'10/10/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(6,6,150,'10/11/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(3,7,209,'12/12/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(4,8,90,'5/13/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(6,9,130,'6/14/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(2,14,85,'6/19/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(3,15,240,'9/20/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(1,16,99,'7/21/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(1,17,87,'3/22/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(2,18,99,'1/23/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(6,19,150,'3/24/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(5,5,900,'3/10/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(4,6,86,'8/11/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(2,7,88,'8/12/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(3,8,198,'12/13/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(1,9,150,'5/14/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(6,14,99,'7/19/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(6,15,104,'9/20/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(3,16,270,'2/21/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(4,17,90,'7/22/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(1,1,130,'3/6/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(2,2,102,'4/7/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(1,3,114,'11/8/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(5,4,1000,'5/9/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(5,5,1100,'10/10/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(3,6,285,'6/11/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(2,7,87,'10/12/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(3,8,300,'7/13/2005')
GO
² 1:返回在2005年10月售出的所有产品的名称、价格和客户姓名,答案:
select c.FirstName,c.LastName, p.productname, s.SalePrice, s.saledate from products p, customers c, sales s
where s.productid = p.productid and c.customerid = s.customerid
and datepart(YY, s.saledate) = 2005 and datepart(MM, s.saledate) = 10
--或者下面的也行。根据执行计划,二者是完全一样的。
SELECT c.FirstName,c.LastName,p.ProductName,s.SalePrice
FROM Sales s
INNER JOIN Customers c ON s.CustomerID=c.CustomerID
INNER JOIN Products p ON s.ProductID=p.ProductID
WHERE s.SaleDate>='10/1/2005'AND s.SaleDate<'11/1/2005'
² 2:返回没有购买产品并且位于客户表格上的人的姓名及其客户ID,答案:
select c.FirstName,c.LastName, c.customerid
from customers c
where c.customerid not in ( select distinct customerid from sales)
--或者下面的。下面的是提供的答案;但是上面的效率更高,二者比42:58
SELECT c.CustomerID,c.FirstName,c.LastName
FROM Sales s
RIGHT OUTER JOIN Customers c ON s.CustomerID=c.CustomerID
WHERE s.CustomerID IS NULL
3:返回客户姓名、销售价格、建议售价、建议售价和实际价格的差额,该差额必需是正数,答案见列表D:
SELECT c.FirstName,c.LastName,s.SalePrice,p.RecommendedPrice,
ABS(s.SalePrice-p.RecommendedPrice) AS diff
FROM Sales s
INNER JOIN Customers c ON s.CustomerID=c.CustomerID
INNER JOIN Products p ON s.ProductID=p.ProductID
² 4:根据产品类别计算平均价格,答案见列表E:
SELECT avg(s.SalePrice) as avg, p.category
FROM Sales s inner join products p
on s.productid = p.productid group by p.category
² 5:将以下的客户和销售信息加入到数据库中:
FirstName:Chris, LastName:Kringle, City:Henryville, State:IN, Zip:47126
ProductID:3, SalePrice:205, SaleDate:12/31/2005
答案见列表F(关注SCOPE_IDENTITY(),这里可以和@@identity互换):
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Chris','Kringle','Henryville','IN','47126')
INSERT INTO Sales(CustomerID,ProductID,SalePrice,SaleDate)
VALUES(SCOPE_IDENTITY(),3,205,'12/31/2005')
² 6:从数据库中删除来自缅因洲(‘ME’)的客户,答案见列表G:(不过,delete s from...这样的用法很怪,貌似这样就可以把s这个名字引入进来了)
delete s from Sales s where s.CustomerID in
(select CustomerID from Customers where State = 'ME')
-- 或者下面的:(因为不支持delete from A, B这样的语法,所以用join)
DELETE s FROM Sales s JOIN Customers c
ON s.CustomerID=c.CustomerID WHERE c.State='ME'
-- 然后
DELETE c FROM Customers c WHERE c.State='ME'
² 7:返回客户购买了两个或多个产品的平均售价和产品类别,答案:
SELECT AVG(s.SalePrice) avg, p.Category
FROM Sales s, Products p
where s.ProductID=p.ProductID and s.CustomerID in
( SELECT s.CustomerID FROM Sales s
GROUP BY s.CustomerID HAVING COUNT(CustomerID)>=2)
GROUP BY p.Category
-- 或者
SELECT AVG(s.SalePrice) avg, p.Category
FROM Sales s INNER JOIN
( SELECT s.CustomerID FROM Sales s
GROUP BY s.CustomerID HAVING COUNT(CustomerID)>=2)x
ON s.CustomerID=x.CustomerID
INNER JOIN Products p ON s.ProductID=p.ProductID
GROUP BY p.Category
² 8:将销售在2005年6月10日到6月20日之间的产品的销售价格升级为建议售价:(这个还是不太明白,尤其是s.ProductID=s.ProductID,怪)
UPDATE s SET SalePrice=p.RecommendedPrice
FROM Sales s INNER JOIN Products p ON s.ProductID=s.ProductID
WHERE SaleDate>='6/10/2005' AND SaleDate<'6/21/2005'
² 9:根据产品种类计算建议售价超过实际售价10元及以上的销售数量,答案见列表J:
SELECT count(s.SalePrice) count, p.Category
FROM Sales s
INNER JOIN Products p ON s.ProductID=p.ProductID
where p.RecommendedPrice - s.SalePrice >= 10
GROUP BY p.Category
-- 题目有歧义,所以,也可以这样做:
SELECT p.Category,COUNT(*)AS NumberOfSales
FROM Sales s
INNER JOIN Products p ON s.ProductID=p.ProductID
GROUP BY p.Category
HAVING AVG(p.RecommendedPrice)>=AVG(s.SalePrice)+10
² 10:不使用叠代构建,返回所由销售产品的销售日期,以及该日期之前的销售额统计,以及该日期之前的销售额统计,并按照该日期升序排列,答案:
SELECT s.SaleDate, s.SalePrice,
( SELECT SUM(SalePrice) FROM Sales s2 WHERE s2.SaleDate<=s.SaleDate )AS RunningTotal
FROM Sales s ORDER BY s.SaleDate ASC
迄今为止,只有2个人可以正确地回答出所有的问题。
平均大约为50-60%,如果表现高于这个平均,那么优秀的TSQL程序员,如果获得了90%以上的得分,那么他或她就是一位非常优异的程序员。
在整理准备数据库面试的过程中,先是在网上一顿海搜,找到历史面试题,然后一个骨头一个骨头的啃完,现在基本上这些问题(或者说叫做实践)都没有问题了。遇到的困难是:PL/SQL居多,T-SQL太少,所以需要筛选,修改答案,甚至有一些在T-SQL里面还没有支持。
下一步再把数据库T-SQL经典教程在翻看一遍,基本上对数据库就算告一段落了,前前后后共整整1个多月的时间(去年10.1是二周,下载是三周),学习的还行吧。
下面的就是全部内容,大段摘录的,或者是抄的,我都写了出处;有一些实在忘记了,请见谅:向大家共享知识,想必也是作者的本愿吧。
1. 三个范式
即: 属性唯一, 记录唯一, 表唯一
第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系: 关键字段 → 非关键字段x → 非关键字段y
2. 一些常识:http://www.enet.com.cn/article/2007/0802/
A20070802755140.shtml
² 简要叙述一下SQL Server 2000中使用的一些数据库对象
表格、视图、用户定义的函数,存储过程,触发器等。
² NULL是什么意思
NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。假设您的SQL Server数据库里有ANSI_NULLS,当然在默认情况下会有,对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 UNKNOWN值进行比较,并在逻辑上希望获得一个答案。您必须使用IS NULL操作符。
使用ISNULL(var,value)来进行NULL判断:当var为NULL的时候,var = value,并且返回value
² 什么是索引?SQL Server 2000里有什么类型的索引?
索引是一个数据结构,用来快速访问数据库表格或者视图里的数据。在SQL Server里,它们有两种形式:聚集索引和非聚集索引。聚集索引在索引的叶级保存数据。这意味着不论聚集索引里有表格的哪个(或哪些)字段,这些字段都会按顺序被保存在表格,物理顺序和逻辑顺序一致。由于存在这种排序,所以每个表格只会有一个聚集索引。非聚集索引在索引的叶级有一个行标识符。它允许每个表格有多个非聚集索引。
² 什么是主键?什么是外键?
主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表(可能是同一表)里的字段。那么这些相连的字段就是外键。
² 什么是触发器?SQL Server 2000有什么不同类型的触发器?
有INSTEAD-OF和AFTER两种触发器。触发器是一种专用类型的存储过程,它被捆绑到表格或者视图上。INSTEAD-OF触发器是替代数据操控语言(DML)语句对表格执行语句的存储过程。例如,如果我有一个用于TableA的INSTEAD-OF-UPDATE触发器,同时对这个表格执行一个更新语句,那么INSTEAD-OF-UPDATE触发器里的代码会执行,而不是我执行的更新语句则不会执行操作。
AFTER触发器要在DML语句在数据库里使用之后才执行。这些类型的触发器对于监视发生在数据库表格里的数据变化十分好用。
² 您如何确一个带有名为Fld1字段的TableB表格里只具有Fld1字段里的那些值,而这些值同时在名为TableA的表格的Fld1字段里?
第一个答案(而且是您希望听到的答案)是使用外键限制。外键限制用来维护引用的完整性integrity。它被用来确保表格里的字段只保存有已经在不同的(或者相同的)表格里的另一个字段里定义了的值。这个字段就是候选键(通常是另外一个表格的主键)。
另外一种答案是触发器。触发器可以被用来保证以另外一种方式实现与限制相同的作用,但是它非常难设置与维护,而且性能一般都很糟糕。由于这个原因,微软建议开发人员使用外键限制而不是触发器来维护引用的完整性。
² 对一个投入使用的在线事务处理表格(OLTP)有过多索引需要有什么样的性能考虑?
对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。
² 你可以用什么来确保表格里的字段只接受特定范围里的值?
Check限制,它在数据库表格里被定义,用来限制输入该列的值。
触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。
² 返回参数总是由存储过程返回,它用来表示存储过程是成功还是失败。返回参数总是INT数据类型。
OUTPUT参数明确要求由开发人员来指定,它可以返回其他类型的数据,例如字符型和数值型的值。(可以用作输出参数的数据类型是有一些限制的。)您可以在一个存储过程里使用多个OUTPUT参数,而您只能够使用一个返回参数。
² 什么是相关子查询?如何使用这些查询?
相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会真正请求外部查询的值,从而形成一个类似于循环的状况。
11. 某一列允许NULL值,但希望确保所有的非空(Non-NULL)值都是唯一的
SQL Server没有实现非NULL值唯一性的内建机制,因此需要通过自定义的trigger:
Create trigger mytrigger on t1 for insert, update as
BEGIN
IF (select max(cnt) from (select count(i.c1)as cnt
from t1, inserted i where t1.c1=i.c1 group by i.c1) x) > 1
ROLLBACK TRAN
END
3. 某列里最大或最小的前几个,或是大于或小于某一个值(最大值或平均值)的数据
http://www.blogjava.net/looline/archive/2006/12/08/86367.html
** HAVING子句对GROUP BY子句设置条件的方式与WHERE子句和SELECT语句交互的方式类似。WHERE子句搜索条件在进行分组操作之前应用;而HAVING搜索条件在进行分组操作之后应用。HAVING语法与WHERE语法类似,但HAVING可以包含聚合函数。HAVING子句可以引用选择列表中出现的任意项。
² 显示数据库中的最后一条记录的所有字段(ID是自增的)
SELECT top 1 * FROM Table_Name ORDER BY ID DESC -- 或者
SELECT * FROM Table_Name WHERE ID=(SELECT MAX (ID) FROM Table_Name)
² 显示数据库中的最后十条记录的所有字段(ID 是自增的 DESC 做降序 ASC 做升序)
SELECT top 10 * FROM Table_Name ORDER BY ID DESC
² 对来自表 authors 的前十个作者的 state 列进行更新
UPDATE s SET s.saleprice = s.saleprice+2
FROM (SELECT TOP 10 * FROM sales ORDER BY saleid) AS t1, sales s
WHERE s.saleid=t1.saleid
-- 或者
UPDATE s SET s.saleprice = s.saleprice+2 FROM sales s
WHERE s.saleid in (SELECT TOP 10 saleid FROM sales ORDER BY saleid)
² 找出公司里收入最高的前三名员工
select top 3 * from t1 order by a desc --或者
Select top 3 *, ROW_NUMBER() OVER(order by a DESC) as No from t1
(根据分析,执行计划中的顺序:sort (order by )+ top 3, 然后是where等条件)
² 找出公司里收入最高(低)的三->五名员工
select top 3 a from t1 where a in ( select top 5 a from t1 order by a asc) order by a desc
--弊端:参与排序的一定要是index,或者unique,且选出来的只能是单一的一个列
-- 所以用下面的方法
SELECT top (10-3+1) * FROM (SELECT TOP 10 * FROM customers Order by zip asc)t order by zip desc
² 取出表A中第31条到第40条记录(SQLServer,以自动增长的ID为主键,注意:ID可能不是连续的。)
-- top 10 可以省略
SELECT top 10 * FROM A WHERE ID not in (SELECT top 30 id FROM A)
² 显示出员工的平均工资大于3000元的部门名称(用SQL语句)
注意Full outer join,left join, right join,inner join区别和联系
SELECT Dept_Name
FROM t_Dept
WHERE ID in (SELECT Dept_IDFROM t_Salary
GROUP BY Dept_ID --对部门分组(即:相同部门的,进行同一操作)
Having avg(Salary)>3000)
² 找出那些工资高于他们所在部门的平均工资的员工
select last_name, dept_id, salary from s_emp a
where salary>(select avg(salary) from s_emp where dept_id=a.dept_id)
² 找出那些工资高于他们所在部门的 manager 的工资的员工。
select id, last_name, salary, manager_id from s_emp a
where salary>(select salary from s_emp where id=a.manager_id)
² 有两个表分别如下:
表A(varchar(32) NAME,int GRADE)
数据:ZHANGSHAN 80, LISI 60, WANGWU 84
表B(varchar(32) NAME,int AGE)
数据:ZHANGSHAN 26, LISI 24, WANGWU 26, WUTIAN 26
1)写SQL语句得到如下查询结果:
NAME GRADE AGE
ZHANGSHAN 80 26
LISI 60 24
WANGWU 84 26
WUTIAN NULL 26
答:select * from A right join B on A.NAME = B.NAME
2)写SQl语句根据名字(NAME)相同按年龄(AGE)分组得到不同年龄的人的平均成绩,并写出结果。
答:avg(grade) group by name, age
4. 横表竖起来
请写出 SQl 语句实现题目要求的结果:写一个 SQL完成左边的表变成右边的表。
表的结构
要求结果
ProductID SALE_YEAR SALES
001 2001 10
002 2001 15
003 2002 12
003 2003 10
productID 2001 2002 2003
001 10
002 15
003 12 10
² 交叉表的列数是确定的
select name,
sum(case subject when '数学' then source else 0 end) as '数学',
sum(case subject when '英语' then source else 0 end) as '英语',
sum(case subject when '语文' then source else 0 end) as '语文'
from test group by name
² 交叉表的列数是不确定的
declare @sql varchar(8000)
set @sql = 'select name,'
select @sql = @sql + 'sum(case subject when '''+subject+'''
then source else 0 end) as '''+subject+''','
from (select distinct subject from test) as a
select @sql = left(@sql,len(@sql)-1) + ' from test group by name'
exec(@sql)
5. SQLServer删除重复数据记录
http://www.cnblogs.com/luohoufu/archive/2008/06/05/1214286.html
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复。
² 写出 SQl 语句(或 SQL 语句组),查询所有 id_no 重复的记录。
select dept_ID from salary
group by dept_ID having count(dept_ID) > 1
² 对于第一种重复,比较容易解决,使用
select distinct * from tableName
就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
select distinct * into #Tmp from tableName
truncate table tableName
select * into tableName from #Tmp
drop table #Tmp
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
² 这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下:
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
² 部分关键字段重复,且记录中有ID. (***这个比较实用***)
第一种方法可一次删除所有重复的..(只保留重复中ID最小的记录)。
delete from table where id not in ( select min(id) from table group by name)第二种方法每次只删除重复中ID最大的一条记录。
delete from table where id in ( select max(id) from table group by name having count(*)>1)
² 使用SQL程序删除
declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0
² 自己还得出的办法:
select * from user1 where id not in (select top 1 id from user1 where name = user1.name) -- 两个name相等比较重要,否则就不对了。但是group by更加好一些
删就这样写
delete from user1 where id not in (select top 1 id from user1 where name=user1.name)
或
delete from user where id not in ( select max(id) from user where name=user.name)
delete from user where id not in (select max(id) from user group by name having count(*) > 1)
其他方法
A:保留id最大(或者最小)的行,删除其它行
--方法1
delete [user] from [user] t
inner join(select name,max(id) as id from [user] group by name) a
on t.name = a.name and t.id <> a.id
--方法2
delete [user] from [user] t
where exists(select * from [user] where name = t.name and id > t.id)
B:删除所有重复的name行,一行也不留
delete [user] from [user] t
inner join
(select id from [user] a where exists(select * from [user] where name = a.name group by name having count(*) > 1)) as b
on t.id = b.id
6. 一些高难度的SQL
http://www.teecool.com/post/2007072807.html
² 如果表的结构和数据:
表1:usertable
USERID USERNAME
1 user1
2 null
3 user3
4 null
5 user5
6 user6
表2: usergrade;
USERID USERNAME GRADE
1 user1 90
2 null 80
7 user7 80
8 user8 90
那么,执行语句 select count(*) from usergrade where username not in (select username from usertable);
select count(*) from usergrade g where not exists (select null from usertable t where t.userid=g.userid and t.username=g.username);
结果为:语句1( 0 ) 语句2 ( 3 ) A: 0 B:1 C:2 D:3 E:NULL --- 不懂
² 在以下的表的显示结果中,以下语句的执行结果是(知识点:in/exists+rownum)
SQL> select * from usertable;
USERID USERNAME
1 user1
2 user2
3 user3
4 user4
5 user5
SQL> select * from usergrade;
USERNAME GRADE
user9 90
user8 80
user7 80
user2 90
user1 100
user1 80
那么,执行语句Select count(*) from usertable t1 where username in
(select username from usergrade t2);
Select count(*) from usertable t1 where exists
(select 'x' from usergrade t2 where t1.username=t2.username );
以上语句的执行结果是:( c) (c ) A: 0 B: 1 C: 2 D: 3
count(*)和count(GRADE)有区别:前者统计NULL行;后者忽略NULL行
² 关联更新
有表一的查询结果如下,该表为学生成绩表select id,grade from student_grade
ID GRADE
1 50
2 40
3 70
4 80
5 30
6 90
表二为补考成绩表 select id,grade from student_makeup
ID GRADE
1 60
2 80
5 60
执行语句:
update student_grade s set s.grade =
(select t.grade from student_makeup t where s.id=t.id);
-- 这里,把1、2、5更新为对应的结果,但是3、4、6也会被更新,但是由于没有对应的值,所以都被更新为了NULL
请问之后查询: select GRADE from student_grade where id = 3;结果为: (c)
A: 0 B: 70 C: null D: 以上都不对
7. 英文
http://www.teecool.com/post/2007072808.html
² Question 1: calculating the Number of Days in a Month
declare @now datetime
--select @now = getdate()
select @now = '20090211'
-- 方法是:下月日-本月日的日期差。所以先构造本月日,在构造下月日,减
select datediff(dd, dateadd(dd, -1* datepart(dd, @now) + 1, @now),
dateadd(MM, 1, dateadd(dd, -1* datepart(dd, @now) + 1, @now)) )
-- 方法:下月日的前一天就是本月的月末,这一天的‘dd’就是本月天数。
select datepart(dd,
dateadd(dd,-1,dateadd(mm,1,cast(cast(year(getdate()) as varchar)
+'-'+cast(month(getdate()) as varchar)+'-01' as datetime))));
² Question2:How can I print "10 to 20" for books that sell for between $10 and $20,"unknown" for books whose price is null, and "other" for all other prices?
select bookid,bookname,
price=case when price is null then 'unknown'
when price between 10 and 20 then '10 to 20' else price end
from books
Question3:to find duplicate values! Find authors with the same last name?
You can use the table authors in datatabase pubs. I want to get the result:
au_lname number_dups
Ringer 2
Answer 3
select au_lname,number_dups=count(1) from authors group by au_lname
--count(1)和count(*)结果一样,都是根据au_lname分组进行的组内全部统计
² Question4:Can you create a cross-tab report in my SQL Server!
How can I get the report about sale quality for each store and each quarter and the total sale quality for each quarter at year 1993?
You can use the table sales and stores in datatabase pubs.
Table Sales record all sale detail item for each store. Column store_id is the id of each store, ord_date is the order date of each sale item, and column qty is the sale quality. Table stores record all store information.
I want to get the result look like as below:
Output:
stor_name Total Qtr1 Qtr2 Qtr3 Qtr4
Barnum's 50 0 50 0 0
Bookbeat 55 25 30 0 0
Doc-U-Mat: 85 0 85 0 0
Fricative 60 35 0 0 25
Total 250 60 165 0 25
Answer 4:用动态SQL实现,前面有。不过看起来很复杂
use pubs
declare @s varchar(8000)
set @s='select isnull(stores.stor_name,''Total'') '
select @s=@s + ',[Qtr' + cast(datepart(q,ord_date) as char(1))
+ ']=sum(case when datepart(q,ord_date)='''
+ cast(datepart(q,ord_date) as char(1)) + ''' then qty else 0 end)'
from Sales
group by datepart(q,ord_date)
set @s=@s + ' ,sum(qty) "Total" from Sales inner join stores on Sales.stor_id = stores.stor_id '
set @s=@s + ' where datepart(yyyy,ord_date) = ''1993'' '
set @s=@s + ' group by stores.stor_name WITH ROLLUP '
set @s=@s + ' order by stores.stor_name '
print @s
exec(@s)
-- print @s的结果是这样的:
select isnull(stores.stor_name,'Total') , -- isnull把rollup造成的NULL值改成了Total,技巧
[Qtr1]=sum(case when datepart(q,ord_date)='1' then qty else 0 end),
[Qtr2]=sum(case when datepart(q,ord_date)='2' then qty else 0 end),
[Qtr3]=sum(case when datepart(q,ord_date)='3' then qty else 0 end),
[Qtr4]=sum(case when datepart(q,ord_date)='4' then qty else 0 end),
sum(qty) "Total"
from Sales inner join stores on Sales.stor_id = stores.stor_id
where datepart(yyyy,ord_date) = '1993'
group by stores.stor_name WITH ROLLUP -- rollup是一个很重要的东西
order by stores.stor_name -- order by,貌似不需要,或者用desc更好
² Question5: The Fastest Way to Recompile All Stored Procedures
I have a problem with a database running in SQL Server 6.5 (Service Pack 4). We moved the database (object transfer) from one machine to another last night, and an error (specific to a stored procedure) is cropping up. However, I can't tell which procedure is causing it. Permissions are granted in all of our stored procedures; is there a way from the isql utility to force all stored procedures to recompile?
Tips: sp_recompile can recomplie a store procedure each time
Answer 5:在执行存储过程时,使用 with recompile 选项强制编译新的计划;使用sp_recompile系统存储过程强制在下次运行时进行重新编译
Question6: How can I add row numbers to my result set?
In database pubs, have a table titles , now I want the result shown as below,each row have a row number, how can you do that?
line-no title_id
1 BU1032
2 BU1111
3 BU2075
4 BU7832
5 MC2222
6 MC3021
7 MC3026
Answer 6:
-- row_number()的这种用法据我了解不行,他必须和over连用
select row_number() over(order by title_id) as line_no ,title_id from titles
² Question 7: the difference of two SQL statements at performance of execution?
Statement 1:
if NOT EXISTS ( select * from publishers where state = ‘NY’)
SELECT ‘Sales force needs to penetrate New York market’
else
SELECT ‘We have publishers in New York’
Statement 2:
if EXISTS ( select * from publishers where state = ‘NY’)
SELECT ‘We have publishers in New York’
else
SELECT ‘Sales force needs to penetrate New York market’
Answer 7:
不同点:初步感觉应该是第二个性能比较好,因为不需要遍历整个数据表,只要有一个存在的就可以结束。但是从执行计划的时间和IO看,结果是一样的。
² Question9: How can I get a list of the stores that have bought both ‘bussiness’ and ‘mod_cook’ type books?
In database pubs, use three table stores,sales and titles to implement this requestment. Now I want to get the result as below:
stor_id stor_name
...
7896 Fricative Bookshop
...
...
...
Answer 9:
use pubs
select distinct a.stor_id, a.stor_name from stores a,sales b,titles c
where a.stor_id=b.stor_id and b.title_id=c.title_id and c.type='business' and
exists(select 1 from sales k,titles g where stor_id=b.stor_id
and k.title_id=g.title_id and g.type='mod_cook');
-- 或者使用个连续的join也可以
select distinct a.stor_id, a.stor_name from stores a
join sales b on a.stor_id=b.stor_id
join titles c on b.title_id=c.title_id and c.type='business'
and exists (select * from sales k,titles g where stor_id=b.stor_id
and k.title_id=g.title_id and g.type='mod_cook')
Question11: How can I list all book with prices greather than the average price of books of the same type?
In database pubs, have a table named titles , its column named price mean the price of the book, and another named type mean the type of books.
Now I want to get the result as below:
type title price
business The Busy Executive’s Database Guide 19.9900
...
...
Answer 11:
select distinct t1.price, t1.type from titles t1, titles t2
where t1.price <
( select avg(price) from titles t2 where t1.type = t2.type group by type )
-- 或者
select distinct t1.price, t1.type from titles t1
join titles
on t1.price <
( select avg(price) from titles t2 where t1.type = t2.type group by type )
8. 其他
http://www.teecool.com/post/2007071809.html
² 有订单表SO_Table,单号字段RefNo VARCHAR(10),需要实现自动编号,格式为YYYYMMXXXX,其中XXXX为序号,如:2004050001,2004050002……2004059999等,采用Transact-SQL实现新订单编号的思路。
思路:
1,IDENTITY(smallint, 100, 1)只有在select…into这样的数据插入里面可用;
2,6位长度的年月可以用:convert(char(6), getdate(), 112);
或者cast(datepart(YY, @date) as varchar(4)) +
right(cast(datepart(MM, @date)+100 as varchar(3)), 2)
3, 如果必须在SP里面工作的话,可以获得上次的最大序号,加1
² 有表T1,T2,现有一事务,在向表T1添加数据时,同时也必须向T2也添加数据,如何确何数据的完整性。
使用trigger可以做到;另外,添加过程要在一个transaction中进行;
² 如何求表中相邻(按聚集索引相邻)的两条记录的某字段的值之差。
select s2.saleid, p=(s1.saleprice-s2.saleprice)
from
(select *, id=row_number() over(order by saleid) from sales) s1,
(select *, id=row_number() over(order by saleid) from sales) s2
where s2.id-s1.id=1
-- 下面的办法不行,因为如果相邻的ID不是连续的就不行了。另外,可以使用cursor
select a.source - b.source from test a, test b
where (a.id - b.id) = 1
order by a.id
² 如何删除表中的重复数据。上面有答案。
² 人员情况表(employee)中字段包括,员工号(ID),姓名(name),年龄(age),文化程度(wh):包括四种情况(本科以上,大专,高中,初中以下),现在我要根据年龄字段查询统计出:表中文化程度为本科以上,大专,高中,初中以下,各有多少人,占总人数多少。结果如下:
学历 年龄 人数 百分比
本科以上 20 34 14
大专 20 33 13
高中 20 33 13
初中以下 20 100 40
本科以上 21 50 20
。。。。。。
Transact-SQL查询语句如何写?
-- Count(*) * 100 由group by限定;SELECT Count(*) FROM是总数。
SELECT wh AS 学历,age as 年龄, Count(*) AS 人数,
Count(*) * 100 /(SELECT Count(*) FROM employee) AS 百分比
FROM employee GROUP BY wh,age
² 表一(AAA)
商品名称a 商品总量b
A 100
B 120
表二(BBB)
商品名称a 出库数量b
A 10
A 20
B 10
B 20
B 30
用一条Transact-SQL语句算出商品A,B目前还剩多少?
select sum(b)
from (select * from a
union all select a, b*(-1) from b) x
group by a
² 找到连续编号中断的那一个的最小值
select min(t.id) as id from (select id=id+1 from tt) t
where id not in (select id from tt)
9. 实际应用
A) 为管理岗位业务培训信息,建立3个表:
S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
C (C#,CN ) C#,CN 分别代表课程编号、课程名称
SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩
² 查询选修课程名称为’税收基础’的学员学号和姓名
Select SN,SD FROM S -- 实际上,使用3个join才是合理的
Where [S#] IN(
Select [S#] FROM C,SC
Where C.[C#]=SC.[C#]
AND CN=N'税收基础')
² 查询选修课程编号为’C2’的学员姓名和所属单位
Select S.SN,S.SD FROM S,SC
Where S.[S#]=SC.[S#]
AND SC.[C#]='C2'
² 查询不选修课程编号为’C5’的学员姓名和所属单位
Select SN,SD FROM S
Where [S#] NOT IN( -- not in是正确的。不能使用=,会遗漏
Select [S#] FROM SC
Where [C#]='C5')
² 4. 查询选修全部课程的学员姓名和所属单位
-- 1)RIGHT JOIN可产生NULL行;2)COUNT(*),COUNT(S#)的结果不同
-- 解释:如果COUNT(*)<>COUNT(S#),
-- 说明C中有某个C#没有在sc中出现,也就是说:这门课程没有被S#同学选中。
Select SN,SD FROM S
Where [S#] IN(
Select [S#] FROM SC
RIGHT JOIN
C ON SC.[C#]=C.[C#] GROUP BY [S#]
HAVING COUNT(*)=COUNT([S#]))
² 5. 查询选修了课程的学员人数
Select 学员人数=COUNT(DISTINCT [S#]) FROM SC
² 6. 查询选修课程超过5门的学员学号和所属单位
-- 关注having子句中的count()等聚合函数的使用
Select SN,SD FROM S
Where [S#] IN(
Select [S#] FROM SC
GROUP BY [S#]
HAVING COUNT(DISTINCT [C#])>5)
B)该题目中,很多都有歧义,所以只要掌握的基本的方法,不需要深究细节。
/*
S (SNO,SNAME) 学生关系。SNO 为学号,SNAME 为姓名
C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师
SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩
*/
² 找出没有选修过“李”老师讲授课程的所有学生姓名
select distinct sname from s
where s.sno not in --因为有这种情况:S.SNO不在SC中存在。
(select sno from sc,c where sc.CNO=c.cno and cteacher = '李')
² 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩
Select S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)
FROM S,SC,(
Select SNO FROM SC Where SCGRADE<60
GROUP BY SNO HAVING COUNT(DISTINCT CNO)>=2
)A -- 实际上,使用 IN 进行条件连接也行
-- where控制条件,having控制分组条件并聚合
Where S.SNO=A.SNO AND SC.SNO=A.SNO
GROUP BY S.SNO,S.SNAME
--下面是错误结果:它只是把没有及格的科目进行了avg,并不是所有的科目的avg
select avg(sc.scgrade), s.sname
from s
join sc on sc.sno = s.sno and sc.scgrade < 60
group by s.sname having count(sc.scgrade)>=2
² 列出既学过“c1”号课程,又学过“c2”号课程的所有学生姓名
select s.sname
from s, (select * from sc
where sc.sno in (select sc.sno from sc where sc.cno = 'c1')
and sc.cno = 'c2') SS -- 把sc.sno in换为exists也可以。两种方案
where s.sno = ss.sno
² 列出“c1”号课成绩比“s2”号同学该门课成绩高的所有学生的学号
select sc.sno, sc.scgrade from sc
where sc.cno='c1' and
sc.scgrade>(select sc.scgrade from sc where sc.cno='c1' and sc.sno='s2')
² 列出“c1”号课成绩比“c2”号课成绩高的所有学生的学号及其“c1”号课和“c2”号课的成绩
select sc1.sno, sc1.cno, sc1.scgrade
from sc sc1,
(select sc1.sno, sc1.cno, sc1.scgrade
from sc sc1, sc sc2
where sc1.cno='c1' and sc2.cno='c2' and sc1.scgrade>sc2.scgrade
and sc1.sno=sc2.sno) sc2
where sc2.sno=sc1.sno and (sc1.cno='c1' or sc1.cno='c2')
1. 老外的一套题
我需要一个模式和一些数据来运行所要考核的查询,列表A创建了所需的这些数据:
IF OBJECT_ID('Sales')>0 DROP TABLE Sales
GO
IF OBJECT_ID('Customers')>0 DROP TABLE Customers
GO
IF OBJECT_ID('Products')>0 DROP TABLE Products
GO
CREATE TABLE Customers(CustomerID INT IDENTITY PRIMARY KEY ,
FirstName VARCHAR(50),
LastName VARCHAR(50),
City VARCHAR(50),
State CHAR(2),
Zip VARCHAR(10) )
GO
CREATE TABLE Products(
ProductID TINYINT IDENTITY PRIMARY KEY ,
ProductName VARCHAR(20),
RecommendedPrice MONEY,
Category VARCHAR(10))
GO
CREATE TABLE Sales(SaleID INT IDENTITY PRIMARY KEY ,
ProductID TINYINT NOT NULL REFERENCES Products(ProductID),
CustomerID INT NOT NULL REFERENCES Customers(CustomerID),
SalePrice MONEY NOT NULL,SaleDate SMALLDATETIME NOT NULL)
GO
INSERT INTO Products(ProductName,RecommendedPrice,Category)VALUES('DVD',105,'LivingRoom')
INSERT INTO Products(ProductName,RecommendedPrice,Category)VALUES('Microwave',98,'Kitchen')
INSERT INTO Products(ProductName,RecommendedPrice,Category)VALUES('Monitor',200,'Office')
INSERT INTO Products(ProductName,RecommendedPrice,Category)VALUES('Speakers',85,'Office')
INSERT INTO Products(ProductName,RecommendedPrice,Category)VALUES('Refrigerator',900,'Kitchen')
INSERT INTO Products(ProductName,RecommendedPrice,Category)VALUES('VCR',165,'LivingRoom')
INSERT INTO Products(ProductName,RecommendedPrice,Category)VALUES('CoffeePot',35,'Kitchen')
GO
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('John','Miller','Asbury','NY','23433')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Fred','Hammill','Basham','AK','85675')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Stan','Mellish','Callahan','WY','38556')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Adrian','Caparzo','Denver','CO','12377')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Mike','Horvath','Easton','IN','47130')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Irwin','Wade','Frankfurt','KY','45902')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('George','Marshall','Gallipoli','ND','34908')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Frank','Costello','Honolulu','HI','23905')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Billy','Costigan','Immice','SC','75389')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Shelly','Sipes','Lights','AZ','35263')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Chirsty','Melton','Spade','CA','97505')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Amanda','Owens','Flask','CN','50386')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Brittany','Smits','Bourbon','KY','24207')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Kristy','Bryant','Tarp','FL','58960')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Kelly','Street','TableTop','ID','57732')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Tricia','Hill','Camera','ME','46738')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Holly','Raines','Compact','MS','35735')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Natalie','Woods','Woods','IN','87219')
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Wendy','Hilton','Action','KY','47093')
GO
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(1,1,130,'2/6/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(2,2,97,'1/7/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(3,3,200,'8/8/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(4,4,80,'4/9/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(5,5,899,'10/10/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(6,6,150,'10/11/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(3,7,209,'12/12/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(4,8,90,'5/13/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(6,9,130,'6/14/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(2,14,85,'6/19/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(3,15,240,'9/20/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(1,16,99,'7/21/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(1,17,87,'3/22/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(2,18,99,'1/23/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(6,19,150,'3/24/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(5,5,900,'3/10/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(4,6,86,'8/11/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(2,7,88,'8/12/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(3,8,198,'12/13/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(1,9,150,'5/14/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(6,14,99,'7/19/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(6,15,104,'9/20/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(3,16,270,'2/21/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(4,17,90,'7/22/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(1,1,130,'3/6/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(2,2,102,'4/7/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(1,3,114,'11/8/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(5,4,1000,'5/9/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(5,5,1100,'10/10/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(3,6,285,'6/11/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(2,7,87,'10/12/2005')
INSERT INTO Sales(ProductID,CustomerID,SalePrice,SaleDate)
VALUES(3,8,300,'7/13/2005')
GO
² 1:返回在2005年10月售出的所有产品的名称、价格和客户姓名,答案:
select c.FirstName,c.LastName, p.productname, s.SalePrice, s.saledate from products p, customers c, sales s
where s.productid = p.productid and c.customerid = s.customerid
and datepart(YY, s.saledate) = 2005 and datepart(MM, s.saledate) = 10
--或者下面的也行。根据执行计划,二者是完全一样的。
SELECT c.FirstName,c.LastName,p.ProductName,s.SalePrice
FROM Sales s
INNER JOIN Customers c ON s.CustomerID=c.CustomerID
INNER JOIN Products p ON s.ProductID=p.ProductID
WHERE s.SaleDate>='10/1/2005'AND s.SaleDate<'11/1/2005'
² 2:返回没有购买产品并且位于客户表格上的人的姓名及其客户ID,答案:
select c.FirstName,c.LastName, c.customerid
from customers c
where c.customerid not in ( select distinct customerid from sales)
--或者下面的。下面的是提供的答案;但是上面的效率更高,二者比42:58
SELECT c.CustomerID,c.FirstName,c.LastName
FROM Sales s
RIGHT OUTER JOIN Customers c ON s.CustomerID=c.CustomerID
WHERE s.CustomerID IS NULL
3:返回客户姓名、销售价格、建议售价、建议售价和实际价格的差额,该差额必需是正数,答案见列表D:
SELECT c.FirstName,c.LastName,s.SalePrice,p.RecommendedPrice,
ABS(s.SalePrice-p.RecommendedPrice) AS diff
FROM Sales s
INNER JOIN Customers c ON s.CustomerID=c.CustomerID
INNER JOIN Products p ON s.ProductID=p.ProductID
² 4:根据产品类别计算平均价格,答案见列表E:
SELECT avg(s.SalePrice) as avg, p.category
FROM Sales s inner join products p
on s.productid = p.productid group by p.category
² 5:将以下的客户和销售信息加入到数据库中:
FirstName:Chris, LastName:Kringle, City:Henryville, State:IN, Zip:47126
ProductID:3, SalePrice:205, SaleDate:12/31/2005
答案见列表F(关注SCOPE_IDENTITY(),这里可以和@@identity互换):
INSERT INTO Customers(FirstName,LastName,City,State,Zip)
VALUES('Chris','Kringle','Henryville','IN','47126')
INSERT INTO Sales(CustomerID,ProductID,SalePrice,SaleDate)
VALUES(SCOPE_IDENTITY(),3,205,'12/31/2005')
² 6:从数据库中删除来自缅因洲(‘ME’)的客户,答案见列表G:(不过,delete s from...这样的用法很怪,貌似这样就可以把s这个名字引入进来了)
delete s from Sales s where s.CustomerID in
(select CustomerID from Customers where State = 'ME')
-- 或者下面的:(因为不支持delete from A, B这样的语法,所以用join)
DELETE s FROM Sales s JOIN Customers c
ON s.CustomerID=c.CustomerID WHERE c.State='ME'
-- 然后
DELETE c FROM Customers c WHERE c.State='ME'
² 7:返回客户购买了两个或多个产品的平均售价和产品类别,答案:
SELECT AVG(s.SalePrice) avg, p.Category
FROM Sales s, Products p
where s.ProductID=p.ProductID and s.CustomerID in
( SELECT s.CustomerID FROM Sales s
GROUP BY s.CustomerID HAVING COUNT(CustomerID)>=2)
GROUP BY p.Category
-- 或者
SELECT AVG(s.SalePrice) avg, p.Category
FROM Sales s INNER JOIN
( SELECT s.CustomerID FROM Sales s
GROUP BY s.CustomerID HAVING COUNT(CustomerID)>=2)x
ON s.CustomerID=x.CustomerID
INNER JOIN Products p ON s.ProductID=p.ProductID
GROUP BY p.Category
² 8:将销售在2005年6月10日到6月20日之间的产品的销售价格升级为建议售价:(这个还是不太明白,尤其是s.ProductID=s.ProductID,怪)
UPDATE s SET SalePrice=p.RecommendedPrice
FROM Sales s INNER JOIN Products p ON s.ProductID=s.ProductID
WHERE SaleDate>='6/10/2005' AND SaleDate<'6/21/2005'
² 9:根据产品种类计算建议售价超过实际售价10元及以上的销售数量,答案见列表J:
SELECT count(s.SalePrice) count, p.Category
FROM Sales s
INNER JOIN Products p ON s.ProductID=p.ProductID
where p.RecommendedPrice - s.SalePrice >= 10
GROUP BY p.Category
-- 题目有歧义,所以,也可以这样做:
SELECT p.Category,COUNT(*)AS NumberOfSales
FROM Sales s
INNER JOIN Products p ON s.ProductID=p.ProductID
GROUP BY p.Category
HAVING AVG(p.RecommendedPrice)>=AVG(s.SalePrice)+10
² 10:不使用叠代构建,返回所由销售产品的销售日期,以及该日期之前的销售额统计,以及该日期之前的销售额统计,并按照该日期升序排列,答案:
SELECT s.SaleDate, s.SalePrice,
( SELECT SUM(SalePrice) FROM Sales s2 WHERE s2.SaleDate<=s.SaleDate )AS RunningTotal
FROM Sales s ORDER BY s.SaleDate ASC
迄今为止,只有2个人可以正确地回答出所有的问题。
平均大约为50-60%,如果表现高于这个平均,那么优秀的TSQL程序员,如果获得了90%以上的得分,那么他或她就是一位非常优异的程序员。
Oracle总结
1.如何知道哪些表没有建立主键?
Select table_name from user_tables t
Where not exists (select table_name from user_constraints c where constraint_type=’P’ and t.table_name=c.table_name)
2.相关数据字典的意义
User_tables 表
User_tab_columns 表的列
User_constraints 约束
User_cons_columns 约束与列的关系
User_indexes 索引
User_ind_columns 索引与列的关系
3.关于角色和权限
对于数据库管理员,应该授予DBA角色;对于数据库开发用户,只需要授予CONNECT和RESOURCE角色
Oracle数据库的权限分为系统权限和对象权限。前者在系统级控制对数据库的存取和操作,如用户是否能通过建立会话而连接到数据库,是否能启动、停止数据库,是否能修改数据库参数等;对象权限在方案级控制对数据库的存取和操作,如用户可以存取哪个方案中的对象,是否能对该对象进行查询、插入、更新等。
4.关于Oracle的回收站以及闪回技术
用drop命令删除的表其实并没有物理删除,而是放在了回收站里,还占用着数据库空间。用select * from User_recyclebin就可以看到回收站中的表。
Purge table temp1—将回收站中的某个表彻底删除
Purge recyclebin:清空oracle的回收站;
Flashback table tablename to before drop(rename to temp2) —还原某张表(可以进行更名);
Flashback table temp to timestamp(systimestamp-interval ‘1’ minute) ---恢复到1分钟前的数据(也可以是second等),但是要注意,首先要启动表的行移动功能:alter table temp enable row movement;
5.选择数据库实例
Windows下:set oracle_sid=…
Unix下:export oracle_sid=…
6.表和表之间的关联更新
Update file_dept a set a.id=(select b.id from temp1 b where a.dept_id=b.dept_id)
7.创建用户:
第一步:建立用户
Create user web identified by web
Default tablespace web
Temporary tablespace temp
Profile “DEFAULT”—大写
Account unlock; —未锁定
第二步:授予权限
与scott相同:grant connect to web;
Grant resource to web;
Grant create view to web;
8.删除某个用户的连接
Select sid,serial#,status from v$session where username=’…’
Alter system kill session ‘sid,serial#’;
9.启动关闭监听
>lsnrctl start
>lsnrctl stop
>lsnrctl status
10.启动和关闭数据库
Ø 启动数据库
>startup nomount ---启动例程,但不装载数据库,并未打开控制文件和数据文件
>startup mount ---启动例程并装载数据库,但不打开数据库,打开控制文件,但并未打开数据文件
>startup open ---启动例程,装载数据库,打开数据库,既打开了控制文件也打开了数据文件
>startup force ---强制启动
>startup restrict
>startup pfile=… ---注意是pfile,不是spfile。可以先用create pfile=… from spfile=…语句将服务器初始化文件导出成文本初始化参数文件后,再使用导出后的文本初始化参数文件
Ø 关闭数据库
过程:关闭数据库-->卸载数据库-->终止例程
语法:shut down[ normal | transactional | immediate | abort ]
尽量避免用abort选项来关闭数据库,如果想尽快关闭,可以使用IMMEDIATE选项,这样所有未提交的事物均被回退,使数据信息以及完整性得以保证。
Ø 说明
在NOMOUNT启动模式下,只能访问那些与SGA区相关的数据字典视图,如V$PARAMETER,V$SGA,V$OPTION,V$PROCESS,V$SESSION,V$VERSION,V$INSTANCE等。这些视图中的信息都是从SGA区中获取的,与数据库无关;
在MOUNT启动模式下,除了可以访问那些与SGA区相关的数据字典视图之外,还可以访问到那些与控制文件相关的数据字典视图,如V$THREAD,V$CONTROLFILE,V$DATABASE,V$DATAFILE,V$LOGFILE等,这些视图中的信息都是从控制文件中获取的。
11.更改用户密码
当忘记了system与sys的密码时,可用如下方法更改:
C:>sqlplus/nolog
SQL>connect 空格/空格 @myoracle as sysdba
SQL>alter user system identified by manager
要注意的是,以上方法只能在服务器端执行,客户端不能执行。
12.设置主机首选身份证明
1).选择“开始”-->“程序”-->“管理工具”-->“本地安全策略”,打开“本地安全策略”窗口
2).选择“本地策略”中的“用户权限分配”项
3).在右边的“策略”列中双击“作为批处理作业登录”项,打开其属性对话框
4).将Administrator加入用户中,这样,该用户就有了“作为批处理作业登录”的权限
13.如何将数据库从noarchivelog改成archivelog方式?
首先打开INIT.ora文件,确保存档日志目标指向一有效目录,然后启动sqlplus
SQL>shutdown immediate
SQL>startup mount
SQL>alter database archivelog
SQL>alter database open
SQL>archive log list ---列出现在数据库是否归档
在INIT.ora中设置参数archive_log_start=true,它设置存档日志为自动启动。
14.创建表空间的SQL
Create smallfile tablespace “FILEEXCHANGE”
Datafile’D:\oracle\myoracle\fileexchange.dbf’ size 10M
Reuse autoextend on next 5120k MAXSIZE 32767M—最大
Nologging extend management local—区管理方式:本地管理
Segment space management Auto—使用Auto段管理方式
15.Sqlplus技巧
清屏:SQL>ho cls
Sqlplus中的所有命令可用>help index看到,关于每个指令具体的用法可用>?…或help …来查看。
16.修改系统日期格式
Alter session set NLS_DATE_FORMAT=’dd-mon-yyyy hh:mi:ss’;
Select current_date from dual;
Select sysdate from dual;
17.如何将角色赋予用户
1).创建一个角色:create role myrole;
2).将对scott.dept表的select权限赋予这个角色:grant select on scott.dept to myrole;
3).将这个角色赋予用户test:grant myrole to test.
18.SQLLoad的使用
1).数据文件Loader.txt,文件内容如下
abcd,qq
abc,ee
…
2).控制文件cont.ctl(以ctl为后缀),内容如下:
Load data
Infile ‘c:\loader.txt’ ---数据文件
Append
Into table mm(
M1 char terminated by “,”,
M2 char terminated by “,”)---用逗号分隔字段
3).执行命令:>sqlldr scott/tiger control=c:\cont.ctl data=c:\loader.txt
如果成功就会提示:commit point reached—logical record count 3—表示插入了3条记录
如果每列长度固定,那么可写成mm(m1 position(1:3) char,m2 position(5:7) char)—表示提取1-3位和5-7位
4).SQLLoader的4种装入表的方式:
APPEND:原先的表有数据,就加在后面;
INSERT:装载空表,如果原先的表有数据,SQLLoader就会停止
REPLACE:原先的表有数据,原先的数据会全部删除
TRUNCATE:指定的内容和REPLACE相同,会用truncate语句删除现存数据
19.如何查看对象所占用的空间
Ø 查看表和索引的大小:select * from user_segments where segmentname=’’
Ø 查看此用户所有对象所占空间大小:select sum(bytes) from user_segments;
Ø 查看每个用户表空间的大小(已使用的表空间,而不是初始化分配的空间):select tablespace_name sum(bytes)/1024/1024 from dba_segments group by tablespace_name
Ø 查看当前用户每个表占用空间的大小:select segment_name,sum(bytes)/1024/1024 from user_extents group by segment_name
20.查看一个表所用的分区
Select table_name,partition_name
from user_tab_partitions
where table_name=’daryxxb’
21.将一个schema中的对象导入到属于另一个表空间的schema中
>imp system/manager@myoracle from user=web to user=net tablespaces=net file=f:\web.dmp
22.数据库链(Database link)
1).创建(首先要有create public database link权限)
Create public database link remotedb using ‘remote’;表示用目前用户去链接远程服务器,如果要指定用户名,则在using前加上connect 用户名 identified by 口令,最后的’remote’是连接字符串
2).应用数据库链
Select * from tablename @remotedb;
复制表结构:create table test as select * from test @remotedb where 1=2;
也可以远端进行Update、insert操作
3).删除(要有drop public database link权限)
Drop public database link remotedb;
4).查询数据库链信息
Dba_db_links,all_db_links,user_db_links
23.物化视图
1).主键物化视图
create materialized view mv_emp_pk
Refresh fast start with sysdate next sysdate+1/48 with primary key
As select * from emp@remotedb;
注意:当用fast选项创建物化视图,必须创建基于主表的视图日志,如下:
Create materialized view log on emp;
2).Rowid 物化视图
Create materialized view mv_emp_rowid
Refresh with rowid
As select * from emp@remote_db
3).Refresh选项说明
Ø Oracle是用刷新方法在物化视图中刷新数据
Ø 是基于主键还是基于rowid的物化视图
Ø 物化视图的刷新时间和间隔刷新时间
4).Refresh的方法
Ø Fast—增量刷新,用物化视图日志来发送主表已经修改的数据行到物化视图中
Ø Complete—完全刷新,重新生成整个视图
Ø Force—如果增量刷新可用将完成增量刷新,否则完成完全刷新
24.关于归档日志的空间问题
Ø 查看归档日志的容量使用:select * from v$recovery_file_dest;
Ø 更改归档日志容量空间:
alter system set db_recovery_file_dest_size=8G scope=BOTH;
Alter database open;
Ø 手动删除归档日志文件,需要以下几步:
手动删除archivelog文件夹中的早期的归档日志文件
登录rman :>rman target /
对归档日志进行验证:rman>crosscheck archivelog all;
删除失效的归档日志:rman>delete expired archivelog all;
25.备份与还原
数据文件的联机备份(热备份)
第一步:将数据库置为归档日志状态:
1).首先查看是否是归档日志模式 >archive log list;
2).如果不是,那么将其设为归档模式 >alter system set log_archive_start=true scope=spfile
3).关闭数据库 >shutdown immediate
4).启动数据库为Mount方式 >startup mount
5).将数据库切换到归档日志模式:>alter database archivelog
6).打开数据库 >alter database open;
7).这时再查看 >archive log list;便显示是归档日志模式了
第二步:备份与恢复
1).alter tablespace web begin backup
2).将表空间web的数据文件进行备份
3).Alter tablespace web end backup;
4).将当前的联机日志进行归档:>alter system archive log current
5).将日志文件切换:>alter system switch logfile; 有几个日志文件就进行几次切换
6).关闭数据库 >shutdown immediate
下面是模拟错误:
7).将web的数据文件删除
8).打开数据库:>startup open;报错—web.dbf文件不能找到
9).让此数据文件脱机,并drop掉>alter database datafile 6 offline drop;6代表6号文件,也就是web.dbf文件
10).将数据库打开>alter database open;
11).将备份的web.dbf文件拷贝到原来的位置
12).恢复数据文件:>recover datafile 6; auto;
13).让数据文件联机:>alter database datafile 6 online;
14).这样,便可以查询web表空间中的数据了
控制文件的备份
1).>alter database backup controlfile to trace; 备份控制文件,会存放在…\admin\myoracle\udump\目录下最近的一个文件,这个文件中的语句就是执行控制文件时的脚本
2).将文件中的语句拷贝出来,另存为一个文件,比如create_ctl.txt
3).关闭数据库
4).执行加载控制文件:sql>@c:\create_ctl.txt;这样就重新创建了控制文件,并且将数据库打开了
日志文件的备份
当日志文件丢失后,可采用如下方法:
1).基于取消的恢复数据库: >recover database until cancel;
2).重新生成日志文件:>alter database open resetlogs;
脱机备份
1).整理需要备份的文件,包括参数文件、控制文件、数据文件和重做日志文件
Ø 参数文件:…\db_1\database\init.ora 以及关于此sid的所有文件
Ø 控制文件:select status,name from v$controlfile;
Ø 数据文件:selelct status,name from dba_data_files;
Ø 重做日志文件:select group#,status,member from v$logfile
2).用sysdba身份用户登录后,>shutdown immediate;关闭数据库
3).将上述整理的文件一一进行备份
4).打开数据库 >startup open;
恢复:当文件丢失,就需要恢复数据库
1).关闭数据库:>shutdown immediate
2).将所有的备份文件复制到原来所在的位置,不得漏掉一个,以便恢复备份时刻数据库的镜像
3).恢复完成后,以open方式启动数据库 >startup open;
//摘录于 http://blog.csdn.net/lihui_79/archive/2009/04/09/4060010.aspx
Select table_name from user_tables t
Where not exists (select table_name from user_constraints c where constraint_type=’P’ and t.table_name=c.table_name)
2.相关数据字典的意义
User_tables 表
User_tab_columns 表的列
User_constraints 约束
User_cons_columns 约束与列的关系
User_indexes 索引
User_ind_columns 索引与列的关系
3.关于角色和权限
对于数据库管理员,应该授予DBA角色;对于数据库开发用户,只需要授予CONNECT和RESOURCE角色
Oracle数据库的权限分为系统权限和对象权限。前者在系统级控制对数据库的存取和操作,如用户是否能通过建立会话而连接到数据库,是否能启动、停止数据库,是否能修改数据库参数等;对象权限在方案级控制对数据库的存取和操作,如用户可以存取哪个方案中的对象,是否能对该对象进行查询、插入、更新等。
4.关于Oracle的回收站以及闪回技术
用drop命令删除的表其实并没有物理删除,而是放在了回收站里,还占用着数据库空间。用select * from User_recyclebin就可以看到回收站中的表。
Purge table temp1—将回收站中的某个表彻底删除
Purge recyclebin:清空oracle的回收站;
Flashback table tablename to before drop(rename to temp2) —还原某张表(可以进行更名);
Flashback table temp to timestamp(systimestamp-interval ‘1’ minute) ---恢复到1分钟前的数据(也可以是second等),但是要注意,首先要启动表的行移动功能:alter table temp enable row movement;
5.选择数据库实例
Windows下:set oracle_sid=…
Unix下:export oracle_sid=…
6.表和表之间的关联更新
Update file_dept a set a.id=(select b.id from temp1 b where a.dept_id=b.dept_id)
7.创建用户:
第一步:建立用户
Create user web identified by web
Default tablespace web
Temporary tablespace temp
Profile “DEFAULT”—大写
Account unlock; —未锁定
第二步:授予权限
与scott相同:grant connect to web;
Grant resource to web;
Grant create view to web;
8.删除某个用户的连接
Select sid,serial#,status from v$session where username=’…’
Alter system kill session ‘sid,serial#’;
9.启动关闭监听
>lsnrctl start
>lsnrctl stop
>lsnrctl status
10.启动和关闭数据库
Ø 启动数据库
>startup nomount ---启动例程,但不装载数据库,并未打开控制文件和数据文件
>startup mount ---启动例程并装载数据库,但不打开数据库,打开控制文件,但并未打开数据文件
>startup open ---启动例程,装载数据库,打开数据库,既打开了控制文件也打开了数据文件
>startup force ---强制启动
>startup restrict
>startup pfile=… ---注意是pfile,不是spfile。可以先用create pfile=… from spfile=…语句将服务器初始化文件导出成文本初始化参数文件后,再使用导出后的文本初始化参数文件
Ø 关闭数据库
过程:关闭数据库-->卸载数据库-->终止例程
语法:shut down[ normal | transactional | immediate | abort ]
尽量避免用abort选项来关闭数据库,如果想尽快关闭,可以使用IMMEDIATE选项,这样所有未提交的事物均被回退,使数据信息以及完整性得以保证。
Ø 说明
在NOMOUNT启动模式下,只能访问那些与SGA区相关的数据字典视图,如V$PARAMETER,V$SGA,V$OPTION,V$PROCESS,V$SESSION,V$VERSION,V$INSTANCE等。这些视图中的信息都是从SGA区中获取的,与数据库无关;
在MOUNT启动模式下,除了可以访问那些与SGA区相关的数据字典视图之外,还可以访问到那些与控制文件相关的数据字典视图,如V$THREAD,V$CONTROLFILE,V$DATABASE,V$DATAFILE,V$LOGFILE等,这些视图中的信息都是从控制文件中获取的。
11.更改用户密码
当忘记了system与sys的密码时,可用如下方法更改:
C:>sqlplus/nolog
SQL>connect 空格/空格 @myoracle as sysdba
SQL>alter user system identified by manager
要注意的是,以上方法只能在服务器端执行,客户端不能执行。
12.设置主机首选身份证明
1).选择“开始”-->“程序”-->“管理工具”-->“本地安全策略”,打开“本地安全策略”窗口
2).选择“本地策略”中的“用户权限分配”项
3).在右边的“策略”列中双击“作为批处理作业登录”项,打开其属性对话框
4).将Administrator加入用户中,这样,该用户就有了“作为批处理作业登录”的权限
13.如何将数据库从noarchivelog改成archivelog方式?
首先打开INIT.ora文件,确保存档日志目标指向一有效目录,然后启动sqlplus
SQL>shutdown immediate
SQL>startup mount
SQL>alter database archivelog
SQL>alter database open
SQL>archive log list ---列出现在数据库是否归档
在INIT.ora中设置参数archive_log_start=true,它设置存档日志为自动启动。
14.创建表空间的SQL
Create smallfile tablespace “FILEEXCHANGE”
Datafile’D:\oracle\myoracle\fileexchange.dbf’ size 10M
Reuse autoextend on next 5120k MAXSIZE 32767M—最大
Nologging extend management local—区管理方式:本地管理
Segment space management Auto—使用Auto段管理方式
15.Sqlplus技巧
清屏:SQL>ho cls
Sqlplus中的所有命令可用>help index看到,关于每个指令具体的用法可用>?…或help …来查看。
16.修改系统日期格式
Alter session set NLS_DATE_FORMAT=’dd-mon-yyyy hh:mi:ss’;
Select current_date from dual;
Select sysdate from dual;
17.如何将角色赋予用户
1).创建一个角色:create role myrole;
2).将对scott.dept表的select权限赋予这个角色:grant select on scott.dept to myrole;
3).将这个角色赋予用户test:grant myrole to test.
18.SQLLoad的使用
1).数据文件Loader.txt,文件内容如下
abcd,qq
abc,ee
…
2).控制文件cont.ctl(以ctl为后缀),内容如下:
Load data
Infile ‘c:\loader.txt’ ---数据文件
Append
Into table mm(
M1 char terminated by “,”,
M2 char terminated by “,”)---用逗号分隔字段
3).执行命令:>sqlldr scott/tiger control=c:\cont.ctl data=c:\loader.txt
如果成功就会提示:commit point reached—logical record count 3—表示插入了3条记录
如果每列长度固定,那么可写成mm(m1 position(1:3) char,m2 position(5:7) char)—表示提取1-3位和5-7位
4).SQLLoader的4种装入表的方式:
APPEND:原先的表有数据,就加在后面;
INSERT:装载空表,如果原先的表有数据,SQLLoader就会停止
REPLACE:原先的表有数据,原先的数据会全部删除
TRUNCATE:指定的内容和REPLACE相同,会用truncate语句删除现存数据
19.如何查看对象所占用的空间
Ø 查看表和索引的大小:select * from user_segments where segmentname=’’
Ø 查看此用户所有对象所占空间大小:select sum(bytes) from user_segments;
Ø 查看每个用户表空间的大小(已使用的表空间,而不是初始化分配的空间):select tablespace_name sum(bytes)/1024/1024 from dba_segments group by tablespace_name
Ø 查看当前用户每个表占用空间的大小:select segment_name,sum(bytes)/1024/1024 from user_extents group by segment_name
20.查看一个表所用的分区
Select table_name,partition_name
from user_tab_partitions
where table_name=’daryxxb’
21.将一个schema中的对象导入到属于另一个表空间的schema中
>imp system/manager@myoracle from user=web to user=net tablespaces=net file=f:\web.dmp
22.数据库链(Database link)
1).创建(首先要有create public database link权限)
Create public database link remotedb using ‘remote’;表示用目前用户去链接远程服务器,如果要指定用户名,则在using前加上connect 用户名 identified by 口令,最后的’remote’是连接字符串
2).应用数据库链
Select * from tablename @remotedb;
复制表结构:create table test as select * from test @remotedb where 1=2;
也可以远端进行Update、insert操作
3).删除(要有drop public database link权限)
Drop public database link remotedb;
4).查询数据库链信息
Dba_db_links,all_db_links,user_db_links
23.物化视图
1).主键物化视图
create materialized view mv_emp_pk
Refresh fast start with sysdate next sysdate+1/48 with primary key
As select * from emp@remotedb;
注意:当用fast选项创建物化视图,必须创建基于主表的视图日志,如下:
Create materialized view log on emp;
2).Rowid 物化视图
Create materialized view mv_emp_rowid
Refresh with rowid
As select * from emp@remote_db
3).Refresh选项说明
Ø Oracle是用刷新方法在物化视图中刷新数据
Ø 是基于主键还是基于rowid的物化视图
Ø 物化视图的刷新时间和间隔刷新时间
4).Refresh的方法
Ø Fast—增量刷新,用物化视图日志来发送主表已经修改的数据行到物化视图中
Ø Complete—完全刷新,重新生成整个视图
Ø Force—如果增量刷新可用将完成增量刷新,否则完成完全刷新
24.关于归档日志的空间问题
Ø 查看归档日志的容量使用:select * from v$recovery_file_dest;
Ø 更改归档日志容量空间:
alter system set db_recovery_file_dest_size=8G scope=BOTH;
Alter database open;
Ø 手动删除归档日志文件,需要以下几步:
手动删除archivelog文件夹中的早期的归档日志文件
登录rman :>rman target /
对归档日志进行验证:rman>crosscheck archivelog all;
删除失效的归档日志:rman>delete expired archivelog all;
25.备份与还原
数据文件的联机备份(热备份)
第一步:将数据库置为归档日志状态:
1).首先查看是否是归档日志模式 >archive log list;
2).如果不是,那么将其设为归档模式 >alter system set log_archive_start=true scope=spfile
3).关闭数据库 >shutdown immediate
4).启动数据库为Mount方式 >startup mount
5).将数据库切换到归档日志模式:>alter database archivelog
6).打开数据库 >alter database open;
7).这时再查看 >archive log list;便显示是归档日志模式了
第二步:备份与恢复
1).alter tablespace web begin backup
2).将表空间web的数据文件进行备份
3).Alter tablespace web end backup;
4).将当前的联机日志进行归档:>alter system archive log current
5).将日志文件切换:>alter system switch logfile; 有几个日志文件就进行几次切换
6).关闭数据库 >shutdown immediate
下面是模拟错误:
7).将web的数据文件删除
8).打开数据库:>startup open;报错—web.dbf文件不能找到
9).让此数据文件脱机,并drop掉>alter database datafile 6 offline drop;6代表6号文件,也就是web.dbf文件
10).将数据库打开>alter database open;
11).将备份的web.dbf文件拷贝到原来的位置
12).恢复数据文件:>recover datafile 6; auto;
13).让数据文件联机:>alter database datafile 6 online;
14).这样,便可以查询web表空间中的数据了
控制文件的备份
1).>alter database backup controlfile to trace; 备份控制文件,会存放在…\admin\myoracle\udump\目录下最近的一个文件,这个文件中的语句就是执行控制文件时的脚本
2).将文件中的语句拷贝出来,另存为一个文件,比如create_ctl.txt
3).关闭数据库
4).执行加载控制文件:sql>@c:\create_ctl.txt;这样就重新创建了控制文件,并且将数据库打开了
日志文件的备份
当日志文件丢失后,可采用如下方法:
1).基于取消的恢复数据库: >recover database until cancel;
2).重新生成日志文件:>alter database open resetlogs;
脱机备份
1).整理需要备份的文件,包括参数文件、控制文件、数据文件和重做日志文件
Ø 参数文件:…\db_1\database\init
Ø 控制文件:select status,name from v$controlfile;
Ø 数据文件:selelct status,name from dba_data_files;
Ø 重做日志文件:select group#,status,member from v$logfile
2).用sysdba身份用户登录后,>shutdown immediate;关闭数据库
3).将上述整理的文件一一进行备份
4).打开数据库 >startup open;
恢复:当文件丢失,就需要恢复数据库
1).关闭数据库:>shutdown immediate
2).将所有的备份文件复制到原来所在的位置,不得漏掉一个,以便恢复备份时刻数据库的镜像
3).恢复完成后,以open方式启动数据库 >startup open;
//摘录于 http://blog.csdn.net/lihui_79/archive/2009/04/09/4060010.aspx
Oracle函数列表速查
PL/SQL单行函数和组函数详解
函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类:
单行函数
组函数
本文将讨论如何利用单行函数以及使用规则。
SQL中的单行函数
SQL和PL/SQL中自带很多类型的函数,有字符、数字、日期、转换、和混合型等多种函数用于处理单行数据,因此这些都可被统称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY等子句中,例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX等单行函数。
SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)
单行函数也可以在其他语句中使用,如update的SET子句,INSERT的VALUES子句,DELET的WHERE子句,认证考试特别注意在SELECT语句中使用这些函数,所以我们的注意力也集中在SELECT语句中。
NULL和单行函数
在如何理解NULL上开始是很困难的,就算是一个很有经验的人依然对此感到困惑。NULL值表示一个未知数据或者一个空值,算术操作符的任何一个操作数为NULL值,结果均为提个NULL值,这个规则也适合很多函数,只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL值。在这些中NVL函数时最重要的,因为他能直接处理NULL值,NVL有两个参数:NVL(x1,x2),x1和x2都式表达式,当x1为null时返回X2,否则返回x1。
下面我们看看emp数据表它包含了薪水、奖金两项,需要计算总的补偿
column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2
不是简单的将薪水和奖金加起来就可以了,如果某一行是null值那么结果就将是null,比如下面的例子:
update empset salary=(salary+bonus)*1.1
这个语句中,雇员的工资和奖金都将更新为一个新的值,但是如果没有奖金,即 salary + null,那么就会得出错误的结论,这个时候就要使用nvl函数来排除null值的影响。
所以正确的语句是:
update empset salary=(salary+nvl(bonus,0)*1.1
单行字符串函数
单行字符串函数用于操作字符串数据,他们大多数有一个或多个参数,其中绝大多数返回字符串
ASCII()
c1是一字符串,返回c1第一个字母的ASCII码,他的逆函数是CHR()
SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122
CHR(<i>)[NCHAR_CS]
i是一个数字,函数返回十进制表示的字符
select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B
CONCAT(,)
c1,c2均为字符串,函数将c2连接到c1的后面,如果c1为null,将返回c2.如果c2为null,则返回c1,如果c1、c2都为null,则返回null。他和操作符||返回的结果相同
select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda
INITCAP()
c1为一字符串。函数将每个单词的第一个字母大写其它字母小写返回。单词由空格,控制字符,标点符号限制。
select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici
INSTR(,[,<i>[,]])
c1,c2均为字符串,i,j为整数。函数返回c2在c1中第j次出现的位置,搜索从c1的第i个字符开始。当没有发现需要的字符时返回0,如果i为负数,那么搜索将从右到左进行,但是位置的计算还是从左到右,i和j的缺省值为1.
select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2
INSTRB(,[,i[,j])
与INSTR()函数一样,只是他返回的是字节,对于单字节INSTRB()等于INSTR()
LENGTH()
c1为字符串,返回c1的长度,如果c1为null,那么将返回null值。
select LENGTH('Ipso Facto') ergo from dualergo10
LENGTHb()
与LENGTH()一样,返回字节。
lower()
返回c的小写字符,经常出现在where子串中
select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite
LPAD(,<i>[,])
c1,c2均为字符串,i为整数。在c1的左侧用c2字符串补足致长度i,可多次重复,如果i小于c1的长度,那么只返回i那么长的c1字符,其他的将被截去。c2的缺省值为单空格,参见RPAD。
select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe
LTRIM(,)
把c1中最左边的字符去掉,使其第一个字符不在c2中,如果没有c2,那么c1就不会改变。
select LTRIM('Mississippi','Mis') from dualLTRppi
RPAD(,<i>[,])
在c1的右侧用c2字符串补足致长度i,可多次重复,如果i小于c1的长度,那么只返回i那么长的c1字符,其他的将被截去。c2的缺省值为单空格,其他与LPAD相似
RTRIM(,)
把c1中最右边的字符去掉,使其第后一个字符不在c2中,如果没有c2,那么c1就不会改变。
REPLACE(,[,])
c1,c2,c3都是字符串,函数用c3代替出现在c1中的c2后返回。
select REPLACE('uptown','up','down') from dualREPLACEdowntown
STBSTR(,<i>[,])
c1为一字符串,i,j为整数,从c1的第i位开始返回长度为j的子字符串,如果j为空,则直到串的尾部。
select SUBSTR('Message',1,4) from dualSUBSMess
SUBSTRB(,<i>[,])
与SUBSTR大致相同,只是I,J是以字节计算。
SOUNDEX()
返回与c1发音相似的词
select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250
TRANSLATE(,,)
将c1中与c2相同的字符以c3代替
select TRANSLATE('fumble','uf','ar') test from dualTEXTramble
TRIM([[]] from c3)
将c3串中的第一个,最后一个,或者都删除。
select TRIM(' space padded ') trim from dual TRIMspace padded
UPPER()
返回c1的大写,常出现where子串中
select name from dual where UPPER(name) LIKE 'KI%'NAMEKING
单行数字函数
单行数字函数操作数字数据,执行数学和算术运算。所有函数都有数字参数并返回数字值。所有三角函数的操作数和值都是弧度而不是角度,oracle没有提供内建的弧度和角度的转换函数。
ABS()
返回n的绝对值
ACOS()
反余玄函数,返回-1到1之间的数。n表示弧度
select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0
ASIN()
反正玄函数,返回-1到1,n表示弧度
ATAN()
反正切函数,返回n的反正切值,n表示弧度。
CEIL()
返回大于或等于n的最小整数。
COS()
返回n的余玄值,n为弧度
COSH()
返回n的双曲余玄值,n 为数字。
select COSH(<1.4>) FROM dualCOSH(1.4)2.15089847
EXP()
返回e的n次幂,e=2.71828183.
FLOOR()
返回小于等于N的最大整数。
LN()
返回N的自然对数,N必须大于0
LOG(,)
返回以n1为底n2的对数
MOD()
返回n1除以n2的余数,
POWER(,)
返回n1的n2次方
ROUND(,)
返回舍入小数点右边n2位的n1的值,n2的缺省值为0,这回将小数点最接近的整数,如果n2为负数就舍入到小数点左边相应的位上,n2必须是整数。
select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54
SIGN()
如果n为负数,返回-1,如果n为正数,返回1,如果n=0返回0.
SIN()
返回n的正玄值,n为弧度。
SINH()
返回n的双曲正玄值,n为弧度。
SQRT()
返回n的平方根,n为弧度
TAN()
返回n的正切值,n为弧度
TANH()
返回n的双曲正切值,n为弧度
TRUNC(,)
返回截尾到n2位小数的n1的值,n2缺省设置为0,当n2为缺省设置时会将n1截尾为整数,如果n2为负值,就截尾在小数点左边相应的位上。
单行日期函数
单行日期函数操作DATA数据类型,绝大多数都有DATA数据类型的参数,绝大多数返回的也是DATA数据类型的值。
ADD_MONTHS(,<i>)
返回日期d加上i个月后的结果。i可以使任意整数。如果i是一个小数,那么数据库将隐式的他转换成整数,将会截去小数点后面的部分。
LAST_DAY()
函数返回包含日期d的月份的最后一天
MONTHS_BETWEEN(,)
返回d1和d2之间月的数目,如果d1和d2的日的日期都相同,或者都使该月的最后一天,那么将返回一个整数,否则会返回的结果将包含一个分数。
NEW_TIME(,,)
d1是一个日期数据类型,当时区tz1中的日期和时间是d时,返回时区tz2中的日期和时间。tz1和tz2时字符串。
NEXT_DAY(,)
返回日期d后由dow给出的条件的第一天,dow使用当前会话中给出的语言指定了一周中的某一天,返回的时间分量与d的时间分量相同。
select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004
ROUND([,])
将日期d按照fmt指定的格式舍入,fmt为字符串。
SYADATE
函数没有参数,返回当前日期和时间。
TRUNC([,])
返回由fmt指定的单位的日期d.
单行转换函数
单行转换函数用于操作多数据类型,在数据类型之间进行转换。
CHARTORWID()
c 使一个字符串,函数将c转换为RWID数据类型。
SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA')
CONVERT(,[,])
c尾字符串,dset、sset是两个字符集,函数将字符串c由sset字符集转换为dset字符集,sset的缺省设置为数据库的字符集。
HEXTORAW()
x为16进制的字符串,函数将16进制的x转换为RAW数据类型。
RAWTOHEX()
x是RAW数据类型字符串,函数将RAW数据类转换为16进制的数据类型。
ROWIDTOCHAR()
函数将ROWID数据类型转换为CHAR数据类型。
TO_CHAR([[,)
x是一个data或number数据类型,函数将x转换成fmt指定格式的char数据类型,如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制返回的月份和日份所使用的语言。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定小数位和千分位的分隔符,以及货币符号。
NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"
TO_DATE([,[,)
c表示字符串,fmt表示一种特殊格式的字符串。返回按照fmt格式显示的c,nlsparm表示使用的语言。函数将字符串c转换成date数据类型。
TO_MULTI_BYTE()
c表示一个字符串,函数将c的担子截字符转换成多字节字符。
TO_NUMBER([,[,)
c表示字符串,fmt表示一个特殊格式的字符串,函数返回值按照fmt指定的格式显示。nlsparm表示语言,函数将返回c代表的数字。
TO_SINGLE_BYTE()
将字符串c中得多字节字符转化成等价的单字节字符。该函数仅当数据库字符集同时包含单字节和多字节字符时才使用
其它单行函数
BFILENAME(
,)
dir是一个directory类型的对象,file为一文件名。函数返回一个空的BFILE位置值指示符,函数用于初始化BFILE变量或者是BFILE列。
DECODE(,,[,,,[])
x是一个表达式,m1是一个匹配表达式,x与m1比较,如果m1等于x,那么返回r1,否则,x与m2比较,依次类推m3,m4,m5....直到有返回结果。
DUMP(,[,[,[,]]])
x是一个表达式或字符,fmt表示8进制、10进制、16进制、或则单字符。函数返回包含了有关x的内部表示信息的VARCHAR2类型的值。如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回。
EMPTY_BLOB()
该函数没有参数,函数返回 一个空的BLOB位置指示符。函数用于初始化一个BLOB变量或BLOB列。
EMPTY_CLOB()
该函数没有参数,函数返回 一个空的CLOB位置指示符。函数用于初始化一个CLOB变量或CLOB列。
GREATEST()
exp_list是一列表达式,返回其中最大的表达式,每个表达式都被隐含的转换第一个表达式的数据类型,如果第一个表达式是字符串数据类型中的任何一个,那么返回的结果是varchar2数据类型,同时使用的比较是非填充空格类型的比较。
LEAST()
exp_list是一列表达式,返回其中最小的表达式,每个表达式都被隐含的转换第一个表达式的数据类型,如果第一个表达式是字符串数据类型中的任何一个,将返回的结果是varchar2数据类型,同时使用的比较是非填充空格类型的比较。
UID
该函数没有参数,返回唯一标示当前数据库用户的整数。
USER
返回当前用户的用户名
USERENV()
基于opt返回包含当前会话信息。opt的可选值为:
ISDBA 会话中SYSDBA脚色响应,返回TRUE
SESSIONID 返回审计会话标示符
ENTRYID 返回可用的审计项标示符
INSTANCE 在会话连接后,返回实例标示符。该值只用于运行Parallel 服务器并且有 多个实例的情况下使用。
LANGUAGE 返回语言、地域、数据库设置的字符集。
LANG 返回语言名称的ISO缩写。
TERMINAL 为当前会话使用的终端或计算机返回操作系统的标示符。
VSIZE()
x是一个表达式。返回x内部表示的字节数。
SQL中的组函数
组函数也叫集合函数,返回基于多个行的单一结果,行的准确数量无法确定,除非查询被执行并且所有的结果都被包含在内。与单行函数不同的是,在解析时所有的行都是已知的。由于这种差别使组函数与单行函数有在要求和行为上有微小的差异.
组(多行)函数
与单行函数相比,oracle提供了丰富的基于组的,多行的函数。这些函数可以在select或select的having子句中使用,当用于select子串时常常都和GROUP BY一起使用。
AVG([{DISYINCT|ALL}])
返回数值的平均值。缺省设置为ALL.
SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413
COUNT({*|DISTINCT|ALL} )
返回查询中行的数目,缺省设置是ALL,*表示返回所有的行。
MAX([{DISTINCT|ALL}])
返回选择列表项目的最大值,如果x是字符串数据类型,他返回一个VARCHAR2数据类型,如果X是一个DATA数据类型,返回一个日期,如果X是numeric数据类型,返回一个数字。注意distinct和all不起作用,应为最大值与这两种设置是相同的。
MIN([{DISTINCT|ALL}])
返回选择列表项目的最小值。
STDDEV([{DISTINCT|ALL}])
返回选者的列表项目的标准差,所谓标准差是方差的平方根。
SUM([{DISTINCT|ALL}])
返回选择列表项目的数值的总和。
VARIANCE([{DISTINCT|ALL}])
返回选择列表项目的统计方差。
用GROUP BY给数据分组
正如题目暗示的那样组函数就是操作那些已经分好组的数据,我们告诉数据库用GROUP BY怎样给数据分组或者分类,当我们在SELECT语句的SELECT子句中使用组函数时,我们必须把为分组或非常数列放置在GROUP BY子句中,如果没有用group by进行专门处理,那么缺省的分类是将整个结果设为一类。
select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982
在这个例子中,我们用state字段分类;如果我们要将结果按照zip_codes排序,可以用ORDER BY语句,ORDER BY子句可以使用列或组函数。
select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982
用HAVING子句限制分组数据
现在你已经知道了在查询的SELECT语句和ORDER BY子句中使用主函数,组函数只能用于两个子串中,组函数不能用于WHERE子串中,例如下面的查询是错误的:
错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk
这个语句中数据库不知道SUM()是什么,当我们需要指示数据库对行分组,然后限制分组后的行的输出时,正确的方法是使用HAVING语句:
SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)>10000;
嵌套函数
函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可继承的执行过程。但函数的优先权只是基于位置,函数遵循由内到外,由左到右的原则。嵌套技术一般用于象DECODE这样的能被用于逻辑判断语句IF....THEN...ELSE的函数。
函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类:
单行函数
组函数
本文将讨论如何利用单行函数以及使用规则。
SQL中的单行函数
SQL和PL/SQL中自带很多类型的函数,有字符、数字、日期、转换、和混合型等多种函数用于处理单行数据,因此这些都可被统称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY等子句中,例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX等单行函数。
SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)
单行函数也可以在其他语句中使用,如update的SET子句,INSERT的VALUES子句,DELET的WHERE子句,认证考试特别注意在SELECT语句中使用这些函数,所以我们的注意力也集中在SELECT语句中。
NULL和单行函数
在如何理解NULL上开始是很困难的,就算是一个很有经验的人依然对此感到困惑。NULL值表示一个未知数据或者一个空值,算术操作符的任何一个操作数为NULL值,结果均为提个NULL值,这个规则也适合很多函数,只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL值。在这些中NVL函数时最重要的,因为他能直接处理NULL值,NVL有两个参数:NVL(x1,x2),x1和x2都式表达式,当x1为null时返回X2,否则返回x1。
下面我们看看emp数据表它包含了薪水、奖金两项,需要计算总的补偿
column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2
不是简单的将薪水和奖金加起来就可以了,如果某一行是null值那么结果就将是null,比如下面的例子:
update empset salary=(salary+bonus)*1.1
这个语句中,雇员的工资和奖金都将更新为一个新的值,但是如果没有奖金,即 salary + null,那么就会得出错误的结论,这个时候就要使用nvl函数来排除null值的影响。
所以正确的语句是:
update empset salary=(salary+nvl(bonus,0)*1.1
单行字符串函数
单行字符串函数用于操作字符串数据,他们大多数有一个或多个参数,其中绝大多数返回字符串
ASCII()
c1是一字符串,返回c1第一个字母的ASCII码,他的逆函数是CHR()
SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122
CHR(<i>)[NCHAR_CS]
i是一个数字,函数返回十进制表示的字符
select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B
CONCAT(,)
c1,c2均为字符串,函数将c2连接到c1的后面,如果c1为null,将返回c2.如果c2为null,则返回c1,如果c1、c2都为null,则返回null。他和操作符||返回的结果相同
select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda
INITCAP()
c1为一字符串。函数将每个单词的第一个字母大写其它字母小写返回。单词由空格,控制字符,标点符号限制。
select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici
INSTR(,[,<i>[,]])
c1,c2均为字符串,i,j为整数。函数返回c2在c1中第j次出现的位置,搜索从c1的第i个字符开始。当没有发现需要的字符时返回0,如果i为负数,那么搜索将从右到左进行,但是位置的计算还是从左到右,i和j的缺省值为1.
select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2
INSTRB(,[,i[,j])
与INSTR()函数一样,只是他返回的是字节,对于单字节INSTRB()等于INSTR()
LENGTH()
c1为字符串,返回c1的长度,如果c1为null,那么将返回null值。
select LENGTH('Ipso Facto') ergo from dualergo10
LENGTHb()
与LENGTH()一样,返回字节。
lower()
返回c的小写字符,经常出现在where子串中
select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite
LPAD(,<i>[,])
c1,c2均为字符串,i为整数。在c1的左侧用c2字符串补足致长度i,可多次重复,如果i小于c1的长度,那么只返回i那么长的c1字符,其他的将被截去。c2的缺省值为单空格,参见RPAD。
select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe
LTRIM(,)
把c1中最左边的字符去掉,使其第一个字符不在c2中,如果没有c2,那么c1就不会改变。
select LTRIM('Mississippi','Mis') from dualLTRppi
RPAD(,<i>[,])
在c1的右侧用c2字符串补足致长度i,可多次重复,如果i小于c1的长度,那么只返回i那么长的c1字符,其他的将被截去。c2的缺省值为单空格,其他与LPAD相似
RTRIM(,)
把c1中最右边的字符去掉,使其第后一个字符不在c2中,如果没有c2,那么c1就不会改变。
REPLACE(,[,])
c1,c2,c3都是字符串,函数用c3代替出现在c1中的c2后返回。
select REPLACE('uptown','up','down') from dualREPLACEdowntown
STBSTR(,<i>[,])
c1为一字符串,i,j为整数,从c1的第i位开始返回长度为j的子字符串,如果j为空,则直到串的尾部。
select SUBSTR('Message',1,4) from dualSUBSMess
SUBSTRB(,<i>[,])
与SUBSTR大致相同,只是I,J是以字节计算。
SOUNDEX()
返回与c1发音相似的词
select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250
TRANSLATE(,,)
将c1中与c2相同的字符以c3代替
select TRANSLATE('fumble','uf','ar') test from dualTEXTramble
TRIM([[]] from c3)
将c3串中的第一个,最后一个,或者都删除。
select TRIM(' space padded ') trim from dual TRIMspace padded
UPPER()
返回c1的大写,常出现where子串中
select name from dual where UPPER(name) LIKE 'KI%'NAMEKING
单行数字函数
单行数字函数操作数字数据,执行数学和算术运算。所有函数都有数字参数并返回数字值。所有三角函数的操作数和值都是弧度而不是角度,oracle没有提供内建的弧度和角度的转换函数。
ABS()
返回n的绝对值
ACOS()
反余玄函数,返回-1到1之间的数。n表示弧度
select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0
ASIN()
反正玄函数,返回-1到1,n表示弧度
ATAN()
反正切函数,返回n的反正切值,n表示弧度。
CEIL()
返回大于或等于n的最小整数。
COS()
返回n的余玄值,n为弧度
COSH()
返回n的双曲余玄值,n 为数字。
select COSH(<1.4>) FROM dualCOSH(1.4)2.15089847
EXP()
返回e的n次幂,e=2.71828183.
FLOOR()
返回小于等于N的最大整数。
LN()
返回N的自然对数,N必须大于0
LOG(,)
返回以n1为底n2的对数
MOD()
返回n1除以n2的余数,
POWER(,)
返回n1的n2次方
ROUND(,)
返回舍入小数点右边n2位的n1的值,n2的缺省值为0,这回将小数点最接近的整数,如果n2为负数就舍入到小数点左边相应的位上,n2必须是整数。
select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54
SIGN()
如果n为负数,返回-1,如果n为正数,返回1,如果n=0返回0.
SIN()
返回n的正玄值,n为弧度。
SINH()
返回n的双曲正玄值,n为弧度。
SQRT()
返回n的平方根,n为弧度
TAN()
返回n的正切值,n为弧度
TANH()
返回n的双曲正切值,n为弧度
TRUNC(,)
返回截尾到n2位小数的n1的值,n2缺省设置为0,当n2为缺省设置时会将n1截尾为整数,如果n2为负值,就截尾在小数点左边相应的位上。
单行日期函数
单行日期函数操作DATA数据类型,绝大多数都有DATA数据类型的参数,绝大多数返回的也是DATA数据类型的值。
ADD_MONTHS(,<i>)
返回日期d加上i个月后的结果。i可以使任意整数。如果i是一个小数,那么数据库将隐式的他转换成整数,将会截去小数点后面的部分。
LAST_DAY()
函数返回包含日期d的月份的最后一天
MONTHS_BETWEEN(,)
返回d1和d2之间月的数目,如果d1和d2的日的日期都相同,或者都使该月的最后一天,那么将返回一个整数,否则会返回的结果将包含一个分数。
NEW_TIME(,,)
d1是一个日期数据类型,当时区tz1中的日期和时间是d时,返回时区tz2中的日期和时间。tz1和tz2时字符串。
NEXT_DAY(,)
返回日期d后由dow给出的条件的第一天,dow使用当前会话中给出的语言指定了一周中的某一天,返回的时间分量与d的时间分量相同。
select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004
ROUND([,])
将日期d按照fmt指定的格式舍入,fmt为字符串。
SYADATE
函数没有参数,返回当前日期和时间。
TRUNC([,])
返回由fmt指定的单位的日期d.
单行转换函数
单行转换函数用于操作多数据类型,在数据类型之间进行转换。
CHARTORWID()
c 使一个字符串,函数将c转换为RWID数据类型。
SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA')
CONVERT(,[,])
c尾字符串,dset、sset是两个字符集,函数将字符串c由sset字符集转换为dset字符集,sset的缺省设置为数据库的字符集。
HEXTORAW()
x为16进制的字符串,函数将16进制的x转换为RAW数据类型。
RAWTOHEX()
x是RAW数据类型字符串,函数将RAW数据类转换为16进制的数据类型。
ROWIDTOCHAR()
函数将ROWID数据类型转换为CHAR数据类型。
TO_CHAR([[,)
x是一个data或number数据类型,函数将x转换成fmt指定格式的char数据类型,如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制返回的月份和日份所使用的语言。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定小数位和千分位的分隔符,以及货币符号。
NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"
TO_DATE([,[,)
c表示字符串,fmt表示一种特殊格式的字符串。返回按照fmt格式显示的c,nlsparm表示使用的语言。函数将字符串c转换成date数据类型。
TO_MULTI_BYTE()
c表示一个字符串,函数将c的担子截字符转换成多字节字符。
TO_NUMBER([,[,)
c表示字符串,fmt表示一个特殊格式的字符串,函数返回值按照fmt指定的格式显示。nlsparm表示语言,函数将返回c代表的数字。
TO_SINGLE_BYTE()
将字符串c中得多字节字符转化成等价的单字节字符。该函数仅当数据库字符集同时包含单字节和多字节字符时才使用
其它单行函数
BFILENAME(
,)
dir是一个directory类型的对象,file为一文件名。函数返回一个空的BFILE位置值指示符,函数用于初始化BFILE变量或者是BFILE列。
DECODE(,,[,,,[])
x是一个表达式,m1是一个匹配表达式,x与m1比较,如果m1等于x,那么返回r1,否则,x与m2比较,依次类推m3,m4,m5....直到有返回结果。
DUMP(,[,[,[,]]])
x是一个表达式或字符,fmt表示8进制、10进制、16进制、或则单字符。函数返回包含了有关x的内部表示信息的VARCHAR2类型的值。如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回。
EMPTY_BLOB()
该函数没有参数,函数返回 一个空的BLOB位置指示符。函数用于初始化一个BLOB变量或BLOB列。
EMPTY_CLOB()
该函数没有参数,函数返回 一个空的CLOB位置指示符。函数用于初始化一个CLOB变量或CLOB列。
GREATEST()
exp_list是一列表达式,返回其中最大的表达式,每个表达式都被隐含的转换第一个表达式的数据类型,如果第一个表达式是字符串数据类型中的任何一个,那么返回的结果是varchar2数据类型,同时使用的比较是非填充空格类型的比较。
LEAST()
exp_list是一列表达式,返回其中最小的表达式,每个表达式都被隐含的转换第一个表达式的数据类型,如果第一个表达式是字符串数据类型中的任何一个,将返回的结果是varchar2数据类型,同时使用的比较是非填充空格类型的比较。
UID
该函数没有参数,返回唯一标示当前数据库用户的整数。
USER
返回当前用户的用户名
USERENV()
基于opt返回包含当前会话信息。opt的可选值为:
ISDBA 会话中SYSDBA脚色响应,返回TRUE
SESSIONID 返回审计会话标示符
ENTRYID 返回可用的审计项标示符
INSTANCE 在会话连接后,返回实例标示符。该值只用于运行Parallel 服务器并且有 多个实例的情况下使用。
LANGUAGE 返回语言、地域、数据库设置的字符集。
LANG 返回语言名称的ISO缩写。
TERMINAL 为当前会话使用的终端或计算机返回操作系统的标示符。
VSIZE()
x是一个表达式。返回x内部表示的字节数。
SQL中的组函数
组函数也叫集合函数,返回基于多个行的单一结果,行的准确数量无法确定,除非查询被执行并且所有的结果都被包含在内。与单行函数不同的是,在解析时所有的行都是已知的。由于这种差别使组函数与单行函数有在要求和行为上有微小的差异.
组(多行)函数
与单行函数相比,oracle提供了丰富的基于组的,多行的函数。这些函数可以在select或select的having子句中使用,当用于select子串时常常都和GROUP BY一起使用。
AVG([{DISYINCT|ALL}])
返回数值的平均值。缺省设置为ALL.
SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413
COUNT({*|DISTINCT|ALL} )
返回查询中行的数目,缺省设置是ALL,*表示返回所有的行。
MAX([{DISTINCT|ALL}])
返回选择列表项目的最大值,如果x是字符串数据类型,他返回一个VARCHAR2数据类型,如果X是一个DATA数据类型,返回一个日期,如果X是numeric数据类型,返回一个数字。注意distinct和all不起作用,应为最大值与这两种设置是相同的。
MIN([{DISTINCT|ALL}])
返回选择列表项目的最小值。
STDDEV([{DISTINCT|ALL}])
返回选者的列表项目的标准差,所谓标准差是方差的平方根。
SUM([{DISTINCT|ALL}])
返回选择列表项目的数值的总和。
VARIANCE([{DISTINCT|ALL}])
返回选择列表项目的统计方差。
用GROUP BY给数据分组
正如题目暗示的那样组函数就是操作那些已经分好组的数据,我们告诉数据库用GROUP BY怎样给数据分组或者分类,当我们在SELECT语句的SELECT子句中使用组函数时,我们必须把为分组或非常数列放置在GROUP BY子句中,如果没有用group by进行专门处理,那么缺省的分类是将整个结果设为一类。
select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982
在这个例子中,我们用state字段分类;如果我们要将结果按照zip_codes排序,可以用ORDER BY语句,ORDER BY子句可以使用列或组函数。
select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982
用HAVING子句限制分组数据
现在你已经知道了在查询的SELECT语句和ORDER BY子句中使用主函数,组函数只能用于两个子串中,组函数不能用于WHERE子串中,例如下面的查询是错误的:
错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk
这个语句中数据库不知道SUM()是什么,当我们需要指示数据库对行分组,然后限制分组后的行的输出时,正确的方法是使用HAVING语句:
SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)>10000;
嵌套函数
函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可继承的执行过程。但函数的优先权只是基于位置,函数遵循由内到外,由左到右的原则。嵌套技术一般用于象DECODE这样的能被用于逻辑判断语句IF....THEN...ELSE的函数。
2009年4月7日星期二
2009年4月4日星期六
2009年4月2日星期四
2009年3月26日星期四
2009年3月21日星期六
选车牌号的门道——如何选车牌号
摘录: http://blog.sina.com.cn/s/blog_5d4c89590100c98m.html
如何选车牌号
更多内容请看《教你购车专题》首页
现在购车,可自选车牌号,这是一种很人性化的改革,它为车主展示学识、品味、情感、追求创造了条件,也为车主选择到适宜、吉祥、理想的车牌号,提供了方便。但如何选择,它有哪些根据,哪些方法,哪些讲究,现运用《易经》的象、数、理思想,简介如下。
一、相关说明
车牌号是由英语字母和数字组成,要选择到理想的车牌号,首先需要从《易》理的角度来认识字母和数字。
其一象,所谓象就是形象,形状。凡车牌字母、数字的形状,如与其事业、希望、追求相对应,则会产生有利的促进作用。在26个字母和十个数字中,利官贵的字母有:A、B、D、E、F、I、P、T,数字有:1、4、6、7、9等,因为它们有竖划、向上、通天、得辅之象;利财运的字母有:A、B、D、E、F、H、M、O、P、Q、R、S、T、U、W、Z,数字有:2、3、4、5、6、8、0,因为它们有横划、圆满、水形、聚积之象;利婚姻的字母有:B、E、F、H、M、O、P、Q、R、S、Y、Z,数字有:2、3、8、0,因为它们有对应、结合、勾通、圆满之象。
其二数,所有的自然数是没有吉凶的,但它与某个体结合产生关联时,就会有影响,才生吉凶。数的含意很多,简单地说有阴阳的含意,即单数为阳,双数为阴。有五行的含意,即1、6为水、2、7为火、3、8为木、4、9为金、5、0为土。有方位的含意,即1、6为北方、2、7为南方、3、8为东方、4、9为西方、5、0为居中。有卦象的含意,即三个数、四个数、五人数都可成卦,每个卦都蕴涵有许多相关事宜。
其三理,所谓理就是道理。在26个字母和十个数字中,所存之理可谓无穷无尽,如字母ABC和数字1有尊贵之意,因为它们是字母的前端和数的开始。如三位数的车牌,其数也可代表天、地、人三才,前一个数代表天,中间数代表人,最后一个数代表地,如四位数,中间两个数代表人,如五位数,中间一位数代表人,因为天、地、人三才的思想存在于一切事理之中,车牌亦不例外。如数字由小到大,最宜求官贵之人和大型产业类企业选用,数字由大到小,最宜求长寿之人和小型服务类企业选用。因为从小到大是步步高升,不断发展,从大到小是返老还童,循环沉淀。
另外,如果知道自己命理中的五行喜忌,则选择效果可能会更好。
二、具体方法
有了一定的《易》理概念后,选号则变得轻松容易,其总的原则是:据情,明理,选择。具体方法是:
1、 字母有含义
不论是一个字母或两个字母,除了从象的角度考虑以外,最好字母为姓名、公司、行业、祥瑞等词语的拼音或单词缩写,使后面的数字有头、有主、有魂。
2、 数理要吉祥
数经特定的排列组合后,它要产生寓意,产生吉凶。一般车牌的数字全加起来为1、3、5、7、8、9、11、13、15、17、23、24、31、33、35、37、39、41、45、48比较好。如果符合以上要求,其数字又正好是车主的生日、特殊纪念日则更佳。
3、 卦象无不良
卦象的好坏,需要一定的易学专业知识才能判断,但用以下简单方法可避开一些不良的卦象。如所有数字的和不要为6、18、14、16、19、22、26、29、32,因为它们的卦象分别为:坎、天地否、天雷无妄、天水讼、乾(常人不用)、兑、泽水困、泽天夬、火泽癸,这些卦象都不是很理想。
三、注意事项
在选车牌时,还应注意以下几点:
1、 阴阳互见
所谓阴阳互见,就是车牌号的数字要有单有双,不能全单或全双,因为《易》理认为,孤阴不生,独阳不长。
2、 三才得配
所谓三才得配是指天、地、人三者的关系要处理恰当,人生活在天地之间,一定要尊天敬地。如果三位数,其中间数不要全大于前后的数,如果四位数字,其中间两位数不要全大于前后的数,如果五位数,其中间的一位数不要全大于两边的数。
3、 五行相生
所谓五行相生,是指车牌尾数或三才中“人数”的五行为车主命理的喜用神,对车主命理有帮扶作用。
以上分析,难免偏颇,甚至错误,仅供参考。
如何选车牌号
更多内容请看《教你购车专题》首页
现在购车,可自选车牌号,这是一种很人性化的改革,它为车主展示学识、品味、情感、追求创造了条件,也为车主选择到适宜、吉祥、理想的车牌号,提供了方便。但如何选择,它有哪些根据,哪些方法,哪些讲究,现运用《易经》的象、数、理思想,简介如下。
一、相关说明
车牌号是由英语字母和数字组成,要选择到理想的车牌号,首先需要从《易》理的角度来认识字母和数字。
其一象,所谓象就是形象,形状。凡车牌字母、数字的形状,如与其事业、希望、追求相对应,则会产生有利的促进作用。在26个字母和十个数字中,利官贵的字母有:A、B、D、E、F、I、P、T,数字有:1、4、6、7、9等,因为它们有竖划、向上、通天、得辅之象;利财运的字母有:A、B、D、E、F、H、M、O、P、Q、R、S、T、U、W、Z,数字有:2、3、4、5、6、8、0,因为它们有横划、圆满、水形、聚积之象;利婚姻的字母有:B、E、F、H、M、O、P、Q、R、S、Y、Z,数字有:2、3、8、0,因为它们有对应、结合、勾通、圆满之象。
其二数,所有的自然数是没有吉凶的,但它与某个体结合产生关联时,就会有影响,才生吉凶。数的含意很多,简单地说有阴阳的含意,即单数为阳,双数为阴。有五行的含意,即1、6为水、2、7为火、3、8为木、4、9为金、5、0为土。有方位的含意,即1、6为北方、2、7为南方、3、8为东方、4、9为西方、5、0为居中。有卦象的含意,即三个数、四个数、五人数都可成卦,每个卦都蕴涵有许多相关事宜。
其三理,所谓理就是道理。在26个字母和十个数字中,所存之理可谓无穷无尽,如字母ABC和数字1有尊贵之意,因为它们是字母的前端和数的开始。如三位数的车牌,其数也可代表天、地、人三才,前一个数代表天,中间数代表人,最后一个数代表地,如四位数,中间两个数代表人,如五位数,中间一位数代表人,因为天、地、人三才的思想存在于一切事理之中,车牌亦不例外。如数字由小到大,最宜求官贵之人和大型产业类企业选用,数字由大到小,最宜求长寿之人和小型服务类企业选用。因为从小到大是步步高升,不断发展,从大到小是返老还童,循环沉淀。
另外,如果知道自己命理中的五行喜忌,则选择效果可能会更好。
二、具体方法
有了一定的《易》理概念后,选号则变得轻松容易,其总的原则是:据情,明理,选择。具体方法是:
1、 字母有含义
不论是一个字母或两个字母,除了从象的角度考虑以外,最好字母为姓名、公司、行业、祥瑞等词语的拼音或单词缩写,使后面的数字有头、有主、有魂。
2、 数理要吉祥
数经特定的排列组合后,它要产生寓意,产生吉凶。一般车牌的数字全加起来为1、3、5、7、8、9、11、13、15、17、23、24、31、33、35、37、39、41、45、48比较好。如果符合以上要求,其数字又正好是车主的生日、特殊纪念日则更佳。
3、 卦象无不良
卦象的好坏,需要一定的易学专业知识才能判断,但用以下简单方法可避开一些不良的卦象。如所有数字的和不要为6、18、14、16、19、22、26、29、32,因为它们的卦象分别为:坎、天地否、天雷无妄、天水讼、乾(常人不用)、兑、泽水困、泽天夬、火泽癸,这些卦象都不是很理想。
三、注意事项
在选车牌时,还应注意以下几点:
1、 阴阳互见
所谓阴阳互见,就是车牌号的数字要有单有双,不能全单或全双,因为《易》理认为,孤阴不生,独阳不长。
2、 三才得配
所谓三才得配是指天、地、人三者的关系要处理恰当,人生活在天地之间,一定要尊天敬地。如果三位数,其中间数不要全大于前后的数,如果四位数字,其中间两位数不要全大于前后的数,如果五位数,其中间的一位数不要全大于两边的数。
3、 五行相生
所谓五行相生,是指车牌尾数或三才中“人数”的五行为车主命理的喜用神,对车主命理有帮扶作用。
以上分析,难免偏颇,甚至错误,仅供参考。
2009年3月13日星期五
QuickCHM 2.6中“不支持此接口”错误的解决 - C#探索者 - 博客园
QuickCHM 2.6中“不支持此接口”错误的解决
最近做一个电子书,在网上找了一个比较好用的QuickCHM 2.6,自己先试验了一个文本和静态网页,好象没什么问题。从网上保存了一些网页,其中包含一些脚本代码、图像等,每当鼠标移到编辑主窗口中时,就出现一连串的“不支持此接口”的错误提示,找了半天也没有解决。到网上找了一下,也没有太明确的解决办法。其中有一个说安装WinCHM就可以解决这个问题,还真是的,真管用。还有一个微软的html编译工具。下午没事,把WinCHM删除了,结果直接没有办法运行程序,提示“EoleSysError”错误,保留的WinCHM副本也不能运行了。看样子是系统路径缺少文件造成的,要不怎么会连WinCHM也不能运行了呢?网上说提示“EoleSysError”错误是缺少库文件造成的。于是我将dhtmled.ocx复制到c:\windows\system32文件夹,结果就可以运行程序了,并且也没有“不支持此接口”的提示。又查找了这个文件的不同版本,机器上共有三个版本,其中两个较低的版本(有一个是WinCHM安装上去的)支持QuickCHM的正常运行,而最新的版本不支持,提示“不支持此接口”。由此可见,必须把版本为6.1.0.9227(128,000 字节)以下的dhtmled.ocx复制到c:\windows\system32文件夹,替换原有文件。
如果打開軟作不成功,可以注冊: regsvr32 X:\windows\system32\dhtmled.ocx;
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=592492"
最近做一个电子书,在网上找了一个比较好用的QuickCHM 2.6,自己先试验了一个文本和静态网页,好象没什么问题。从网上保存了一些网页,其中包含一些脚本代码、图像等,每当鼠标移到编辑主窗口中时,就出现一连串的“不支持此接口”的错误提示,找了半天也没有解决。到网上找了一下,也没有太明确的解决办法。其中有一个说安装WinCHM就可以解决这个问题,还真是的,真管用。还有一个微软的html编译工具。下午没事,把WinCHM删除了,结果直接没有办法运行程序,提示“EoleSysError”错误,保留的WinCHM副本也不能运行了。看样子是系统路径缺少文件造成的,要不怎么会连WinCHM也不能运行了呢?网上说提示“EoleSysError”错误是缺少库文件造成的。于是我将dhtmled.ocx复制到c:\windows\system32文件夹,结果就可以运行程序了,并且也没有“不支持此接口”的提示。又查找了这个文件的不同版本,机器上共有三个版本,其中两个较低的版本(有一个是WinCHM安装上去的)支持QuickCHM的正常运行,而最新的版本不支持,提示“不支持此接口”。由此可见,必须把版本为6.1.0.9227(128,000 字节)以下的dhtmled.ocx复制到c:\windows\system32文件夹,替换原有文件。
如果打開軟作不成功,可以注冊: regsvr32 X:\windows\system32\dhtmled.ocx;
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=592492"
2009年3月12日星期四
CHM格式電子書製作詳解--alphaport的blog
CHM格式電子書製作詳解--alphaport的blog: "CHM格式電子書製作詳解
CHM幫助檔是什麼?原來的軟體大多數採用副檔名為HLP的幫助檔(WinHelp ),但隨著互聯網的發展,這種格式的幫助檔已經難以適應軟體線上幫助的需要,以及更加人性化更加簡單易於查看的需要,因此一種全新的幫助檔系統HTML Help由微軟率先在Windows98中使用了。由於它是一個經過壓縮的網頁集合,不但減小了檔的體積,更利於用戶從INTERNET上下載,並且還支援HTML、Ac-tiveX、Java、JScript、Visual Basic Scripting 和多種圖像格式(.jpeg、.gif和.png 等),因此很快受到廣大軟體作者和軟體用戶的歡迎。不過,它的用途又何止這些?
下面,我們就以將小說《圍城》製作成一部閱讀方便的電子版小說為例,一步步地讓您瞭解CHM幫助文檔製作的全過程,通過這樣的介紹,相信您一定能隨心所欲地做出更多自己想要的電子文檔。“公欲善其事,必先利其器”,還是先介紹我們的製作工具吧。能製作CHM文件的工具最常用也是最易用的莫過於Microsoft的HTML Help Workshop了,它完全安裝後只有4.6M,包括兩組工具集:HTML Help Workshop和HTML Help Image Editor。前者就是我們今天要用到的好東東,後者在網頁製作中常用到圖形檔的編輯和修改。
安裝完HTML Help Workshop後,您可以在開始功能表|程式|HTML Help Workshop中打開它。要建立CHM幫助檔必須先將我們所有想要讓其出現在幫助檔中的內容做成相對獨立的網頁檔(即HTML檔),這些工作可以在HTML Help Workshop中完成,也可以應用其他網頁編輯器(如FontPage或HotDog)來製作。
比如說我們這裏將其作為例子的《圍城》,就可以按不同的章節來製作。另外,HTML檔之間應該相互鏈結,如每一章之間應該保留與上一章和下一章超連結的介面,將這些相對獨立的網頁製作完成後,將它們儲存到一個新建的檔夾中。
首先我們先介紹幾種將要用到的過渡檔:
1.hhp檔,這是最常用的一類檔,它實際上是“HTML Help project”的縮寫,表示HTML幫助檔專案,它是生成CHM檔最直接用到的一類檔,只需要有一個hhp檔就可以根據它來編譯相應的CHM檔。
2.hhc檔,它是“HTML Help table of contents”的縮寫,表示的是HTML幫助檔的目錄,通常我們在CHM檔流覽器的左邊視窗中看到的目錄內容就由它來提供,當然,它並不能直接被編譯成CHM檔,而先要集成到某一hhp檔中才能發揮作用。
3.hhk檔,它是“HTML Help Index Keyword”的縮寫,為我們提供了CHM檔的關鍵字索引查詢功能,也是一個易於查看的幫助檔不可缺少的一部分,同hhc檔一樣,它也不能直接編譯生成相應的CHM檔。
4.hhj檔,它實際上不屬於我們今天要討論的內容,因為它屬於另一個幫助檔系統Win Help,在Win Help系統中,hhj檔的作用相當於HTML Help 中的HHP檔,在這裏就不做更詳細的介紹了。
我們現在已經知道要編譯一個CHM檔,首先要建立一個hhp檔。先在Workshop的“檔”功能表中選擇“新建”一個項目,這時將會出現有名為“新建專案”的視窗,這裏會有一名“嚮導”提示您是否將採用原由的WinHelp專案檔(即.hpj)來製作新的項目,可以將“轉換WinHelp專案”選項勾掉,點擊“下一步”然後指定將要建立的hhp文件的檔案名和完整的路徑,再進入“下一步”,此時會有三個複選項,它們分別表示以現存的hhc、hhk、HTML檔來建立HHP檔,由於沒有現成的hhc和hhk檔,因此我們可以只選擇最後一項(HTML Files),點擊“下一步”後可以在隨後出現的“新建專案——HTML檔”視窗中將我們已經製作好的所有網頁檔按先後順序添加到檔列表中,點擊“下一步”後,就可以看到令人愉快的“完成”按鍵了,但這並不意味著大功告成,因為這一步僅僅是建立了一個hhp檔,還有不少工作等著我們去完成呢。
一個hhp檔形成後,將會在Workshop|專案視窗中顯示此檔的結構,雙擊此視窗中的[OPTIONS]選項,就可以修改這一專案的結構了,比如要指定專案的標題,指定CHM檔的默認首頁檔以及文字編碼類型和字體,在檔視窗中,還可以指定將要生成的CHM檔的檔案名以及路徑、指定編譯時所需的hhc和hhk的路徑及名稱等等。上面我們已經介紹了hhc、hhk檔的作用,它們並不是必須的,可以根據需要來決定是否要生成包含目錄以及關鍵字查詢的幫助文檔,一般來說,總頁數較少的幫助檔可以省略掉這些內容和功能。對照本例的電子版小說《圍城》的頁數,我們決定簡單至上,這時可以執行“檔”功能表中的“編譯”命令,Workshop在確認hhp檔的路徑及名稱後。很快,一本電子版小說就這樣生成了,它雖然只是一個獨立的檔,但卻可以完全脫離自己的機器、脫離Workshop運行(需要IE4.0以上支援)。
一個比較簡單的CHM幫助檔(沒有目錄、沒有索引)的製作過程就是這樣,如果您想製作包括目錄和索引的幫助檔,可以先分別製作一個HHC檔和一個HHK檔,然後在上一步中將它們添加到相應的項目中就可以了。HHC的建立和編輯的方法有兩種,一種是在“檔”功能表中選擇新建一個“目錄表”,在隨後出現的編輯視窗中對其進行編輯;另一種方法是在形成的hhp檔編輯視窗中點擊“目錄”視窗選擇“創建一個新的目錄檔”,並為其命名進行相應的編輯。
經過上面的介紹,現在您一定可以自己編輯製作幫助檔和電子文檔了吧,Workshop的用途其實還有很多,其中另一個不得不說的功能是:它不僅可以編譯一個CHM檔,更可以對現有的CHM文檔進行反編譯,這樣我們可以更直接地借鑒和使用一些製作得非常精美的幫助文檔的某些精彩部分,有時搞一點“拿來主義”感覺還是不錯的。"
CHM幫助檔是什麼?原來的軟體大多數採用副檔名為HLP的幫助檔(WinHelp ),但隨著互聯網的發展,這種格式的幫助檔已經難以適應軟體線上幫助的需要,以及更加人性化更加簡單易於查看的需要,因此一種全新的幫助檔系統HTML Help由微軟率先在Windows98中使用了。由於它是一個經過壓縮的網頁集合,不但減小了檔的體積,更利於用戶從INTERNET上下載,並且還支援HTML、Ac-tiveX、Java、JScript、Visual Basic Scripting 和多種圖像格式(.jpeg、.gif和.png 等),因此很快受到廣大軟體作者和軟體用戶的歡迎。不過,它的用途又何止這些?
下面,我們就以將小說《圍城》製作成一部閱讀方便的電子版小說為例,一步步地讓您瞭解CHM幫助文檔製作的全過程,通過這樣的介紹,相信您一定能隨心所欲地做出更多自己想要的電子文檔。“公欲善其事,必先利其器”,還是先介紹我們的製作工具吧。能製作CHM文件的工具最常用也是最易用的莫過於Microsoft的HTML Help Workshop了,它完全安裝後只有4.6M,包括兩組工具集:HTML Help Workshop和HTML Help Image Editor。前者就是我們今天要用到的好東東,後者在網頁製作中常用到圖形檔的編輯和修改。
安裝完HTML Help Workshop後,您可以在開始功能表|程式|HTML Help Workshop中打開它。要建立CHM幫助檔必須先將我們所有想要讓其出現在幫助檔中的內容做成相對獨立的網頁檔(即HTML檔),這些工作可以在HTML Help Workshop中完成,也可以應用其他網頁編輯器(如FontPage或HotDog)來製作。
比如說我們這裏將其作為例子的《圍城》,就可以按不同的章節來製作。另外,HTML檔之間應該相互鏈結,如每一章之間應該保留與上一章和下一章超連結的介面,將這些相對獨立的網頁製作完成後,將它們儲存到一個新建的檔夾中。
首先我們先介紹幾種將要用到的過渡檔:
1.hhp檔,這是最常用的一類檔,它實際上是“HTML Help project”的縮寫,表示HTML幫助檔專案,它是生成CHM檔最直接用到的一類檔,只需要有一個hhp檔就可以根據它來編譯相應的CHM檔。
2.hhc檔,它是“HTML Help table of contents”的縮寫,表示的是HTML幫助檔的目錄,通常我們在CHM檔流覽器的左邊視窗中看到的目錄內容就由它來提供,當然,它並不能直接被編譯成CHM檔,而先要集成到某一hhp檔中才能發揮作用。
3.hhk檔,它是“HTML Help Index Keyword”的縮寫,為我們提供了CHM檔的關鍵字索引查詢功能,也是一個易於查看的幫助檔不可缺少的一部分,同hhc檔一樣,它也不能直接編譯生成相應的CHM檔。
4.hhj檔,它實際上不屬於我們今天要討論的內容,因為它屬於另一個幫助檔系統Win Help,在Win Help系統中,hhj檔的作用相當於HTML Help 中的HHP檔,在這裏就不做更詳細的介紹了。
我們現在已經知道要編譯一個CHM檔,首先要建立一個hhp檔。先在Workshop的“檔”功能表中選擇“新建”一個項目,這時將會出現有名為“新建專案”的視窗,這裏會有一名“嚮導”提示您是否將採用原由的WinHelp專案檔(即.hpj)來製作新的項目,可以將“轉換WinHelp專案”選項勾掉,點擊“下一步”然後指定將要建立的hhp文件的檔案名和完整的路徑,再進入“下一步”,此時會有三個複選項,它們分別表示以現存的hhc、hhk、HTML檔來建立HHP檔,由於沒有現成的hhc和hhk檔,因此我們可以只選擇最後一項(HTML Files),點擊“下一步”後可以在隨後出現的“新建專案——HTML檔”視窗中將我們已經製作好的所有網頁檔按先後順序添加到檔列表中,點擊“下一步”後,就可以看到令人愉快的“完成”按鍵了,但這並不意味著大功告成,因為這一步僅僅是建立了一個hhp檔,還有不少工作等著我們去完成呢。
一個hhp檔形成後,將會在Workshop|專案視窗中顯示此檔的結構,雙擊此視窗中的[OPTIONS]選項,就可以修改這一專案的結構了,比如要指定專案的標題,指定CHM檔的默認首頁檔以及文字編碼類型和字體,在檔視窗中,還可以指定將要生成的CHM檔的檔案名以及路徑、指定編譯時所需的hhc和hhk的路徑及名稱等等。上面我們已經介紹了hhc、hhk檔的作用,它們並不是必須的,可以根據需要來決定是否要生成包含目錄以及關鍵字查詢的幫助文檔,一般來說,總頁數較少的幫助檔可以省略掉這些內容和功能。對照本例的電子版小說《圍城》的頁數,我們決定簡單至上,這時可以執行“檔”功能表中的“編譯”命令,Workshop在確認hhp檔的路徑及名稱後。很快,一本電子版小說就這樣生成了,它雖然只是一個獨立的檔,但卻可以完全脫離自己的機器、脫離Workshop運行(需要IE4.0以上支援)。
一個比較簡單的CHM幫助檔(沒有目錄、沒有索引)的製作過程就是這樣,如果您想製作包括目錄和索引的幫助檔,可以先分別製作一個HHC檔和一個HHK檔,然後在上一步中將它們添加到相應的項目中就可以了。HHC的建立和編輯的方法有兩種,一種是在“檔”功能表中選擇新建一個“目錄表”,在隨後出現的編輯視窗中對其進行編輯;另一種方法是在形成的hhp檔編輯視窗中點擊“目錄”視窗選擇“創建一個新的目錄檔”,並為其命名進行相應的編輯。
經過上面的介紹,現在您一定可以自己編輯製作幫助檔和電子文檔了吧,Workshop的用途其實還有很多,其中另一個不得不說的功能是:它不僅可以編譯一個CHM檔,更可以對現有的CHM文檔進行反編譯,這樣我們可以更直接地借鑒和使用一些製作得非常精美的幫助文檔的某些精彩部分,有時搞一點“拿來主義”感覺還是不錯的。"
2009年3月10日星期二
怎样在pb中用.chm的help文件
怎样在pb中用.chm的help文件
Power Builder - Windows API
Q frank:
怎样在pb中用.chm的help文件?谢谢
A回答:
以下答案摘自:http://extend.hk.hi.cn/~kjx/pbclub/0015_html.htm
写出来与大家分享:
1、定义全局API函数:
Function Long HtmlHelpA (long hwnd ,string lpHelpFile , long wCommand, string dwData) Library "hhctrl.ocx"
2、定义全局变量:
long HH_DISPLAY_TOPIC = 0
3、在功能模块的“帮助”按钮的clicked事件中写下以下代码:
htmlhelpA(handle(parent), "chm_name>chm_win_name", HH_DISPLAY_TOPIC, "htm_name")
例如:chm帮助文件的名字是help.chm,help.chm的主窗口名是mywin,要调出的相关页面是bj_modi.htm,相应的脚本是:
htmlhelpA(handle(parent), "help.chm>mywin", HH_DISPLAY_TOPIC, "bj_modi.htm")
主持人注:其中的HH_DISPLAY_TOPIC表示在指定的窗口显示一个主题(这里为bj_modi.htm)。
4、至于在菜单中启动帮助文件,用run("hh help.chm")命令即可。
此问题由PB编程俱乐部回答。
附加关键字:编程, 源程序, programming, source code, Power Builder, PB, sybase, Windows API, win32, api, windows api, gdi32, kernel。
Power Builder - Windows API
Q frank:
怎样在pb中用.chm的help文件?谢谢
A回答:
以下答案摘自:http://extend.hk.hi.cn/~kjx/pbclub/0015_html.htm
写出来与大家分享:
1、定义全局API函数:
Function Long HtmlHelpA (long hwnd ,string lpHelpFile , long wCommand, string dwData) Library "hhctrl.ocx"
2、定义全局变量:
long HH_DISPLAY_TOPIC = 0
3、在功能模块的“帮助”按钮的clicked事件中写下以下代码:
htmlhelpA(handle(parent), "chm_name>chm_win_name", HH_DISPLAY_TOPIC, "htm_name")
例如:chm帮助文件的名字是help.chm,help.chm的主窗口名是mywin,要调出的相关页面是bj_modi.htm,相应的脚本是:
htmlhelpA(handle(parent), "help.chm>mywin", HH_DISPLAY_TOPIC, "bj_modi.htm")
主持人注:其中的HH_DISPLAY_TOPIC表示在指定的窗口显示一个主题(这里为bj_modi.htm)。
4、至于在菜单中启动帮助文件,用run("hh help.chm")命令即可。
此问题由PB编程俱乐部回答。
附加关键字:编程, 源程序, programming, source code, Power Builder, PB, sybase, Windows API, win32, api, windows api, gdi32, kernel。
2009年2月28日星期六
原型的制作与工具的使用(转摘)
【IT168 技术文章】
在应用开发生命周期中分析与设计阶段完成后,就应是应用系统的建立阶段了吗?即有了正确的分析与设计结果就可以正式的进入编程实现阶段了吗?回答是肯定的。那么为什么还要制作原型呢?下面我们讨论原型在开发中能够起到哪些作用:
通常分析设计人员并不是某一问题域的专家,他们可能对问题域的理解并不充分,而且采用的分析设计方法并不十分有效,再加上同用户的交流不够,这样就会产生错误的分析与设计,通过原型的制作可以及时发现这些错误并将它们反馈给分析与设计人员,这样避免了当开发进行到中途时再进行修改。另外,通过原型的制作还可以使开发变的更快更容易。开发人员可以在原型的基础上添加实现细节来开发出完整的应用系统,因为有了原型可以减少编码量从而提高开发速度。
恰当合理的使用原型有利于发现设计中的问题,例如,过分要求减少数据冗余导致连接查询的时间过于长,以及许多数据库设计中看似功能强大的维护触发器却导致程序无法正常录入数据等等类似的设计问题。
原型利于尽可能早的将程序提供给用户使用。在系统开发中开发人员会受到极大的压力,用户要求早日提供一些系统功能,即使是系统的一部分也行。而传统的软件生命周期与这种人际关系处境有着明显的差距。通过制作原型可以提供给用户一些最终能够使用的功能,但是这些原型大部分缺少安全性。
原型的制作能使用户对应用开发者产生一种信赖;既在概念上证明了系统设计能实际工作;也证明了项目组有能力作出一些有实际意义的东西。即使完整的应用系统不能提早交付,这对项目组与用户的交流上也是极有益处的。
由此来看,原型在开发中是提高效率的一个很好的手段,运用恰当可以收到事半功倍的效果。既然如此,为什么在使用PowerBuilder开发应用系统的过程中很少看到开发人员制作原型呢?总体来看原因有以下两个方面:
第一、应用系统开发人员将所有的精力都投入到了PowerBuilder这一开发工具的使用当中了,认为只要将该工具使用好即可解决所有问题了。
第二、对Sybase公司提供的与PowerBuilder相关的其它工具的功能不了解或了解不深,无法综合利用PowerBuilder开发工具包提供的各种工具,互相配合完成复杂的系统设计。
下面我们为读者介绍三种原型制作工具,它们都是PowerBuilder软件包中提供的,读者可以根据需要选用:
1、 应用模型生成工具AppMdeler for PowerBuilder与AppMdeler for Web。这两个工具是随PowerBuilder一同推出的原型设计工具。
他们是Sybase公司的PowerDesigner产品系列中的设计检测工具。因为PowerDesigner是Sybase公司设计的实体--关系建模工具,用户通过该工具将对现实世界的分析结果(这里采用的分析方法是结构化方法)转换成为实体—关系模型。最终将该模型生成到实际的后台数据库中。至于所生成的表以及表间的关系正确与否,由于没有经过实际应用的检验,所以还不能得出十分客观评价结果。而AppMdeler for PowerBuilder与AppMdeler for Web就是通过生成应用模型的方式检验最终的实体—关系模型正确性的工具。
AppMdeler for PowerBuilder与AppMdeler for Web能够生成基于PowerBuilder的应用模型,还可以生成基于Web的应用模型。由于他们是用来检验数据库设计是否合理的工具,所以生成的模型十分灵活。他们可以针对某张表、某几张表、某个关系以及某张表中的具体某些列进行模型生成;当需要时,他们还可以将不同表中的不同列进行组合,不论他们是否有联系。这些功能主要是为了测试数据库的设计是否合理而准备的,但是对于应用的开发同样具有极为重要的意义。当应用系统中有涉及表中具体列乃至不同表中不同列的操作需求时,就可以采用如上工具产生出模型。这些模型是基于PowerBuilder PFC生成的,所以开发人员可以通过PowerBuilder对其进行补充和修改。
2、 快速原型开发工具InfoMaker。这个软件是与PowerBuilder同步推出的数据挖掘工具,它不仅打包到了PowerBuilder工具包中,而且所有购买Sybase数据库产品的用户同样会得到这个软件。它主要有如下特点:
InfoMaker有与PowerBuilder完全相同的数据库接口。
通过InfoMaker可以不编写任何程序直接生成针对任意数据库表的数据录入(包括单表形式和主细目形式)窗口、报表输出窗口以及数据管道功能窗口。
生成的系统可以通过InfoMaker直接编译成.EXE文件交付用户使用。
所有通过InfoMaker生成的对象都可以被PowerBuilder直接打开,并且可以对设计结果进行修改和引用。
InfoMaker生成应用系统的功能来源于一个模板文件,这个模板文件是一个PBL文件,PowerBuilder程序员可以利用PowerBuilder修改这个模板,为模板添加新的功能使其不断壮大以适应新的应用原型制作要求。
由于InfoMaker具有以上的功能,所以它是采用PowerBuilder开发系统时的首选原型制作工具,开发人员可以利用它先设计出应用的录入和报表功能,然后将精力投入系统中相对复杂的功能实现上,最后再将这些功能引入系统并对这些窗口做一定的修饰即可,这样可以大大加快开发速度。唯一美中不足的是生成的原型界面和菜单是英文的,不过程序员可以在引用这些功能时对其进行汉化;另外还可以一次性的对模板进行汉化,虽然花费的精力较多,但是今后设计出的原型将是中文界面可以直接使用。
3、 系统分析、设计及应用生成工具HOW。HOW是PowerBuilder6.0软件包中新增加的一个软件开发工具,它是由Riverton公司提供的学习版软件。该开发工具有如下的特点:
利用它可以完成需求分析与设计,并且分析与设计过程完全是按照面向对象方式进行的。
该工具可以将分析与设计结果直接转换成PowerDesigner或ERWin的概念模型。然后由这些CASE工具将概念模型转换成物理模型并生成到数据库中。
此工具可以在分析与设计的基础上,不编写程序直接设计生成基于基础类库的应用系统。该系统可实现复杂的业务需求功能甚至分布式应用系统。并且生成的系统也可以被PowerBuilder打开和修改,但是要想使这个生成的应用系统正常运行必须有PowerBuilder的基础类库配合。(有关基础类库将在重用部分介绍。)
HOW可以生成一整套完整的正规的文档。从而免除了手工录入。
以上是HOW这一工具的主要功能,还有其它的实现细节读者可以在使用中慢慢体会。
由于PowerBuilder软件包中提供的HOW是学习版,有许多功能无法实现,例如,分析和设计时只能包含24个对象等约束。所以在应用开发中它仅能作为一个良好的检验工具,检验分析是否合理。另外,HOW还可以实现相对复杂的应用原型以检验设计是否合理,如果正确无误再投入PowerBuilder的正式开发。这样可以少走弯路。
以上提到的三个工具是PowerBuilder软件包中提供的,通过以上的介绍不难发现它们的功能各有侧重,在制作原型时只要选择恰当,可以将应用的开发效率提高到一个新的水平。
在应用开发生命周期中分析与设计阶段完成后,就应是应用系统的建立阶段了吗?即有了正确的分析与设计结果就可以正式的进入编程实现阶段了吗?回答是肯定的。那么为什么还要制作原型呢?下面我们讨论原型在开发中能够起到哪些作用:
通常分析设计人员并不是某一问题域的专家,他们可能对问题域的理解并不充分,而且采用的分析设计方法并不十分有效,再加上同用户的交流不够,这样就会产生错误的分析与设计,通过原型的制作可以及时发现这些错误并将它们反馈给分析与设计人员,这样避免了当开发进行到中途时再进行修改。另外,通过原型的制作还可以使开发变的更快更容易。开发人员可以在原型的基础上添加实现细节来开发出完整的应用系统,因为有了原型可以减少编码量从而提高开发速度。
恰当合理的使用原型有利于发现设计中的问题,例如,过分要求减少数据冗余导致连接查询的时间过于长,以及许多数据库设计中看似功能强大的维护触发器却导致程序无法正常录入数据等等类似的设计问题。
原型利于尽可能早的将程序提供给用户使用。在系统开发中开发人员会受到极大的压力,用户要求早日提供一些系统功能,即使是系统的一部分也行。而传统的软件生命周期与这种人际关系处境有着明显的差距。通过制作原型可以提供给用户一些最终能够使用的功能,但是这些原型大部分缺少安全性。
原型的制作能使用户对应用开发者产生一种信赖;既在概念上证明了系统设计能实际工作;也证明了项目组有能力作出一些有实际意义的东西。即使完整的应用系统不能提早交付,这对项目组与用户的交流上也是极有益处的。
由此来看,原型在开发中是提高效率的一个很好的手段,运用恰当可以收到事半功倍的效果。既然如此,为什么在使用PowerBuilder开发应用系统的过程中很少看到开发人员制作原型呢?总体来看原因有以下两个方面:
第一、应用系统开发人员将所有的精力都投入到了PowerBuilder这一开发工具的使用当中了,认为只要将该工具使用好即可解决所有问题了。
第二、对Sybase公司提供的与PowerBuilder相关的其它工具的功能不了解或了解不深,无法综合利用PowerBuilder开发工具包提供的各种工具,互相配合完成复杂的系统设计。
下面我们为读者介绍三种原型制作工具,它们都是PowerBuilder软件包中提供的,读者可以根据需要选用:
1、 应用模型生成工具AppMdeler for PowerBuilder与AppMdeler for Web。这两个工具是随PowerBuilder一同推出的原型设计工具。
他们是Sybase公司的PowerDesigner产品系列中的设计检测工具。因为PowerDesigner是Sybase公司设计的实体--关系建模工具,用户通过该工具将对现实世界的分析结果(这里采用的分析方法是结构化方法)转换成为实体—关系模型。最终将该模型生成到实际的后台数据库中。至于所生成的表以及表间的关系正确与否,由于没有经过实际应用的检验,所以还不能得出十分客观评价结果。而AppMdeler for PowerBuilder与AppMdeler for Web就是通过生成应用模型的方式检验最终的实体—关系模型正确性的工具。
AppMdeler for PowerBuilder与AppMdeler for Web能够生成基于PowerBuilder的应用模型,还可以生成基于Web的应用模型。由于他们是用来检验数据库设计是否合理的工具,所以生成的模型十分灵活。他们可以针对某张表、某几张表、某个关系以及某张表中的具体某些列进行模型生成;当需要时,他们还可以将不同表中的不同列进行组合,不论他们是否有联系。这些功能主要是为了测试数据库的设计是否合理而准备的,但是对于应用的开发同样具有极为重要的意义。当应用系统中有涉及表中具体列乃至不同表中不同列的操作需求时,就可以采用如上工具产生出模型。这些模型是基于PowerBuilder PFC生成的,所以开发人员可以通过PowerBuilder对其进行补充和修改。
2、 快速原型开发工具InfoMaker。这个软件是与PowerBuilder同步推出的数据挖掘工具,它不仅打包到了PowerBuilder工具包中,而且所有购买Sybase数据库产品的用户同样会得到这个软件。它主要有如下特点:
InfoMaker有与PowerBuilder完全相同的数据库接口。
通过InfoMaker可以不编写任何程序直接生成针对任意数据库表的数据录入(包括单表形式和主细目形式)窗口、报表输出窗口以及数据管道功能窗口。
生成的系统可以通过InfoMaker直接编译成.EXE文件交付用户使用。
所有通过InfoMaker生成的对象都可以被PowerBuilder直接打开,并且可以对设计结果进行修改和引用。
InfoMaker生成应用系统的功能来源于一个模板文件,这个模板文件是一个PBL文件,PowerBuilder程序员可以利用PowerBuilder修改这个模板,为模板添加新的功能使其不断壮大以适应新的应用原型制作要求。
由于InfoMaker具有以上的功能,所以它是采用PowerBuilder开发系统时的首选原型制作工具,开发人员可以利用它先设计出应用的录入和报表功能,然后将精力投入系统中相对复杂的功能实现上,最后再将这些功能引入系统并对这些窗口做一定的修饰即可,这样可以大大加快开发速度。唯一美中不足的是生成的原型界面和菜单是英文的,不过程序员可以在引用这些功能时对其进行汉化;另外还可以一次性的对模板进行汉化,虽然花费的精力较多,但是今后设计出的原型将是中文界面可以直接使用。
3、 系统分析、设计及应用生成工具HOW。HOW是PowerBuilder6.0软件包中新增加的一个软件开发工具,它是由Riverton公司提供的学习版软件。该开发工具有如下的特点:
利用它可以完成需求分析与设计,并且分析与设计过程完全是按照面向对象方式进行的。
该工具可以将分析与设计结果直接转换成PowerDesigner或ERWin的概念模型。然后由这些CASE工具将概念模型转换成物理模型并生成到数据库中。
此工具可以在分析与设计的基础上,不编写程序直接设计生成基于基础类库的应用系统。该系统可实现复杂的业务需求功能甚至分布式应用系统。并且生成的系统也可以被PowerBuilder打开和修改,但是要想使这个生成的应用系统正常运行必须有PowerBuilder的基础类库配合。(有关基础类库将在重用部分介绍。)
HOW可以生成一整套完整的正规的文档。从而免除了手工录入。
以上是HOW这一工具的主要功能,还有其它的实现细节读者可以在使用中慢慢体会。
由于PowerBuilder软件包中提供的HOW是学习版,有许多功能无法实现,例如,分析和设计时只能包含24个对象等约束。所以在应用开发中它仅能作为一个良好的检验工具,检验分析是否合理。另外,HOW还可以实现相对复杂的应用原型以检验设计是否合理,如果正确无误再投入PowerBuilder的正式开发。这样可以少走弯路。
以上提到的三个工具是PowerBuilder软件包中提供的,通过以上的介绍不难发现它们的功能各有侧重,在制作原型时只要选择恰当,可以将应用的开发效率提高到一个新的水平。
标签:
PowerBuilder,原型
2009年2月13日星期五
辟谷养生术与断食疗法】-黄平著
【辟谷养生术与断食疗法】-黄平著2008-06-02 21:17【辟谷养生术与断食疗法】-黄平著
不知黄平老师的近况,如对转载此书有异议,请说明!!
* 一部贯穿古今中西的辟谷文集
* 一部迄今为止最丰富翔实的辟谷专著
广州出版社 1995年12月
开卷语(略)
前 言
辟谷,是中国人或东方人(如印度人)的古老养生法。服气辟谷是在不吃的状态下辅以导引吐纳,以增加功效,提高层次。
断食,是国外特别是西方社会的古老养生法,泛指不吃谷麦的自然疗法。断食疗法有不吃一切饮食物呵可以进食部分瓜果菜蔬两种。
辟谷一词按《辞海》的解释是:亦称“断谷”、“绝谷”,即不吃五谷的意思。据称中国古代的一种修养方法。。。。后为道教承袭,当作“修仙”方法之一。《宗教词典》载:(辟谷)原为中国古代的一种呼吸养生方法,同吐纳相似。
上述两种解释实际都欠全面,理由一是辟谷应有单纯辟谷和同时辅以吐纳两种方法,二是绝非道家所独有,儒家、佛家、伊斯兰教派及民间流传的一些功派都有此法并都占据重要地位。相比之下,道家经典对其论述最丰倒是事实,仅《道藏》一书当中,便对其作了甚详、甚细的评述。
服气辟谷在我国有极其悠久的历史,从最早的《山海经》一书种已有无骨子食气的事例。屈原在《楚辞.远游》中也有:“食六气而饮沆瀣兮,漱正阳兮含朝霞。保神明之清澄兮,精气入而粗秽除。”应该说,自有了文字记载的朝代开始,已直言此为“古已有之”的古法。秦汉之后,辟谷已成为每一个朝代必不可少的历史记载内容并出版过大量的著作。可见,这种最为古老的养生法在人类历史上的影响的重要与深远。
从庞杂的古今书籍资料记载里,辟谷的意义不外为二:一是可以避荒以求生存,二是可以修道成仙。
时移世易,文明进步。古老的养生法在今天的世界中显示了极其蓬勃的生命力,科技发达的国家不仅利用断食疗法来攻克现代医学技术医治不了的种种危害人体健康的疾病,更把其上升到一个提高身体素质、净化人的灵魂和延年益寿的科学和哲学的层次。
反观我们自己,号称文明古国并以辟谷的发源地自居(辟谷源于中国还是印度,目前还未有定论,妄自以辟谷发源自称实是浅薄),其实对其认识甚少:除台湾省外,全国之中研究辟谷者少,实践辟谷者少,科学实验更是少之又少。
其实早在二三十年及五六十年代,国内已有报道国外运用断食疗法医治医学上解决不了的疾病的科研成果及其动态,而国人又长期处于人多病多、医少药少和钱少的状态,政府及医学界的目光也的确在上下张望,就是偏偏对断食疗法这颗极其耀眼且在国内有悠久历史的明珠视而不见听而不闻.....
编者对古籍养生文献和国外养生资料中的断食疗法情有独钟,又从诸多人的辟谷理论研究和实践者的著作、事例中加深了认识,进一步加强了信心,于是萌发了一定要把断食和服气辟谷这种最好、最简单的属于全人类的珍贵历史遗产推广和发扬光大的愿望。
让我们沿着古人走过的路,步着张良、释迦穆尼、穆罕默德、邱长春、耶稣、苏格拉底、柴可夫、摩西、弘一法师等古人和圣人的脚步,步着千千万万修行者的脚步,为着自身和社会的幸福安宁而学习断食或服气辟谷。
让我们用虔诚的心,重复下列伟人的心声:
“在我看来,我们这个时代最伟大的发现,就是使人经由合理的绝食而变得更年轻--在身体、心理、精神上。”
--柴可夫
“绝食是最伟大的疗法。”
--拉赛色斯
“绝食不止是健康,且是灵魂的喜悦。”
--托尔斯泰
“经由绝食,我找到了完全的健康,一个感觉纯净、快乐、新的生存境界。”
--辛克雷
编者 乙亥年仲春于广州
第一章 辟谷简述
返朴归真是历史的必然。当我们目睹现代文明给人类带来的巨大财富和物质生活时,是否注意到过分充足的营养食物和生活与精神的紧张同时也增加了发病的机会,而现今的医学对很多人类的常见病、多发病认识还很陌生……
然而,远古的人类对自然界的万事万物及人体疾病却有着比现代人更全面更客观和更直接的认识,他们早已认识和重视食物与身体的联系。吕祖指出:“欲要长生,腹中常清;欲要不死,肠无渣滓。”《黄庭内景经》云:“百谷之实土地精,五味外美邪魔腥,臭乱神吹胎气零,那从返老得还婴?”《中黄真经》云:“咸美辛酸五脏病,津味入牙昏心境,致命六腑神气衰,百骸九窍不灵圣。”该文又云:“滞子神功去路难,大都谷食偏为病……谷食精华与灵隔,缠罗六腑昏诸脉。”我国有历史上记载西汉的张良于公元前200-195年间曾闭门谢客专心修炼辟谷导引之术以改善体质。葛洪在《抱朴子·至理》记载:“张良遂修导引,绝谷一年,规轻举之道。”1896年,英国伦敦一位名叫开士的博士,写了一本《简易生活法》的书,他在书中指出:患病之时,凡多与病人以药物,足致病势加重;与其服用效力不确、效果不佳的药物,还不如使体内受病肌体暂时休息,绝食断水,这样的话,消耗的元神自然填补,体内机关也自然恢复其活动能力。他认为人们只要掌握这一秘诀,不但身体隐患自然恢复,而且还可以防病,终致无病。哥伦比亚大学医学教授汉博士也指出:“衰老的主因,是身体中因食物而产生的毒素。试管试验证明,老年人的血液含有毒素;若能抑制人体毒素,就可以延长寿命。”美国营养学教授马凯博士也作了一项著名的“马凯试验”,证实老鼠每周绝食两天,不易生癌,且寿命延长一倍。因此,到近代,在科技发达的地区与国家。绝食疗法盛行不衰,并广为应用到医疗、养生等不同的领域上来,断食研究和应用机构如干雨后春笋并取得了显赫的成就。
本书根据部分国内公开出版的书籍资料,特别是上述著名学者的著作中有关辟谷的专门理论,方法,予以整理而成,书中的评述,仅是编者的观点,不代表其他人。
第五章 张荣堂的辟谷术
张荣堂是浙江省著名气功师,是我国运用现代科学手段对气功辟谷进行检测实验的第一人。他在浙江省中医药研究院的支持与配合下,在国内首创了个体、群体辟谷的科学实验。
一、辟谷方法
断谷三天以上定为辟谷,不满 三天作为节食。
断谷3-7天为短期辟谷,8-14天为中期辟谷,15天以上为长期辟谷。
辟谷层次:
1.低层次断谷:
可食用少量瓜、果、药物,除开水和药物外不吃人间烟火之食。
2.中层次断食:
只喝水或稍加果汁,蜂蜜等饮料。
3.高层次断水:
不食任何食物,亦不饮水,但需有人护法。
初练辟谷的,可从短期、低层次开始,随着服气功夫的提高和辟谷经验的积累,再逐步延长辟谷时间和提高辟谷层次。
二、辟谷时间
为治病而辟谷者,并非辟谷时间越长、辟谷层次愈高愈好。病重、体弱者辟谷时应量力而行,适可而止。宁愿增加辟谷次数,不要一次辟谷时间太长。根据经验,一般辟谷3-5天即有疗效。
为实用而练辟谷者(如野外作业突然断粮或为渡灾荒或为练服所辟谷功夫)可以延长辟谷时间,提高辟谷层次,但必须以身体健康为前提,即辟谷期间不感饥饿,体力、精神如常。
四、辟谷进程
辟谷大致有三种形式:
1.经长期练功而出现主动辟谷。
2.经气功师催化而出现辟谷。
3.为了某种目的的修练而主动辟谷。
值得提倡的是主动辟谷,说辟谷,马上辟谷,说复食,马上复食。
整个辟谷期间可按日常生活如常进行,工作、学习仍照以往。
五、注意事项
1.服气是辟谷的前提,练辟谷者必须先练服气。
2.辟谷层次要逐渐提高,确定辟谷时间要量力而行。
3.低层次的辟谷可吃点水果。
4.辟谷时要尽量避免不蹲,如下蹲后应慢慢立起,睡在床上也要慢慢的起来,不要急速爬起,过分剧烈的动作也要避免。
5.辟谷后舌苔变厚,口中吐臭气,皮肤也会有酸臭 味,小便变黄变浊,无大便或拉稀便如便似酱油状、柏油状,这些都是正常现象,是身体排 毒的表现。如原来便秘者可服点泻药以求把宿疾泻掉,一般的辟谷腹泻是不必用药调治的,毒气泻光腹泻就会停止。
6.辟谷时会有气冲病灶反应,在正邪相博之时病会有加重或把隐病激发出来,出现这种现象时要正确理解,不要害怕有此反应是身体好,气感强、祛病快的表现。
7.最好在晚上10时正结束辟谷,同时进食少量稀粥,然后立即打坐。这时练功只是放松入静,没有运用意念,时间愈长愈好。这时打坐效果显著,有的人辟谷时还无气感,此时才有气感。
8.恢复饮食后不要马上进补,要有三五天的缓慢恢复期后才正常饮食。
9.辟谷期间绝对禁止性生活,在辟谷后复食期也要暂时停止性生活。
10.辟谷者要乐观豁达,心平气和,整个辟谷期间都要保持心情乐观和情绪稳定。
六、关于辟谷的看法和观点
所功辟谷,古今都极为重视。从实践中,体会到中国的气功辟谷具有西方绝食疗法的优点而避免了它的缺点。
在浙江省中医药研究院的配合下,对辟谷者进行了检测生理生化指标,通过对670人的辟谷实践观察和53名实验对象的科学检测,综合分析如下:
1.现代医学表明,短期断食可能引起一些机体代谢紊乱,而53名辟谷实验者的体液生化表明,短期辟谷对机体无明显损害,也无后遗症。
2.辟谷可降低三酸甘油酯和担固醇、对高血指症和心血管系统病症有治疗作用。
3.对HDL(高密度脂蛋白)两批观察表明,辟谷可提高HDL,这对治疗心血管系统疾病更有积极意义。但辟谷时间长短可能有不同效应,今后应增加观察人数,特别要进行跟踪观察。
4.对糖尿病人,在实验观察中和其他单独检测中均提示辟谷具有降低血糖之作用,但对血糖正常者可维持血糖的稳定。
5.辟谷可使人健美,胖瘦可双向调节。
6.辟谷可治疗多种疾病,包括癌症、乙肝等难治之症。
7.辟谷可提高机体免疫功能,改善血细胞功能,对人体血清蛋白的比例有较好的调节,因此辟谷具有祛病健身,延年益寿的养生学意义。
8.短期辟谷使血清总蛋白提高,提示辟谷存在一种特殊之蛋白质合成途径,其机理有待探讨。
9.古气功所说“气足不思食”本意指高功夫气功师内气充足方可辟谷。670名学员辟谷之成功和53名实验者的科学检测表明,无练功史的学员经过自身特殊体验,也能达到辟谷目的。气功辟谷具有西方饥饿疗法的优点而避免了它的副作用,与一般气功相比也有它独特的效应,其为治疗现代文明找到了一种较为理想的方法。
http://hi.baidu.com/tamife/blog/item/746f2ed92a8dd92910df9b47.html
不知黄平老师的近况,如对转载此书有异议,请说明!!
* 一部贯穿古今中西的辟谷文集
* 一部迄今为止最丰富翔实的辟谷专著
广州出版社 1995年12月
开卷语(略)
前 言
辟谷,是中国人或东方人(如印度人)的古老养生法。服气辟谷是在不吃的状态下辅以导引吐纳,以增加功效,提高层次。
断食,是国外特别是西方社会的古老养生法,泛指不吃谷麦的自然疗法。断食疗法有不吃一切饮食物呵可以进食部分瓜果菜蔬两种。
辟谷一词按《辞海》的解释是:亦称“断谷”、“绝谷”,即不吃五谷的意思。据称中国古代的一种修养方法。。。。后为道教承袭,当作“修仙”方法之一。《宗教词典》载:(辟谷)原为中国古代的一种呼吸养生方法,同吐纳相似。
上述两种解释实际都欠全面,理由一是辟谷应有单纯辟谷和同时辅以吐纳两种方法,二是绝非道家所独有,儒家、佛家、伊斯兰教派及民间流传的一些功派都有此法并都占据重要地位。相比之下,道家经典对其论述最丰倒是事实,仅《道藏》一书当中,便对其作了甚详、甚细的评述。
服气辟谷在我国有极其悠久的历史,从最早的《山海经》一书种已有无骨子食气的事例。屈原在《楚辞.远游》中也有:“食六气而饮沆瀣兮,漱正阳兮含朝霞。保神明之清澄兮,精气入而粗秽除。”应该说,自有了文字记载的朝代开始,已直言此为“古已有之”的古法。秦汉之后,辟谷已成为每一个朝代必不可少的历史记载内容并出版过大量的著作。可见,这种最为古老的养生法在人类历史上的影响的重要与深远。
从庞杂的古今书籍资料记载里,辟谷的意义不外为二:一是可以避荒以求生存,二是可以修道成仙。
时移世易,文明进步。古老的养生法在今天的世界中显示了极其蓬勃的生命力,科技发达的国家不仅利用断食疗法来攻克现代医学技术医治不了的种种危害人体健康的疾病,更把其上升到一个提高身体素质、净化人的灵魂和延年益寿的科学和哲学的层次。
反观我们自己,号称文明古国并以辟谷的发源地自居(辟谷源于中国还是印度,目前还未有定论,妄自以辟谷发源自称实是浅薄),其实对其认识甚少:除台湾省外,全国之中研究辟谷者少,实践辟谷者少,科学实验更是少之又少。
其实早在二三十年及五六十年代,国内已有报道国外运用断食疗法医治医学上解决不了的疾病的科研成果及其动态,而国人又长期处于人多病多、医少药少和钱少的状态,政府及医学界的目光也的确在上下张望,就是偏偏对断食疗法这颗极其耀眼且在国内有悠久历史的明珠视而不见听而不闻.....
编者对古籍养生文献和国外养生资料中的断食疗法情有独钟,又从诸多人的辟谷理论研究和实践者的著作、事例中加深了认识,进一步加强了信心,于是萌发了一定要把断食和服气辟谷这种最好、最简单的属于全人类的珍贵历史遗产推广和发扬光大的愿望。
让我们沿着古人走过的路,步着张良、释迦穆尼、穆罕默德、邱长春、耶稣、苏格拉底、柴可夫、摩西、弘一法师等古人和圣人的脚步,步着千千万万修行者的脚步,为着自身和社会的幸福安宁而学习断食或服气辟谷。
让我们用虔诚的心,重复下列伟人的心声:
“在我看来,我们这个时代最伟大的发现,就是使人经由合理的绝食而变得更年轻--在身体、心理、精神上。”
--柴可夫
“绝食是最伟大的疗法。”
--拉赛色斯
“绝食不止是健康,且是灵魂的喜悦。”
--托尔斯泰
“经由绝食,我找到了完全的健康,一个感觉纯净、快乐、新的生存境界。”
--辛克雷
编者 乙亥年仲春于广州
第一章 辟谷简述
返朴归真是历史的必然。当我们目睹现代文明给人类带来的巨大财富和物质生活时,是否注意到过分充足的营养食物和生活与精神的紧张同时也增加了发病的机会,而现今的医学对很多人类的常见病、多发病认识还很陌生……
然而,远古的人类对自然界的万事万物及人体疾病却有着比现代人更全面更客观和更直接的认识,他们早已认识和重视食物与身体的联系。吕祖指出:“欲要长生,腹中常清;欲要不死,肠无渣滓。”《黄庭内景经》云:“百谷之实土地精,五味外美邪魔腥,臭乱神吹胎气零,那从返老得还婴?”《中黄真经》云:“咸美辛酸五脏病,津味入牙昏心境,致命六腑神气衰,百骸九窍不灵圣。”该文又云:“滞子神功去路难,大都谷食偏为病……谷食精华与灵隔,缠罗六腑昏诸脉。”我国有历史上记载西汉的张良于公元前200-195年间曾闭门谢客专心修炼辟谷导引之术以改善体质。葛洪在《抱朴子·至理》记载:“张良遂修导引,绝谷一年,规轻举之道。”1896年,英国伦敦一位名叫开士的博士,写了一本《简易生活法》的书,他在书中指出:患病之时,凡多与病人以药物,足致病势加重;与其服用效力不确、效果不佳的药物,还不如使体内受病肌体暂时休息,绝食断水,这样的话,消耗的元神自然填补,体内机关也自然恢复其活动能力。他认为人们只要掌握这一秘诀,不但身体隐患自然恢复,而且还可以防病,终致无病。哥伦比亚大学医学教授汉博士也指出:“衰老的主因,是身体中因食物而产生的毒素。试管试验证明,老年人的血液含有毒素;若能抑制人体毒素,就可以延长寿命。”美国营养学教授马凯博士也作了一项著名的“马凯试验”,证实老鼠每周绝食两天,不易生癌,且寿命延长一倍。因此,到近代,在科技发达的地区与国家。绝食疗法盛行不衰,并广为应用到医疗、养生等不同的领域上来,断食研究和应用机构如干雨后春笋并取得了显赫的成就。
本书根据部分国内公开出版的书籍资料,特别是上述著名学者的著作中有关辟谷的专门理论,方法,予以整理而成,书中的评述,仅是编者的观点,不代表其他人。
第五章 张荣堂的辟谷术
张荣堂是浙江省著名气功师,是我国运用现代科学手段对气功辟谷进行检测实验的第一人。他在浙江省中医药研究院的支持与配合下,在国内首创了个体、群体辟谷的科学实验。
一、辟谷方法
断谷三天以上定为辟谷,不满 三天作为节食。
断谷3-7天为短期辟谷,8-14天为中期辟谷,15天以上为长期辟谷。
辟谷层次:
1.低层次断谷:
可食用少量瓜、果、药物,除开水和药物外不吃人间烟火之食。
2.中层次断食:
只喝水或稍加果汁,蜂蜜等饮料。
3.高层次断水:
不食任何食物,亦不饮水,但需有人护法。
初练辟谷的,可从短期、低层次开始,随着服气功夫的提高和辟谷经验的积累,再逐步延长辟谷时间和提高辟谷层次。
二、辟谷时间
为治病而辟谷者,并非辟谷时间越长、辟谷层次愈高愈好。病重、体弱者辟谷时应量力而行,适可而止。宁愿增加辟谷次数,不要一次辟谷时间太长。根据经验,一般辟谷3-5天即有疗效。
为实用而练辟谷者(如野外作业突然断粮或为渡灾荒或为练服所辟谷功夫)可以延长辟谷时间,提高辟谷层次,但必须以身体健康为前提,即辟谷期间不感饥饿,体力、精神如常。
四、辟谷进程
辟谷大致有三种形式:
1.经长期练功而出现主动辟谷。
2.经气功师催化而出现辟谷。
3.为了某种目的的修练而主动辟谷。
值得提倡的是主动辟谷,说辟谷,马上辟谷,说复食,马上复食。
整个辟谷期间可按日常生活如常进行,工作、学习仍照以往。
五、注意事项
1.服气是辟谷的前提,练辟谷者必须先练服气。
2.辟谷层次要逐渐提高,确定辟谷时间要量力而行。
3.低层次的辟谷可吃点水果。
4.辟谷时要尽量避免不蹲,如下蹲后应慢慢立起,睡在床上也要慢慢的起来,不要急速爬起,过分剧烈的动作也要避免。
5.辟谷后舌苔变厚,口中吐臭气,皮肤也会有酸臭 味,小便变黄变浊,无大便或拉稀便如便似酱油状、柏油状,这些都是正常现象,是身体排 毒的表现。如原来便秘者可服点泻药以求把宿疾泻掉,一般的辟谷腹泻是不必用药调治的,毒气泻光腹泻就会停止。
6.辟谷时会有气冲病灶反应,在正邪相博之时病会有加重或把隐病激发出来,出现这种现象时要正确理解,不要害怕有此反应是身体好,气感强、祛病快的表现。
7.最好在晚上10时正结束辟谷,同时进食少量稀粥,然后立即打坐。这时练功只是放松入静,没有运用意念,时间愈长愈好。这时打坐效果显著,有的人辟谷时还无气感,此时才有气感。
8.恢复饮食后不要马上进补,要有三五天的缓慢恢复期后才正常饮食。
9.辟谷期间绝对禁止性生活,在辟谷后复食期也要暂时停止性生活。
10.辟谷者要乐观豁达,心平气和,整个辟谷期间都要保持心情乐观和情绪稳定。
六、关于辟谷的看法和观点
所功辟谷,古今都极为重视。从实践中,体会到中国的气功辟谷具有西方绝食疗法的优点而避免了它的缺点。
在浙江省中医药研究院的配合下,对辟谷者进行了检测生理生化指标,通过对670人的辟谷实践观察和53名实验对象的科学检测,综合分析如下:
1.现代医学表明,短期断食可能引起一些机体代谢紊乱,而53名辟谷实验者的体液生化表明,短期辟谷对机体无明显损害,也无后遗症。
2.辟谷可降低三酸甘油酯和担固醇、对高血指症和心血管系统病症有治疗作用。
3.对HDL(高密度脂蛋白)两批观察表明,辟谷可提高HDL,这对治疗心血管系统疾病更有积极意义。但辟谷时间长短可能有不同效应,今后应增加观察人数,特别要进行跟踪观察。
4.对糖尿病人,在实验观察中和其他单独检测中均提示辟谷具有降低血糖之作用,但对血糖正常者可维持血糖的稳定。
5.辟谷可使人健美,胖瘦可双向调节。
6.辟谷可治疗多种疾病,包括癌症、乙肝等难治之症。
7.辟谷可提高机体免疫功能,改善血细胞功能,对人体血清蛋白的比例有较好的调节,因此辟谷具有祛病健身,延年益寿的养生学意义。
8.短期辟谷使血清总蛋白提高,提示辟谷存在一种特殊之蛋白质合成途径,其机理有待探讨。
9.古气功所说“气足不思食”本意指高功夫气功师内气充足方可辟谷。670名学员辟谷之成功和53名实验者的科学检测表明,无练功史的学员经过自身特殊体验,也能达到辟谷目的。气功辟谷具有西方饥饿疗法的优点而避免了它的副作用,与一般气功相比也有它独特的效应,其为治疗现代文明找到了一种较为理想的方法。
http://hi.baidu.com/tamife/blog/item/746f2ed92a8dd92910df9b47.html
pb各版本安装包、相关补丁及相关软件下载
pb各版本安装包、相关补丁及相关软件下载
类型:转载 责任编辑:asp 日期:2007/03/01
-------------------------------------------------------------------------------------------------
[color=#dc143c]powerbuilder 6.0[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/pb6.rar] 下载 [/url] 35m
[color=#dc143c]powerbuilder 6.51[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/pb651.rar] 下载 [/url] 18m
[color=#dc143c]powerbuilder 7.0[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/pb7000.rar] 下载 [/url] 439m ( cd key: 0000277816960496 或 0000592654p60496 )
[color=#dc143c]powerbuilder 8.0[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/pb8.rar] 下载 [/url] 580m
[color=#dc143c]powerbuilder 9.0[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/pb9.rar] 下载 [/url] 490m
[color=#dc143c]installshield[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/is.rar] 下载 [/url] 54m
[color=#dc143c]sybase adaptive server[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/sas.rar] 下载 [/url] 110m
[color=#dc143c]easerver 413[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/easerver413.zip] 下载 [/url] 79m
[color=#dc143c]powerdesigner 9.5[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/pd9.rar] 下载 [/url] 73m
-------------------------------------------------------------------------------------------------
[color=#dc143c]pb9.0 补丁[/color]
powerbuilder9.0补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pb9patch.zip] 下载 [/url] 6m
powerbuilder9.01补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pb901.zip] 下载 [/url] 71m
pbvm 9.0.1 (6533) 补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pbvm901.zip] 下载 [/url] 71m
infomaker 9.0.1 (6533) 补丁程序:[url=http://pb.besoft.com.cn/download/ebf/im901.zip] 下载 [/url] 32m
[color=#dc143c]pb8.0.4 补丁[/color]
powerbuilder8.04补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pb804.zip] 下载 [/url] 58m
pbvm 8.0.4 补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pbvm4.zip] 下载 [/url] 5m
infomaker 8.0.4 补丁程序:[url=http://pb.besoft.com.cn/download/ebf/im804.zip] 下载 [/url] 20m
支持文件:[url=http://pb.besoft.com.cn/download/ebf/support804.zip] 下载 [/url] 891k
[color=#dc143c]pb8.0.3 补丁[/color]
powerbuilder8.03补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pb803.zip] 下载 [/url] 68m
pbvm 8.0.3 补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pbvm.zip] 下载 [/url] 10m
infomaker 8.0.3 补丁程序:[url=http://pb.besoft.com.cn/download/ebf/im803.zip] 下载 [/url] 29m
支持文件:[url=http://pb.besoft.com.cn/download/ebf/support.zip] 下载 [/url] 980k
[color=#dc143c]pb8.0.2 补丁[/color]
powerbuilder8.02补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pb802.zip] 下载 [/url] 53m
[color=#dc143c]pb8.0.1 补丁[/color]
powerbuilder8.01补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pb801.zip] 下载 [/url] 46m
powerbuilder8.01修补说明 cdkey:3243707281207605
类型:转载 责任编辑:asp 日期:2007/03/01
-------------------------------------------------------------------------------------------------
[color=#dc143c]powerbuilder 6.0[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/pb6.rar] 下载 [/url] 35m
[color=#dc143c]powerbuilder 6.51[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/pb651.rar] 下载 [/url] 18m
[color=#dc143c]powerbuilder 7.0[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/pb7000.rar] 下载 [/url] 439m ( cd key: 0000277816960496 或 0000592654p60496 )
[color=#dc143c]powerbuilder 8.0[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/pb8.rar] 下载 [/url] 580m
[color=#dc143c]powerbuilder 9.0[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/pb9.rar] 下载 [/url] 490m
[color=#dc143c]installshield[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/is.rar] 下载 [/url] 54m
[color=#dc143c]sybase adaptive server[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/sas.rar] 下载 [/url] 110m
[color=#dc143c]easerver 413[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/easerver413.zip] 下载 [/url] 79m
[color=#dc143c]powerdesigner 9.5[/color] 安装包文件:[url=http://gongy.vicp.net/gongy/xc/pd9.rar] 下载 [/url] 73m
-------------------------------------------------------------------------------------------------
[color=#dc143c]pb9.0 补丁[/color]
powerbuilder9.0补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pb9patch.zip] 下载 [/url] 6m
powerbuilder9.01补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pb901.zip] 下载 [/url] 71m
pbvm 9.0.1 (6533) 补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pbvm901.zip] 下载 [/url] 71m
infomaker 9.0.1 (6533) 补丁程序:[url=http://pb.besoft.com.cn/download/ebf/im901.zip] 下载 [/url] 32m
[color=#dc143c]pb8.0.4 补丁[/color]
powerbuilder8.04补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pb804.zip] 下载 [/url] 58m
pbvm 8.0.4 补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pbvm4.zip] 下载 [/url] 5m
infomaker 8.0.4 补丁程序:[url=http://pb.besoft.com.cn/download/ebf/im804.zip] 下载 [/url] 20m
支持文件:[url=http://pb.besoft.com.cn/download/ebf/support804.zip] 下载 [/url] 891k
[color=#dc143c]pb8.0.3 补丁[/color]
powerbuilder8.03补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pb803.zip] 下载 [/url] 68m
pbvm 8.0.3 补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pbvm.zip] 下载 [/url] 10m
infomaker 8.0.3 补丁程序:[url=http://pb.besoft.com.cn/download/ebf/im803.zip] 下载 [/url] 29m
支持文件:[url=http://pb.besoft.com.cn/download/ebf/support.zip] 下载 [/url] 980k
[color=#dc143c]pb8.0.2 补丁[/color]
powerbuilder8.02补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pb802.zip] 下载 [/url] 53m
[color=#dc143c]pb8.0.1 补丁[/color]
powerbuilder8.01补丁程序:[url=http://pb.besoft.com.cn/download/ebf/pb801.zip] 下载 [/url] 46m
powerbuilder8.01修补说明 cdkey:3243707281207605
2009年2月10日星期二
2009, 公司电脑重新安装操作系统
因电脑Very Slow,因电脑用了好久,很长时间没有安装了,今天决定重新安装操作系统,已经OK,现在已经可以与Blog了;确实快了许多,看来是磨刀不负砍柴工啊;
2009年2月1日星期日
2009年1月24日星期六
2009春節假期安排
成本稽核(東莞)春節假期暫訂:1/24~1/28 五天(比照YY).
–如果後續YY調為七天,則我們隨之比照/待YY確定版通知.
春節期間應休假日共四天: 1/25~1/27 三天 + 1/28 一天(1/25逢周日需補休). 目前相關單位放假訊息:
1. YY工廠(預定): 1/24~1/28 五天
2. 行政中心(確定): 1/25~1/31 七天(2/1上班). -1/29.1/30 分別調到1/24(六).2/1(日)正常上班.
3.PY-D(預定): 1/25~1/28 四天
–如果後續YY調為七天,則我們隨之比照/待YY確定版通知.
春節期間應休假日共四天: 1/25~1/27 三天 + 1/28 一天(1/25逢周日需補休). 目前相關單位放假訊息:
1. YY工廠(預定): 1/24~1/28 五天
2. 行政中心(確定): 1/25~1/31 七天(2/1上班). -1/29.1/30 分別調到1/24(六).2/1(日)正常上班.
3.PY-D(預定): 1/25~1/28 四天
2009年1月23日星期五
免费网盘大集合
Diino欧洲
2007/12/11 新开通的欧洲版,主站在英国,还有法国、西班牙、瑞典等分站,给你更多选择,我这里感觉比美
国主站速度快一些。同样是免费2G网络硬盘,注册后先要收信激活帐号,然后下载软件安装,打开软件就可上
传下载了,软件界面很酷,操作起来很简便,速度不快,但比较稳定。
地址:
http://www.kqzyfj.com/r779wktqks7ACCDBF9798CHFGGB
--------------------------------------------------------------------------------
Diino
2007/09/27 免费2G网络硬盘,注册后先要收信激活帐号,然后下载软件安装,开始稍微麻烦点。以后使用就简
单了,打开软件就可上传下载了,软件界面很酷,操作起来很简便,速度不快,但比较稳定。
地址:
http://www.kqzyfj.com/il122efolfn257786A42437CAB6A
--------------------------------------------------------------------------------
豆丁
2008/03/12 免费文档存储分享空间,可以上传.txt、.ppt、.xls、.doc、.pdf格式文件,单个文件限制100M以
内。上传速度挺不错的。上传的文档自动转为flash格式,可以嵌入到博客或网页中。上传的文档可以免费分享
也可以收费。
地址:
http://www.docin.com/
--------------------------------------------------------------------------------
中山电信
2008/03/10 1G免费网盘,中山电信提供,应该会比较有保障,试了一下,上传速度也不错。可以设置与好友共
享,并加密码。(感谢deepblue提供此信息)
地址http://u.zsnet.com/default.aspx
--------------------------------------------------------------------------------
DivShare
2008/02/25 国外的一家免费网盘,5G空间,单个文件200M以内,每月50G下载流量。主要支持图片、flash、视
频、音乐、文档、压缩等文件为主,.exe等文件不可上传。试了一下,速度还可以。可以选择公开或加密你所
上传的文件。此免费网盘的
地址:http://www.divshare.com/
--------------------------------------------------------------------------------
Fs2You
2008/02/06 目前比较不错的国内免费存储空间,无需注册直接上传,速度也不错,不限文件大小和存储空间。
如果你上传的文件没有人浏览下载,你的帐号就难保了,详细要求看网站中的“常见问题”。另外,重要文件
请自行做好备份,否则此网盘出现问题就会让你麻烦了。
地址:http://www.divshare.com/
--------------------------------------------------------------------------------
WikiUpload
2008/01/25 国外的免费临时存储网盘,无需注册即直接可上传文件,单个文件可达5G,速度也还可以。要求你
上传的文件每月都要有人访问,否则会被删除。(感谢deepblue提供此信息)
地址:http://www.wikiupload.com/
--------------------------------------------------------------------------------
Scribd
2008/01/14 免费在线文档分享服务,无限空间,页面简练大气,速度也还可以。可以上传Word、PPT、Execl、
PDF、TXT、Html、jpg、gif、png等文档图片文件,能够很好的支持中文文档。
地址:http://www.scribd.com/
--------------------------------------------------------------------------------
jooce
2008/01/14 来自法国的超酷免费在线桌面终于可以正常使用了!有简体中文版,但其中还参杂这一些英文。速
度还可以,功能还稍显单一,主要可以用免费网盘功能来保存你的文件,不过多大空间不详。
地址:http://www.jooce.com
--------------------------------------------------------------------------------
纳米盘
2008/01/09 新推出的免费网盘,单个文件限制200M以内,支持图片外链,我这里上传下载速度都不错(电信网
通线路可选)。可以下载纳米机器人来上传文件,更方便,而且支持4G超大文件上传。对于新的又如此巨大空
间且无广告的免费网盘,请保持谨慎态度,重要文件不要上传,且保持备份。(感谢deepblue提供此信息)
地址:http://www.namipan.com/
--------------------------------------------------------------------------------
FanBox
2007/12/31 Vista风格的免费Web桌面服务,注册很简单,可以上传图片、音乐、视频等内容与你的朋友分享,
总共2G存储空间。界面酷,再加上服务器在国外,速度肯定是比较慢了。
地址:http://www.fanbox.com/
--------------------------------------------------------------------------------
联想
2007/12/25 联想推出的5G免费网盘!随时随地收藏网址、记录文字、备份文档……,和好友分享。上传很方便
,可一次上传多个文件,有详细进度显示。所有内容不能完全公开,仅能和“我的圈子”或“二人世界”中的
好友分享。
地址:http://www.lenovodata.com/
--------------------------------------------------------------------------------
ADrive
2007/12/19 50G国外免费网络硬盘,最大单个文件可达2G,上传文件默认不共享,你可以选择将你上传的文件
共享给他人。flash上传界面,无需下载插件,可以一次上传多个文件。缺点是功能不多,速度偏慢。
地址:http://www.adrive.com/
--------------------------------------------------------------------------------
Adobe
2007/12/14 Adobe推出的1G免费网盘,很酷的flash界面。可以开放你上传的文件给网友下载,也可以保密文件
。
地址:http://share.adobe.com/
--------------------------------------------------------------------------------
who.hasfiles
2007/12/12 100M免费网盘,空间不大,最大特色是下载个小软件登陆后会在你的电脑上虚拟出这100M网盘,和
U盘一样,使用很方便,但速度有点慢。你的文件只能邀请朋友来共享,不能完全公开。
地址:http://who.hasfiles.com/
--------------------------------------------------------------------------------
Drop.io
2007/12/05 新推出的国外免费网盘,100M空间,直接上传文件无需注册,自定义访问密码或者完全公开,还可
以自定义访问者权限以及文件过期时间。虽然是国外的服务,我感觉上传下载速度都还可以。
地址:http://www.drop.io/
--------------------------------------------------------------------------------
Files upload
2007/11/22 国外免费网盘,无需注册即可匿名上传文件,仅能上传不超过100M的单个文件。如果注册为用户可
以上传最大单个文件300M,总共3G空间,文件保存30天。速度还可以,就是限制比较多。
地址:http://www.files-upload.com/
--------------------------------------------------------------------------------
in.solit.us
2007/11/07 国外的免费网盘,无限空间容量和流量,速度偏慢,功能较多。
地址:http://in.solit.us/
--------------------------------------------------------------------------------
YouSwap
2007/09/21 flash界面的国外免费网盘,可上传1G以内单个文件,不限流量和空间,我这里上传速度不错,竟
然比国内的多特网盘快很多。
地址:http://www.youswap.com/
--------------------------------------------------------------------------------
多特网盘
2007/09/21 免费网盘服务,单个文件128M以内,不限流量和空间大小。文件默认保存30天,如果文件下载量每
天超过10次以上,程序将会为你的文件自动延时。
地址:http://www.youswap.com/
--------------------------------------------------------------------------------
Seednet
2007/09/11 2000M免费网络硬盘,目前测试期间暂不限制单个文件大小以及上传下载流量,台湾网站,我这里
上传下载速度都很快。
地址:http://shareme.seed.net.tw/
--------------------------------------------------------------------------------
Live
2007/09/04 微软旗下Live.com推出免费网盘,500M空间,可以外链,单个文件限制50M之内。目前不对中文用
户开放,所以本站提供英文版链接,申请后再重新访问folders.live.com就能以中文版登录了。(感谢xnlong
提供此信息)
地址:
http://folders.live.com/home.aspx?mkt=en-US
--------------------------------------------------------------------------------
TOMOS
2007/08/30 国内的一家免费WebOS,有20M网络硬盘空间,没有国外的WebOS这么酷,空间也比较小,但速度还
不错,功能上还有待完善。
地址:
http://www.webtomos.com/index.jsp?rcmuserID=free8
--------------------------------------------------------------------------------
DepositFiles
2007/08/18 无需注册的免费文件上传空间,可上传单个300M以内的文件,速度一般,不过还比较稳定,但下载
文件要先看一段60秒的广告,比较夸张。
地址:
http://depositfiles.com/en/signup.php?ref=free8
--------------------------------------------------------------------------------
YouSendIt
2007/08/09 免费临时文件存储,如果你要发送大文件到朋友的邮箱可以试试这个,单个文件最大100M,1G流量
限制,可以保存7天,我这里上传下载速度都不错,还有outlook插件无需登录网站使用。
地址:http://www.yousendit.com/
--------------------------------------------------------------------------------
爱问
2007/08/07 免费文件空间,限单个文件不超过30M,需要注册用户,并且上传后需要审核,比较麻烦,好在速
度很快。
地址:
http://ishare.iask.sina.com.cn/upload/
--------------------------------------------------------------------------------
RapidShare
2007/07/17 Alexa排名18位的免费网络硬盘服务,现在网盘这么受欢迎啊!号称有110G带宽……,速度确实不
错。无需注册直接上传下载,单个文件100M。
地址:http://www.rapidshare.com/
--------------------------------------------------------------------------------
ohShare
2007/07/10 无需注册直接上传的免费网盘,单个文件80M,上传完成后会给你该文件下载链接。
--------------------------------------地址:http://www.ohshare.com/---------------------------------------
myGoya
2007/07/01 免费在线桌面,有512M文件存储空间以及诸多实用功能,很酷的flash界面,不过速度就比较慢了
。
地址:https://www.mygoya.de/us
--------------------------------------------------------------------------------
Mozy
2007/06/23 2G免费网络硬盘(介绍一个朋友注册你将额外获得256M空间!),注册完成后需要收信点最长那个
链接激活帐号,然后下载软件来使用,安装好会自动选择我的文档、收藏夹等内容,你也可以自己选择要备份
的文件或目录,并可随时备份和恢复电脑上的重要文件,很方便的。
地址:https://mozy.com/?ref=SWZ62B
--------------------------------------------------------------------------------
zUpload
2007/06/14 免费网盘,无须注册直接上传,单个文件可达500M,国外服务器,速度偏慢。
地址:http://www.zupload.com/
--------------------------------------------------------------------------------
AxiFile
2007/06/05 免费网盘,提供ftp帐号,单个文件最大可达150M,速度一般,下载的时候也要先看35秒广告。
地址:http://www.axifile.com/
--------------------------------------------------------------------------------
5upload
2007/05/24 无限网络硬盘空间,无须注册直接上传下载,限制单个文件不超过10M,支持jpg、jpeg、gif、png
、zip、rar、doc、torrent格式文件。
地址:http://www.5upload.net/
--------------------------------------------------------------------------------
myDataBus
2007/05/24 免费5G网络硬盘空间,每天限制1G公开下载流量,虽然服务器在国外,但我这里上传速度不错。申
请表格提交后会有一些调查广告,都点“pass”跳过即可,然后收信点链接激活帐号就能用了。
地址:http://www.mydatabus.com/
--------------------------------------------------------------------------------
dotWORLDS
2007/05/12 提供个性域名、邮箱、空间服务,但感觉不太实用。不过还有500M免费网盘可以用,注册后需要审
核才能使用。(感谢xnlong提供此信息)
---------------------------地址:http://www.dotworlds.net/---------------------------
--------------------------
GOGOBOX
2007/05/05 免费100G网络硬盘空间!服务器在台湾,速度尚可,但感觉不够稳定。使用需要下载插件,操作也
比较麻烦,用着不太舒服。此免费网络硬盘的『演示』(感谢自由天空提供此信息)
地址:http://www.gogobox.com.tw/
--------------------------------------------------------------------------------
迈客盒子
2007/04/17 无限空间免费网络硬盘,限单个文件不超过10M、每天上传5个文件,可用赚取的金币免费升级限制
数量。(感谢子夜月相思提供此信息)
地址:
[url=http://www.mikebox.com/register.php?id=78039http://www.mikebox.com/register.php?id=78039[/url][color=#0000ff[/url]]
--------------------------------------------------------------------------------
Desktoptwo
2007/04/04 一个操作系统桌面形式的界面,很酷,集成了1G免费网络硬盘空间、免费电邮等免费服务,就是速
度比较慢。
地址:
http://www.desktoptwo.com/
--------------------------------------------------------------------------------
GigaSize
2007/04/04 免费网络硬盘空间,不注册的话可以上传总共2G大小的10个文件,注册成为会员可以上传无限个单
个不超过1.5G的文件,文件最多可以保留90天。上传速度还不错,但下载需要输入验证码并等待30秒,不过会
有积分赠送,累积到一定积分可以升级为高级账户。
地址:http://www.gigasize.com/
--------------------------------------------------------------------------------
Nakido
2007/03/25 无限空间的免费网络硬盘服务,上传文件大小也没有限制,国外的网站,我这里访问速度很慢,但
界面都是中文的。此免费网络硬盘的『演示』
地址:http://www.nakido.com/
--------------------------------------------------------------------------------
MailBigFile
2007/03/04 免费在线向邮箱发送大型文件,如果你的邮箱不支持大的附件可以试试这个,最大单个文件512M。
其实它也只是提供免费网络硬盘,只会发链接给对方,让其来MailBigFile下载,文件最多保留5天。
地址:
[url=http://www.mailbigfile.com/index.php?language=zh_CN.utf8http://www.mailbigfile.com/index.php?language=zh_CN.utf8[/url][color=#0000ff[/url]]
--------------------------------------------------------------------------------
海盘
2007/02/06 福州电信提供10M免费网络硬盘,功能也还可以,电信用户访问速度应该会不错。
地址:http://www.haipan.com/
--------------------------------------------------------------------------------
Xdrive
2007/02/01 AOL旗下的免费网络硬盘,有5G空间,需要先注册为AOL会员,还会给你个
[url=mailto:yourname@aol.com]yourname@aol.com[/url]的免费邮
箱。
地址:http://www.xdrive.com/
--------------------------------------------------------------------------------
eSnips
2006/11/11 免费5G网络硬盘,申请后需要收信点确认链接,否则7天后暂停帐户。最大可以上传10M单个文件,
如果下载工具条可以上传更大的文件。另外,可以用email方式上传文件,比较有特色。此免费网络硬盘的『演
示』
地址:http://www.esnips.com/
--------------------------------------------------------------------------------
DriveHQ
2006/11/08 既是免费网络硬盘又可以做免费空间,1G储存容量,每月200M下载流量限制,支持ftp上传管理文
件,功能也比较多,无广告。注意:网页不要采用gb2312编码,使用utf-8才不乱码。此免费网盘空间的『演示
』
地址:
[url=http://www.drivehq.com/secure/signup.aspx?refID=1058716http://www.drivehq.com/secure/signup.aspx?refID=1058716[/url][color=#0000ff[/url]]
--------------------------------------------------------------------------------
PC2N
2006/10/03 免费2G网盘,单个文件最大5M,windowsXP风格,很有特色,而且申请简单,速度也还可以。(感
谢XnLonG提供此信息)
地址:
[url=http://www.pc2n.com/index/invite.jsp?id=378026http://www.pc2n.com/index/invite.jsp?id=378026[/url][color=#0000ff[/url]]
--------------------------------------------------------------------------------
FileDen
2006/10/19 免费500M网络硬盘空间,每月5G流量限制,可以外部调用上传的文件。如果不注册为会员仅可以上
传图片,并限制单个文件不超过10M。
地址:http://www.fileden.com/
--------------------------------------------------------------------------------
Live-Share
2006/09/13 免费网络硬盘,无需注册直接上传,最大单个文件300M。注册为用户可以上传最大500M的单个文件
。无下载限制,但速度较慢。(感谢小徐提供此信息)
地址:http://www.live-share.com/
--------------------------------------------------------------------------------
Network Disk
2006/09/06 免费网络硬盘空间,无需注册,上传简单,单个文件最大不能超过100M。他还可以帮你从别的网站
下载文件,只要有url就行,很方便哦
地址:http://www.networkdisk.co.uk/
--------------------------------------------------------------------------------
999KB
2006/08/07 免费网络硬盘空间,可以上传999KB以内的文件,无需注册随便传。
地址:http://www.999kb.com/
--------------------------------------------------------------------------------
Mofile
2006/07/30 提供无限容量的视频空间供你上传视频和朋友们分享,单个视频文件限制1000M以内,并提供免费
64M永久网络硬盘空间,临时文件最大达到1G,快速稳定并支持断点续传。此免费网络硬盘的『演示』
地址:
http://passport.mofile.com/cn/register/step1.do?referuser=free8
--------------------------------------------------------------------------------
Orbitfiles
2006/07/16 为您提供免费1000M网络硬盘空间,不限流量,不限存储时间,web上传单个文件不能超过30M,如
果使用他们的专用上传软件不限制单个文件大小。
地址:
[url=http://www.orbitfiles.com/?a_aid=09268180http://www.orbitfiles.com/?a_aid=09268180[/url][color=#0000ff[/url]]
--------------------------------------------------------------------------------
G宝盘
2006/06/13 免费提供1G网络硬盘空间,上传单个文件不能超过10M,下载无限制。此免费硬盘的『演示』
地址:http://www.gbaopan.com/
--------------------------------------------------------------------------------
21disk
2006/06/09 为您提供64M免费网络硬盘空间,功能很强大,超过60天未登陆您的帐户将被删除。
地址:http://www.21disk.com/
--------------------------------------------------------------------------------
Streamload
2006/05/17 免费提供25G网络硬盘空间,但是每月只允许下载100M的文件,而且上传文件后需要排队等待才能
出现在你的帐户中。
地址:http://www.streamload.com/
--------------------------------------------------------------------------------
35MB
2006/03/21 免费提供35M网络硬盘空间,支持web、ftp方式上传管理文件,申请后会给你发确认码,登陆填写
确认码即可激活帐户。此免费硬盘的『演示』
地址:
http://www.35mb.com/
--------------------------------------------------------------------------------
Box.net
2006/03/04 提供免费1G网络硬盘空间,单个文件不能超过5M,上传较稳定,虽然不快但也不掉线。申请后需要
收信,点击链接激活你的帐户。此免费硬盘的『演示』
地址:
[url=http://www.box.net/signup/invitation/webmaster@free8.comhttp://www.box.net/signup/invitation/webmaster@free8.com[/url][color=#0000ff[/url]]
--------------------------------------------------------------------------------
vdisk
2006/01/12 提供100M免费网络硬盘空间,限制单个文件不超过20M,上传文件可以保存60天。(感谢24049提供
此信息)
地址:http://www.vdisk.cn/
--------------------------------------------------------------------------------
蕃薯藤
2005/12/09 为您提供6M网络硬盘空间,速度飞快,并支持上传zip文件自动解压缩,45天没有登陆将清空你的
免费硬盘。(感谢网络文盲提供此信息)
地址:http://webhd.yam.com/
--------------------------------------------------------------------------------
Xuite
2005/11/30 台湾中华电信HiNet旗下网站,免费提供网络相册、网络硬盘、blog日志以及
[url=mailto:yourname@xuite.net]yourname@xuite.net[/url]的邮
箱,总计300M空间,可自由调整分配空间大小。注册的时候,身份证号码选外籍人士且号码要在7-10位之间。
http://www.xuite.net/
地址:
--------------------------------------------------------------------------------
SoEasy
2005/10/21 提供32M免费网络硬盘空间,支持文件在线编辑、媒体文件播放、网络收藏等多种功能,可以通过
网站、客户端两种方式上传管理文件。
地址:http://www.soeasy.net.cn/
--------------------------------------------------------------------------------
网易网盘
2005/10/15 最新推出免费网络硬盘服务,容量64M-280M,申请比较麻烦,需要介绍朋友加入才行。(感谢e龙
星空提供此信息)
地址:http://wp.163.com/
--------------------------------------------------------------------------------
蜂盘
2005/09/13 免费提供100M网络硬盘空间,申请简单,功能也不少,只是需要下载软件来使用,稍显麻烦。(感
谢sunzhenyu提供此信息)
地址:http://www.1g.cn/
--------------------------------------------------------------------------------
FileFront
2005/08/21 为您提供无限空间的网络硬盘服务,单个文件最大可达1GB,不允许上传违法内容,并要求文件注
释详细,否则也会删除您的文件。此免费网络硬盘的『演示』(感谢Allan.Cylakes提供此信息)
地址:
[url=http://freespace.filefront.com/http://freespace.filefront.com/[/url][color=#0000ff[/url]]
--------------------------------------------------------------------------------
MEGAUPLOAD
2005/08/14 为您提供免费网络硬盘服务,限制单个文件不超过250M,很稳定,但下载的时候要等45秒才给出下
载链接,如果有1000人下载了你传的文件还会给你1美元报酬,每3个月还会派发一次奖励,不过这钱赚的可够
困难的,呵呵。此免费网络硬盘的『演示』(感谢Allan.Cylakes提供此信息)
地址:http://www.megaupload.com/
--------------------------------------------------------------------------------
POLOPO
2005/08/09 为您提供100M免费网络硬盘空间,管理比较方便,就是速度有点慢。此免费网络硬盘的『演示』(
感谢xzss提供此信息)
地址:http://www.polopo.com/
--------------------------------------------------------------------------------
永硕网络硬盘
2005/08/02 为您提供20M免费网络硬盘空间,单个文件限制3M,有不少功能,很实用的免费服务。此免费网络
硬盘的『演示』(感谢xzss提供此信息)
地址:http://www.ys168.com/
--------------------------------------------------------------------------------
Tom.com
2005/04/30 为您免费提供30M网络U盘、50M网络相册以及[url=mailto:yourname@tom.com]
yourname@tom.com[/url]的1.5G免费邮箱,支持pop3,smtp,最大
30M附件,专业24小时在线杀毒,垃圾邮件过滤。
地址:http://briefcase.tom.com/
--------------------------------------------------------------------------------
三五互联
2005/01/16 提供50M免费网络U盘,还有电子相册功能,单个文件最大可以支持20M,单个图片最大10M,功能很
多,感觉这个免费网络硬盘还不错。我的用户名是“free8”,可以把我添加为你的邻居,共享文件。
地址:http://ud.35.com/default.htm
--------------------------------------------------------------------------------
ecPocket
2004/06/30 免费提供200M网上存储空间,申请后会给你的邮箱发信,点击链接才能激活帐户,这个网站速度比
较慢。(感谢100FUN提供此信息)
地址:
http://www.ecpocket.com/
--------------------------------------------------------------------------------
千龙网
2004/01/29 提供10M免费网络硬盘空间以及[url=mailto:yourname@qianlong.com]
[email=yourname@qianlong.com[/url]yourname@qianlong.com[/url][color=#0000ff[/email]]的10M免费邮箱,支持pop3,smtp,wap,web方式收发邮
件。
地址:http://mail.qianlong.com/
--------------------------------------------------------------------------------
yahoo中国
2002/08/17 目前为数不多可正常使用的免费硬盘空间服务,提供30M空间,大家很熟悉了,就不多介绍了。
地址:http://cn.briefcase.yahoo.com/
2007/12/11 新开通的欧洲版,主站在英国,还有法国、西班牙、瑞典等分站,给你更多选择,我这里感觉比美
国主站速度快一些。同样是免费2G网络硬盘,注册后先要收信激活帐号,然后下载软件安装,打开软件就可上
传下载了,软件界面很酷,操作起来很简便,速度不快,但比较稳定。
地址:
http://www.kqzyfj.com/r779wktqks7ACCDBF9798CHFGGB
--------------------------------------------------------------------------------
Diino
2007/09/27 免费2G网络硬盘,注册后先要收信激活帐号,然后下载软件安装,开始稍微麻烦点。以后使用就简
单了,打开软件就可上传下载了,软件界面很酷,操作起来很简便,速度不快,但比较稳定。
地址:
http://www.kqzyfj.com/il122efolfn257786A42437CAB6A
--------------------------------------------------------------------------------
豆丁
2008/03/12 免费文档存储分享空间,可以上传.txt、.ppt、.xls、.doc、.pdf格式文件,单个文件限制100M以
内。上传速度挺不错的。上传的文档自动转为flash格式,可以嵌入到博客或网页中。上传的文档可以免费分享
也可以收费。
地址:
http://www.docin.com/
--------------------------------------------------------------------------------
中山电信
2008/03/10 1G免费网盘,中山电信提供,应该会比较有保障,试了一下,上传速度也不错。可以设置与好友共
享,并加密码。(感谢deepblue提供此信息)
地址http://u.zsnet.com/default.aspx
--------------------------------------------------------------------------------
DivShare
2008/02/25 国外的一家免费网盘,5G空间,单个文件200M以内,每月50G下载流量。主要支持图片、flash、视
频、音乐、文档、压缩等文件为主,.exe等文件不可上传。试了一下,速度还可以。可以选择公开或加密你所
上传的文件。此免费网盘的
地址:http://www.divshare.com/
--------------------------------------------------------------------------------
Fs2You
2008/02/06 目前比较不错的国内免费存储空间,无需注册直接上传,速度也不错,不限文件大小和存储空间。
如果你上传的文件没有人浏览下载,你的帐号就难保了,详细要求看网站中的“常见问题”。另外,重要文件
请自行做好备份,否则此网盘出现问题就会让你麻烦了。
地址:http://www.divshare.com/
--------------------------------------------------------------------------------
WikiUpload
2008/01/25 国外的免费临时存储网盘,无需注册即直接可上传文件,单个文件可达5G,速度也还可以。要求你
上传的文件每月都要有人访问,否则会被删除。(感谢deepblue提供此信息)
地址:http://www.wikiupload.com/
--------------------------------------------------------------------------------
Scribd
2008/01/14 免费在线文档分享服务,无限空间,页面简练大气,速度也还可以。可以上传Word、PPT、Execl、
PDF、TXT、Html、jpg、gif、png等文档图片文件,能够很好的支持中文文档。
地址:http://www.scribd.com/
--------------------------------------------------------------------------------
jooce
2008/01/14 来自法国的超酷免费在线桌面终于可以正常使用了!有简体中文版,但其中还参杂这一些英文。速
度还可以,功能还稍显单一,主要可以用免费网盘功能来保存你的文件,不过多大空间不详。
地址:http://www.jooce.com
--------------------------------------------------------------------------------
纳米盘
2008/01/09 新推出的免费网盘,单个文件限制200M以内,支持图片外链,我这里上传下载速度都不错(电信网
通线路可选)。可以下载纳米机器人来上传文件,更方便,而且支持4G超大文件上传。对于新的又如此巨大空
间且无广告的免费网盘,请保持谨慎态度,重要文件不要上传,且保持备份。(感谢deepblue提供此信息)
地址:http://www.namipan.com/
--------------------------------------------------------------------------------
FanBox
2007/12/31 Vista风格的免费Web桌面服务,注册很简单,可以上传图片、音乐、视频等内容与你的朋友分享,
总共2G存储空间。界面酷,再加上服务器在国外,速度肯定是比较慢了。
地址:http://www.fanbox.com/
--------------------------------------------------------------------------------
联想
2007/12/25 联想推出的5G免费网盘!随时随地收藏网址、记录文字、备份文档……,和好友分享。上传很方便
,可一次上传多个文件,有详细进度显示。所有内容不能完全公开,仅能和“我的圈子”或“二人世界”中的
好友分享。
地址:http://www.lenovodata.com/
--------------------------------------------------------------------------------
ADrive
2007/12/19 50G国外免费网络硬盘,最大单个文件可达2G,上传文件默认不共享,你可以选择将你上传的文件
共享给他人。flash上传界面,无需下载插件,可以一次上传多个文件。缺点是功能不多,速度偏慢。
地址:http://www.adrive.com/
--------------------------------------------------------------------------------
Adobe
2007/12/14 Adobe推出的1G免费网盘,很酷的flash界面。可以开放你上传的文件给网友下载,也可以保密文件
。
地址:http://share.adobe.com/
--------------------------------------------------------------------------------
who.hasfiles
2007/12/12 100M免费网盘,空间不大,最大特色是下载个小软件登陆后会在你的电脑上虚拟出这100M网盘,和
U盘一样,使用很方便,但速度有点慢。你的文件只能邀请朋友来共享,不能完全公开。
地址:http://who.hasfiles.com/
--------------------------------------------------------------------------------
Drop.io
2007/12/05 新推出的国外免费网盘,100M空间,直接上传文件无需注册,自定义访问密码或者完全公开,还可
以自定义访问者权限以及文件过期时间。虽然是国外的服务,我感觉上传下载速度都还可以。
地址:http://www.drop.io/
--------------------------------------------------------------------------------
Files upload
2007/11/22 国外免费网盘,无需注册即可匿名上传文件,仅能上传不超过100M的单个文件。如果注册为用户可
以上传最大单个文件300M,总共3G空间,文件保存30天。速度还可以,就是限制比较多。
地址:http://www.files-upload.com/
--------------------------------------------------------------------------------
in.solit.us
2007/11/07 国外的免费网盘,无限空间容量和流量,速度偏慢,功能较多。
地址:http://in.solit.us/
--------------------------------------------------------------------------------
YouSwap
2007/09/21 flash界面的国外免费网盘,可上传1G以内单个文件,不限流量和空间,我这里上传速度不错,竟
然比国内的多特网盘快很多。
地址:http://www.youswap.com/
--------------------------------------------------------------------------------
多特网盘
2007/09/21 免费网盘服务,单个文件128M以内,不限流量和空间大小。文件默认保存30天,如果文件下载量每
天超过10次以上,程序将会为你的文件自动延时。
地址:http://www.youswap.com/
--------------------------------------------------------------------------------
Seednet
2007/09/11 2000M免费网络硬盘,目前测试期间暂不限制单个文件大小以及上传下载流量,台湾网站,我这里
上传下载速度都很快。
地址:http://shareme.seed.net.tw/
--------------------------------------------------------------------------------
Live
2007/09/04 微软旗下Live.com推出免费网盘,500M空间,可以外链,单个文件限制50M之内。目前不对中文用
户开放,所以本站提供英文版链接,申请后再重新访问folders.live.com就能以中文版登录了。(感谢xnlong
提供此信息)
地址:
http://folders.live.com/home.aspx?mkt=en-US
--------------------------------------------------------------------------------
TOMOS
2007/08/30 国内的一家免费WebOS,有20M网络硬盘空间,没有国外的WebOS这么酷,空间也比较小,但速度还
不错,功能上还有待完善。
地址:
http://www.webtomos.com/index.jsp?rcmuserID=free8
--------------------------------------------------------------------------------
DepositFiles
2007/08/18 无需注册的免费文件上传空间,可上传单个300M以内的文件,速度一般,不过还比较稳定,但下载
文件要先看一段60秒的广告,比较夸张。
地址:
http://depositfiles.com/en/signup.php?ref=free8
--------------------------------------------------------------------------------
YouSendIt
2007/08/09 免费临时文件存储,如果你要发送大文件到朋友的邮箱可以试试这个,单个文件最大100M,1G流量
限制,可以保存7天,我这里上传下载速度都不错,还有outlook插件无需登录网站使用。
地址:http://www.yousendit.com/
--------------------------------------------------------------------------------
爱问
2007/08/07 免费文件空间,限单个文件不超过30M,需要注册用户,并且上传后需要审核,比较麻烦,好在速
度很快。
地址:
http://ishare.iask.sina.com.cn/upload/
--------------------------------------------------------------------------------
RapidShare
2007/07/17 Alexa排名18位的免费网络硬盘服务,现在网盘这么受欢迎啊!号称有110G带宽……,速度确实不
错。无需注册直接上传下载,单个文件100M。
地址:http://www.rapidshare.com/
--------------------------------------------------------------------------------
ohShare
2007/07/10 无需注册直接上传的免费网盘,单个文件80M,上传完成后会给你该文件下载链接。
--------------------------------------地址:http://www.ohshare.com/---------------------------------------
myGoya
2007/07/01 免费在线桌面,有512M文件存储空间以及诸多实用功能,很酷的flash界面,不过速度就比较慢了
。
地址:https://www.mygoya.de/us
--------------------------------------------------------------------------------
Mozy
2007/06/23 2G免费网络硬盘(介绍一个朋友注册你将额外获得256M空间!),注册完成后需要收信点最长那个
链接激活帐号,然后下载软件来使用,安装好会自动选择我的文档、收藏夹等内容,你也可以自己选择要备份
的文件或目录,并可随时备份和恢复电脑上的重要文件,很方便的。
地址:https://mozy.com/?ref=SWZ62B
--------------------------------------------------------------------------------
zUpload
2007/06/14 免费网盘,无须注册直接上传,单个文件可达500M,国外服务器,速度偏慢。
地址:http://www.zupload.com/
--------------------------------------------------------------------------------
AxiFile
2007/06/05 免费网盘,提供ftp帐号,单个文件最大可达150M,速度一般,下载的时候也要先看35秒广告。
地址:http://www.axifile.com/
--------------------------------------------------------------------------------
5upload
2007/05/24 无限网络硬盘空间,无须注册直接上传下载,限制单个文件不超过10M,支持jpg、jpeg、gif、png
、zip、rar、doc、torrent格式文件。
地址:http://www.5upload.net/
--------------------------------------------------------------------------------
myDataBus
2007/05/24 免费5G网络硬盘空间,每天限制1G公开下载流量,虽然服务器在国外,但我这里上传速度不错。申
请表格提交后会有一些调查广告,都点“pass”跳过即可,然后收信点链接激活帐号就能用了。
地址:http://www.mydatabus.com/
--------------------------------------------------------------------------------
dotWORLDS
2007/05/12 提供个性域名、邮箱、空间服务,但感觉不太实用。不过还有500M免费网盘可以用,注册后需要审
核才能使用。(感谢xnlong提供此信息)
---------------------------地址:http://www.dotworlds.net/---------------------------
--------------------------
GOGOBOX
2007/05/05 免费100G网络硬盘空间!服务器在台湾,速度尚可,但感觉不够稳定。使用需要下载插件,操作也
比较麻烦,用着不太舒服。此免费网络硬盘的『演示』(感谢自由天空提供此信息)
地址:http://www.gogobox.com.tw/
--------------------------------------------------------------------------------
迈客盒子
2007/04/17 无限空间免费网络硬盘,限单个文件不超过10M、每天上传5个文件,可用赚取的金币免费升级限制
数量。(感谢子夜月相思提供此信息)
地址:
[url=http://www.mikebox.com/register.php?id=78039http://www.mikebox.com/register.php?id=78039[/url][color=#0000ff[/url]]
--------------------------------------------------------------------------------
Desktoptwo
2007/04/04 一个操作系统桌面形式的界面,很酷,集成了1G免费网络硬盘空间、免费电邮等免费服务,就是速
度比较慢。
地址:
http://www.desktoptwo.com/
--------------------------------------------------------------------------------
GigaSize
2007/04/04 免费网络硬盘空间,不注册的话可以上传总共2G大小的10个文件,注册成为会员可以上传无限个单
个不超过1.5G的文件,文件最多可以保留90天。上传速度还不错,但下载需要输入验证码并等待30秒,不过会
有积分赠送,累积到一定积分可以升级为高级账户。
地址:http://www.gigasize.com/
--------------------------------------------------------------------------------
Nakido
2007/03/25 无限空间的免费网络硬盘服务,上传文件大小也没有限制,国外的网站,我这里访问速度很慢,但
界面都是中文的。此免费网络硬盘的『演示』
地址:http://www.nakido.com/
--------------------------------------------------------------------------------
MailBigFile
2007/03/04 免费在线向邮箱发送大型文件,如果你的邮箱不支持大的附件可以试试这个,最大单个文件512M。
其实它也只是提供免费网络硬盘,只会发链接给对方,让其来MailBigFile下载,文件最多保留5天。
地址:
[url=http://www.mailbigfile.com/index.php?language=zh_CN.utf8http://www.mailbigfile.com/index.php?language=zh_CN.utf8[/url][color=#0000ff[/url]]
--------------------------------------------------------------------------------
海盘
2007/02/06 福州电信提供10M免费网络硬盘,功能也还可以,电信用户访问速度应该会不错。
地址:http://www.haipan.com/
--------------------------------------------------------------------------------
Xdrive
2007/02/01 AOL旗下的免费网络硬盘,有5G空间,需要先注册为AOL会员,还会给你个
[url=mailto:yourname@aol.com]yourname@aol.com[/url]的免费邮
箱。
地址:http://www.xdrive.com/
--------------------------------------------------------------------------------
eSnips
2006/11/11 免费5G网络硬盘,申请后需要收信点确认链接,否则7天后暂停帐户。最大可以上传10M单个文件,
如果下载工具条可以上传更大的文件。另外,可以用email方式上传文件,比较有特色。此免费网络硬盘的『演
示』
地址:http://www.esnips.com/
--------------------------------------------------------------------------------
DriveHQ
2006/11/08 既是免费网络硬盘又可以做免费空间,1G储存容量,每月200M下载流量限制,支持ftp上传管理文
件,功能也比较多,无广告。注意:网页不要采用gb2312编码,使用utf-8才不乱码。此免费网盘空间的『演示
』
地址:
[url=http://www.drivehq.com/secure/signup.aspx?refID=1058716http://www.drivehq.com/secure/signup.aspx?refID=1058716[/url][color=#0000ff[/url]]
--------------------------------------------------------------------------------
PC2N
2006/10/03 免费2G网盘,单个文件最大5M,windowsXP风格,很有特色,而且申请简单,速度也还可以。(感
谢XnLonG提供此信息)
地址:
[url=http://www.pc2n.com/index/invite.jsp?id=378026http://www.pc2n.com/index/invite.jsp?id=378026[/url][color=#0000ff[/url]]
--------------------------------------------------------------------------------
FileDen
2006/10/19 免费500M网络硬盘空间,每月5G流量限制,可以外部调用上传的文件。如果不注册为会员仅可以上
传图片,并限制单个文件不超过10M。
地址:http://www.fileden.com/
--------------------------------------------------------------------------------
Live-Share
2006/09/13 免费网络硬盘,无需注册直接上传,最大单个文件300M。注册为用户可以上传最大500M的单个文件
。无下载限制,但速度较慢。(感谢小徐提供此信息)
地址:http://www.live-share.com/
--------------------------------------------------------------------------------
Network Disk
2006/09/06 免费网络硬盘空间,无需注册,上传简单,单个文件最大不能超过100M。他还可以帮你从别的网站
下载文件,只要有url就行,很方便哦
地址:http://www.networkdisk.co.uk/
--------------------------------------------------------------------------------
999KB
2006/08/07 免费网络硬盘空间,可以上传999KB以内的文件,无需注册随便传。
地址:http://www.999kb.com/
--------------------------------------------------------------------------------
Mofile
2006/07/30 提供无限容量的视频空间供你上传视频和朋友们分享,单个视频文件限制1000M以内,并提供免费
64M永久网络硬盘空间,临时文件最大达到1G,快速稳定并支持断点续传。此免费网络硬盘的『演示』
地址:
http://passport.mofile.com/cn/register/step1.do?referuser=free8
--------------------------------------------------------------------------------
Orbitfiles
2006/07/16 为您提供免费1000M网络硬盘空间,不限流量,不限存储时间,web上传单个文件不能超过30M,如
果使用他们的专用上传软件不限制单个文件大小。
地址:
[url=http://www.orbitfiles.com/?a_aid=09268180http://www.orbitfiles.com/?a_aid=09268180[/url][color=#0000ff[/url]]
--------------------------------------------------------------------------------
G宝盘
2006/06/13 免费提供1G网络硬盘空间,上传单个文件不能超过10M,下载无限制。此免费硬盘的『演示』
地址:http://www.gbaopan.com/
--------------------------------------------------------------------------------
21disk
2006/06/09 为您提供64M免费网络硬盘空间,功能很强大,超过60天未登陆您的帐户将被删除。
地址:http://www.21disk.com/
--------------------------------------------------------------------------------
Streamload
2006/05/17 免费提供25G网络硬盘空间,但是每月只允许下载100M的文件,而且上传文件后需要排队等待才能
出现在你的帐户中。
地址:http://www.streamload.com/
--------------------------------------------------------------------------------
35MB
2006/03/21 免费提供35M网络硬盘空间,支持web、ftp方式上传管理文件,申请后会给你发确认码,登陆填写
确认码即可激活帐户。此免费硬盘的『演示』
地址:
http://www.35mb.com/
--------------------------------------------------------------------------------
Box.net
2006/03/04 提供免费1G网络硬盘空间,单个文件不能超过5M,上传较稳定,虽然不快但也不掉线。申请后需要
收信,点击链接激活你的帐户。此免费硬盘的『演示』
地址:
[url=http://www.box.net/signup/invitation/webmaster@free8.comhttp://www.box.net/signup/invitation/webmaster@free8.com[/url][color=#0000ff[/url]]
--------------------------------------------------------------------------------
vdisk
2006/01/12 提供100M免费网络硬盘空间,限制单个文件不超过20M,上传文件可以保存60天。(感谢24049提供
此信息)
地址:http://www.vdisk.cn/
--------------------------------------------------------------------------------
蕃薯藤
2005/12/09 为您提供6M网络硬盘空间,速度飞快,并支持上传zip文件自动解压缩,45天没有登陆将清空你的
免费硬盘。(感谢网络文盲提供此信息)
地址:http://webhd.yam.com/
--------------------------------------------------------------------------------
Xuite
2005/11/30 台湾中华电信HiNet旗下网站,免费提供网络相册、网络硬盘、blog日志以及
[url=mailto:yourname@xuite.net]yourname@xuite.net[/url]的邮
箱,总计300M空间,可自由调整分配空间大小。注册的时候,身份证号码选外籍人士且号码要在7-10位之间。
http://www.xuite.net/
地址:
--------------------------------------------------------------------------------
SoEasy
2005/10/21 提供32M免费网络硬盘空间,支持文件在线编辑、媒体文件播放、网络收藏等多种功能,可以通过
网站、客户端两种方式上传管理文件。
地址:http://www.soeasy.net.cn/
--------------------------------------------------------------------------------
网易网盘
2005/10/15 最新推出免费网络硬盘服务,容量64M-280M,申请比较麻烦,需要介绍朋友加入才行。(感谢e龙
星空提供此信息)
地址:http://wp.163.com/
--------------------------------------------------------------------------------
蜂盘
2005/09/13 免费提供100M网络硬盘空间,申请简单,功能也不少,只是需要下载软件来使用,稍显麻烦。(感
谢sunzhenyu提供此信息)
地址:http://www.1g.cn/
--------------------------------------------------------------------------------
FileFront
2005/08/21 为您提供无限空间的网络硬盘服务,单个文件最大可达1GB,不允许上传违法内容,并要求文件注
释详细,否则也会删除您的文件。此免费网络硬盘的『演示』(感谢Allan.Cylakes提供此信息)
地址:
[url=http://freespace.filefront.com/http://freespace.filefront.com/[/url][color=#0000ff[/url]]
--------------------------------------------------------------------------------
MEGAUPLOAD
2005/08/14 为您提供免费网络硬盘服务,限制单个文件不超过250M,很稳定,但下载的时候要等45秒才给出下
载链接,如果有1000人下载了你传的文件还会给你1美元报酬,每3个月还会派发一次奖励,不过这钱赚的可够
困难的,呵呵。此免费网络硬盘的『演示』(感谢Allan.Cylakes提供此信息)
地址:http://www.megaupload.com/
--------------------------------------------------------------------------------
POLOPO
2005/08/09 为您提供100M免费网络硬盘空间,管理比较方便,就是速度有点慢。此免费网络硬盘的『演示』(
感谢xzss提供此信息)
地址:http://www.polopo.com/
--------------------------------------------------------------------------------
永硕网络硬盘
2005/08/02 为您提供20M免费网络硬盘空间,单个文件限制3M,有不少功能,很实用的免费服务。此免费网络
硬盘的『演示』(感谢xzss提供此信息)
地址:http://www.ys168.com/
--------------------------------------------------------------------------------
Tom.com
2005/04/30 为您免费提供30M网络U盘、50M网络相册以及[url=mailto:yourname@tom.com]
yourname@tom.com[/url]的1.5G免费邮箱,支持pop3,smtp,最大
30M附件,专业24小时在线杀毒,垃圾邮件过滤。
地址:http://briefcase.tom.com/
--------------------------------------------------------------------------------
三五互联
2005/01/16 提供50M免费网络U盘,还有电子相册功能,单个文件最大可以支持20M,单个图片最大10M,功能很
多,感觉这个免费网络硬盘还不错。我的用户名是“free8”,可以把我添加为你的邻居,共享文件。
地址:http://ud.35.com/default.htm
--------------------------------------------------------------------------------
ecPocket
2004/06/30 免费提供200M网上存储空间,申请后会给你的邮箱发信,点击链接才能激活帐户,这个网站速度比
较慢。(感谢100FUN提供此信息)
地址:
http://www.ecpocket.com/
--------------------------------------------------------------------------------
千龙网
2004/01/29 提供10M免费网络硬盘空间以及[url=mailto:yourname@qianlong.com]
[email=yourname@qianlong.com[/url]yourname@qianlong.com[/url][color=#0000ff[/email]]的10M免费邮箱,支持pop3,smtp,wap,web方式收发邮
件。
地址:http://mail.qianlong.com/
--------------------------------------------------------------------------------
yahoo中国
2002/08/17 目前为数不多可正常使用的免费硬盘空间服务,提供30M空间,大家很熟悉了,就不多介绍了。
地址:http://cn.briefcase.yahoo.com/
订阅:
评论 (Atom)
