??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲视频人成在线播放,久久久久亚洲av无码专区导航,亚洲男人的天堂一区二区http://m.tkk7.com/shichengjun1984/category/21570.html希望我的q个博客能给那些惛_java的vz中拼搏的h有所帮助。谢谢光_zh-cnFri, 11 Apr 2008 05:03:58 GMTFri, 11 Apr 2008 05:03:58 GMT60Oracle 10G 中的"回收?http://m.tkk7.com/shichengjun1984/articles/192113.htmlI LOVE JAVAI LOVE JAVAFri, 11 Apr 2008 03:16:00 GMThttp://m.tkk7.com/shichengjun1984/articles/192113.htmlhttp://m.tkk7.com/shichengjun1984/comments/192113.htmlhttp://m.tkk7.com/shichengjun1984/articles/192113.html#Feedback0http://m.tkk7.com/shichengjun1984/comments/commentRss/192113.htmlhttp://m.tkk7.com/shichengjun1984/services/trackbacks/192113.html 

作者:Fenng

日期Q?1-Jan-2004  

出处Q?a >http://www.dbanotes.net

版本Q?.0 $29-Oct-2004$

在Oracle 10g数据库中Q引入了一个回收站(Recycle Bin)的数据库对象?

回收站,从原理上来说是一个数据字典表Q放|用户Drop掉的数据库对象信息。用戯行Drop操作的对象ƈ没有被数据库删除Q仍然会占用I间。除非是׃用户手工q行Purge或者因为存储空间不够而被数据库清掉。数据库有了q样的功能,能够减少很多不必要的ȝ。常常看到开发h员误把表删除Q急急忙忙找DBA 来想办法的情c相信随着10G的大范围应用Q这U情形应该比较少见了Q我们可以充分利?0g的闪?FLASHBACK,闪回Q回?)功能来避免大量的人工误操作?/p>

DBA理上的相关信息可以从USER_recyclebin(DBA_recyclebin)中获取?

Z便于试,我们创徏了一个表I间Foo,大小?M,创徏了一个用户Foo,默认的表I间为Foo.

SQL> CONNECT foo/foo;
Connected.
SQL> SELECT table_name FROM user_tables;
no rows selected
SQL>
SQL> DESC user_recyclebin
Name Null? Type
----------------------------------------- -------- -------------------
OBJECT_NAME NOT NULL VARCHAR2(30)
ORIGINAL_NAME VARCHAR2(32)
OPERATION VARCHAR2(9)
TYPE VARCHAR2(25)
TS_NAME VARCHAR2(30)
CREATETIME VARCHAR2(19)
DROPTIME VARCHAR2(19)
DROPSCN NUMBER
PARTITION_NAME VARCHAR2(32)
CAN_UNDROP VARCHAR2(3)
CAN_PURGE VARCHAR2(3)
RELATED NOT NULL NUMBER
BASE_OBJECT NOT NULL NUMBER
PURGE_OBJECT NOT NULL NUMBER
SPACE NUMBER
SQL>

user_recyclebin大多是自解释?相对比较Ҏ理解.

SQL> SELECT object_name FROM user_recyclebin;
no rows selected
SQL>
SQL> SELECT object_name FROM user_recyclebin;
no rows selected
SQL> CREATE TABLE foo AS SELECT * FROM DUAL;
Table created.
SQL> SELECT table_name FROM user_tables;
TABLE_NAME
----------------------------------------------
FOO
SQL> DROP TABLE foo;
Table dropped.
SQL> SELECT table_name FROM user_tables;
no rows selected
SQL> SHOW recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO BIN$V3f/oYUITrCEF2cotS5JaA==$0 TABLE 2004-10-30:14:37:39
SQL>

SQL*Plus命oSHOW recyclebin{h于这条SQL:

SQL> SELECT original_name, object_name, TYPE, droptime FROM user_recyclebin;
ORIGINAL_NAME OBJECT_NAME TYPE DROPTIME
--------------- ------------------------------ ---------- --------------------
FOO BIN$V3f/oYUITrCEF2cotS5JaA==$0 TABLE 2004-10-30:14:37:39
SQL>
SQL> DESC "BIN$V3f/oYUITrCEF2cotS5JaA==$0"
Name Null? Type
----------------------------------------- -------- ----------------
DUMMY VARCHAR2(1)
SQL>

当一个表被删除ƈUd?回收?中,它的名字要进行一些{换。这L目的显而易见是Z避免同类对象名称的重复?q一点和Windows操作pȝ的回收站不同QWindows中的回收站经q了Ҏ的处理,操作pȝ文g可以重名?

转换后的名字格式如下:

BIN$unique_id$version

  • 其中BIN代表RecycleBin
  • unique_id是数据库中该对象的唯一标志Q?6个字W长?
  • version表示该对象的版本?/span>

注:?0g beta 版本中,名字格式如下Q?

RB$$objn$object_type$version

其中的RB,代表Recycle Bin. objn的目录对象号. object_type表示对象cd. version表示版本? 由数据库指定?/p>

下面我们验证一下回收站里数据库对象名字的唯一?

SQL> CREATE TABLE foo AS SELECT * FROM DUAL;
Table created.
SQL> SELECT table_name FROM user_tables;
TABLE_NAME
------------------------------------------------------------
FOO
SQL> DROP TABLE foo;
Table dropped.
SQL> SHOW recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO BIN$VL+ZsqVlQF6R2nYnwAqtvw==$0 TABLE 2004-10-30:15:01:42
FOO BIN$V3f/oYUITrCEF2cotS5JaA==$0 TABLE 2004-10-30:14:37:39
SQL>

能看出来Q虽然源表名字相同,在回收站里的对象名字是不同的?

针对Recycle Bin对象的操?/p>

已经攑ֈ回收站里的表是不能用drop 命o删除?注意对象名字上的双引?Q?

SQL> DROP table "BIN$V3f/oYUITrCEF2cotS5JaA==$0"
2 /
DROP table "BIN$V3f/oYUITrCEF2cotS5JaA==$0"
*
ERROR at line 1:
ORA-38301: can not perform DDL/DML over objects in Recycle Bin
SQL>

如果要清掉该对象,使用purge命oQ?

SQL> PURGE table "BIN$V3f/oYUITrCEF2cotS5JaA==$0"
2 /
Table purged.
SQL> SELECT object_name, original_name FROM user_recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ ---------------
BIN$VL+ZsqVlQF6R2nYnwAqtvw==$0 FOO
SQL>

对象已经清掉。如果直接清I所有的Recycle Bin中的对象Q?

SQL> PURGE RECYCLEBIN;
Recyclebin purged.
SQL> SELECT object_name, original_name FROM user_recyclebin;
no rows selected
SQL>

恢复表,用回闪表的功能:

SQL> FLASHBACK TABLE foo TO BEFORE DROP;
Flashback complete.
SQL>SELECT table_name FROM user_tables;
TABLE_NAME
------------------------------------------------------------
FOO
SQL>

??0g Beta版本中,使用Undrop命o来做到这一?

有的时候,可能同一个名字的表被删除到回收站?

SQL> DROP TABLE FOO;
Table dropped.
SQL> SHOW RECYCLEBIN
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO BIN$lfTbzOjISXaw8u0BIO7pNA==$0 TABLE 2004-10-30:15:18:03
SQL> CREATE TABLE foo AS SELECT * FROM DUAL;
Table created.
SQL> DROP TABLE foo;
Table dropped.
SQL> SHOW RECYCLEBIN
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO BIN$J63QaUaKTmC1glat+imjeg==$0 TABLE 2004-10-30:15:18:50
FOO BIN$lfTbzOjISXaw8u0BIO7pNA==$0 TABLE 2004-10-30:15:18:03
SQL> FLASHBACK TABLE FOO TO BEFORE DROP;
Flashback complete.
SQL> SHOW RECYCLEBIN
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO BIN$lfTbzOjISXaw8u0BIO7pNA==$0 TABLE 2004-10-30:15:18:03
SQL>

默认的恢复是W一个被删除的FOO表。如果要恢复指定的表Q可以在FLASHBACK TABLE 后面加上指定的RECYCLEBIN 参数指定其他的名?

SQL> FLASHBACK TABLE "BIN$lfTbzOjISXaw8u0BIO7pNA==$0" TO BEFORE DROP;
FLASHBACK TABLE "BIN$lfTbzOjISXaw8u0BIO7pNA==$0" TO BEFORE DROP
*
ERROR at line 1:
ORA-38312: original name is used by an existing object
SQL> FLASHBACK TABLE "BIN$lfTbzOjISXaw8u0BIO7pNA==$0" TO BEFORE DROP
2 RENAME TO foo2;
Flashback complete.
SQL>



I LOVE JAVA 2008-04-11 11:16 发表评论
]]>
Oracle 执行定时备䆾http://m.tkk7.com/shichengjun1984/articles/191190.htmlI LOVE JAVAI LOVE JAVAMon, 07 Apr 2008 02:45:00 GMThttp://m.tkk7.com/shichengjun1984/articles/191190.htmlhttp://m.tkk7.com/shichengjun1984/comments/191190.htmlhttp://m.tkk7.com/shichengjun1984/articles/191190.html#Feedback0http://m.tkk7.com/shichengjun1984/comments/commentRss/191190.htmlhttp://m.tkk7.com/shichengjun1984/services/trackbacks/191190.html 1、徏立批处理文gbackup.bat\.
exp system/manager file=d:\backup\oracle\oracle%date:~0,10%.dmp owner=system log=d:\backup\oracle\oracle%date:~0,10%.log
生成oracle2006-01-09.dmp文g
exp system/manager file=d:\backup\oracle\oracle%date:~11,3%.dmp owner=system log=d:\backup\oracle\oracle%date:~11,3%.log
生成oracle星期一.dmp文gQ则每周循环保留一个备份文Ӟ?个备份文件@?br /> 2、添加一个Q务计?br /> 利用d计划向导Q根据备份策略设|自动执行Q务的旉频率Q例如每天零ӞQ执行d:\oracle\backup.bat
3、以后每天将在目录中生成形如“oracle2005-08-31.dmp和oracle2005-08-31.log”的备份和日志文g?br /> 说明Q?br /> 1?date%的值在不同的系l、语a版本下可能是不一LQ控刉杉K面区域选项的设定也会改?date%的倹{请先在命o行中试 echo %date% 的返回倹{?date:~4,10% 是返回日期函敎ͼ~后的W一个参数是要截取的起始位置Q从0开始)Q第二个参数是要截取的长度,如没有则是截取到最后,参数可酌情修攏V?br /> 2、如需要准的旉做ؓ文g名,L%time%函数Q参数同上?br />
 http://tb.blog.csdn.net/TrackBack.aspx?PostId=1442858

I LOVE JAVA 2008-04-07 10:45 发表评论
]]>
36.oracle常用命ohttp://m.tkk7.com/shichengjun1984/articles/146226.htmlI LOVE JAVAI LOVE JAVATue, 18 Sep 2007 10:26:00 GMThttp://m.tkk7.com/shichengjun1984/articles/146226.htmlhttp://m.tkk7.com/shichengjun1984/comments/146226.htmlhttp://m.tkk7.com/shichengjun1984/articles/146226.html#Feedback0http://m.tkk7.com/shichengjun1984/comments/commentRss/146226.htmlhttp://m.tkk7.com/shichengjun1984/services/trackbacks/146226.html1.登陆pȝ用户
sqlplus 然后输入pȝ用户名和密码
登陆别的用户
conn 用户?密码;
2.创徏表空?br /> create tablespace I间?br /> datafile 'c:\I间? size 15M  --表空间的存放路径,初始gؓ15M
autoExtend on next 10M  --I间的自动增长的值是10M
permanent online;  --怹使用
3.创徏用户
create user shi   --创徏用户名ؓshi
identified by scj  --创徏密码为scj
default tablespace 表空间名 --默认表空间名
temporary tablespace temp --临时表空间ؓtemp
profile default   --受profile文g的限?br /> quota unlimited on 表空间名; --在表I间下面不受限制
4.创徏角色
create role 角色?identified by 密码;
5.l角色授?br /> grant create session to 角色名;--l角色授予创Z话的权限
grant 角色?to 用户名; --把角色授予用?br /> 6.l用h予权?br /> grant create session,resource to shi;--lshi用户授予所有权?br /> grant create table to shi; --lshi用户授予创徏表的权限
7.select table_name from user_tables;   察看当前用户下的所有表
8.select tablespace_name from user_tablespaces; 察看当前用户下的 表空?br /> 9.select username from dba_users;察看所有用户名U命?必须用sys as sysdba登陆
10.创徏?br /> create table 表名
(
id int not null,
name varchar2(20) not null
)tablespace 表空间名  --所属的表空?br /> storage
(
   initial 64K   --表的初始?br />    minextents 1   --最扩展?br />    maxextents unlimited  --最大扩展?br /> );
