﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-lanxin1020-随笔分类-DB</title><link>http://www.blogjava.net/lanxin1020/category/38975.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2009 05:30:16 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2009 05:30:16 GMT</pubDate><ttl>60</ttl><item><title>sql(转)</title><link>http://www.blogjava.net/lanxin1020/archive/2009/04/13/265236.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Mon, 13 Apr 2009 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/lanxin1020/archive/2009/04/13/265236.html</guid><wfw:comment>http://www.blogjava.net/lanxin1020/comments/265236.html</wfw:comment><comments>http://www.blogjava.net/lanxin1020/archive/2009/04/13/265236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lanxin1020/comments/commentRss/265236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lanxin1020/services/trackbacks/265236.html</trackback:ping><description><![CDATA[--sql structured query language <br />
<br />
--DML--Data Manipulation Language--数据操作语言 <br />
<br />
query information (SELECT), <br />
add new rows (INSERT), <br />
modify existing rows (UPDATE), <br />
delete existing rows (DELETE), <br />
perform a conditional update or insert operation (MERGE), <br />
see an execution plan of SQL (EXPLAIN PLAN), <br />
and lock a table to restrict access (LOCK TABLE). <br />
<br />
--DDL--Data Definition Language--数据定义语言 <br />
create, modify,drop, or rename objects (CREATE,ALTER,DROP,RENAME), <br />
remove all rows from a database object without dropping the structure (TRUNCATE), <br />
manage access privileges (GRANT,REVOKE), <br />
audit database use (AUDIT,NOAUDIT) <br />
and add a description about an object to the dictionary (COMMENT). <br />
<br />
--Transaction Control事务控制语句 <br />
save the changes(COMMIT) <br />
or discard the changes (ROLLBACK) made by DML statements. <br />
Also included in the transaction-control statements are statements to set a point or marker in the transaction for possible rollback (SAVEPOINT) <br />
and to define the properties for the transaction (SET TRANSACTION). <br />
Used to manage the properties of the database. <br />
There isonly one statement in this category (ALTER SYSTEM). <br />
<br />
--DCL--Data Control Language--与开发关系不是很密切,用于权限的分配与回收 <br />
grant,revoke,data control <br />
<br />
--Session Control <br />
control the session properties (ALTER SESSION) <br />
and to enable/disable roles (SET ROLE). <br />
<br />
--System Control <br />
<br />
<br />
-------------------------------------------------------- <br />
select的用法 <br />
<br />
--每个员工的所有信息 <br />
select * from emp <br />
--每个人的部门编号，姓名，薪水 <br />
select deptno,ename,sal from emp; <br />
--每个人的年薪 <br />
select ename,sal*12 from emp; <br />
--计算2*3的值 <br />
select 2*3 from emp; <br />
--计算2*3的值(dual) <br />
select 2*3 from dual; <br />
select * from dual; <br />
--得到当前时间 <br />
select sysdate from dual <br />
--可以给列起别名,比如求每个人的年薪 <br />
select ename,sal*12&nbsp; salperyear from emp; <br />
--如果别名中有空格，需要用双引号 <br />
select ename,sal*12&nbsp; "sal per year" from emp; <br />
--如果没有内容，则为空 <br />
select comm from emp; <br />
--当空字段参与计算，则结果是null <br />
--例如：计算每个人的全年的收入包括月薪和年终奖 <br />
select ename,sal*12+comm from emp; <br />
--可以将多个字符串拼在一起。比如：求每个人的薪水，格式为smith-sal-123 <br />
select ename||'-sal-'||sal from emp; <br />
--如果字符串中有单引号，需要用另外一个单引号转义，比如：这样一个字符串： he's friend <br />
select ename||'''s sal is'||sal from emp; <br />
<br />
<br />
-------------------------------------------------------- <br />
--distinct 关键词的用法 <br />
--求有哪些个部门 <br />
select distinct deptno from emp <br />
--可以用来修饰多个字段。比如：求有哪些个部门和job的组合 <br />
select distinct deptno,job from emp <br />
<br />
-------------------------------------------------------- <br />
where关键词的用法 <br />
--可以是数值类型的等值判断。比如：求10这个部门的所有员工 <br />
select * from emp where deptno=20 <br />
--可以是字符串类型的等值判断。比如：求叫KING的这个人的信息 <br />
select * from emp where ename = 'KING' <br />
--也可以是不等值判断。比如：求薪水小于2000的员工信息 <br />
select * from emp where sal&lt;2000; <br />
--字符串也可以做不等值判断，比如：求所有ename大于'CBA'的员工信息。 <br />
select * from emp where ename&gt;'CBA'; <br />
--求部门不是10的员工 <br />
select * from emp where deptno &lt;&gt; 10; <br />
--求薪水在800和1500之间的员工信息 <br />
select * from emp where sal &gt;=800 and sal &lt;=1500; <br />
--也可以写成 <br />
select * from emp where sal between 800 and 1500 <br />
--这样写则不可以 <br />
-----------------------------select * from emp where 800&lt;=sal&lt;=1500 <br />
--where...in..的用法。比如：求薪水是800或者1500或正2000的员工信息 <br />
select * from emp where sal=800 or sal=1500 or sal=2000 <br />
--相当于写成这样 <br />
select * from emp where sal in(1500,800,2000,1500,1500,1500,1500); <br />
--再比如求姓名是KING,SMITH,AA的员工信息 <br />
select * from emp where ename in ('KING','SMITH','AA') <br />
--求入职时间在20-2月-81之后的员工信息 <br />
select * from emp where hiredate &lt; '23-5月 -87'; <br />
<br />
-------------------------------------------------------- <br />
--and or not的用法 <br />
--求薪水大于1000或者部门在20这个部门的员工信息 <br />
select * from emp where sal&gt;1000 and deptno=20 <br />
--求薪水不是800或者不是1500或者不是3000的员工信息 <br />
select * from emp where sal not in (800,1500,3000) <br />
--也可以这样来写 <br />
select * from emp where sal &lt;&gt;800 and sal &lt;&gt; 1500 and sal&lt;&gt;3000 <br />
<br />
-------------------------------------------------------- <br />
--like的用法 <br />
--求名字中包含ALL这三个字符的员工信息 <br />
select * from emp where ename like '%E%'; <br />
--求名字中的第二个字母是A的员工 <br />
select * from emp where ename like '_A%'; <br />
--特殊字符需要转义。比如：求员工中包含特殊字符%的员工信息 <br />
select * from emp where ename like '%\%%' escape '\' <br />
<br />
-------------------------------------------------------- <br />
--null的用法 <br />
--求没有年终奖的员工 <br />
select * from emp where comm is null <br />
--求有年终奖的员工 <br />
select * from emp where comm is not null <br />
<br />
<br />
-------------------------------------------------------- <br />
--order by的用法 <br />
--员工信息按照姓名正序排列 <br />
select * from emp order by ename asc; <br />
--员工信息按照倒叙排列 <br />
select * from emp order by ename desc; <br />
--也可以是多个字段组合排列。例如：员工信息按照部门正序排列，并且按照姓名倒叙排列 <br />
select * from emp order by deptno asc,ename desc <br />
<br />
-------------------------------------------------------- <br />
--function的用法 <br />
--把所有姓名变成小写 <br />
select lower(ename) from emp; <br />
--把所有姓名变成大写 <br />
select upper(ename) from emp; <br />
--求所有人名中包含'a'的员工信息不区分大小写 <br />
select * from emp where lower(ename) like '%a%' <br />
--截取子字符串，比如求Hello的一部分 <br />
select substr('hello',2,2) from dual; <br />
select substr(ename,2,2) from emp; <br />
--求Hello的一部分，并指明长度 <br />
<br />
--求ascii码对应的字符 <br />
select chr(65) from dual <br />
--求字符对应的ascii码 <br />
select ascii('中')from dual <br />
--四舍五入 <br />
select round(12.456,2) from dual <br />
select round(12.456,-1) from dual <br />
--四舍五入小数点后面多少位 <br />
<br />
--四舍五入小数点前面多少位 <br />
<br />
<br />
-------------------------------------------------------- <br />
--important!日期转换函数 <br />
-------------------------------------------------------- <br />
--将当前日期转换成1981-03-12 12:00:00这种形式的字符串 <br />
select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; <br />
<br />
--将1981-03-12 12:00:00字符串转换成日期 <br />
select to_date('1981-03-12 12:00:00','YYYY-MM-DD HH24:MI:SS') from dual; <br />
<br />
--将每个人的薪水转换成固定格式的字符串 <br />
select to_char(sal,'$999,999,999.99') from emp; <br />
--将固定格式的字符串转换成数值 <br />
select to_number('$8,000.00','$999,999,999.99') from dual; <br />
<br />
--当null参与计算时候，可以用nvl这个函数。比如求每个人一年总共的收入 <br />
select ename,sal*12+comm from emp <br />
<br />
-------------------------------------------------------- <br />
--group function组函数 <br />
--求所有人的薪水的总和，平均值，最大值，最小值 <br />
select sum(sal),avg(sal),max(sal) ,min(sal) from emp; <br />
--求总的行数 <br />
select count(*) from emp; <br />
--求总的行树，（可以指定具体的字段）但如果字段有null值的时候需要小心使用 <br />
select count(comm) from emp; <br />
<br />
--也可以过滤掉重复的行之后统计行数 <br />
<br />
select count(distinct deptno) from emp <br />
--可以指明按照哪个字段进行分组.比如；分部门统计最高薪水 <br />
select deptno,max(sal) from emp where deptno is not null group by deptno <br />
--也可以按照多个字段来分组统计，比如：分部门和岗位，统计最高薪水和行数 <br />
select deptno,job,max(sal),count(*) from emp group by deptno,job <br />
<br />
-------------------------------------------------------- <br />
--重要：出现在select列表中的字段，如果没有在组函数中，那么必须出现在group by 子句中。 <br />
-------------------------------------------------------- <br />
select ename,deptno,job,max(sal),count(*) from emp group by deptno,job <br />
<br />
--求薪水最高的员工姓名 <br />
select * from emp where sal=(select max(sal) from emp); <br />
delete from emp where ename='TEST2' <br />
update emp set deptno=10 where deptno=99 <br />
select * from dept <br />
insert into dept (deptno,dname,loc) values('10','ACCOUNTING','NEW YORK'); <br />
--having从句的用法 <br />
--求平均薪水是2000以上的部门 <br />
select deptno,avg(sal) as avg_sal from emp group by deptno <br />
having avg(sal) &gt;2000 <br />
-------------------------------------------------------- <br />
--总结一下select语法 <br />
select <br />
from <br />
where <br />
group by <br />
having <br />
order by <br />
-------------------------------------------------------- <br />
-- 执行顺序very important! <br />
-- 首先执行where语句将原有记录过滤； <br />
-- 第二执行group by 进行分组； <br />
-- 第三执行having过滤分组； <br />
-- 然后将select 中的字段值选出来； <br />
-- 最后执行order by 进行排序； <br />
<br />
-------------------------------------------------------- <br />
/* <br />
按照部门分组统计，求最高薪水，平均薪水 <br />
只有薪水是1200以上的才参与统计 <br />
并且分组结果中只包括平均薪水在1500以上的部门 <br />
而且按照平均薪水倒叙排列 <br />
*/ <br />
select max(sal),avg(sal) from emp <br />
where sal&gt;1200 <br />
group by deptno <br />
having avg(sal) &gt;1500 <br />
order by avg(sal) desc <br />
<br />
-------------------------------------------------------- <br />
/* <br />
把雇员按部门分组， <br />
求最高薪水， 部门号， <br />
过滤掉名字中第二个字母是'A'的， <br />
要求分组后的平均薪水&gt;1500， <br />
按照部门编号倒序排列 <br />
*/ <br />
select max(sal) ,deptno from emp where ename not like '_A%'group by deptno <br />
having avg(sal) &gt;1500 <br />
order by deptno desc <br />
<br />
/* very very important! */ <br />
select ename, deptno from emp; <br />
select deptno, dname from dept; <br />
-------------------------------------------------------------------------------------- <br />
--老语法：---------------------------------------------------------------------------- <br />
-------------------------------------------------------------------------------------- <br />
--等值连接：求员工姓名以及员工所在部门的名字同时显示出来 <br />
select ename,emp.deptno,dname,dept.deptno from emp,dept <br />
where emp.deptno = dept.deptno <br />
<br />
select ename,e.deptno,dname,d.deptno from emp e,dept d <br />
where e.deptno = d.deptno <br />
<br />
--非等值连接：要求每位雇员的薪水等级 <br />
select * from salgrade <br />
select ename,sal,grade,losal,hisal from emp,salgrade <br />
where sal &gt;=losal and sal &lt;=hisal <br />
--跨3个表：求工作职位是&#8217;PRESIDENT&#8217;的雇员姓名，部门名称和薪水等级时 <br />
select ename,dname,grade from emp,dept,salgrade <br />
where emp.deptno = dept.deptno <br />
and sal &gt;=losal and sal &lt;=hisal <br />
and job ='PRESIDENT' <br />
<br />
<br />
--也可以同一个表做跨表连接：求每位员工的姓名，及其上级经理的姓名 <br />
<br />
select e1.ename,e2.ename from emp e1,emp e2 <br />
where e1.mgr = e2.empno <br />
<br />
-------------------------------------------------------------------------------------- <br />
--新语法------------------------------------------------------------------------------ <br />
--在SQL1992的语法规则中，语句过滤的条件和表连接的条件都被放在了where子句中，当条件过多时，容易造成混淆， <br />
--SQL1999修正了这个缺点，将连接条件和数据过滤条件区分开来， <br />
-------------------------------------------------------------------------------------- <br />
<br />
--交叉连接 <br />
--结果会产生这两张表的笛卡尔乘积 <br />
<br />
select * from emp cross join dept <br />
--要用deptno作为等值连接条件，我们可以这样写 <br />
select * from emp join dept using (deptno) <br />
select ename, dname from emp join dept using(deptno); <br />
--相当于 <br />
select ename, dname from emp join dept on emp.deptno = dept.deptno <br />
--也可以写成这样 <br />
<br />
<br />
--也可以用于非等值连接 <br />
--求每位雇员的薪水等级 <br />
select * from emp join salgrade on (sal &gt;=losal and sal&lt;= hisal) <br />
<br />
<br />
--多个join,where组合使用 <br />
--(求工作职位是&#8217;PRESIDENT&#8217;的雇员姓名，部门名称和薪水等级时) <br />
<br />
select * from emp join dept on emp.deptno = dept.deptno <br />
join salgrade on (sal &gt;=losal and sal&lt;= hisal) <br />
where job = 'PRESIDENT' <br />
<br />
<br />
--外连接--取出表中连接不到一起的多余的数据 <br />
--没有全内连接，没有右内连接 <br />
<br />
--其中outer也可以省略，简写为left join , right join , full join <br />
--left inner join可以缩写成inner join 也可以缩写成join，意思是左内。 <br />
--update emp set deptno=20 where ename='SMITH'; <br />
--commit; <br />
select * from emp; <br />
select * from dept; <br />
delete from dept where deptno=99; <br />
--左内,从左往右找，匹配不上的记录不显示 <br />
select ename,emp.deptno from emp&nbsp; join dept on emp.deptno = dept.deptno; <br />
select ename,emp.deptno from emp&nbsp; inner join dept on emp.deptno = dept.deptno; <br />
--没有这种语法：select ename,emp.deptno from emp&nbsp; left inner join dept on emp.deptno = dept.deptno; <br />
--左外连接,从左往右找，匹配不上的记录也显示一行 <br />
select ename,dept.deptno from emp left /*outer*/ join dept on emp.deptno = dept.deptno; <br />
<br />
--右外连接，从右往左找，匹配不上的记录，也显示一行 <br />
select ename,dept.deptno from emp right /*outer*/ join dept on emp.deptno = dept.deptno; <br />
--没有右内连接：select ename,dept.deptno from emp right inner join dept on emp.deptno = dept.deptno; <br />
<br />
--全外连接 <br />
select ename,dept.deptno from emp full /*outer*/ join dept on emp.deptno = dept.deptno; <br />
<br />
--左外,右外的区别 <br />
<br />
<br />
<br />
<br />
<br />
<br />
--什么时候用外连接呢?比如领导向你要所有学生的列表,顺便把所属的班级也列出来,就需要外连接 <br />
<br />
--在Where语句中使用子查询 <br />
----------------------------------------------------------------- <br />
--雇员中最高薪水的人员名称 <br />
--1,先求出最高薪水 <br />
--2,再求雇员中最高薪水的人员名称 <br />
select ename from emp where sal=(select max(sal) from emp) <br />
<br />
<br />
<br />
--有哪些人的薪水是在整个雇员的平均薪水之上的 <br />
select ename,sal from emp where sal &gt;(select avg(sal) from emp) <br />
<br />
----------------------------------------------------------------- <br />
--雇员中哪些人是经理人 <br />
--1,首先查询mgr中有哪些号码 <br />
--2,再看有哪些人员的号码在此出现 <br />
select distinct mgr from emp where mgr is not null order by mgr <br />
<br />
select ename <br />
&nbsp; from emp <br />
where empno in (select distinct mgr from emp where mgr is not null ) <br />
--where in 中不让写orderby <br />
select ename <br />
&nbsp; from emp <br />
where empno in (select distinct mgr from emp where mgr is not null order by mgr) <br />
<br />
----------------------------------------------------------------- <br />
--在From子句中使用子查询 <br />
------------------------------------------------------------------ <br />
<br />
--部门平均薪水的等级 <br />
--1,首先将每个部门的平均薪水求出来 <br />
--2,然后把结果当成一张表，再用这张结果表和salgrade表做连接，以此求得薪水等级 <br />
select deptno,avg(sal) from emp group by deptno <br />
select * from (select deptno,avg(sal) avg_sal from emp group by deptno) t join salgrade <br />
on avg_sal between losal and hisal; <br />
<br />
<br />
----------------------------------------------------------------- <br />
--每个部门最高薪水的人员名称 <br />
--1,首先将每个部门的最高薪水求出来 <br />
--2,然后把结果当成一张表，再用emp和这张结果表做连接，以此求得每个部门最高薪水的人员名称 <br />
<br />
select deptno,max(sal) from emp where deptno is not null group by deptno <br />
<br />
select ename from emp e join <br />
(select deptno,max(sal) max_sal from emp where deptno is not null group by deptno ) t <br />
on sal = max_sal and e.deptno = t.deptno <br />
<br />
----------------------------------------------------------------- <br />
--哪些人的薪水在部门的平均薪水之上 <br />
--1,首先将每个部门的平均薪水求出来 <br />
--2,然后把结果当成一张表，再用emp和这张结果表做连接，以此求得哪些人的薪水在部门的平均薪水之上 <br />
select deptno,avg(sal) avg_sal from emp group by deptno <br />
<br />
select * from emp join (select deptno,avg(sal) avg_sal from emp group by deptno)t <br />
on (sal&gt;avg_sal and emp.deptno=t.deptno) <br />
----------------------------------------------------------------- <br />
--求部门中(所有人的)平均的薪水等级,形式如： <br />
--&nbsp; deptno&nbsp; avg_grade <br />
--&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.67 <br />
--&nbsp; 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.8 <br />
--&nbsp; 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.5 <br />
--1,先求每个人的薪水等级 <br />
--2,再按照部门分组,求平均数 <br />
select deptno,sal,grade from emp join salgrade on sal between losal and hisal <br />
select deptno,avg(grade) from (select deptno,sal,grade from emp join salgrade on sal between losal and hisal)t group by deptno <br />
<br />
<br />
<br />
<br />
------------------------------------------------------------------------------------------ <br />
--使用伪字段:rownum，---------------------- <br />
------------------------------------------------------------------------------------------ <br />
--用来标识每条记录的行号，行号从1开始，每次递增1 <br />
select rownum,emp.* from emp; <br />
--oracle下rownum只能使用 &lt; &lt;=， 不能使用 = &gt; &gt;= 等比较操作符， <br />
select rownum,emp.* from emp where rownum&lt;5; <br />
--当rownum和order by 一起使用时，会首先选出符合rownum条件的记录，然后再排序 <br />
--(错误的写法)例如，当我们要求薪水最高的前5个人时，最直接的想法可以这样写： <br />
select * from emp where rownum&lt;5 order by sal desc <br />
--(正确的写法)可以这样写 <br />
<br />
select * from <br />
(select * from emp order by sal desc) t <br />
where rownum&lt;=5 <br />
<br />
<br />
<br />
<br />
-------------------------------------------------------- <br />
--不准用组函数(即MAX()),求薪水的最高值(面试题) <br />
--第一种解决办法: <br />
--1,先把所有薪水按照倒序排列 <br />
--2,再取第一行 <br />
select * from <br />
(select sal from emp order by sal desc) t <br />
where rownum=1 <br />
<br />
<br />
<br />
--第二种解决办法: <br />
--1,先跨表查询自己,先求出的结果中,e1.sal不可能出现最大数 <br />
--2,然后再not in <br />
select e2.sal from emp e1,emp e2 where e1.sal&gt;e2.sal <br />
select sal from emp where sal not in(select e2.sal from emp e1,emp e2 where e1.sal&gt;e2.sal) <br />
<br />
<br />
----------------------------------------------------------------- <br />
--求平均薪水最高的部门的部门编号 <br />
--第一种解决办法: <br />
--1,先求出每个部门的平均薪水, <br />
select deptno,avg(sal) avg_sal from emp group by deptno <br />
--2,再求每个部门的平均薪水的最高值, <br />
select max(avg_sal) from (1111111111111111111111111) <br />
--3,最后再求第一步结果中avg_sal = 最高薪水的记录. <br />
<br />
select deptno from (111111111111) where avg_sal = (22222222) <br />
<br />
<br />
select deptno <br />
&nbsp; from (select deptno,avg(sal) avg_sal from emp group by deptno) <br />
where avg_sal = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (select max(avg_sal) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from (select deptno,avg(sal) avg_sal from emp group by deptno)) <br />
<br />
<br />
--没法考虑并列第一的情况 <br />
select deptno from <br />
(select deptno,avg(sal) avg_sal from emp group by deptno order by avg(sal) desc) <br />
where rownum&lt;=1 <br />
<br />
<br />
--第二种解决办法: <br />
--1,将上面的第一步第二步合并,先求最高平均薪水,用max(avg(sal))的办法 <br />
--不能写成select deptno,max(avg(sal)) from emp group by deptno <br />
select max(avg(sal)) from emp group by deptno <br />
--2,求出每个部门的平均薪水 <br />
select deptno,avg(sal) avg_sal from emp group by deptno <br />
--3,最后再求第二步结果中(即每个部门的平均薪水),avg_sal = (第一步结果)的记录.即avg_sal =最高薪水的记录. <br />
select deptno from (select deptno,avg(sal) avg_sal from emp group by deptno) <br />
where avg_sal =(select max(avg(sal)) from emp group by deptno) <br />
<br />
<br />
--第三种解决办法: <br />
--1,先求出每个部门的平均薪水, <br />
select avg(sal) avg_sal from emp group by deptno <br />
--2,求最高平均薪水,用max(avg(sal))的办法 <br />
select max(avg(sal)) from emp group by deptno <br />
--3,再使用having语句, avg(sal) = 第二步的结果 <br />
注意：为组函数起的别名在having中不能用 <br />
<br />
select deptno from emp group by deptno <br />
having avg(sal) = (select max(avg(sal)) from emp group by deptno) <br />
<br />
<br />
<br />
----------------------------------------------------------------- <br />
--求平均薪水最高的部门的部门名称 <br />
--1,部门平均最高薪水 <br />
--2,得到部门编号列表,注意用group by deptno <br />
--3,再应用having子句, having avg(sal) = (第一步的结果) <br />
--4,得到平均最高薪水的那个部门的编号 <br />
--5,再得到部门名称 <br />
<br />
<br />
<br />
select dname from dept where deptno in <br />
<br />
( <br />
select deptno <br />
&nbsp; from (select deptno,avg(sal) avg_sal from emp group by deptno) <br />
where avg_sal = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (select max(avg_sal) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from (select deptno,avg(sal) avg_sal from emp group by deptno)) <br />
<br />
) <br />
<br />
----------------------------------------------------------------- <br />
--求平均薪水的等级最低的部门的部门名称 <br />
--第一步：部门平均薪水的等级,分成两个小步骤,第一小步是求部门平均薪水 <br />
<br />
select * from <br />
(select deptno,avg(sal) avg_sal from emp group by deptno) t <br />
join salgrade on avg_sal between losal and hisal <br />
<br />
--第二步：最低的等级值 <br />
<br />
select min(grade) from (1111111111111111111111111) <br />
<br />
--第三步：等于最低值的部门编号 <br />
------------有错误,应该是grade= <br />
select deptno from (111111111111) where grade = (22222222222222) <br />
--第四步：求名称 <br />
select dname from dept where deptno in(33333333333) <br />
<br />
<br />
<br />
<br />
select dname <br />
&nbsp; from dept <br />
where deptno in <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select deptno <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from (select * <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from (select deptno, avg(sal) avg_sal <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from emp <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group by deptno) t <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; join salgrade on avg_sal between losal and hisal) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where grade = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (select min(grade) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from (select * <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from (select deptno, avg(sal) avg_sal <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from emp <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group by deptno) t <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; join salgrade on avg_sal between losal and hisal))) <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
--也可以用视图的方式来解决 <br />
--conn sys/bjsxt as sysdba <br />
--grant create table, create view, create sequence to scott <br />
--根据第一步的结果,建立一个view <br />
<br />
create or replace view v1 as <br />
--必须明确定义列 <br />
select deptno, avg_sal, grade from <br />
(select deptno,avg(sal) avg_sal from emp group by deptno) t <br />
join salgrade on avg_sal between losal and hisal <br />
<br />
<br />
--查看一下 <br />
select * from v1 <br />
--查询一下 <br />
<br />
--带入view <br />
<br />
select dname from dept where deptno in <br />
(select deptno from (v1) where grade = (select min(grade) from v1)) <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
------------------------------------------------------------- <br />
--为什么in的后面不能order by ？ <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
--------------------------------------------------------------- <br />
--求部门经理人中平均薪水最低的部门名称 (思考题) <br />
第一步,求部门经理的雇员编号 <br />
select distinct mgr from emp where mgr is not null <br />
第二步，按部门统计，求部门经理的平均薪水 <br />
select deptno,avg(sal) avg_sal from emp where empno in (select distinct mgr from emp where mgr is not null)group by deptno <br />
第三步，求最低值 <br />
select min(avg(sal)) from emp where empno in (select distinct mgr from emp where mgr is not null)group by deptno <br />
第四步，求部门经理人中平均薪水最低的部门名称 <br />
select deptno from (2222222222222) where avg_sal =(333333333333333333333333) <br />
<br />
<br />
select dname from dept where deptno in (select deptno from (select deptno,avg(sal) avg_sal from emp where empno in (select distinct mgr from emp where mgr is not null)group by deptno) where avg_sal =(select min(avg(sal)) from emp where empno in (select distinct mgr from emp where mgr is not null)group by deptno)) <br />
---------------------------------------------------------------------------- <br />
--求比普通员工的最高薪水还要高的经理人名称 <br />
--1,求所有经理的编号 <br />
create or replace view v1 as <br />
select distinct mgr from emp where mgr is not null <br />
select * from v1 <br />
--2,普通员工的最高薪水 <br />
select max(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null) <br />
--3, <br />
<br />
select ename from emp where empno in (select * from v1) <br />
and sal &gt; (select max(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null)) <br />
<br />
--即: <br />
<br />
<br />
select ename from emp where empno in (select distinct mgr from emp where mgr is not null) <br />
and sal &gt; (select max(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null)) <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
------------------------------------------------------------------------------ <br />
--求薪水最高的前5名雇员 <br />
--1,先观察一下 <br />
<br />
--2,看看rownum的作用 <br />
<br />
--3,不是我们想要的结果 <br />
select ename,sal&nbsp; from emp where rownum&lt;=5 order by sal desc <br />
--4,先order by,再rownum <br />
select * from <br />
(select ename,sal&nbsp; from emp&nbsp; order by sal desc ) t <br />
where rownum&lt;=5 <br />
<br />
-------------------------------------------------------------------------------- <br />
--求薪水最高的第6到第10名雇员(重点掌握) <br />
--这种没法实现,oracle下rownum只能使用 &lt; &lt;=， 不能使用 = &gt; &gt;= 等比较操作符 <br />
--注意里面的rownum和外面的rownum的区别，外面要想访问里面的rownum，必须取得一个别名。 <br />
<br />
select * from <br />
(select ename,sal&nbsp; from emp&nbsp; order by sal desc ) t <br />
where rownum&gt;=5 <br />
and rownum&lt;=10 <br />
<br />
--所以再套一层select <br />
select * from <br />
(select t.*,rownum r from <br />
(select ename,sal&nbsp; from emp&nbsp; order by sal desc ) t <br />
) <br />
where r&gt;=5 <br />
and r&lt;=10 <br />
<br />
--还有一种排序方式 <br />
select * from <br />
(select * from emp&nbsp; order by sal desc)where rownum&lt;=10 <br />
minus <br />
select * from <br />
(select * from emp&nbsp; order by sal desc)where rownum&lt;=5 <br />
-------------------------------------------------------------------- <br />
--练习: 求最后入职的5名员工 <br />
--1,每个人的入职时间 <br />
<br />
--2,取前5行 <br />
<br />
<br />
<br />
<br />
<br />
----------------------------------------------------------------- <br />
--求每个部门中薪水最高的前两名雇员 <br />
<br />
--1,每个员工的姓名，部门，工资,按部门和工资(倒序)排列 <br />
select ename,deptno,sal from emp order by deptno,sal desc <br />
--2,套一层,加上个r <br />
select ename,deptno,sal,rownum r from <br />
(select ename,deptno,sal from emp order by deptno,sal desc) t <br />
--3,创建试图 <br />
create or replace view v1 <br />
as <br />
select ename,deptno,sal,rownum r from <br />
(select ename,deptno,sal from emp order by deptno,sal desc) t <br />
--观察一下 <br />
select * from v1 <br />
<br />
--每个部门中,薪水最高的第一行,并创建试图 <br />
create or replace view v2 as <br />
select deptno,min(r) min_r from v1 group by deptno <br />
<br />
--两个view跨表连接,大于薪水最高的行数,小于最高的行数+1,并且部门编号要匹配 <br />
select ename from v1 join v2 <br />
on ( v1.deptno = v2.deptno and v1.r &gt;=v2.min_r and v1.r&lt;=v2.min_r+1) <br />
<br />
<br />
------------------------------------------------------------------------------- <br />
--面试题: 比较效率 <br />
&nbsp; select * from emp where deptno = 10 and ename like '%A%'; <br />
&nbsp; select * from emp where ename like '%A%' and deptno = 10; <br />
&nbsp; <br />
--------------------------------------------------------- <br />
--使用union、minus <br />
<br />
--使用union、minus可以用来实现结果集的合并和去除（可以理解为加和减），例如： <br />
select * from emp where deptno=10 <br />
union <br />
select * from emp where deptno=20; <br />
<br />
--相当于 <br />
select * from emp where deptno=10 or deptno=20 <br />
<br />
--而下面的语句 <br />
select * from emp where deptno in (10,20) <br />
minus <br />
select * from emp where sal &lt; 1500; <br />
--相当于 <br />
select * from emp where deptno in(10,20) and sal&gt;=1500 <br />
<br />
--求分段显示薪水的个数 <br />
<br />
<br />
<br />
如： <br />
scale&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total <br />
&lt;800 &nbsp;&nbsp; 0 <br />
801-1000 2 <br />
1001-2000 3 <br />
2001-5000 6 <br />
&gt;5000 &nbsp;&nbsp; 8 <br />
<br />
select '&lt;800' as scale ,count(*) as total from emp where sal&lt;800 <br />
union <br />
select '&lt;801-1000' as scale ,count(*) as total from emp where sal&lt;=1000 and sal&gt;=801 <br />
<br />
<br />
<br />
--或者显示成为 <br />
--注意：使用between .. and .. 的时候，包含了最大和最小值。 <br />
800-1000 1001-2000 2001-5000 <br />
2 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 <br />
select * from <br />
(select count(*) as "800-1000" from emp where sal &gt;=800 and sal &lt;= 1000), <br />
(select count(*) as "1001-2000" from emp where sal &gt;=1001 and sal &lt;= 2000), <br />
(select count(*) as "2001-5000" from emp where sal &gt;=2001 and sal &lt;= 5000) <br />
<br />
<br />
<br />
--或显示成为 <br />
DEPTNO&nbsp;&nbsp; 800-2000&nbsp; 2001-5000 <br />
------ ---------- ---------- <br />
&nbsp;&nbsp;&nbsp; 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 <br />
&nbsp;&nbsp;&nbsp; 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 <br />
&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 <br />
select t.deptno,"800-2000","2001-5000" from <br />
(select deptno,count(*) as "800-2000" from emp where sal between 800 and 2000 group by deptno) t <br />
join <br />
(select deptno,count(*) as "2001-5000" from emp where sal between 2001 and 5000 group by deptno) t1 <br />
on t.deptno = t1.deptno <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp; <br />
----------------------------------------------------------------------------------- <br />
--每个薪水等级有多少名雇员 ？ <br />
--1,先求出每个雇员的薪水等级 <br />
<br />
--2,再group一下 <br />
<img src ="http://www.blogjava.net/lanxin1020/aggbug/265236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lanxin1020/" target="_blank">lanxin1020</a> 2009-04-13 10:40 <a href="http://www.blogjava.net/lanxin1020/archive/2009/04/13/265236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mldn  jndi配置</title><link>http://www.blogjava.net/lanxin1020/archive/2009/03/25/261804.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Wed, 25 Mar 2009 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/lanxin1020/archive/2009/03/25/261804.html</guid><wfw:comment>http://www.blogjava.net/lanxin1020/comments/261804.html</wfw:comment><comments>http://www.blogjava.net/lanxin1020/archive/2009/03/25/261804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lanxin1020/comments/commentRss/261804.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lanxin1020/services/trackbacks/261804.html</trackback:ping><description><![CDATA[<div class="postTitle"><a class="postTitle2" id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/ztf2008/archive/2009/02/11/1388410.html">Tomcat6数据源的配置(JNDI)</a> </div>
<p><font face="Verdana"><font face="Verdana"></font></font>&nbsp;</p>
<p><font face="Verdana"><span style="color: #ff0000"><font face="Verdana">Tomcat5版本的<font face="Verdana">数据源的配置</font>如下：<br />
</font></span><font face="Verdana"><span style="color: #008000"><font face="Verdana"><font face="Verdana">&lt;Resource name="jdbc/mldn"&nbsp; auth="Container" type="javax.sql.DataSource"/&gt;<br />
&nbsp;&lt;ResourceParams name="jdbc/mldn"&gt;<br />
&nbsp;&nbsp;&lt;parameter&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;name&gt;factory&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/parameter&gt;<br />
&nbsp;&nbsp;&lt;parameter&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;name&gt;maxActive&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;100&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/parameter&gt;<br />
&nbsp;&nbsp;&lt;parameter&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;name&gt;maxIdle&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;30&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/parameter&gt;<br />
&nbsp;&nbsp;&lt;parameter&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;name&gt;maxWait&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;5000&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/parameter&gt;<br />
&nbsp;&nbsp;&lt;parameter&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;name&gt;username&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;root&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/parameter&gt;<br />
&nbsp;&nbsp;&lt;parameter&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;name&gt;password&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;root&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/parameter&gt;<br />
&nbsp;&nbsp;&lt;parameter&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;name&gt;driverClassName&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/parameter&gt;<br />
&nbsp;&nbsp;&lt;parameter&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;name&gt;url&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;jdbc:mysql://localhost:3306/mldn&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/parameter&gt;<br />
&nbsp; &lt;/ResourceParams&gt;</font></font></span></font></font></p>
<p><font face="Verdana"><font face="Verdana"></font></font><span style="color: #ff0000"><span style="color: #ff0000">Tomcat6版本的数据源的配置如下：</span></span></p>
<p>第一步:<font face="Verdana">在%Tomcat_HOME%conf\server.xml的<font face="Verdana">&nbsp;&lt;Host&gt;<font face="Verdana">标签</font>里当前位置下的<font face="Verdana">&lt;Context&gt;里</font>添加如下代码。</font></font></p>
<p style="color: #008000"><font face="Verdana">&lt;Resource&nbsp;&nbsp; name="jdbc/mldn" <br />
&nbsp;&nbsp;&nbsp;&nbsp;auth="Container" <br />
&nbsp;&nbsp;&nbsp;&nbsp;type="javax.sql.DataSource"<br />
&nbsp;&nbsp;&nbsp;&nbsp;factory="org.apache.commons.dbcp.BasicDataSourceFactory"<br />
&nbsp;&nbsp;&nbsp;&nbsp;username="root"<br />
&nbsp;&nbsp;&nbsp;&nbsp;password="root"<br />
&nbsp;&nbsp;&nbsp;&nbsp;url="jdbc:mysql://localhost:3306/mldn"<br />
&nbsp;&nbsp;&nbsp;&nbsp;driverClassName="com.mysql.jdbc.Driver"<br />
&nbsp;&nbsp;&nbsp;&nbsp;maxIdle="30"<br />
&nbsp;&nbsp;&nbsp;&nbsp;maxWait="5000"<br />
&nbsp;&nbsp;&nbsp;&nbsp;maxActive="100"/&gt; <br />
</font></p>
<p>另外在%Tomcat_HOME%conf\context.xml的<font face="Verdana">&nbsp;&lt;Context&gt;<font face="Verdana">标签</font>里<font face="Verdana">里</font>添加如下代码。</font><br />
&lt;Resource name="jdbc/mldn" auth="Container"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="javax.sql.DataSource" username="root" password="xtcwvt"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mldn"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxActive="8" maxIdle="4"/&gt;<br />
<br />
第二步：<font face="Verdana">配置应用目录下的web.xml文件，<font face="Verdana">在&lt;web-app&gt;&lt;/web-app&gt;之间加入以下代码： </font></p>
<p style="color: #008000"><font face="Verdana"><font face="Verdana">&lt;resource-ref&gt;<br />
&nbsp;&nbsp;&lt;description&gt;DB<em></em>&nbsp;Connection&lt;/description&gt;<br />
&nbsp;&nbsp;&lt;res-ref-name&gt;jdbc/mldn&lt;/res-ref-name&gt;<br />
&nbsp;&nbsp;&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br />
&nbsp;&nbsp;&lt;res-auth&gt;Container&lt;/res-auth&gt;<br />
&nbsp;&lt;/resource-ref&gt;</font></font></p>
<p>注意：<font face="Verdana">要求&lt;res-ref-name&gt;jdbc/mldn&lt;/res-ref-name&gt;中的&#8220;jdbc/mldn&#8221;一定要与在server.xml中配置的Resource中的name一致，不然会出错。</font></p>
<p>第三步：<font face="Verdana">在测试之前，要确保将数据库的驱动jar包放到，你的应用目录\WEB-INF\lib目录下和%Tomcat_HOME%c\lib目录下。 </font></p>
</font>
<p>&nbsp;下面重启Tomcat就OK了！</p>
 <img src ="http://www.blogjava.net/lanxin1020/aggbug/261804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lanxin1020/" target="_blank">lanxin1020</a> 2009-03-25 09:53 <a href="http://www.blogjava.net/lanxin1020/archive/2009/03/25/261804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JNDI使用小指南(转)</title><link>http://www.blogjava.net/lanxin1020/archive/2009/03/24/261663.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Tue, 24 Mar 2009 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/lanxin1020/archive/2009/03/24/261663.html</guid><wfw:comment>http://www.blogjava.net/lanxin1020/comments/261663.html</wfw:comment><comments>http://www.blogjava.net/lanxin1020/archive/2009/03/24/261663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lanxin1020/comments/commentRss/261663.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lanxin1020/services/trackbacks/261663.html</trackback:ping><description><![CDATA[<p>配置Tomcat5.5.X的Server.xml，在&lt;host&gt;下面加:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<li><span><span>&lt;Context&nbsp;path=</span><span class="string">"/JNDIDemo"</span><span>&nbsp;docBase=</span><span class="string">"D:\workspace\JNDIDemo\WebRoot"</span><span>&nbsp;debug=</span><span class="string">"0"</span><span>&nbsp;reloadable=</span><span class="string">"true"</span><span>&nbsp;crossContext=</span><span class="string">"true"</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&lt;Logger&nbsp;className=</span><span class="string">"org.apache.catalina.logger.FileLogger"</span><span>&nbsp;prefix=</span><span class="string">"localhost_quality_log."</span><span>&nbsp;suffix=</span><span class="string">".txt"</span><span>&nbsp;timestamp=</span><span class="string">"true"</span><span>/&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&lt;Resource&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;name=</span><span class="string">"jdbc/test"</span><span>&nbsp;&lt;!--&nbsp;JNDI数据池名称&nbsp;--&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;type=</span><span class="string">"javax.sql.DataSource"</span><span>&nbsp;&lt;!--&nbsp;数据类&nbsp;--&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;password=</span><span class="string">"karid"</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;密码&nbsp;--&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;driverClassName=</span><span class="string">"oracle.jdbc.driver.OracleDriver"</span><span>&nbsp;&nbsp;&lt;!--&nbsp;驱动&nbsp;--&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;maxIdle=</span><span class="string">"2"</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;最少可用lia&nbsp;--&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;maxWait=</span><span class="string">"5000"</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;最大等待时间&nbsp;</span><span class="number">5</span><span>秒&nbsp;--&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;username=</span><span class="string">"karid"</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;用户名&nbsp;--&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;url=</span><span class="string">"jdbc:oracle:thin:@127.0.0.1:1521:karid"</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;maxActive=</span><span class="string">"4"</span><span>&nbsp;&lt;!--&nbsp;最大可用连接&nbsp;--&gt;&nbsp;/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&lt;ResourceParams&nbsp;name=</span><span class="string">"jdbc/test"</span><span>&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&lt;parameter&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;name&gt;removeAbandoned&lt;/name&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;!--&nbsp;Abandoned&nbsp;DB&nbsp;connections&nbsp;are&nbsp;removed&nbsp;and&nbsp;recycled&nbsp;--&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;value&gt;</span><span class="keyword">true</span><span>&lt;/value&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&lt;/parameter&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&lt;parameter&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;name&gt;removeAbandonedTimeout&lt;/name&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;!--&nbsp;Use&nbsp;the&nbsp;removeAbandonedTimeout&nbsp;parameter&nbsp;to&nbsp;set&nbsp;the&nbsp;number&nbsp;of&nbsp;seconds&nbsp;a&nbsp;DB&nbsp;connection&nbsp;has&nbsp;been&nbsp;idle&nbsp;before&nbsp;it&nbsp;is&nbsp;considered&nbsp;abandoned.&nbsp;&nbsp;--&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;value&gt;</span><span class="number">60</span><span>&lt;/value&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&lt;/parameter&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&lt;parameter&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;name&gt;logAbandoned&lt;/name&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;!--&nbsp;Log&nbsp;a&nbsp;stack&nbsp;trace&nbsp;of&nbsp;the&nbsp;code&nbsp;which&nbsp;abandoned&nbsp;--&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;value&gt;</span><span class="keyword">false</span><span>&lt;/value&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&lt;/parameter&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&lt;parameter&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;name&gt;factory&lt;/name&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;!--DBCP&nbsp;Basic&nbsp;Datasource&nbsp;Factory&nbsp;--&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&lt;/parameter&gt;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&lt;/ResourceParams&gt;&nbsp;</span></li>
<p>&nbsp;</p>
<p><br />
2、配置web.xml&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<ol class="dp-j">
    <li><span><span>&lt;description&gt;MySQL&nbsp;Test&nbsp;App&lt;/description&gt;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;resource-ref&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;description&gt;DB&nbsp;Connection&lt;/description&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;res-ref-name&gt;jdbc/test&lt;/res-ref-name&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;res-auth&gt;Container&lt;/res-auth&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/resource-ref&gt;&nbsp;&nbsp;&nbsp;</span></li>
</ol>
<p><span>3、JNDI使用&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;DataSourceFactory&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;DataSource&nbsp;ds;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;DataSource&nbsp;createDataSourde()&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(ds&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;initContext&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;InitialContext();&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(initContext&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"无配置环境"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;envContext&nbsp;=&nbsp;(Context)&nbsp;initContext.lookup(</span><span class="string">"java:/compenv"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ds&nbsp;=&nbsp;(DataSource)&nbsp;envContext.lookup(</span><span class="string">"jdbc/test"</span><span>);&nbsp;</span><span class="comment">//根据名称取得数据源&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(NamingException&nbsp;e)&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;ds;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</span>
 <img src ="http://www.blogjava.net/lanxin1020/aggbug/261663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lanxin1020/" target="_blank">lanxin1020</a> 2009-03-24 11:43 <a href="http://www.blogjava.net/lanxin1020/archive/2009/03/24/261663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>