junjie

 

2008年12月19日

心情调整

今天是5月11日,今天我去整形了。把我的疤痕有整小了一部份,这下不是很高兴啊!为什么这么说呢?我一直很高兴哎!!!嘿嘿!现在这么感觉有点怕听见心中那些自卑妥协的声音。害怕在回到从前。呵呵 时光永远都不可能倒流!如果能倒流那么多伟人都能神了!时间永远不可能倒流的!这是自然规律!
我知道怎么回事了!想起以前的事情啦!以前怎么啦!以前想起这块疤上火 自卑啦!呵呵 过去的都已经过去啦!我也不要怪自己!为什么呢?我为什么要怪自己呢?如果这块疤长到谁身上谁有能一点不难过呢?有几个人能做的比我好呢?有几个人能经历了这么大的痛苦还挺过来啦呢!呵呵 这就是毅力啊!
你在好好想想 菲菲还感觉这块疤痕很好看来!其实话有说回来了,我有什么好难过的!就算我现在这块疤痕没整理的话!有块红色也挺好的!
就咱这模样!脸型他们真挡不住!在侧面他们还感觉是撞的呢!都说有点颜色脸上挺好看的呢!虽然咱有疤但咱这模样就眼夹旁边的这块疤跟咱这模样张的一点也不别小白脸那种模样差!你没比没数!这么多人 能张的小白脸的那个层次的人已经不多了!人已经很多了!我到了这个层次已经很高了!其实你一直感到难看的事,到最后真有小姑娘真有人很欣赏这些!我又何苦遭这个罪呢!呵呵 模样真的已经很不错了!每个人都渴望漂亮,如果能变的很漂亮 谁又何尝不
愿意呢?因为这个东西都是父母给决定的不是自己说了算的! 这是太正常的事情,你看看那么多张的那么一般的人不还都照样过的挺美的!因为我真的很不错啊!生活的好好坏坏不是有模样决定!真正幸福的生活是靠自己的努力!你看看身边的那些男人们!不用你张的多么帅!只要你有颗乐观坚强 宽容善良的心就够了!你的生活决定是很美好的!有心爱的女孩 有成功的事业!怒路吧!孩子你已经完成了 该完的一项任务!放弃这个吧!放弃了!全心的开始!也是全新的开始!因为明天真是太美好了!

posted @ 2009-05-11 21:23 wangjunjie| 编辑 收藏

超连接

http://www.3y11.com/

posted @ 2009-03-31 20:17 wangjunjie 阅读(152) | 评论 (0)编辑 收藏

子窗口

【1、最基本的弹出窗口代码】

<SCRIPT LANGUAGE="javascript">
<!--
window.open ('page.html')
-->
</SCRIPT>