11.--为usrs表添加主键和索引
alter table users
add constraint pk primary key (ID);
12.为已l创建users表添加外?br /> alter table users
  add constraint fk_roleid foreign key (roleid)
  references role(role_id) on delete cascad; --下边写主表的?br />    on delete cascad是创建?br /> 13.把两个列q接h
select concat(name,id) from 表名Q?nbsp; --把name和idq接h
14.截取字符?br /> select column(name,'?) from 表名Q?nbsp; --把name中的‘?#8217;L
15.q行事务之前必须?br /> set serveroutput on;  --打开输入输出Q不写的?打印不出信息Q?br /> 16.while的应?br /> declare   --声明部分
ccc number:=1;  --复职
a number:=0;
begin   --事务的开?br /> while ccc<=100 loop --循环
if((ccc mod 3)=0) then --条g
 dbms_output.put_line(ccc||',');    --打印昄
 a:=a+ccc;
end if;   --l束if
ccc:=ccc+1;
end loop;  --l束循环
dbms_output.put_line(a); 
end;   --l束事务
/   
17.select into  的用?nbsp;--只能处理一行结果集
declare
  name varchar(30);
begin
 select username into name
 from users
 where id=2;
dbms_output.put_line('姓名为:'||name);
end;
/
18.利用%rowtype属性可以在q行时方便的声明记录变量和其他结?br /> Set serveroutput on;
Declare
   utype users%rowtype;
Begin
Select * into utype from users where id=20;
Dbms_output.put_line('姓名'|| utype.username);
Dbms_output.put_line('生日'|| utype.brithday);
end;
/   --%rowtype惛_于复制一个表
19.游标的定义和使用
Declare
Cursor ucur is select * from users; --声明游标
Us users%rowtype;--定义与游标想匚w的变?br /> Begin
Open ucur;--打开游标
Fetch ucur into us;
While ucur %found loop --使用循环遍历游标的查询结?br /> Dbms_output.put_line('姓名Q?||us.username||'生日'||us.brithday);
Fetch ucur into us;
End loop;
Close ucur; --关闭游标
End;
20.插入值时Qsql语句里取得系l的当前旉?sysdate

=======================================
%found在前一条的fetch语句臛_对应数据库的一行时Q?found属性gؓtrueQ否则ؓfalse;
% notfound 在前一条fetch语句没有对应的数据库行时Q?notfound属性gؓtrueQ否则ؓfalse;
%isopen 在游标打开?isopen属性gؓtrueQ否则ؓfalse;
%rowcount昄q今为止从显C游标中取出的行?/p>

20.
删除
drop tablespace I间?including contents; --删除表空间和里面的内?br /> drop table 表名   --删除?br /> drop user 用户?nbsp; --删除用户

 



I LOVE JAVA 2007-09-18 18:26 发表评论
]]>
8.数据库菜鸟不可不?单SQL语句结http://m.tkk7.com/shichengjun1984/articles/119701.htmlI LOVE JAVAI LOVE JAVAThu, 24 May 2007 05:22:00 GMThttp://m.tkk7.com/shichengjun1984/articles/119701.htmlhttp://m.tkk7.com/shichengjun1984/comments/119701.htmlhttp://m.tkk7.com/shichengjun1984/articles/119701.html#Feedback0http://m.tkk7.com/shichengjun1984/comments/commentRss/119701.htmlhttp://m.tkk7.com/shichengjun1984/services/trackbacks/119701.html  b.直接表示Qselect name '姓名' from students order by age

  2._查找:

  a.用in限定范围Qselect * from students where native in ('湖南', '四川')

  b.between...andQselect * from students where age between 20 and 30

  c.“=”Qselect * from students where name = '李山'

  d.like:select * from students where name like '?' (注意查询条g中有“%”Q则说明是部分匹配,而且q有先后信息在里面,x找以“?#8221;开头的匚wV所以若查询?#8220;?#8221;的所有对象,应该命oQ?%?';若是W二个字为李Q则应ؓ'_?'?_??_李_'?

  e.[]匚w查符Qselect * from courses where cno like '[AC]%' (表示或的关系Q与"in(...)"cMQ而且"[]"可以表示范围Q如Qselect * from courses where cno like '[A-C]%')

  3.对于旉cd变量的处?/p>

  a.smalldatetimeQ直接按照字W串处理的方式进行处理,例如Q?br>select * from students where birth > = '1980-1-1' and birth <= '1980-12-31'

  4.集函?/p>

  a.count()求和Q如Qselect count(*) from students (求学生Mh?

  b.avg(?求^均,如:select avg(mark) from grades where cno=’B2’

  c.max(?和min(?Q求最大与最?/p>

  5.分组group

  常用于统计时Q如分组查LQ?br>select gender,count(sno)
from students
group by gender
(查看男女学生各有多少)

  注意Q从哪种角度分组׃哪列"group by"

  对于多重分组Q只需分l规则罗列。比如查询各届各专业的男奛_学h?Q那么分l规则有Q届?grade)、专?mno)和性别(gender)Q所以有"group by grade, mno, gender"

select grade, mno, gender, count(*)
from students
group by grade, mno, gender

  通常groupq和having联用Q比如查?门课以上不及格的学生Q则按学?sno)分类有:

select sno,count(*) from grades
where mark<60
group by sno
having count(*)>1

  6.UNION联合

  合ƈ查询l果Q如Q?/p>

SELECT * FROM students
WHERE name like ‘?’
UNION [ALL]
SELECT * FROM students
WHERE name like ‘?’

  7.多表查询

  a.内连?/p>

select g.sno,s.name,c.coursename
from grades g JOIN students s ON g.sno=s.sno
JOIN courses c ON g.cno=c.cno
(注意可以引用别名)
b.外连?br>b1.左连?br>select courses.cno,max(coursename),count(sno)
from courses LEFT JOIN grades ON courses.cno=grades.cno
group by courses.cno

  左连接特点:昄全部左边表中的所有项目,即其中有些中的数据未填写完全?/p>

  左外q接q回那些存在于左表而右表中却没有的行,再加上内q接的行?/p>

  b2.双?/p>

  与左q接cM

  b3.全连?/p>

select sno,name,major
from students FULL JOIN majors ON students.mno=majors.mno

  两边表中的内容全部显C?/p>

  c.自nq接

select c1.cno,c1.coursename,c1.pno,c2.coursename
from courses c1,courses c2 where c1.pno=c2.cno

  采用别名解决问题?/p>

  d.交叉q接

select lastname+firstname from lastname CROSS JOIN firstanme

  相当于做W卡儿积

  8.嵌套查询

  a.用关键字IN,如查询李q同乡Q?/p>

select * from students
where native in (select native from students where name=’ 李山’)

  b.使用关键字EXIST,比如Q下面两句是{h的:

select * from students
where sno in (select sno from grades where cno=’B2’)

select * from students where exists
(select * from grades where
grades.sno=students.sno AND cno=’B2’)

  9.关于排序order

  a.对于排序orderQ有两种ҎQasc升序和desc降序

  b.对于排序order,可以按照查询条g中的某项排列Q而且q项可用数字表示Q如Q?/p>

select sno,count(*) ,avg(mark) from grades
group by sno
having avg(mark)>85
order by 3

  10.其他

  a.对于有空格的识别名称Q应该用"[]"括住?/p>

  b.对于某列中没有数据的特定查询可以用null判断Q如select sno,courseno from grades where mark IS NULL

  c.注意区分在嵌套查询中使用的any与all的区别,any相当于逻辑q算“||”而all则相当于逻辑q算“&&”

  d.注意在做否定意义的查询是心q入陷阱Q?/p>

  如,没有选修‘B2’评的学?Q?/p>

select students.*
from students, grades
where students.sno=grades.sno
AND grades.cno <> ’B2’

  上面的查询方式是错误的,正确方式见下方:

select * from students
where not exists (select * from grades
where grades.sno=students.sno AND cno='B2')

  11.关于有难度多重嵌套查询的解决思想Q?/p>

  如,选修了全部课E的学生Q?/p>

select *
from students
where not exists ( select *
from courses
where NOT EXISTS
(select *
from grades
where sno=students.sno
AND cno=courses.cno))

  最外一重:从学生表中选,排除那些有课没选的。用not exist。由于讨论对象是评Q所以第二重查询从course表中找,排除那些选了评卛_?br>



I LOVE JAVA 2007-05-24 13:22 发表评论
]]>
8.数据库菜鸟不可不?单SQL语句结http://m.tkk7.com/shichengjun1984/articles/119702.htmlI LOVE JAVAI LOVE JAVAThu, 24 May 2007 05:22:00 GMThttp://m.tkk7.com/shichengjun1984/articles/119702.htmlhttp://m.tkk7.com/shichengjun1984/comments/119702.htmlhttp://m.tkk7.com/shichengjun1984/articles/119702.html#Feedback0http://m.tkk7.com/shichengjun1984/comments/commentRss/119702.htmlhttp://m.tkk7.com/shichengjun1984/services/trackbacks/119702.html  b.直接表示Qselect name '姓名' from students order by age

  2._查找:

  a.用in限定范围Qselect * from students where native in ('湖南', '四川')

  b.between...andQselect * from students where age between 20 and 30

  c.“=”Qselect * from students where name = '李山'

  d.like:select * from students where name like '?' (注意查询条g中有“%”Q则说明是部分匹配,而且q有先后信息在里面,x找以“?#8221;开头的匚wV所以若查询?#8220;?#8221;的所有对象,应该命oQ?%?';若是W二个字为李Q则应ؓ'_?'?_??_李_'?

  e.[]匚w查符Qselect * from courses where cno like '[AC]%' (表示或的关系Q与"in(...)"cMQ而且"[]"可以表示范围Q如Qselect * from courses where cno like '[A-C]%')

  3.对于旉cd变量的处?/p>

  a.smalldatetimeQ直接按照字W串处理的方式进行处理,例如Q?br>select * from students where birth > = '1980-1-1' and birth <= '1980-12-31'

  4.集函?/p>

  a.count()求和Q如Qselect count(*) from students (求学生Mh?

  b.avg(?求^均,如:select avg(mark) from grades where cno=’B2’

  c.max(?和min(?Q求最大与最?/p>

  5.分组group

  常用于统计时Q如分组查LQ?br>select gender,count(sno)
from students
group by gender
(查看男女学生各有多少)

  注意Q从哪种角度分组׃哪列"group by"

  对于多重分组Q只需分l规则罗列。比如查询各届各专业的男奛_学h?Q那么分l规则有Q届?grade)、专?mno)和性别(gender)Q所以有"group by grade, mno, gender"

select grade, mno, gender, count(*)
from students
group by grade, mno, gender

  通常groupq和having联用Q比如查?门课以上不及格的学生Q则按学?sno)分类有:

select sno,count(*) from grades
where mark<60
group by sno
having count(*)>1

  6.UNION联合

  合ƈ查询l果Q如Q?/p>

SELECT * FROM students
WHERE name like ‘?’
UNION [ALL]
SELECT * FROM students
WHERE name like ‘?’

  7.多表查询

  a.内连?/p>

select g.sno,s.name,c.coursename
from grades g JOIN students s ON g.sno=s.sno
JOIN courses c ON g.cno=c.cno
(注意可以引用别名)
b.外连?br>b1.左连?br>select courses.cno,max(coursename),count(sno)
from courses LEFT JOIN grades ON courses.cno=grades.cno
group by courses.cno

  左连接特点:昄全部左边表中的所有项目,即其中有些中的数据未填写完全?/p>

  左外q接q回那些存在于左表而右表中却没有的行,再加上内q接的行?/p>

  b2.双?/p>

  与左q接cM

  b3.全连?/p>

select sno,name,major
from students FULL JOIN majors ON students.mno=majors.mno

  两边表中的内容全部显C?/p>

  c.自nq接

select c1.cno,c1.coursename,c1.pno,c2.coursename
from courses c1,courses c2 where c1.pno=c2.cno

  采用别名解决问题?/p>

  d.交叉q接

select lastname+firstname from lastname CROSS JOIN firstanme

  相当于做W卡儿积

  8.嵌套查询

  a.用关键字IN,如查询李q同乡Q?/p>

select * from students
where native in (select native from students where name=’ 李山’)

  b.使用关键字EXIST,比如Q下面两句是{h的:

select * from students
where sno in (select sno from grades where cno=’B2’)

select * from students where exists
(select * from grades where
grades.sno=students.sno AND cno=’B2’)

  9.关于排序order

  a.对于排序orderQ有两种ҎQasc升序和desc降序

  b.对于排序order,可以按照查询条g中的某项排列Q而且q项可用数字表示Q如Q?/p>

select sno,count(*) ,avg(mark) from grades
group by sno
having avg(mark)>85
order by 3

  10.其他

  a.对于有空格的识别名称Q应该用"[]"括住?/p>

  b.对于某列中没有数据的特定查询可以用null判断Q如select sno,courseno from grades where mark IS NULL

  c.注意区分在嵌套查询中使用的any与all的区别,any相当于逻辑q算“||”而all则相当于逻辑q算“&&”

  d.注意在做否定意义的查询是心q入陷阱Q?/p>

  如,没有选修‘B2’评的学?Q?/p>

select students.*
from students, grades
where students.sno=grades.sno
AND grades.cno <> ’B2’

  上面的查询方式是错误的,正确方式见下方:

select * from students
where not exists (select * from grades
where grades.sno=students.sno AND cno='B2')

  11.关于有难度多重嵌套查询的解决思想Q?/p>

  如,选修了全部课E的学生Q?/p>

select *
from students
where not exists ( select *
from courses
where NOT EXISTS
(select *
from grades
where sno=students.sno
AND cno=courses.cno))

  最外一重:从学生表中选,排除那些有课没选的。用not exist。由于讨论对象是评Q所以第二重查询从course表中找,排除那些选了评卛_?br>



I LOVE JAVA 2007-05-24 13:22 发表评论
]]>
10.谈数据库设计技??http://m.tkk7.com/shichengjun1984/articles/119698.htmlI LOVE JAVAI LOVE JAVAThu, 24 May 2007 05:15:00 GMThttp://m.tkk7.com/shichengjun1984/articles/119698.htmlhttp://m.tkk7.com/shichengjun1984/comments/119698.htmlhttp://m.tkk7.com/shichengjun1984/articles/119698.html#Feedback0http://m.tkk7.com/shichengjun1984/comments/commentRss/119698.htmlhttp://m.tkk7.com/shichengjun1984/services/trackbacks/119698.html  开?a >数据?/a>理cȝ软gQ不可能不考虑多用户和用户权限讄的问题。尽目前市面上的大、中型的后台数据库系lY仉提供了多用户Q以及细x个数据库内某张表的权限设|的功能Q我个hQ一套成熟的数据库管理YӞq是应该自行设计用户理q块功能Q原因有二:
  1.那些大、中型后台数据库pȝ软g所提供的多用户及其权限讄都是针对数据库的共有属性,q不一定能完全满某些特例的需求;
  2.不要q多的依赖后台数据库pȝ软g的某些特D功能,多种大、中型后台数据库pȝ软g之间q不完全兼容。否则一旦日后需要{换数据库q_或后台数据库pȝ软g版本升Q之前的架构设计很可能无法重用?

  下面看看如何自行设计一套比较灵zȝ多用L理模块,卌数据库管理Y件的pȝ理员可以自行添加新用户Q修改已有用L权限Q删除已有用戗首先,分析用户需求,列出该数据库理软g所有需要实现的功能Q然后,Ҏ一定的联系对这些功能进行分c,x某类用户需使用的功能归Zc;最后开始徏表:
  
功能?Function_table)
名称     cd    U束条g   说明
f_id          int        无重复     功能标识Q主?br>f_name        char(20)    不允ؓI?nbsp;  功能名称Q不允许重复
f_desc        char(50)    允许为空     功能描述

用户l表(User_group)
名称     cd    U束条g   说明
group_id      int         无重?nbsp;       用户l标识,主键
group_name    char(20)    不允ؓI?nbsp;   用户l名U?br>group_power   char(100)   不允ؓI?nbsp;   用户l权限表Q内容ؓ功能表f_id的集?/p>

用户?User_table)
名称     cd    U束条g   说明
user_id       int         无重?nbsp;       用户标识Q主?br>user_name     char(20)    无重?nbsp;       用户?br>user_pwd      char(20)    不允ؓI?nbsp;   用户密码
user_type     int         不允ؓI?nbsp;   所属用L标识Q和User_group.group_id兌

  采用q种用户l的架构设计Q当需要添加新用户Ӟ只需指定新用h属的用户l;当以后系l需要添加新功能或对旧有功能权限q行修改Ӟ只用操作功能表和用户l表的记录,原有用户的功能即可相应随之变化。当Ӟq种架构设计把数据库理软g的功能判定移C前台Q得前台开发相对复杂一些。但是,当用h较大(10Z?Q或日后软g升的概率较大时Q这个代h值得的?/p>


  四、简z的扚wm:n设计
  到m:n的关p,一般都是徏?个表Qm一个,n一个,m:n一个。但是,m:n有时会遇到批量处理的情况Q例如到图书馆借书Q一般都是允许用户同时借阅n本书Q如果要求按Ҏ询借阅记录Q即列出某个用户某次借阅的所有书c,该如何设计呢Q让我们建好必须?个表先:

书籍?Book_table)
名称     cd    U束条g   说明
book_id       int         无重?nbsp;       书籍标识Q主?br>book_no       char(20)    无重?nbsp;       书籍~号
book_name     char(100)   不允ؓI?nbsp;   书籍名称
……

借阅用户?Renter_table)
名称     cd    U束条g   说明
renter_id     int         无重?nbsp;       用户标识Q主?br>renter_name   char(20)    不允ؓI?nbsp;   用户姓名
……

借阅记录?Rent_log)
名称     cd    U束条g   说明
rent_id       int         无重?nbsp;       借阅记录标识Q主?br>r_id          int         不允ؓI?nbsp;   用户标识Q和Renter_table.renter_id兌
b_id          int         不允ؓI?nbsp;   书籍标识Q和Book_table.book_id兌
rent_date     datetime    不允ؓI?nbsp;   借阅旉
……

  Z实现按批查询借阅记录Q我们可以再Z个表来保存批量借阅的信息,例如Q?/p>

扚w借阅?Batch_rent)
名称     cd    U束条g   说明
batch_id      int         无重?nbsp;       扚w借阅标识Q主?br>batch_no      int         不允ؓI?nbsp;   扚w借阅~号Q同一批借阅的batch_no相同
rent_id       int         不允ؓI?nbsp;   借阅记录标识Q和Rent_log.rent_id兌
batch_date    datetime    不允ؓI?nbsp;   扚w借阅旉

  q样的设计好吗?我们来看看ؓ了列出某个用hơ借阅的所有书c,需要如何查询?首先索批量借阅?Batch_rent)Q把W合条g的的所有记录的rent_id字段的数据保存v来,再用q些数据作ؓ查询条g带入到借阅记录?Rent_log)中去查询。那么,有没有什么办法改q呢Q下面给ZU简z的扚w设计ҎQ不需d新表Q只需修改一下借阅记录?Rent_log)卛_。修改后的记录表(Rent_log)如下Q?/p>