因为这是一段javascripts代码,所以它们应该放在<SCRIPT LANGUAGE="javascript">标签和</script>之间。<!-- 和 -->是对一些版本低的浏览器起作用,在这些老浏览器中不会将标签中的代码作为文本显示出来。要养成这个好习惯啊。window.open ('page.html') 用于控制弹出新的窗口page.html,如果page.html不与主窗口在同一路径下,前面应写明路径,绝对路径(http://)和相对路径(../)均可。用单引号和双引号都可以,只是不要混用。这一段代码可以加入HTML的任意位置,<head>和</head>之间可以,<body>间</body>也可以,越前越早执行,尤其是页面代码长,又想使页面早点弹出就尽量往前放。

【2、经过设置后的弹出窗口】

下面再说一说弹出窗口的设置。只要再往上面的代码中加一点东西就可以了。我们来定制这个弹出的窗口的外观,尺寸大小,弹出的位置以适应该页面的具体情况。

<SCRIPT LANGUAGE="javascript">
<!--
window.open ('page.html', 'newwindow', 'height=100, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=n o, status=no') //这句要写成一行
-->
</SCRIPT>

参数解释:

<SCRIPT LANGUAGE="javascript"> js脚本开始;
window.open 弹出新窗口的命令;
'page.html' 弹出窗口的文件名;
'newwindow' 弹出窗口的名字(不是文件名),非必须,可用空''代替;
height=100 窗口高度;
width=400 窗口宽度;
top=0 窗口距离屏幕上方的象素值;
left=0 窗口距离屏幕左侧的象素值;
toolbar=no 是否显示工具栏,yes为显示;
menubar,scrollbars 表示菜单栏和滚动栏。
resizable=no 是否允许改变窗口大小,yes为允许;
location=no 是否显示地址栏,yes为允许;
status=no 是否显示状态栏内的信息(通常是文件已经打开),yes为允许;
</SCRIPT> js脚本结束

【3、用函数控制弹出窗口】

下面是一个完整的代码。
<html>
<head>
<script LANGUAGE="JavaScript">
<!--
function openwin() {
window.open ("page.html", "newwindow", "height=100, width=400, toolbar =no, menubar=no, scrollbars=no, resizable=no, location=no, status=no") //写成一行
}
//-->
</script>
</head>
<body onload="openwin()">
任意的页面内容...
</body>
</html>

这里定义了一个函数openwin(),函数内容就是打开一个窗口。在调用它之前没有任何用途。怎么调用呢?

方法一:<body onload="openwin()"> 浏览器读页面时弹出窗口;
方法二:<body onunload="openwin()"> 浏览器离开页面时弹出窗口;
方法三:用一个连接调用:
<a href="#" onclick="openwin()">打开一个窗口</a>
注意:使用的“#”是虚连接。
方法四:用一个按钮调用:
<input type="button" onclick="openwin()" value="打开窗口">

【4、同时弹出2个窗口】

对源代码稍微改动一下:

<script LANGUAGE="JavaScript">
<!--
function openwin() {
window.open ("page.html", "newwindow", "height=100, width=100, top=0, left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=n o, status=no")//写成一行
window.open ("page2.html", "newwindow2", "height=100, width=100, top=1 00, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, loca tion=no, status=no")//写成一行
}
//-->
</script>
为避免弹出的2个窗口覆盖,用top和left控制一下弹出的位置不要相互覆盖即可 。最后用上面说过的四种方法调用即可。
注意:2个窗口的name(newwindows和newwindow2)不要相同,或者干脆全部为空。

【5、主窗口打开文件1.htm,同时弹出小窗口page.html】

如下代码加入主窗口<head>区:
<script language="javascript">
<!--
function openwin() {
window.open("page.html","","width=200,height=200")
}
//-->
</script>
加入<body>区:
<a href="1.htm" onclick="openwin()">open</a>即可。

【6、弹出的窗口之定时关闭控制】

下面我们再对弹出的窗口进行一些控制,效果就更好了。如果我们再将一小段 代码加入弹出的页面(注意是加入page.html的HTML中,不是主页面中),让它10秒后自动关闭是不是更酷了?
首先,将如下代码加入page.html文件的<head>区:
<script language="JavaScript">
function closeit()
{
setTimeout("self.close()",10000) //毫秒
}
</script>
然后 儆?lt;body onload="closeit()"> 这一句话代替page.html中原有的<BODY>这一句就可以了。(这一句话千万不要忘记写啊!这一句的作用是调用关闭窗口的代码,10秒钟后就自行关闭该窗口。)

【7、在弹出窗口中加上一个关闭按钮】

<FORM>
<INPUT TYPE='BUTTON' VALUE='关闭' onClick='window.close()'>
</FORM>
呵呵,现在更加完美了!

【8、内包含的弹出窗口-一个页面两个窗口】

上面的例子都包含两个窗口,一个是主窗口,另一个是弹出的小窗口。通过下面的例子,你可以在一个页面内完成上面的效果。

<html>
<head>
<SCRIPT LANGUAGE="JavaScript">
function openwin()
{
OpenWindow=window.open("", "newwin", "height=250, width=250,toolbar=no ,scrollbars="+scroll+",menubar=no");
//写成一行
OpenWindow.document.write("<TITLE>例子</TITLE>")
OpenWindow.document.write("<BODY BGCOLOR=#ffffff>")
OpenWindow.document.write("<h1>Hello!</h1>")
OpenWindow.document.write("New window opened!")
OpenWindow.document.write("</BODY>")
OpenWindow.document.write("</HTML>")
OpenWindow.document.close()
}
</SCRIPT>
</head>
<body>
<a href="#" onclick="openwin()">打开一个窗口</a>
<input type="button" onclick="openwin()" value="打开窗口">
</body>
</html>

看看OpenWindow.document.write()里面的代码不就是标准的HTML吗?只要按照格式写更多的行即可。千万注意多一个标签或少一个标签就会出现错误。记得用 OpenWindow.document.close()结束啊。

【9、终极应用--弹出的窗口之Cookie控制】

回想一下,上面的弹出窗口虽然酷,但是有一点小毛病,比如你将上面的脚本放在一个需要频繁经过的页面里(例如首页),那么每次刷新这个页面,窗口都会弹出一次,我们使用cookie来控制一下就可以了。
首先,将如下代码加入主页面HTML的<HEAD>区:

<script>
function openwin(){
window.open("page.html","","width=200,height=200")
}
function get_cookie(Name) {
var search = Name + "="
var returnvalue = "";
if (document.cookie.length > 0) {
offset = document.cookie.indexOf(search)
if (offset != -1) {
offset += search.length
end = document.cookie.indexOf(";", offset);
if (end == -1)
end = document.cookie.length;
returnvalue=unescape(document.cookie.substring(offset, end))
}
}
return returnvalue;
}
function loadpopup(){
if (get_cookie('popped')==''){
openwin()
document.cookie="popped=yes"
}
}
</script>

然后,用<body onload="loadpopup()">(注意不是openwin而是loadpop啊!)替换主页面中原有的<BODY>这一句即可。你可以试着刷新一下这个页面或重新进入该页面,窗口再也不会弹出了。真正的Pop-Only-Once!

posted @ 2009-03-25 22:35 wangjunjie| 编辑 收藏

多线程理解(转载)

 对于Java开发人员,多线程应该是必须熟练应用的知识点,特别是开发基于Java语言的产品。本文将深入浅出的表述Java多线程的知识点,在后续的系列里将侧重于Java5由Doug Lea教授提供的Concurrent并行包的设计思想以及具体实现与应用。
    如何才能深入浅出呢,我的理解是带着问题,而不是泛泛的看。所以该系列基本以解决问题为主,当然我也非常希望读者能够提出更好的解决问题的方案以及提出更多的问题。由于水平有限,如果有什么错误之处,请大家提出,共同讨论,总之,我希望通过该系列我们能够深入理解Java多线程来解决我们实际开发的问题。
    作为开发人员,我想没有必要讨论多线程的基础知识,比如什么是线程? 如何创建等 ,这些知识点是可以通过书本和Google获得的。本系列主要是如何理深入解多线程来帮助我们平时的开发,比如线程池如何实现? 如何应用锁等。 

(1)方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答。
    自从接触Java多线程,一直对Join理解不了。JDK是这样说的:
   join
    public final void join(long millis)throws InterruptedException
    Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever.
 大家能理解吗? 字面意思是等待一段时间直到这个线程死亡,我的疑问是那个线程,是它本身的线程还是调用它的线程的,上代码: 
package concurrentstudy;
/**
 *
 * 
@author vma
 
*/
public class JoinTest {
    
public static void main(String[] args) {
        Thread t 
= new Thread(new RunnableImpl());
        t.start();
        
try {
            t.join(
1000);
            System.out.println(
"joinFinish");
        } 
catch (InterruptedException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
     
        }
    }
}
class RunnableImpl implements Runnable {

    @Override
    
public void run() {
        
try {
            System.out.println(
"Begin sleep");
            Thread.sleep(
1000);
           System.out.println(
"End sleep");
        } 
catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
结果是:
Begin sleep
End sleep
joinFinish
明白了吧,当main线程调用t.join时,main线程等待t线程,等待时间是1000,如果t线程Sleep 2000呢
 public void run() {
        
try {
            System.out.println(
"Begin sleep");
            // Thread.sleep(
1000);
            Thread.sleep(2000);
           System.out.println("End sleep");
        } 
catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

结果是:
Begin sleep
joinFinish
End sleep
也就是说main线程只等1000毫秒,不管T什么时候结束,如果是t.join()呢, 看代码:  
 public final void join() throws InterruptedException {
    join(0);
    }
就是说如果是t.join() = t.join(0) 0 JDK这样说的 A timeout of 0 means to wait forever 字面意思是永远等待,是这样吗?
其实是等到t结束后。
这个是怎么实现的吗? 看JDK代码:
    /**
     * Waits at most <code>millis</code> milliseconds for this thread to 
     * die. A timeout of <code>0</code> means to wait forever. 
     *
     * 
@param      millis   the time to wait in milliseconds.
     * 
@exception  InterruptedException if any thread has interrupted
     *             the current thread.  The <i>interrupted status</i> of the
     *             current thread is cleared when this exception is thrown.
     
*/
    
public final synchronized void join(long millis) 
    
throws InterruptedException {
    
long base = System.currentTimeMillis();
    
long now = 0;

    
if (millis < 0) {
            
throw new IllegalArgumentException("timeout value is negative");
    }

    
if (millis == 0) {
        
while (isAlive()) {
        wait(
0);
        }
    } 
else {
        
while (isAlive()) {
        
long delay = millis - now;
        
if (delay <= 0) {
            
break;
        }
        wait(delay);
        now 
= System.currentTimeMillis() - base;
        }
    }
    }
其实Join方法实现是通过wait(小提示:Object 提供的方法)。 当main线程调用t.join时候,main线程会获得线程对象t的锁(wait 意味着拿到该对象的锁),调用该对象的wait(等待时间),直到该对象唤醒main线程,比如退出后。

这就意味着main 线程调用t.join时,必须能够拿到线程t对象的锁,如果拿不到它是无法wait的,刚开的例子t.join(1000)不是说明了main线程等待1秒,如果在它等待之前,其他线程获取了t对象的锁,它等待时间可不就是1毫秒了。上代码介绍:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 
*/
package concurrentstudy;
/**
 *
 * 
@author vma
 
*/
public class JoinTest {
    
public static void main(String[] args) {
        Thread t 
= new Thread(new RunnableImpl());
       
new ThreadTest(t).start();
        t.start();
        
try {
            t.join();
            System.out.println(
"joinFinish");
        } 
catch (InterruptedException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
     
        }
    }
}
class ThreadTest extends Thread {

    Thread thread;

    
public ThreadTest(Thread thread) {
        
this.thread = thread;
    }

    @Override
    
public void run() {
        holdThreadLock();
    }

    
public void holdThreadLock() {
        
synchronized (thread) {
            System.out.println(
"getObjectLock");
            
try {
                Thread.sleep(
9000);

            } 
catch (InterruptedException ex) {
             ex.printStackTrace();
            }
            System.out.println(
"ReleaseObjectLock");
        }

    }
}

class RunnableImpl implements Runnable {

    @Override
    
public void run() {
        
try {
            System.out.println(
"Begin sleep");
            Thread.sleep(
2000);
           System.out.println(
"End sleep");
        } 
catch (InterruptedException e) {
            e.printStackTrace();
        }


    }
}
在main方法中 通过new ThreadTest(t).start();实例化ThreadTest 线程对象, 它在holdThreadLock()方法中,通过 synchronized (thread),获取线程对象t的锁,并Sleep(9000)后释放,这就意味着,即使
main方法t.join(1000),等待一秒钟,它必须等待ThreadTest 线程释放t锁后才能进入wait方法中,它实际等待时间是9000+1000 MS
运行结果是:
getObjectLock
Begin sleep
End sleep
ReleaseObjectLock
joinFinish

小结:
本节主要深入浅出join及JDK中的实现。
在下一节中,我们将要讨论SWing 中的事件方法线程来解决一个网友问到的问题:
如何控制Swing程序在单机只有一个实例,也就是不能运行第二个Main方法。


posted @ 2009-03-01 14:17 wangjunjie 阅读(1185) | 评论 (0)编辑 收藏

hibernate跟一些配置文件有关的异常

Exception in thread "main" org.hibernate.HibernateException: Could not parse configuration: /hibernate.cfg.xml
 at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1494)
 at org.hibernate.cfg.Configuration.configure(Configuration.java:1428)
 at org.hibernate.cfg.Configuration.configure(Configuration.java:1414)
 at Test.TestDao.main(TestDao.java:21)
Caused by: org.dom4j.DocumentException: c:\ajar\hibernate-configuration-3.0.dtd (系统找不到指定的路径。) Nested exception: c:\ajar\hibernate-configuration-3.0.dtd (系统找不到指定的路径。)
 at org.dom4j.io.SAXReader.read(SAXReader.java:484)
 at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1484)
 ... 3 more



这里是在咱们的hibernate.cfg.xml中写在文件头的 DOCTYPE中 这里说明当hibernate运行时候 即new Configuration的时候 hibernate这个框架会 进行XML文档的校验  其实 STRUTS也一样







posted @ 2009-02-16 17:43 wangjunjie 阅读(414) | 评论 (0)编辑 收藏

转载 Soalries中常用命令

系统基本配置

如何查看日志信息                 dmesg | more /var/adm/messages*   

收集 exlpore 日志                  /opt/SUNWexplo/bin/explorer -k ->/opt/SUNWexplo/output

系统的基本状况                            showrev 

系统运行时间,平均负载                                  uptime                           

版本信息                                                uname -a                                 

Update 版本                                          more /etc/release                

系统补丁       showrev -p 已安装的补丁信息  patchadd 123-12 打补丁

查看服务对应的端口  more /etc/services

系统变量设置 env sysdef

Shell 变量: bash,csh,ksh

收集 explore 日志

先查看有没有装
# pkginfo |grep SUNWexplo
如果有安装的话:
# /opt/SUNWexplo/bin/explorer
收集到的文件在:
# /opt/SUNWexplo/output

清空日志: cp /var/adm/messages /var/adm/messages.bkp  #cat /dev/null > /var/adm/messages

CPU  

psrinfo -vp              系统 cpu 数和速度

uptime                   cpu 平均负载

prstat -a                实时进程的状态

ps -ef                   显示所有进程的详细信息

kill pid 杀死进程

vmstat mpstat /usr/ucb/ps -aux

内存

prtdiag -v 系统硬件,电源接口等

查看内存大小 prtconf -vp | grep Mem

vmstat

swap -s

增加 swap 分区: mkfile 200m /tmp ,swap -a,swap -l

C5292

磁盘管理

iostat 监视系统输入/输出设备负载

format 系统几块磁盘,大小 Ctrl+D 的组合键退出

metastat 显示硬盘 raid 状态

检查硬盘信息 prtvtoc /dev/dsk/c0t0d0s5

查看 NBU 硬盘 available_media

如何添加硬盘

1 mkdir /usr/ldap3

2 newfs /dev/rdsk/c1t3d0s1 

       3 mount /dev/dsk/c1t3d0s1 /usr/ldap3

4 vi /etc/vfstab 添加文件系统信息

/dev/dsk/c1t2d0s0  /dev/rdsk/c1t2d0s0   /usr/ldap3      ufs     1 yes     logging
 

文件系统

df -k   磁盘使用情况

磁带机的读存数据 : tar cpio

磁带机状态  mt -f /dev/rmt/0 status

虚拟文件系统表  /etc/vfstab

Solaris 硬盘分区

网络

ping netstat -arp

ifconfig –a

系统基本操作

文件操作

压缩解压 tar gzip gunzip

iso 文件  lofiadm

查看文件信息  ls -lrt

目录大小  du -sk dir

mkdir ,cd,

查找文件: Find 文件类型 file

查看文件 more head tail cat 例如: tail -10 /var/adm/messages

文件的权限 chmod: chmod 644 a.txt 

解包 tar vcf filename.tar

打包 tar cvf filename.tar dirname

.gz 文件 解压 gunzip filename.gz ; gzip -d filename.gz           压缩 gzip filenam

.tar.gz 解压: tar zxcf file.tar.gz                                     压缩; tar zcvf file.tar.gz dirname

创建和编辑文件:

生成新文件或改变文件日期: Touch   文件拷贝 cp 移动文件 mv

修改文件: vi的用法

组合命令 : 输出重定向 >   组合命令 |

常用管理命令 man

用户管理

groupadd useradd passwd

查看用户 / more /etc/passwd /etc/shadow /etc/group

(who finger rusers 1 whodo id

如何做系统硬件健康状况检查

# more /var/adm/messages* (没有重大异常报错)

# df –k (“/” 使用率小于 85%)

# format ctrl+d退出)(所有硬盘正常)

# prtdiag –v ( 没有 failed 的部件、内存和 cpu 数量正确 )

# psrinfo –v ( 系统中所有的 cpu 都处在 online 状态 )

运行级别

查看系统的运行级、日期及时间   who   –r

系统运行级别 1 掉电(运行级 0 2 单用户(运行级 1 s S

3 多用户(运行级 2 3 4 重引导(运行级 5 6

重新启动  reboot, init 6

关闭系统: shutdown init 0 halt

其它管理

定时任务

crontab  推到一个自定义的文件上
crontab -l>tmp
编辑这个文件,做需要的修改
vi tmp
推回 crontab
crontab tmp

NBU 备份

#bpdbjobs –report   检查作业备份情况,返回为 0 即为正常

#bpps –a   备份进程启动情况

磁盘阵列管理

 #sccli

sccli: selected device /dev/rdsk/c2t0d0s2 [SUN StorEdge yyyy SN#08472F]

#sccli> show disks

输出的 Status 列,所有值正常情况下是 ” ONLINE” ” STAND-BY” ,其它的值都是不正常的;

#sccli> show logical-drives

输出的 Status 列,其值正常情况下是 ” Good” ,其它的值都是不正常的;

#sccli>show enclosure-status

输出的 Status 列,所有值正常情况下是 ” OK” 或者 ” Absent” ,其它的值都是不正常的;

#sccli>show FRUs

输出的 FRU Status 行,所有值正常情况下是 ”OK” 其它的值都是不正常的;

#sccli> show peripheral-device-status

输出的 status 列,所有值正常情况下是 ”within safety range” ” N/A” ” Hardware:N/A” ” Hardware:OK” 其它的值都是不正常的;

#sccli>exit

oracle

lsnrctl status 查看 listener 进程的状态

tnsping SID    查看连通请款

sun cluster

scinstall -pv 版本信息

luxadm -e port 光纤链路状态

posted @ 2009-02-15 19:24 wangjunjie 阅读(313) | 评论 (0)编辑 收藏

SQL高级查询(转载)

transact---sql高级查询(下)
5:使用having关键字来筛选结果
6:使用compute和compute by子句
7:使用嵌套查询
8:分布式查询

E:使用having关键字来筛选结果
    当完成对数据结果的查询和统计后,可以使用having关键字来对查询和计算的结果进行一步的筛选
      例:检索出work表中学历是大专或者是中专的人数
          select 学历,count(学历) from work group by 学历 having 学历 in("'大专"',"'中专"')
          说明:1:having关键字都与group by用在一起.
               2:having不支持对列分配的别名
          例如:select 学历,"'大于5的人数"'=count(学历) from work group by 学历 having 大于5的人数>5 [错错]
          改为:select 学历,"'大于5的人数"'=count(学历) from work group by 学历 having count(学历)>5

F:使用compute和compute by
  使用compute子句允许同时观察查询所得到各列的数据的细节以及统计各列数据所产生的汇总列
      select * from work [查询所得到的各列的数据的细节]
      compute max(基本工资),min(基本工资) [统计之后的结果]
  这个例子中没有使用by关键字,返回的结果是最后添加了一行基本工资的最大值和最小值,也可增加by关键字.
        例:select * from work order by 学历
           compute max(基本工资),min(基本工资) by 学历
        比较:select 学历,max(基本工资),min(基本工资) from work group by 学历
        说明:1:compute子句必须与order by子句用在一起
             2:compute子句可以返回多种结果集.一种是体现数据细节的数据集,可以按分类要求进行正确的分类;另一种在分类的基础上进行汇总产生结果.
             3:而group by子句对每一类数据分类之后只能产生一个结果,不能知道细节

G:使用嵌套查询
  查询中再查询,通常是以一个查询作为条件来供另一个查询使用
      例:有work表和部门表
         A:检索出在部门表中登记的所有部门的职工基本资料
           select * from work where 部门编号 in [not in](select 部门编号 from dbo.部门)
         B:检索出在work表中每一个部门的最高基本工资的职工资料
           select * from work a where 基本工资=(select max(基本工资) from work b where a.部门名称=b.部门名称)
           说明:由外查询提供一个部门名称给内查询,内查询利用这个部门名称找到该部门的最高基本工资,然后外查询根据基本工资判断是否等于最高工资,如果是的,则显示出来.
           相当于:select * from work,(select 部门名称,max(基本工资) as 基本工资 from work group by 部门名称 as t) where work.基本工资=t.基本工资 and work.部门名称=t.部门名称
         C:用嵌套work表和嵌套部门表,在嵌套work表中检索出姓名和职工号都在嵌套部门存在的职工资料
           select * from 嵌套work where 职工号 in (select 职工号 from 嵌套部门) and 姓名 in (select 姓名 from 嵌套部门) [察看结果,分析原因]
           改:select * from 嵌套work a,嵌套部门 b where a.职工号=b.职工号 and a.姓名=b.姓名
           改:select * from 嵌套work where 职工号=(select 职工号 from 嵌套部门) and 姓名=(select 姓名 from 嵌套部门) [行吗?为什么,分析原因?]

在嵌套中使用exists关键字[存在]
例:1:用嵌套work表和嵌套部门表,在嵌套work表中检索出姓名和职工号都在嵌套部门存在的职工资料
     select * from 嵌套work a where exists (select * from 嵌套部门 b where a.姓名=b.姓名 and a.职工号=b.职工号)
   2:在work表检索出在部门表没有的职工
     select * from work where not exists (select * from 部门 where 部门.部门编号=work.部门编号)
     能否改成:select * from work where exists (select * from 部门 where 部门.部门编号<>work.部门编号)
                      
在列清单中使用select
例:1:在work1表和部门表中检索出所有部门的部门名称和基本工资总和
    select 部门名称,(select sum(基本工资) from work1 b where a.部门编号=b.部门编号) from 部门 a
   2:检索各部门的职工人数
    select 部门编号,部门名称,(select count(职工号) from work1 a where a.部门编号=b.部门编号) as 人数 from 部门 b
   3:在商品表和销售表中查询每一职工的姓名,所属部门,销售总量                  
    select 姓名,所属部门,(select sum(销售量) from 商品销售 a where a.职工号=b.职工号) as 销售总量 from 嵌套部门 b

H:分布式查询
我们以前的查询都只是基于一个服务器中的一个数据库的查询,如果一个查询是要跨越一个服务器,像这样的查询就是分布式查询,那么我们以看到分布查询就是数据源自于两个服务器.要进行分布式查询必须先创建一个“链接服务器”,以便让本地的用户能够映射到过程服务器.
“链接服务器”的创立
     A:在“链接服务器”里面输入以后为了方便访问该链接服务器的名称[任意]
     B:在“提供程序名称”里面选择“Microsoft OLE DB Provider for SQL Server”
     C:在“数据源”里面输入服务器的网络名
     D:本地登录,远程用户和远程密码里面分别输入一个本地登录用户,远程登录和远程密码以便让本地SQL Server登录映射为链接服务器上的用户
     E:访问方法:格式:链接服务器的名称.数据库名.dbo.表名
       链接服务器有两个特点:
           1:通过链接服务器不能删除链接源服务器的任何对像.
           2:能过链接服务器可以对链接源服务器的表进行insert,updae,delete操作.

 


视图
1:什么是视图
2:视图和查询的区别
3:视图的优点
4:如何创建和管理视图
5:如何通过视图修改基本表的数据
6:如何通过视图实现数据的安全性

A:什么是视图:
视图(view):从一个或几个基本表中根据用户需要而做成一个虚表
    1:视图是虚表,它在存储时只存储视图的定义,而没有存储对应的数据
    2:视图只在刚刚打开的一瞬间,通过定义从基表中搜集数据,并展现给用户

B:视图与查询的区别:
视图和查询都是用由sql语句组成,这是他们相同的地方,但是视图和查询有着本质区别:
它们的区别在于:1:存储上的区别:视图存储为数据库设计的一部分,而查询则不是.
              2:更新限制的要求不一样
                要注意:因为视图来自于表,所以通过视图可以间接对表进行更新,我们也可以通过update语句对表进行更新,但是对视图和查询更新限制是不同的,以下我们会知道虽然通过视图可以间接更新表但是有很多限制.
              3:排序结果:通过sql语句,可以对一个表进行排序,而视图则不行.
                比如:创建一个含有order by子句的视图,看一下可以成功吗?

C:视图的优点: 
为什么有了表还要引入视图呢?这是因为视图具有以下几个优点:
1:能分割数据,简化观点
  可以通过select和where来定义视图,从而可以分割数据基表中某些对于用户不关心的数据,使用户把注意力集中到所关心的数据列.进一步简化浏览数据工作.
2:为数据提供一定的逻辑独立性
  如果为某一个基表定义一个视图,即使以后基本表的内容的发生改变了也不会影响“视图定义”所得到的数据
3:提供自动的安全保护功能
  视图能像基本表一样授予或撤消访问许可权.
4:视图可以间接对表进行更新,因此视图的更新就是表的更新

D:视图的创建和管理
  视图的创建
  1:通过sql语句
    格式:create view 视图名 as select 语句
         试一试:分别创建关于一个表或多个表的视图[因为视图可以来自于多表]
  2:通过企业管理器  
    说明:1:在完成视图的创立之后,就可以像使用基本表一样来使用视图
         2:在创建视图时,并非所有的select子查询都可用
           如:compute和compute by,order by[除非与top一起连用] 
         3:但在查询时,依然都可以用在创建时禁用的select子查询
         4:在视图创建时,必须为没有标题列指定标题[思考:能否不用select语句来创建一个视图]
 
  视图的删除:
  1:通过sql语句:drop view 视图名
  2:通过企业管理器
    说明:与删除表不同的是,删除视图后只是删除了视图了定义,并没有删除表中的数据.[查看相关性]
 
  修改视图的定义
  1:通过企业管理器
  2:通过sql语句:
    格式:alter view 视图名 as 新的select语句

浏览视图信息 sp_helptext 视图名 [查看视图创建的语句]

E:如何通过视图修改基本表的数据.
  1:在视图上使用insert语句
    通过视图插入数据与直接在表中插入数据一样,但视图毕竟不是基本表.因此在进行数据插入时还是有一定的限制
      1:如果视图上没有包括基本表中属性为not null[不能为空]的列,那么插入操作会因为那些列是null值而失败.
      2:如果某些列因为某些规则或约束的限制而不能直接接受从视图插入的列时,插入会失败
      3:如果在视图中包含了使用统计函数的结果,或是包含计算列,则插入操作会失败
      4:不能在使用了distinct语句的视图中插入值
      5:不能在使用了group by语句的视图中插入值

  2:使用update更新视图中的数据
       1:更新视图与更新表格一样,但是在视图中使用了多个基本表连接的情况下,每次更新操作只能更新来自基本表的一个数据列
         例如:创建以下视图:create view del as
                          select 职工号,姓名,部门名称,负责人 from work1,部门
                          where work1.部门编号=部门.部门编号
              如果再执行下面的语句时:
                        update del set 职工号="'001"',部门名称="'wenda"' where 职工号="'01"'[出现错误]
              只能够改成:update del set 职工号="'001"' where 职工号="'01"'
                        update del set 部门名称="'wenda"' where 职工号="'01"'
       2:不能在使用了distinct语句的视图中更新值
       3:不能在使用了group by语句的视图中更新值
 
  3:使用delete删除视图中数据.
    通过视图删除数据最终体现为从基本表中删除数据
    格式:delete 视图名 [where 条件]
    说明:当视图由两个以上的基表构成时,不允许删除视图的数据
    例如:建一个视图kk
         create view kk as
         select 职工号,姓名,性别,部门名称 from work1,部门 where work1.部门编号=部门.部门编号 [试着去删除]

    使用with check option的视图
    如果不了解视图定义内容,则常常会发生向视图中输入不符合视图定义的数据的情况.
    比如:create view xm as
         select * from work where 性别="'男"'
         完全可以插入insert xm values("'001"',"'女"',23,"'2400"'....)
尽管从意义上来说是不合理的,但是上述语句是正确的.为了防止这种情况的发生,可以使用with check option子句来对插入的或更改的数据进行限制.
    比如:create view xm as
         select * from work where 性别="'男"' with check option

    使用schemabinding的视图[使用绑定到构架]
我们知道视图是依赖于表,如果在一个表中创建一个视图,今后如果这个表被删除了,则这个视图将不可再用了.为了防止用户删除一个有视图在引用的表,可以在创建视图的时候加上schemabinding关键字.
    比如:create view 基本工资 with SCHEMABINDING
         as select 姓名,性别,基本工资 from dbo.work
    说明:1:不能使用“*”来创建此类型的视图
         2:创建此类型的视图时,一定要加上dbo.表名.
         3:如果在某个表中定义了此类视图,则用户将不能对表的结构进行修改,否则会删除这些绑定
         4:如果用户对表的结构进行列改名,则会删除绑定而且视图不可用.
         5:如果用户对表的结构进行列的类型或者大小修改,则会删除绑定但视图可用,此时用户可以删除视图所引用的表.
  
    使用with encryption对视图进行加密
为了保护创建视图定义的原代码,可以对视图进行加密.
    比如:create view kk with encryption
         as select * from work where 职称="'经理"'
    用sp_helptext来查看一下.或用企业管理器查看一下.
    说明:如果应用此项用户将无法设计视图

F:使用视图加强数据的安全
  一般通过使用视图共有三种途径加强数据的安全性    
     A:对不同用户授予不同的使用权.
     B:通过使用select子句限制用户对某些底层基表的列的访问
     C:通过使用where子句限制用户对某些底层基表的行的访问
  对不同用户授予不同的权限

posted @ 2008-12-19 13:57 wangjunjie 阅读(556) | 评论 (0)编辑 收藏

操作数据库应该养成的好习惯(转载)

我们开发的系统中,数据是最重要的一部分,如果程序的代码错了,我们可以通过各种方式修改回来,但如果数据失真了,将永远无法还原,那种欲哭无泪的滋味,相信经历过的人是深有体会的。可能这些小的细节对我们来说都是微不足道的,但往往这些微不足道而且是小概率的事件将会毁了你。
        记得刚开始工作的时候,我们项目组的几个人对某个市的数据进行操作,由于自己的一个不小心,写错了一个SQL就把其中一部分的数据给毁了,那时候心理真的很难受,多么希望有个人可以骂骂我,至少心理会好受一点,但是没有人理我,这样一直在水深火热这中,感觉自己已经到了地狱一般。经过多年程序生涯,在地狱中也得到了一些成长,于是把自己的一点用金钱换来的经验全盘托出,希望对一些朋友有所帮助。




1、不要用Truncate Table语句。刚开始学这个语句的时候,相信很多人多会拿出来跑一跑,会很高兴地向同事证明你的Truncate Table比Delete跑得更快,但是如果你养成这样的习惯,万一有一天误删东西的时候,就还原不回来了,因为Truncate Table不会记录日志,所以,如果操作重要数据的时候,还是用回Delete语句吧。

2、每次动数据库之前,都先要把数据库备份起来。这个习惯一定要养成,你操作数据库的时候,哪怕只是做一次简单的查询或只是删除几条普通的数据,都先备份一下,不会花你很多时间,却在你失误的时候可以把你从死亡的边缘拉回来。如果数据比较大,至少也要把表里的数据备份出来。

3、把删除语句以及更新语句、插入语句注释掉。我们操作数据库时,通常都喜欢在查询分析器里写一大堆SQL,然后选择某一条,按F5来执行,但有时候会直接按下F5,导致所有的语句都执行,给数据造成一定的损害。如果你把那些有影响的语句注释掉了,就算按错了也没有关系。


4、不要随便地去分离数据库。如果我们要获取整个数据库的数据时,尽量采用把数据备份下来,然后取到其他机器上还原,而不要把数据库分离,然后再复制到其它机器附加。有时候,数据库分离了之后就会造成无法附加,虽然概率很小,但一旦碰上了就会很麻烦,尤其是一些实时的系统。

5、自己不熟悉的数据库,不要去动它。我们维护数据库时,有时候要 出差到其他市去操作数据,这时,其他项目组的同事可能会叫你帮忙更新这个更新那个的,如果你很熟悉数据库的结构,以及了解更新的影响程度,那么你帮忙操作就无所谓,如果你不熟悉,尽量不操作,如果你做好了,功劳不是你的,如果出了什么差错,你就要背黑锅了。

6、身体疲劳时不要操作数据库。加班是程序员的家常便饭,当你加班到身体很疲劳时,操作数据库失误的概率会很大,我记得刚刚出来工作时有一次我写了一个DELETE语句,选择执行了居然漏选了一个WHERE条件,还好数据比较多,超时了,要不然就.........

7、如果自己对数据库结构了解很透彻,而且你的数据库技术水平已经达到一定的高度,更加要小心了,通常出现误操作导致数据失真就是这个阶段,有时候学了一个新语法就会马上拿去试着使用。

8、经常要考虑你的SQL脚本有没有什么漏洞,或者有没有其他方法可以更有效率地执行。


9、SQL SERVER2000里面有一个宝藏,就是它的联机丛书,建议经常去阅读它,当你把它读完并理解之后,你的SQL水平基本就可以超80%的程序员了,根本不要去迷信什么NB的教材,但到了那个时候,你会发现自己懂的东西少了,要学习的东西更多了。

     先总结到这里,如果大家有什么好的经验或建议,请多多提出,大家共同交流!

posted @ 2008-12-19 13:18 wangjunjie| 编辑 收藏

导航

统计

常用链接

留言簿(2)

随笔档案

文章分类

搜索

最新评论

阅读排行榜

评论排行榜