借阅记录?Rent_log)
名称     cd    U束条g   说明
rent_id       int         无重?nbsp;       借阅记录标识Q主?br>r_id          int         不允ؓI?nbsp;   用户标识Q和Renter_table.renter_id兌
b_id          int         不允ؓI?nbsp;   书籍标识Q和Book_table.book_id兌
batch_no      int         不允ؓI?nbsp;   扚w借阅~号Q同一批借阅的batch_no相同
rent_date     datetime    不允ؓI?nbsp;   借阅旉
……

  其中Q同一ơ借阅的batch_no和该批第一条入库的rent_id相同。D例:假设当前最大rent_id?4Q接着某用户一ơ借阅?本书Q则扚w插入?条借阅记录的batch_no都是65。之后另外一个用L了一套碟Q再插入出租记录的rent_id?8。采用这U设计,查询扚w借阅的信息时Q只需使用一条标准T_SQL的嵌套查询即可。当Ӟq种设计不符?NFQ但是和上面标准?NF设计比v来,哪一U更好呢Q答案就不用我说了吧?/p>


  五、冗余数据的取舍
  上篇?#8220;树型关系的数据表”中保留了一个冗余字D,q里的例子更q一步——添加了一个冗余表。先看看例子Q我原先所在的公司Z解决员工的工作餐Q和附近的一家小馆联系Q每天吃饭记账,费用按h数^摊,月底由公司现金结,每个人每个月的工作餐费从工资中扣除。当Ӟ每天吃饭的h员和人数都不是固定的Q而且Q由于每工作餐的所点的菜色不同Q每的p也不相同。例如,星期一中餐5?0元,晚餐2?0Q星期二中餐6?6元,晚餐3?8元。ؓ了方便计每个h每个月的工作费Q我写了一个简陋的餐记̎理E序Q数据库里有3个表Q?/p>

员工?Clerk_table)
名称     cd    U束条g   说明
clerk_id      int         无重?nbsp;       员工标识Q主?br>clerk_name    char(10)    不允ؓI?nbsp;   员工姓名

每餐总表(Eatdata1)
名称     cd    U束条g   说明
totle_id      int         无重?nbsp;       每餐总表标识Q主?br>persons       char(100)   不允ؓI?nbsp;   餐员工的员工标识集?br>eat_date      datetime    不允ؓI?nbsp;   餐日期
eat_type      char(1)     不允ؓI?nbsp;   餐cdQ用来区分中、晚?br>totle_price   money       不允ؓI?nbsp;   每餐总花?br>persons_num   int         不允ؓI?nbsp;   餐人数

餐计费l表(Eatdata2)
名称     cd    U束条g   说明
id            int         无重?nbsp;       餐计费l表标识Q主?br>t_id          int         不允ؓI?nbsp;   每餐总表标识Q和Eatdata1.totle_id兌
c_id          int         不允ؓI?nbsp;   员工标识标识Q和Clerk_table.clerk_id兌
price         money       不允ؓI?nbsp;   每h每餐p

  其中Q就计费细?Eatdata2)的记录就是把每餐总表(Eatdata1)的一条记录按餐员工qx拆开Q是个不折不扣的冗余表。当Ӟ也可以把每餐总表(Eatdata1)的部分字D合q到餐计费l表(Eatdata2)中,q样每餐总表(Eatdata1)成了冗余表Q不q这h设计出来的就计费细表重复数据更多,相比来说q是上面的方案好些。但是,是餐计费l表(Eatdata2)q个冗余表,在做每月每h费l计的时候,大大化了~程的复杂度Q只用类D么一条查询语句即可统计出每h每月的寄次数和费dQ?/p>

SELECT clerk_name AS personname,COUNT(c_id) as eattimes,SUM(price) AS ptprice FROM Eatdata2 JOIN Clerk_tabsle ON (c_id=clerk_id) JOIN eatdata1 ON (totleid=tid) WHERE eat_date>=CONVERT(datetime,'"&the_date&"') AND eat_date<DATEADD(month,1,CONVERT(datetime,'"&the_date&"')) GROUP BY c_id

  惌一下,如果不用q个冗余表,每次l计每h每月的餐Ҏd时会多麻烦,E序效率也够呛。那么,到底什么时候可以增加一定的冗余数据呢?我认为有2个原则:

  Q、用L整体需求。当用户更多的关注于Q对数据库的规范记录按一定的法q行处理后,再列出的数据。如果该法可以直接利用后台数据库系l的内嵌函数来完成,此时可以适当的增加冗余字D,甚至冗余表来保存q些l过法处理后的数据。要知道Q对于大扚w数据的查询,修改或删除,后台数据库系l的效率q远高于我们自己~写的代码?br>  Q、简化开发的复杂度。现代Y件开发,实现同样的功能,Ҏ有很多。尽不必要求程序员_N绝大部分的开发工具和q_Q但是还是需要了解哪U方法搭配哪U开发工LE序更简z,效率更高一些。冗余数据的本质是用空间换旉Q尤其是目前g的发展远q高于YӞ所以适当的冗余是可以接受的。不q我q是在最后再一下:不要q多的依赖^台和开发工LҎ来化开发,q个度要是没把握好的话,后期l护升会栽大跟头的?/p>

I LOVE JAVA 2007-05-24 13:15 发表评论
]]>
9.谈数据库设计技??http://m.tkk7.com/shichengjun1984/articles/119696.htmlI LOVE JAVAI LOVE JAVAThu, 24 May 2007 05:08:00 GMThttp://m.tkk7.com/shichengjun1984/articles/119696.htmlhttp://m.tkk7.com/shichengjun1984/comments/119696.htmlhttp://m.tkk7.com/shichengjun1984/articles/119696.html#Feedback0http://m.tkk7.com/shichengjun1984/comments/commentRss/119696.htmlhttp://m.tkk7.com/shichengjun1984/services/trackbacks/119696.html数据?/a>Q我认ؓ不能不先谈数据结构?996q_在我初入大学学习计算机编E时Q当时的老师告诉我们说Q计机E序Q数据结构+法。尽现在的E序开发已由面向过Eؓ主逐步q渡到面向对象ؓ主,但我q是深深赞同8q前老师的告诉我们的公式Q计机E序Q数据结构+法。面向对象的E序开发,要做的第一件事是Q先分析整个E序中需处理的数据,从中提取出抽象模板,以这个抽象模板设计类Q再在其中逐步d处理其数据的函数(即算?Q最后,再给cM的数据成员和函数划分讉K权限Q从而实现封装?

  数据库的最初雏形据说源自美国一个奶牛场的记账薄(U质的,由此可见Q数据库q不一定是存储在电脑里的数据^_^)Q里面记录的是该奶牛场的收支账目Q程序员在将其整理、录入到电脑中时从中受到启发。当按照规定好的数据l构所采集到的数据量大C定程度后Q出于程序执行效率的考虑Q程序员其中的索、更新维护等功能分离出来Q做成单独调用的模块Q这个模块后来就慢慢发展、演变成现在我们所接触到的数据库管理系l?DBMS)——程序开发中的一个重要分支?/p>

  下面q入正题Q首先按我个人所接触q的E序l数据库设计人员的功底分一下类Q?br>  Q、没有系l学习过数据l构的程序员。这cȝ序员的作品往往只是他们的即兴玩P他们往往习惯只设计有限的几个表,实现某类功能的数据全部塞在一个表中,各表之间几乎毫无兌。网上不的免费理软g都是q样的东西,当程序功能有限,数据量不多的时候,其程序运行v来没有什么问题,但是如果用其理比较重要的数据,风险性非常大?br>  Q、系l学习过数据l构Q但是还没有开发过对程序效率要求比较高的管理Y件的E序员。这cMh多半刚从学校毕业不久Q他们在设计数据库表l构Ӟ严格按照教科书上的规定,LE-R囑֒3NF(别灰心,所有的数据库设计高手都是从q一步开始的)。他们的作品Q对于一般的access型轻量的管理YӞ已经够用。但是一旦该pȝ需要添加新功能Q原有的数据库表差不多得q行大换血?br>  Q、第二类E序员,在经历过数次E序效率的提升,以及功能升的折腑֐Q终于升U成为数据库设计的老鸟Q第一cȝ序员g的高人。这cȝ序员可以胜Q二十个表以上的中型商业数据管理系l的开发工作。他们知道该在什么样的情况下保留一定的冗余数据来提高程序效率,而且其设计的数据库可拓展性较好,当用户需要添加新功能Ӟ原有数据库表只需做少量修改即可?br>  Q、在l历q上十个cM数据库管理Y件的重复设计后,W三cȝ序员中坚持下来没有{行,而是希望从中扑և“h”H门的有心h会慢慢觉悟,从而完成量变到质变的{换。他们所设计的数据库表结构有一定的q见Q能够预到未来功能升所需要的数据Q从而预先留下伏W。这cȝ序员目前大多晋成数据挖掘方面的高软g开发h员?br>  Q、第三类E序员或W四cȝ序员Q在对现有的各家数据库管理系l的原理和开发都有一定的ȝ后,要么在其基础上进行二ơ开发,要么自行开发一套有自主版权的通用数据库管理系l?/p>

  我个人正处于W三cȝ末期Q所以下面所列出的一些设计技巧只适合W二cd部分W三cL据库设计人员。同Ӟ׃我很碰到有兴趣在这斚w深钻下去的同行,所以文中难免出现错误和遗漏Q在此先行声明,Ƣ迎大家指正Q不要藏U哦8)

  一、树型关pȝ数据?br>  不少E序员在q行数据库设计的时候都遇到q树型关pȝ数据Q例如常见的cd表,即一个大c,下面有若q个子类Q某些子cd有子c这L情况。当cd不确定,用户希望可以在Q意类别下d新的子类Q或者删除某个类别和其下的所有子c,而且预计以后其数量会逐步增长Q此时我们就会考虑用一个数据表来保存这些数据。按照教U书上的教导Q第二类E序员大概会设计出类DL数据表结构:

cd表_1(Type_table_1)
名称     cd    U束条g   说明
type_id      int        无重复     cd标识Q主?br>type_name   char(50)    不允ؓI?nbsp;  cd名称Q不允许重复
type_father   int         不允ؓI?nbsp;  该类别的父类别标识,如果是顶节点的话讑֮为某个唯一?/p>

  q样的设计短精悍,完全满3NFQ而且可以满用户的所有要求。是不是q样p呢?{案是NOQWhyQ?/p>

  我们来估计一下用户希望如何罗列出q个表的数据的。对用户而言Q他当然期望按他所讑֮的层ơ关pMơ罗列出所有的cdQ例如这P
ȝ?br>  cd1
    cd1.1
      cd1.1.1
    cd1.2
  cd2
    cd2.1
  cd3
    cd3.1
    cd3.2
  ……

  看看Z实现q样的列表显C?树的先序遍历)Q要对上面的表进行多次索?注意Q尽类?.1.1可能是在cd3.2之后d的记录,{案仍然是Nơ。这L效率对于量的数据没什么媄响,但是日后cd扩充到数十条甚至上百条记录后Q单单列一ơ类型就要检索数十次该表Q整个程序的q行效率׃敢恭l了。或许第二类E序员会_那我再徏一个时数l或临时表,专门保存cd表的先序遍历l果Q这样只在第一ơ运行时索数十次Q再ơ罗列所有的cd关系时就直接读那个时数l或临时表就行了。其实,用不着再去分配一块新的内存来保存q些数据Q只要对数据表进行一定的扩充Q再Ҏ加类型的数量q行一下约束就行了Q要完成上面的列表只需一ơ检索就行了。下面是扩充后的数据表结构:

cd表_2(Type_table_2)
名称     cd    U束条g                       说明
type_id      int        无重复                     cd标识Q主?br>type_name   char(50)    不允ؓI?nbsp;                  cd名称Q不允许重复
type_father   int         不允ؓI?nbsp;                  该类别的父类别标识,如果是顶节点的话讑֮为某个唯一?br>type_layer    char(6)     限定3?初始gؓ000000       cd的先序遍历,主要为减检索数据库的次?/p>

  按照q样的表l构Q我们来看看上面例子记录在表中的数据是怎样的:

type_id      type_name          type_father          type_layer
1             ȝ?nbsp;              0                 000000
2             cd1                1                 010000
3             cd1.1              2                 010100
4             cd1.2              2                 010200
5             cd2                1                 020000
6             cd2.1              5                 020100
7             cd3                1                 030000
8             cd3.1              7                 030100
9             cd3.2              7                 030200
10            cd1.1.1            3                 010101
……

  现在按type_layer的大来索一下:SELECT * FROM Type_table_2 ORDER BY type_layer

列出记录集如下:

type_id      type_name          type_father          type_layer
1             ȝ?nbsp;              0                 000000
2             cd1                1                 010000
3             cd1.1              2                 010100
10            cd1.1.1            3                 010101
4             cd1.2              2                 010200
5             cd2                1                 020000
6             cd2.1              5                 020100
7             cd3                1                 030000
8             cd3.1              7                 030100
9             cd3.2              7                 030200
……

  现在列出的记录顺序正好是先序遍历的结果。在控制昄cd的层ơ时Q只要对type_layer字段中的数D行判断,?位一l,如大?则向右移2个空根{当Ӟ我这个例子中讑֮的限制条件是最?层,每层最多可?9个子cdQ只要按用户的需求情况修改一下type_layer的长度和位数Q即可更攚w制层数和子类别数。其实,上面的设计不单单只在cd表中用到Q网上某些可按树型列表显C的论坛E序大多采用cM的设计?/p>

  或许有h认ؓQType_table_2中的type_father字段是冗余数据,可以除去。如果这P在插入、删除某个类别的时候,得对type_layer 的内容进行比较繁琐的判定Q所以我q没有消去type_father字段Q这也正W合数据库设计中适当保留冗余数据的来降低E序复杂度的原则Q后面我会D一个故意增加数据冗余的案例?/p>

  
  二、商品信息表的设?br>  假设你是一家百货公司电脑部的开发h员,某天老板要求你ؓ公司开发一套网上电子商务^収ͼ该百货公司有数千U商品出售,不过目前仅打先在网上销售数十种方便q输的商品,当然Q以后可能会陆箋在该电子商务q_上增加新的商品出售。现在开始进行该q_数据库的商品信息表的设计。每U出售的商品都会有相同的属性,如商品编P商品名称Q商品所属类别,相关信息Q供货厂商,内含件数Q库存,q货P销售hQ优惠h。你很快p计出4个表Q商品类型表(Wares_type)Q供货厂商表(Wares_provider)Q商品信息表(Wares_info)Q?/p>

商品cd?Wares_type)
名称     cd    U束条g                       说明
type_id      int        无重复                     cd标识Q主?br>type_name   char(50)    不允ؓI?nbsp;                  cd名称Q不允许重复
type_father   int         不允ؓI?nbsp;                  该类别的父类别标识,如果是顶节点的话讑֮为某个唯一?br>type_layer    char(6)     限定3?初始gؓ000000       cd的先序遍历,主要为减检索数据库的次?/p>

供货厂商?Wares_provider)
名称     cd    U束条g                       说明
provider_id   int        无重复                     供货商标识,主键
provider_name char(100)   不允ؓI?nbsp;                  供货商名U?/p>

商品信息?Wares_info)
名称      cd    U束条g                       说明
wares_id       int       无重复                       商品标识Q主?br>wares_name     char(100)  不允ؓI?nbsp;                    商品名称
wares_type   int        不允ؓI           商品cd标识Q和Wares_type.type_id兌
wares_info     char(200)  允许为空                       相关信息
provider       int        不允ؓI?nbsp;                    供货厂商标识Q和Wares_provider.provider_id兌
setnum         int        初始gؓ1                      内含件数Q默认ؓ1
stock          int        初始gؓ0                      库存Q默认ؓ0
buy_price      money      不允ؓI?nbsp;                    q货?br>sell_price     money      不允ؓI?nbsp;                    销售h
discount       money      不允ؓI?nbsp;                    优惠?/p>

  你拿着q?个表l老板查,老板希望能够再添加一个商品图片的字段Q不q只有一部分商品有图片。OKQ你在商品信息表(Wares_info)中增加了一个haspic的BOOL型字D,然后再徏了一个新表——商品图片表(Wares_pic)Q?/p>

商品囄?Wares_pic)
名称      cd    U束条g                       说明
pic_id        int        无重复                       商品囄标识Q主?br>wares_id      int         不允ؓI?nbsp;                    所属商品标识,和Wares_info.wares_id兌
pic_address  char(200)   不允ؓI           囄存放路径

  E序开发完成后Q完全满板目前的要求,于是正式启用。一D|间后Q老板打算在这套^C推出新的商品销售,其中Q某cd品全部都需d“长度”的属性。第一轮折腾来?#8230;…当然Q你按照d商品囄表的老方法,在商品信息表(Wares_info)中增加了一个haslength的BOOL型字D,又徏了一个新表——商品长度表(Wares_length)Q?/p>

商品长度?Wares_length)
名称      cd    U束条g                       说明
length_id     int        无重复                       商品囄标识Q主?br>wares_id      int         不允ؓI?nbsp;                    所属商品标识,和Wares_info.wares_id兌
length       char(20)    不允ؓI           商品长度说明

  刚刚改完没多久,老板又打上一Ҏ的商品,q次某类商品全部需要添?#8220;宽度”的属性。你咬了咬牙Q又照方抓药Q添加了商品宽度?Wares_width)。又q了一D|_老板C的商品中有一些需要添?#8220;高度”的属性,你是不是开始觉得你所设计的数据库按照q种方式增长下去Q很快就能变成一个迷宫呢Q那么,有没有什么办法遏制这U不可预见性,但却cM重复的数据库膨胀呢?我在阅读《敏捯Y件开发:原则、模式与实践》中发现作者Dq类似的例子Q?.3 “Copy”E序。其中,我非常赞同敏捯Y件开发这个观点:在最初几乎不q行预先设计Q但是一旦需求发生变化,此时作ؓ一名追求卓的E序员,应该从头审查整个架构设计Q在此次修改中设计出能够满日后cM修改的系l架构。下面是我在需要添?#8220;长度”的属性时所提供的修Ҏ案:

  L商品信息?Wares_info)中的haspic字段Q添加商品额外属性表(Wares_ex_property)和商品额外信息表(Wares_ex_info)2个表来完成添加新属性的功能?/p>

商品额外属性表(Wares_ex_property)
名称      cd    U束条g                       说明
ex_pid        int        无重复                       商品额外属性标识,主键
p_name        char(20)    不允ؓI?nbsp;                    额外属性名U?/p>

商品额外信息?Wares_ex_info)
名称        cd    U束条g                       说明
ex_iid          int        无重复                       商品额外信息标识Q主?br>wares_id        int         不允ؓI?nbsp;                    所属商品标识,和Wares_info.wares_id兌
property_id    int         不允ؓI           商品额外属性标识,和Wares_ex_property.ex_pid兌
property_value  char(200)   不允ؓI?nbsp;                    商品额外属性?/p>

  在商品额外属性表(Wares_ex_property)中添?条记录:
ex_pid            p_name
1                商品囄
2                商品长度

  再在整个电子商务q_的后台管理功能中q加一商品额外属性管理的功能Q以后添加新的商品时出现新的属性,只需利用该功能往商品额外属性表(Wares_ex_property)中添加一条记录即可。不要害怕变化,被第一颗子弹击中ƈ不是坏事Q坏的是被相同轨道飞来的W二颗、第三颗子弹M。第一颗子Ҏ得越早,所受的伤越重,之后的抵抗力也越?)(待箋)



I LOVE JAVA 2007-05-24 13:08 发表评论
]]>
7.Oracle PL/SQL入门之案例实?/title><link>http://m.tkk7.com/shichengjun1984/articles/119639.html</link><dc:creator>I LOVE JAVA</dc:creator><author>I LOVE JAVA</author><pubDate>Thu, 24 May 2007 03:18:00 GMT</pubDate><guid>http://m.tkk7.com/shichengjun1984/articles/119639.html</guid><wfw:comment>http://m.tkk7.com/shichengjun1984/comments/119639.html</wfw:comment><comments>http://m.tkk7.com/shichengjun1984/articles/119639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/shichengjun1984/comments/commentRss/119639.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/shichengjun1984/services/trackbacks/119639.html</trackback:ping><description><![CDATA[?a >数据?/a>有两张表Q是关于某公司员工资料、薪水和部门信息的,它们分别是emp表和dept表,两张表的l构如下Q? <p>  要求如下Q?/p> <p>  1、按照上表结构徏立相应的表,q每张表写入5l合法数据?/p> <p>  2、操U늛兌Q?#8220;技术部”的员工的薪水上涨20%?/p> <p>  3、徏立日志,q踪薪水变动情况?/p> <p>  4、徏立测试包?/p> <p>  二. 案例的分析与实现</p> <p>  从前面案例的介绍不难看出Q要?考察点ؓ基本SQL语句Q要?主要考察复合查询Q要?是考察触发器的应用Q要?的考察面相对多一些,不仅考察了包的创建,而且也考察了在PL/SQL中的试Ҏ。了解了q些考察的知识点Q就可以一一去解冟?/p> <p>  要求1Q?/p> <p>  首先Ҏ前面表的l构可以创徏两张表:</p> <p>  ——创建员工表</p> <p>create table emp (emp_id number(5), emp_name varchar2(20), emp_salary number(4)); </p> <p>  ——部门表</p> <p>create table dept (dept_id number(3), dept_name varchar2(20), emp_id number(5)); </p> <p>  建立了表之后可以往表里面写数据了,q里把添加表记录的代码写入到相应的存储过E?/p> <p>/*lemp表添加记录的存储q程*/<br>create or replace procedure ins_table_emp(p_emp_id number,p_emp_name varchar2,p_emp_salary number) as<br>v_emp_id number:=p_emp_id;<br>v_emp_name varchar2(20):=p_emp_name;<br>v_emp_salary number:=p_emp_salary;<br>begin<br> insert into emp values (v_emp_id,v_emp_name,v_emp_salary);<br>end ins_table_emp;</p> <p>/*ldept表添加记录的存储q程*/<br>create or replace procedure ins_table_dept(p_dept_id number,p_dept_name varchar2,p_emp_id number) as<br> v_dept_id number:=p_dept_id;<br> v_dept_name varchar2(20):=p_dept_name;<br> v_emp_id number:=p_emp_id;<br>begin<br> insert into dept values (v_dept_id,v_dept_name,v_emp_id);<br>end ins_table_emp;</p> <p>/*调用相应的存储过E实现记录添?/<br>begin<br> ins_table_emp(10000,'',4000);<br> ins_table_emp(10001,'??èy',2300);<br> ins_table_emp(10002,'3?t',3500);<br> ins_table_emp(10003,'à???',3500);<br> ins_table_emp(10004,'á?ò?',3500);</p> <p> ins_table_dept(111,'DD?t2?',10000);<br> ins_table_dept(111,'DD?t2?',10001);<br> ins_table_dept(111,'DD?t2?',10002);<br> ins_table_dept(112,'??ê?2?',10003);<br> ins_table_dept(113,'êD3?2?',10004);<br>end; </p> <p>  要求2Q?/p> <p>  l指定部门的员工加薪Q这实际上是一个复合查询,首先需要把所有该部门的员工塞选出来,然后对这些员工的薪水q行相应的改动。依照这一思\Q代码如下:</p> <p>  Q需要注意的是:要加薪的部门作为参敎ͼq样的存储过E更有灵zL。)</p> <p>create or replace procedure add_salary(p_dept_name varchar2) as<br>v_dept_name varchar2(20):=p_dept_name;<br>begin<br> update emp set emp.EMP_SALARY=emp.EMP_SALARY*1.2 where emp.EMP_ID in (select emp.EMP_ID from emp,dept where emp.EMP_ID=dept.EMP_ID and dept.DEPT_ID='??ê?2?'); <br>end add_salary; </p> <p>  要求3Q?/p> <p>  建立日志对薪水的变动情况形成一个追t,也就是说Q如果对某个职员的薪水进行变更就应该其相应的变更记录全部记下来。如果对emp表的salary字段创徏一个触发器Q来监视对salary的更改,把每ơ更改进行记录,q样pC要求3的目的了?/p> <p>create or replace trigger print_salary_change  <br>before delete or insert or update on emp  --触发事g<br>for each row                  -- 每修改一行都需要调用此q程</p> <p>declare           --只有触发器的声明需要declareQ过E和函数都不需?br>salary_balance number;<br>begin<br>--:new ?old分别代表该行在修改前和修改后的记?br>salary_balance=:new.salary=:old.salary;<br>dbms_output.PUT_LINE('old salary is: '|| :old.salary);<br>dbms_output.PUT_LINE('old salary is: '|| :new.salary);<br>dbms_output.PUT_LINE('old salary is: '|| to_char(salary_balance));<br>end print_salary_change; </p> <p>  要求4Q?/p> <p>  与其他语aQc/c++{)相比QPL/SQL的测试有其不同之处,归纳下来有三U方法:</p> <p>  1、用DBMS_OUTPUT包的PUT_LINEҎ来显CZ间变量,以此来观察程序是否存在逻辑错误?/p> <p>  2、插入测试表的方法。即创徏一个时的中间表,然后把所有涉及到的中间变量的l果都作录插入到中间表中Q这样可以查询表中的l果来观察程序的执行情况?/p> <p>  3、用异常处理手D,对可疑的E序D用begin … end Q然后可以在exception里进行异常捕获处理?/p> <p>  q里准备使用W二U方法来建立一个测试包QPL/SQL里包的概늱g面向对象里的cȝ概念Q包一l操作和属性封装在一P不仅增强了程序的模块化,而且׃装了更多的操作和属性而提高了执行效能。徏立一个PL/SQL需要两个步骤:首先要徏立包_cM于徏立一个类的头文gQ里面主要对包中的过E,函数和变量的声明Q第二部分主要是包体部分Q实现前面声明的q程和函敎ͼ另外q需要对包进行初始化{工作?/p> <p>  Ҏq一思\Q徏立测试包如下Q?/p> <p>/*包头部分*/<br>create or replace package debug as <br>procedure debug(v_description varchar2,v_valueOfvariable varchar2)<br> procedure reset;<br> v_numberOfLine number;<br>end debug;<br>/*包体部分*/<br>create or replace package body debug as <br>procedure debug(v_description varchar2,v_valueOfvariable varchar2) is <br>begin<br> insert into debugtable <br> values(v_numberOfLine,v_description,v_valueOfvariable);<br> v_numberOfLine:=v_numberOfLine+1;<br>end debug;<br>procedure reset is <br>begin <br> v_numberOfLine:=1;<br> delete from debugtable;<br>end reset;<br>/*初始化部?/<br>begin <br> reset;<br>end debug; </p> <img src ="http://m.tkk7.com/shichengjun1984/aggbug/119639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/shichengjun1984/" target="_blank">I LOVE JAVA</a> 2007-05-24 11:18 <a href="http://m.tkk7.com/shichengjun1984/articles/119639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5.新手入门 Windows下Oracle安装图解http://m.tkk7.com/shichengjun1984/articles/119636.htmlI LOVE JAVAI LOVE JAVAThu, 24 May 2007 03:16:00 GMThttp://m.tkk7.com/shichengjun1984/articles/119636.htmlhttp://m.tkk7.com/shichengjun1984/comments/119636.htmlhttp://m.tkk7.com/shichengjun1984/articles/119636.html#Feedback0http://m.tkk7.com/shichengjun1984/comments/commentRss/119636.htmlhttp://m.tkk7.com/shichengjun1984/services/trackbacks/119636.html    g要求Q?/p>

    Intel奔腾处理器;
    最?28 MB 内存Q推?56 MB Q;

    交换I间Q?/p>

    对于大多数系l,推荐两倍于内存数量或至?00MBQ?/p>

    典型安装Q?

    750 MB

    最安装:

    675 MB

     最大安装:

    1000MB

    软g要求Q?/p>

    Linux内核版本2.2或更高;
    windows NT 4.0以上操作pȝ

    Oracle下蝲Q?a >WWW.ORACLE.COM 上面有,不过要事先注册一个免费用戗下载到的安装文件ؓoracle816nt.zipQ大?41MBQ?br>

    安装q程Q?/font>

    下载到的安装文件解压,双击setup.exe开始出现安装界面?/p>

安装初始界面Q点ȝ大图Q?/td>

    1、接着q入安装向导Q如果已安装有OracleQ可以在q一步进行卸?/p>

安装向导Q点ȝ大图Q?/td>

    2、在下图的向导界面中点击“已安装?#8230;”,可以查阅本机是否已安装Oracle其它版本Q以免造成冲突

版本查阅Q点ȝ大图Q?/td>

    3、如昄未安装Q何相同版本,则可以放心安装,在图上中点击“关闭”Q再?#8220;下一?#8221;Q进入如下图所C的界面Q在q一步里是确定安装文件所在\径即安装到本机硬盘所在\径,选择完成后点“下一?#8221;?/p>

认安装路径Q点ȝ大图Q?/td>

    4、接着安装E序开始加载必要的安装信息

    5、接着出现安装选项?#8220;Oracle 8i Enterprise Edition 8.1.6.0.0”为数据库ȝ序,包括理工具、实用程序和基本的客h软g{,默认首先安装Q第二项为客L理工具Q第三项为服务器端管理工兗按光认选项点击“下一?#8221;

lg安装选项Q点ȝ大图Q?/td>

    6、接着是安装类型的选择。一般按光认,?#8220;典型”吧?/p>

安装cdQ点ȝ大图Q?/td>

    7、命名数据库。全局数据库名Q指唯一在你的网l域中区别于其他数据库的完整数据库名Q例如:sales.acme.com其中sales是你惌调用的数据库名,而acme.com是数据库所在的|络域。而系l标识符(SID)Q是指唯一在你的网l域中区别于其他数据库的数据库实例名。SID域缺省ؓ全局数据库名的数据库部分(上例的sales)( 最?个字W或输入一?)。你可以接受或改变缺省倹{输入完成后?#8220;下一?#8221;Q安装程序开始处理数据库标识?/p>

命名数据库(点击看大图)

    8、接着出现的是对要安装的Oracle版本的一个全局认识Q包括前面所做安装选择{。到q里Q才表示准备正式向本机安装E序?/p>

安装摘要Q点ȝ大图Q?/td>

    9、首先安装的是教学帮助:

速成教学安装步骤Q点ȝ大图Q?/td>

    10、接着是选择工具配置Q同h光认即可?/p>

配置工具Q点ȝ大图Q?/td>

    11、一切准备妥当之后,开始创建数据库及初始化?/p>

创徏数据库(点击看大图)

    12、经q几分钟Q当弹出下面的安装提C时Q表C数据库创徏完成Qƈ昄出相关信息?/p>

安装完成信息Q点ȝ大图Q?/td>

    13、在“开?#8221;-“E序”里找到OracleE序条,卛_选择相应的程序登录数据库啦。至此,整个安装q程全部l束?/p>

安装完成Q点ȝ大图Q?/td>

    补充QOracle的卸?/strong>

    同样?a >Windows 2000Z?/p>

Oracle的卸载(点击看大图)

    (1)、开始-Q设|-Q控刉板-Q管理工PQ服?nbsp;      停止所有Oracle服务?/p>

    (2)、开始-Q程序-QOracle - OraHome81Q>Oracle Installation ProductsQ>Universal Installer 卸装所有Oracle产品

    (3)、运行regeditQ选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLEQ按del键删除这个入口?/p>

    (4)、运行regeditQ选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ServicesQ滚动这个列表,删除所有Oracle入口?/p>

    (5)、从桌面上、STARTUPQ启动)l、程序菜单中Q删除所有有关Oracle的组和图?/p>

    (6)、重新启动计机Q重起后才能完全删除Oracle所在目?/p>

    (7)、删除与Oracle有关的文Ӟ选择Oracle所在的~省目录C:\OracleQ删除这个入口目录及所有子目录Qƈ从Windows 2000目录Q一般ؓC:\WINNTQ下删除以下文gQORACLE.INI、oradim80.INI



I LOVE JAVA 2007-05-24 11:16 发表评论
]]>
4.SQL数据查询语言http://m.tkk7.com/shichengjun1984/articles/119626.htmlI LOVE JAVAI LOVE JAVAThu, 24 May 2007 03:08:00 GMThttp://m.tkk7.com/shichengjun1984/articles/119626.htmlhttp://m.tkk7.com/shichengjun1984/comments/119626.htmlhttp://m.tkk7.com/shichengjun1984/articles/119626.html#Feedback0http://m.tkk7.com/shichengjun1984/comments/commentRss/119626.htmlhttp://m.tkk7.com/shichengjun1984/services/trackbacks/119626.html=============================================================
SELECT 基本语法l构
=============================================================
SELECT[predicate]{*|table.*|[table.]]field [,[table.]field2[,...]}
[AS alias1 [,alias2[,...]]]
[INTO new_table_name]
FROM tableexpression [, ...]
[WHERE...]
[GROUP BY...]
[ORDER BY...][ASC | DESC] ]


predicate-->指定q回记录(?的数?可?ALL,TOP
* --------->指定表中所有字D??.
table ----->指定表的名称.
field ----->指定表中字段(?的名U?br>[AS alias] -替代表中实际字段(?名称的化?
[INTO new_table_name]-->创徏新表及名U?
tableexpression---->表的名称.
[GROUP BY...]表示以该字段的值分l?br>[ORDER BY...]表示按升序排?降序?DESC;

------------------------------------------------------------
1 选择?br>------------------------------------------------------------
sql语句在access中的输入Ҏ
(1)选择"查询"-->新徏-->默认设计视图-->点击定
(2)关闭"昄表对话框"
(3)在菜单拦选择"视图"--->SQL视图 ,可以输入SQL语句?/font>



CZ1_1_选择所有字D?br>SELECT *
FROM useres;

CZ1_2_选择部分字段

SELECT user_name,real_name,submit_date
FROM useres;

CZ1_3查询两个表中的字D?/font>

SELECT 图书信息?图书条码, 借书信息?图书条码
FROM 图书信息? 借书信息?

 

CZ解读:
通过上面单示例我们体会到
(1) SELECT 子句选择列表,它指出查询结果集所包含的字D??及其属?选择所有列时用通配?,选择部分列时要用逗号隔开
(2) FROM 子句指出查询的表?要指定多个表时中间用逗号隔开

------------------------------------------------------------
2 TOP指定q回记录数量
------------------------------------------------------------
CZ1_4_q回记录数量
SELECT TOP 3 *
FROM useres;

-------------------------------------------------------------
3 ASz新字D?br>-------------------------------------------------------------
CZ1_5_z新字D?br>SELECT user_name,(submit_date+30) AS new_date
FROM useres;

------------------------------------------------------------
4 WHERE指定条gq行{?
------------------------------------------------------------
CZ1_6{号查找指定记录
SELECT *
FROM useres
WHERE useres.real_name="U红";

CZ1_7q龄大于30的h
SELECT *
FROM useres
WHERE age>30

从上面可以看?在根据条件进行筛选时,要用到运符,常见的运符如下所C?

1 比较q算W?br>= {于
<> 不等?br>> 大于
< 于
<= 于{于
>= 大于{于

2 逻辑q算W?br>ALL 所有条仉为true则返回true
AND 两个条g都ؓtrue则返回true
OR 有一个条件ؓtrue则返回true
NOT 对值取?br>ANY 所有条件中只要有一个ؓtrue则返回true
BETWEEN 只要操作数在指定的范围内,则返回true
IN 只要操作数等于表辑ּ中的一?则返回true
LIKE 如果操作C模式相匹?则返回true
SOME 在一pd的比较中,有些为true则返回true

CZ1_8_某日以前注册用户
SELECT *
FROM useres
WHERE submit_date<#2004-12-30#

CZ1_9_某时间段注册用户
SELECT *
FROM useres
WHERE submit_date BETWEEN #2004-1-1# AND #2005-5-1#

CZ1_10_按关键字查找
SELECT *
FROM useres
WHERE useres.real_name LIKE "*?"

------------------
IN与OR的区?br>-----------------
CZ_IN{选字D中的记?/font>

SELECT real_name,submit_date
FROM useres
WHERE real_name In("李","张")

CZ_OR{选字D中的记?/font>

SELECT real_name,submit_date
FROM useres
WHERE real_name="李" OR real_name="张"

------------------------------------------------------------
5 GROUP BY分组l果?br>------------------------------------------------------------
CZ1_12_GROUPBY分组l果?br>SELECT sex, SUM(age) AS age之SUM
FROM useres
GROUP BY useres.sex
ORDER BY SUM(age) DESC;

CZ解读:
按字D?sex"下的记录Ҏ"字段"age之SUM"q行分组.
ORDER BY...DESC用来指定按降序排?/font>

本例中的sum为SQL中的聚合函数(对一lD行操?q回单一的汇d?,下面是常用的几个聚合函数:

1 SUM 求d函数

格式:
SUM([ALL|DISTINCT] expression)
参数:
ALL Ҏ有值求d,默认为ALL
DISTINCT 求d时排除重复项
expression 值或表达?可以是变?字段,函数{?/font>

2 AVG 求^均值函?br>格式:
AVG([ALL|DISTINCT] expression)
参数:
ALL Ҏ有值求q_,默认为ALL
DISTINCT 求^均时排除重复?br>expression 值或表达?可以是变?字段,函数{?/font>

3 MIN和MAX函数分别为求最值和最大?格式和上面类?

4 COUNT 行计数函?br>格式:
COUNT({[ALL|DISTINCT] expression|*})
ALL 表示计算除了NULL以外的其他项,为默认选项
DISTINCT 表示COUNTq回唯一非空值的数量
expression 辑ּ,不能是txte,image,ntxt和uniqueidentifiercd的数?

CZ1_13_AVG求^均值函?/font>

SELECT sex, AVG(age) AS age之AVG
FROM useres
GROUP BY useres.sex
ORDER BY AVG(age) DESC;

CZ1_14_COUNTq回记录数量

SELECT COUNT(*)
FROM useres

CZ1_15_按性别分组记录数量

SELECT sex, COUNT(*)
FROM useres
GROUP BY sex;

------------------------------------------------------------
6 DISTINCT从尾部除去重复记?br>------------------------------------------------------------

SELECT DISTINCT real_name
FROM useres

------------------------------------------------------------
7 l合查询
------------------------------------------------------------
当需要从多个表中查询?可以使用l合查询
SELECT useres.real_name, logtime.log_time
FROM useres, logtime
WHERE (((useres.real_name)=[logtime].[real_name]));



I LOVE JAVA 2007-05-24 11:08 发表评论
]]>3.数据库基语句http://m.tkk7.com/shichengjun1984/articles/119614.htmlI LOVE JAVAI LOVE JAVAThu, 24 May 2007 02:59:00 GMThttp://m.tkk7.com/shichengjun1984/articles/119614.htmlhttp://m.tkk7.com/shichengjun1984/comments/119614.htmlhttp://m.tkk7.com/shichengjun1984/articles/119614.html#Feedback0http://m.tkk7.com/shichengjun1984/comments/commentRss/119614.htmlhttp://m.tkk7.com/shichengjun1984/services/trackbacks/119614.htmlcreate database FySql
use FySql
创徏表命?br>create table Users
(
UserId int primary key not null,
UserName varchar(20) not null,
passwd varchar(20) not null,
sex bit not null,
birthday datetime null,
RegTime datetime,
)

删除表的代码
drop table users1
drop table users2

插入表users的数据的几种Ҏ
insert users values(1,'fangsong','123','20020101',20)
insert users1(id,username,passwd,birthday,age) values(2,'fenxji','123','20020401',30)
insert into users1 values(1,'women','123','20020103',30)


插入数据命o
insert into Users values(1,'liuhu','123',1,'19770522','20061114')
insert into Users values(2,'分手','123',1,'19790602','20061113')
insert into Users values(3,'柛_','123',0,'19780512','20061004')

insert into Users values(5,'人类','123',0,'19751102','20061006')
insert into Users values(6,'飞儿','123',0,'19780503','20061007')
insert into Users values(7,'构飞','123',1,'19830301','20051004')

 

索数据的Ҏ-选出数据


select * from Users
select Userid,UserName,passwd,sex,birthday from users
select [Userid],[UserName],[password],[sex],[birthday] from [users]
select "Userid","UserName","password","sex","birthday" from "users"
select userId 用户id,username 用户?sex 性别 from users
select userId as 用户id,username as 用户?sex as  性别 from users

select UserId 用户id,UserName 用户?sex 性别,birthday as 生日 from users
下面只返回一个字D里面的唯一?br>select distinct sex from users
select top 5 * from users
select top 5 percent * from users

 


用函数进行统?br>select count(*)  from Users
select count(birthday)  from Users
select max(UserId) 最大用户id from users
select max(UserId) 最用户id from users
select sum(UserId) 所有id的和 from users
select avg(UserId) 所有id的和 from users
select UserId+sex, "UserName"+"Password" from users

 

 

 

带条件检索数?/font>

(1)查出放松的资?br>select * from Users where Username='放松'
select userId,UserName,password from Users where UserName='放松'

查出性别是女的ƈ且UserId于{于6的姓?and代表?or代表或?br>select UserName from Users where sex=0 and UserId<=6

查出1978q前出生的数??978q?
select *  from users where year(birthday)<'1980'

查出1978q前出生的数??978q?,但是列名改ؓ中文的哈,(用as 或空g为别?,q且只显C年?br>select userId,UserName,password,sex,year(birthday) as 出生q䆾 from users where year(birthday)<'1980'

查出在今q注册的用户
select UserId,userName from Users where datediff(yy,regtime,getdate())<1
查出在本月注册的用户
select UserId,userName from Users where datediff(mm,regtime,getdate())<1

查出在今天注册的用户
select UserId,userName from Users where datediff(dd,regtime,getdate())<1

查出本月注册的用h
select count(*) from Users where datediff(mm,regtime,getdate())<1
--?br>select count(*) as 注册的用h  from Users where datediff(mm,regtime,getdate())<1

此外 >=,<= <> !> !< between and  not between and  或in(a,b,c) not in(a,b,c)
注意in ===or



I LOVE JAVA 2007-05-24 10:59 发表评论
]]>
2.安装sql挂v问题解决办法http://m.tkk7.com/shichengjun1984/articles/119603.htmlI LOVE JAVAI LOVE JAVAThu, 24 May 2007 02:50:00 GMThttp://m.tkk7.com/shichengjun1984/articles/119603.htmlhttp://m.tkk7.com/shichengjun1984/comments/119603.htmlhttp://m.tkk7.com/shichengjun1984/articles/119603.html#Feedback0http://m.tkk7.com/shichengjun1984/comments/commentRss/119603.htmlhttp://m.tkk7.com/shichengjun1984/services/trackbacks/119603.html以前装过sql serverQ后来删掉的?/font>

1Q在d/删除E序中彻底删除sql server?

2Q将没有删除的sql server目录也删除掉?

3Q打开注册表编辑器Q在HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager中找到PendingFileRenameOperations目Qƈ删除它。这样就可以清除安装暂挂目?

4Q删除注册表中跟sql server相关的键?/font>

其实估计只要做第3步就可以搞定Q这样就可以清除安装暂挂目。以上是|络搜烦的资料,我直接做W?步,可以安装了



I LOVE JAVA 2007-05-24 10:50 发表评论
]]>
6、javaq接 sql server 数据?/title><link>http://m.tkk7.com/shichengjun1984/articles/117307.html</link><dc:creator>I LOVE JAVA</dc:creator><author>I LOVE JAVA</author><pubDate>Mon, 14 May 2007 04:53:00 GMT</pubDate><guid>http://m.tkk7.com/shichengjun1984/articles/117307.html</guid><wfw:comment>http://m.tkk7.com/shichengjun1984/comments/117307.html</wfw:comment><comments>http://m.tkk7.com/shichengjun1984/articles/117307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/shichengjun1984/comments/commentRss/117307.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/shichengjun1984/services/trackbacks/117307.html</trackback:ping><description><![CDATA[<p>                W一U?/p> <p>import java.sql.Connection;<br>import java.sql.DriverManager;<br>import java.sql.ResultSet;<br>import java.sql.SQLException;<br>import java.sql.Statement;<br>public class Conn {<br> private static Conn conn = null;<br> public static Conn getInstance() { <br>  if (conn == null) conn = new Conn();<br>  return conn; <br> } <br> public static Connection getCon() {  <br>  String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; <br>  String username = "<span style="FONT-FAMILY: Times New Roman">用户?/span>"; <br>  String password = "密码"; <br>  String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=pubs";<br>  Connection con = null;<br>  try {<br>   Class.forName(driver);<br>   con = DriverManager.getConnection(url, username, password); <br>   Statement stmt=con.createStatement(); <br>          ResultSet rs=stmt.executeQuery("select job_desc from jobs"); <br>          while(rs.next()) { <br>             System.out.println(rs.getString(1));<br>          } <br>          //conn.close();<br>  } catch (ClassNotFoundException e) { <br>   e.printStackTrace();<br>  } catch (SQLException e) { <br>   e.printStackTrace(); <br>  }<br>  return con; <br> }<br> public static void main(String[] args) {  <br>  System.out.println(getCon());<br> }<br>}</p> <p> q行q个例子q需要导?个jar包,分别是mssqlserver.jar、msutil.jar和msbase.jarQ可以到微Y的网站去下蝲Q?a target=_blank><u><font color=#800080>http://www.microsoft.com/downloads/details.aspx?FamilyId...38-2AA54BFDC03A&displaylang=en</font></u></a>Q,如果你下载的是setup.exeQ还需要安装它Q安装后会生成上面的三个jar文g。此JDBC驱动实现?nbsp;JDBC 2.0?br><br><br><br>                 W二U?用JDBCq接数据库,d建数据源<br><br>JDBC技术事实上是一U能通过JAVA语言讉KMl构化数据库的应用程序接?API)(Sunq样说的Q我也不知道是不是真?,而且现在的JDBC 3.0据Sun说也能访问Execel{电子表格程? <br><br>JDBC对于数据库的讉K有四U方式,我们q里只是介绍两种Q?<br><br>W一U是通过ODBC做ؓ“?#8221;(Bridge)Ҏ据库讉KQ第二种是直接对数据库访问?br><br>我们先来看看W一UJDBC<-->ODBC讉K的流E:<br><br>JDBC Driver Mannager->JDBC<->ODBC?>ODBC->数据库客h驱动?>数据库服务器->q回查询l果Q在q种讉K中值的我们注意的是虽然JAVA?Write Once ,Run Anywhere"Q但是如果通过q种讉K的话Q需要客L必须讄ODBC和有相应的数据库客户机的驱动Q当你看了下面的另外一个流E的时候或怽会想Q明明下一U更斚wQؓ什么还要有q个东西的生!呵呵Q因为,未必所有的数据库服务器提供商都提供下面的JDBC驱动E序Q给JDBC讉K提供相应的接口)Q所以就有了JDBC<->ODBC Bridge?<br><br>接着再让我们来看看第二种讉K程Q?<br><br>JDBC Driver Mannager->局部JDBC驱动->客户端数据库->数据库服务器->q回查询l果Q这U访问事实上是{换JDBC调用为相应的数据库(Oracle, Sybase, Informix, DB2, 和其他的数据库数据库理pȝQ的客户端API调用Q这么说Q不知道大家能不能懂Q说单点好像ASP不是通过DSNҎ据库讉K而是通过OLEDB讉KQ说道这里我q是不知道大家能不能明白我的意思。哎呀Q不要扔鸡蛋?Q,q种方式的访问需要相应的数据库提供商提供相应的JDBC驱动E序Q但是有一U好处,可以独立于odbc用于可以随处可Run的客L的浏览器中的AppletE序?<br>我们下面给大家一个通过JDBC-ODBC桥数据库讉K的实例,但是在看下面的事例前我想问大家一?JDK1.3装了吗?数据库驱动装了吗Q我使用的是SQLserverQ?你该没有使用Linux吧?虽然java支持LinuxQ但是老兄我可没有使用Linux?q同JAVA的Write Once ,Run Anywhere没有关系)Q由于用了q行于Win下面的ODBCQ我你看看这东西http://www.aspcn.com/showarticle.asp?id=112Q否则你要是有了问题Q出不了l果那岂不是要怪我Q不q欲加之|,何患无吃... ...Q,冤枉呀Q?/p> <p>哎呀Q说了这么多的废话,q是让我们来看看到底JDBC的调用吧Q既然我们是通过odbc讉K数据库,所以这个odbc是跑不了的,我们先来讄你的odbcQ打开你的odbc数据?>选择pȝdsn(Click加新的dsn-)->接下来输入选择数据库类型、输入dsn?、选择服务器、连接数据库的方式、输入数据库的登陆用户和密码->试q接Q如果测试成功的话,那么你的dsn徏立好了,我的dsn名ؓSqlserver.使用的是sqlserver7.0,?“sa”登陆Q密码ؓI。这些东襉K是后面要用道的! <br><br>好了下面让我们来看程序代码: Q该代码已经通过q行Q?br>//########################################################### <br>//代码开?<br>//########################################################### <br><br>import java.sql.*; <br>//加蝲java数据q接包,java基本所有的数据库的调用的都在这个东襉K?<br><br>public class InsertCoffees { <br><br>public static void main(String args[]) { <br><br>String url = "jdbc:odbc:sqlserver"; <br>//取得q接的url名,注意sqlserver是dsn?<br>Connection con; <br>//实例化一个Connection对象 <br>Statement stmt; <br>String query = "select * from col_link"; <br>//选择所有的Col_link表中的数据输?<br><br>try { <br>Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); <br>//加蝲jdbc-odbc桥驱?<br><br>} catch(java.lang.ClassNotFoundException e) { <br>System.err.print("ClassNotFoundException: "); <br>//加蝲jdbc-odbc桥错?<br>System.err.println(e.getMessage()); <br>//其他错误 <br>} <br><br>try { <br><br>con = DriverManager.getConnection(url, "sa", ""); <br>//数据库连?<br><br><br>stmt = con.createStatement(); <br>//Create 一个声?<br>stmt.executeUpdate("CREATE TABLE col_link (sitename varchar (20) NULL ,siteurl varchar (50) NULL) "); <br>//执行了一个sql语句生成了一个表col_link的表 <br>stmt.executeUpdate("insert into col_link values('ASP中华|?,'http://www.aspcn.com')"); <br>stmt.executeUpdate("insert into col_link values('永远到底有多q?,'http://xuankong.com')"); <br>//执行一个insert into语句 <br>stmt.executeUpdate("update col_link set siteurl='http://www.aspcn.com/xuankong/xuankongt.jpg' where siteurl='http://xuankong.com'"); <br>//执行一个update语句Q更新数据库 <br>ResultSet rs = stmt.executeQuery(query); <br>//q回一个结果集 <br>System.out.println("Col_link表中的数据如?原始数据)"); <br>//下面的语句用了一个while循环打印Zcol_link表中的所有的数据 <br>System.out.println("站点?"+" "+"站点地址"); <br>System.out.println("---------------"+" "+"----------------"); <br>while (rs.next()) { <br>String s = rs.getString("sitename"); <br>String f = rs.getString("siteurl"); <br>//取得数据库中的数?<br>System.out.println(s + " " + f); <br>/*String t = rs.getString(1); <br>String l = rs.getString(2); <br>System.out.println(t + " " + l);*/ <br>/*jdbc提供了两U方法识别字D,一U是使用getXXX(注意q里的getXXX表示取不同类型字D늚不同的方?获得字段名, <br>W二U?是通过字段索引Q在q里我把W二U方法注释了*/ <br>/*你可以访问这个连接获得getxxx的用法:http://java.sun.com/docs/books/tutorial/jdbc/basics/_retrievingTable.html*/ <br>} <br>stmt.close(); <br>con.close(); <br>//上面的语句关闭声明和q接 <br>} catch(SQLException ex) { <br>System.err.println("SQLException: " + ex.getMessage()); <br>//昄数据库连接错误或者查询错?<br>} <br>} <br>} </p> <img src ="http://m.tkk7.com/shichengjun1984/aggbug/117307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/shichengjun1984/" target="_blank">I LOVE JAVA</a> 2007-05-14 12:53 <a href="http://m.tkk7.com/shichengjun1984/articles/117307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1、可能会让你写一DJdbcqOracle的程?q实现数据查?http://m.tkk7.com/shichengjun1984/articles/110257.htmlI LOVE JAVAI LOVE JAVAThu, 12 Apr 2007 11:10:00 GMThttp://m.tkk7.com/shichengjun1984/articles/110257.htmlhttp://m.tkk7.com/shichengjun1984/comments/110257.htmlhttp://m.tkk7.com/shichengjun1984/articles/110257.html#Feedback0http://m.tkk7.com/shichengjun1984/comments/commentRss/110257.htmlhttp://m.tkk7.com/shichengjun1984/services/trackbacks/110257.html{?/span>:E序如下Q?/span>

package hello.ant;

import java.sql.*;

public class jdbc

{

String dbUrl=jdbc:oracle:thin:@127.0.0.1:1521:orcl;

String theUser=admin;

String thePw=manager;

Connection c=null;

Statement conn;

ResultSet rs=null;

public jdbc()

{

try{

Class.forName(oracle.jdbc.driver.OracleDriver).newInstance();

c = DriverManager.getConnection(dbUrl,theUser,thePw);

conn=c.createStatement();

}catch(Exception e){

e.printStackTrace();

}

}

public boolean executeUpdate(String sql)

{

try

{

conn.executeUpdate(sql);

return true;

}

catch (SQLException e)

{

e.printStackTrace();

return false;

}

}

public ResultSet executeQuery(String sql)

{

rs=null;

try

{

rs=conn.executeQuery(sql);

}

catch (SQLException e)

{

e.printStackTrace();

}

return rs;

}

public void close()

{

try

{

conn.close();

c.close();

}

catch (Exception e)

{

e.printStackTrace();

}

}

public static void main(String[] args)

{

ResultSet rs;

jdbc conn = new jdbc();

rs=conn.executeQuery(select * from test);

try{

while (rs.next())

{

System.out.println(rs.getString(id));

System.out.println(rs.getString(name));

}

}catch(Exception e)

{

e.printStackTrace();

}

}

}



I LOVE JAVA 2007-04-12 19:10 发表评论
]]>
վ֩ģ壺 ѹվ߹ۿ15| ŮjƵڵ| ޹Ʒ߲ | պ߹ۿ| ޹˾þۺ| Ƶѿ| ȾþǾƷ6ѹۿ| ޾Ʒɫվ| ߲޵һĻ| ƷһëƬ| Թ| ۺС˵þ| ѹۿһƬ| ƷһƵ| ŷͽȺ| һƷ| ߹ۿƵ| Ʒþþþ| ŷһղ| ޾Ʒ˳鶹| ϺɫϺҳa| AVպƷþþþ| һ| ޸ƵһƵƵ| Ʒѿþþþ| 쿴ѸӰ| ߹ۿĶ | Ƶ| ƷվƵ| պavþþƷ| re99þ6Ʒ| avһ| Ʒ͵Ƶۿ | ŷƷպһ| ޢva| ۺϳ߹ۿ| AV˾Ʒ | ۺϾþþƷ| ޹Ʒһ| ˾ƷƵȫ弶| ĻƵѹۿ|