现在公司招来的员工中,总是招进一些“空降兵”式的项目经理,这些项目经理不管它以前有什么
样的经验,仅仅就项目实施来说,他们有太多的不知道了。在我心目中,一个项目经理不仅仅具备一定
的沟通技巧还需要具备较强的技术修养和背景。
不否认,项目中的沟通是可以解决项目中的一些问题,但是说服客户是需要“以理服人”,因为客户
不是傻子,他们需要了解为什么这项功能不能实现,为什么这项功能需要推后实现,在我的经验中,项目
中没有什么是客户提出问题,而仅仅通过项目经理的沟通就可以解决的。解决的方式往往是项目经理“无可奈何”的向客户保证××××我们一定完成。恶梦开始了,软件人员有需要不停的加班来满足客户那些毫无理由的需求了。
我认为项目经理在客户的和项目组员眼中应该是一个技术高手的形象,只要这样他所作的决定才具有一定的说服力,所安排的工作才具备一定的合理性。而不是那些一行代码没有些过,而仅仅花一些钱考一些什么pmp 之类的认证的人。由于缺乏客户的信任,将导致客户绕过项目经理,直接找技术人员去解决问题,这将导致项目的逐渐失控。
现在公司不知是怎么想的,招聘只是考虑有没有意愿,有没有pmp而不是从实际是否具备的能力。在项目中也不知多少是由于他们的无知造成工期的延误,一点点问题,都要到处协调人去解决,很小的一个问题一来一去不知要耽误多少时间,消耗多少资源。最后还颇为感慨的说,作项目经理太累了。其实这不是太累了,这是因为技术素养太低造成的。IT行业所具有的特点是高手和庸才 之间生产力的差距不仅仅是几倍而是几十倍,甚至是上百倍。
不具备软件开发背景的项目经理工作进度的安排仅仅是一个漂亮的project 图表,不具备任何实际意义。由于没有亲身经历过开发,他不可能了解软件开发的全过程,不可能对项目进度有比较深入的控制。而是靠pmp 中过程控制的方式管理软件的开发,这几乎成了软件项目开发一济致命毒药。因此软件项目的延期甚至失败则变成了必然。
另外 没有作过软件人员的项目经理,在软件人员的管理方面存在也存在问题。不了解技术人员所想
的是什么,更不可能真正调动起技术人员的积极性。他们所做的仅仅是不停的催促软件人员开发,其实这也不能怪他,因为在他的眼里,整个软件开发是一个黑盒,他之所以急躁,是因为他觉的不可控。
嗨 不说了,说了这么多,只不过是对外行人管内行人的一点点感慨。趁这自己还在软件开发这个阶段,多学习,多总结,为成为自己心目中的软件的项目经理而努力。
1 Standard Template Library (STL)主要有两种组件构成,一时容器container 另一种组件是 操作
这些容器类的泛型算法
1 vector and list 是序列是容器
2 map 是一对keyvalue 组合 3 set 其中仅含有key 我们对它惊醒查询操作。主要是判断某之是否存在其中。
2 指针的算术运算
当数组被传递给函数,仅有第一个元素的地址会被传递
template <typename elemType>
elemType * find(const elemType *array,int size,const elemType &value)
{
if(!array||size<1)
return 0;
for(int i=0;i<size;i++)
{
if(array[i]==value)
return &array[i];
}
/*
for(int i=0;i<size;i++,array++)
{
if(*array==value)
return array;
}
*/
return 0;
}
template <typename elemType>
elemType * find(const elemType *first,const elemType *last,const elemType &value)
{
if(!fist||!last)
return 0;
for(;first!=last;first++)
if(*first==value)
return first;
return 0;
}
由于vector 和array 相同,
array[2] equals *(array+2) 2 指两个elemType 单位
由于vector 和array 相同,都是以一块赖宁许内存存储所有元素,所以我们可以使用和array 一样的处理处理
方式
vector<string> svec
find(&vec[],&svec[vec.size()].serch_value);
3 了解Iterator
1 template<typename elemType>
void display(const vector<elemType>&vec,ostream &os)
{
vector<elemType>::const_iterator iter=vec.begin();
vector<elemType>::const_iterator end_it=vec.end();
for(;iter !=end_it;++iter)
{
os<<"ite3r"<<endl;
}
}
2 find
template<typename IteratorTypes,typename elemType>
IteratorType
find(IteratorType first,IteratorType last,count elemType &values)
{
for(;first!=last;++first)
if(value==*first)
return first;
}
return last;
const int siz3=9;
int ia[size]={1,2,3,4,5,6,7,8,9};
vector<int> vec=(ia,ia+size);
list<int> list=(ia,ia+size);
int *pia=find(ia,ia+size,3);
if(pia!=ia+size)
//find...;
vector<int>::iterator it;
it=find(vec.begin(),vec.end,1024);
if(it!=vec.end())
//find...
list<int>::iterator it;
it=find(list.first().list.end,4);
4 所有容器的共同操作
equality(==),assignment(=),empty(),size(),clear()
begin() 返回一个iterator,只向容器的第一个元素
end() 返回一个iterator,只向容器的最后 一个元素
5 使用序列容器
1 vector 和list 是两个最主要的序列式容器 vector 式一块连续的内存。取数据效率较高,但是存数据
但是如果在任意位置插入或删除数据,效率就比较低。(但是在最后一位添加和删除数据效率都比较高)
2 list 系以双向连接来存储内存,可以任意执行前进或后退操作,可以在任意位置安插或删除数据。
3 deque 以连续的内存存储元素,但是deque 在最前端元素的安插和删除操作更有效,末端相同
4 #include<vector>
#include<list>
#include<deque>
5 产生空的容器
list<string> slist;
vector<int> ivec;
6 产生特定大小的容器,每个元素都以千默认的值作为初值
list<int> ilist(1024);
vector<string> svec(32);
7产生特定大小的容器,并为每个软速制定初值
vector<int> ivec(10,-1)
list<string> slist(16,'unassigned');
8 int ia[9]={1,2,3,4,5,6,7,8,9};
vector<int> fib(ia,ia+8);
9 根据某个容器产生新容器,复制软来容器的元素,作为新容器的初值
list<string> slist;
list<string> slist2<slist>
10 push_back(),pob_back() 在容器末尾进行安插和删除操作。在deque和list可以用push_front
和pop_front 在最前面天加和删除操作。
11 fornt() 和back()可以取回最前和最后的值
12 iterator insert(iterator position,elemType value)将value 安插于position 之前,返回一个iterator
指向被安插的元素
list<int>ilist;
list<int>:: it=ilist.begin();
while(it!=ilist.end())
if(*it>=ival)
{
ilist.inert(it,ival);
break;
}
if(it==ilist.end())
ilist.pushi_back(ival);
1 java 类型, hibernate 类型 sql
java .lang.String string varchar
java.lang.String text Text
int int INT
char character char(1)
boolean boolean bit
byte[] binary blob
java.sql.Date date Date
java.sql.Timestamp timestamp Timestamp (载数据库中如果插入为null,数据库系统自动插入为当前值)
2 表述层--》业务逻辑层-》hibernate-》database
3
Configuration config=new Configuration();
config.add(Customer.class);
sessionFactory=conf.buildSessionFactory();
Session session=sessionFactory.openSession();
Transaction tx;
try{
tx=session.beginTransaction();
tx.commit();
}catch(Exception e){
if(tx!=null){
tx.rollback();
}
}finally{
session.close();
}
4 数据库存取blob 对象
1
InputStream in=this.getClass().getResourceAsStream("photo.gif");
byte[] buffer=new byte[in.available()]'
in.read(buffer);
customer.setImage(buffer);
2 byte[] buffer=customer.get.getImage();
File OutputStream fout=new fileOutStream("photo.gif");
fout.write(buffer);
fout.close();
1 class 的定义,一般来说分为两部分,其中一个是所谓的头文件,用来声明class 所提供的各种操作行为
另一个是文件,程序代码文件,用来包含这些行为的实现内容。预使用class 不许在程序中含入其头文件
2 using namespace std
3 template class 机制使程序员直到使用template class 时才决定真正的数据类别。先使用一个代名,
稍后才绑定至实际的数据类别
4 Arrays 要定义array 我们必须指定array 的元素类型,名称,并指定其尺度的大小
array 的尺度必须是个常量表达式
const int seq_size=18;
int pell_seql seq_size=1;
5 vector 必须首先含如vector 的头文件。在角括号中指定其元素类型,其尺度则写作小括号内,不一定
是常量表达式
#include<vector>
vector<int> pell_seq(seq_size);
6 初始化数组和vector
1 初始化数组
int elem_seq[seq_size]={1,2,3,4} ;
int elem_swq[]={1,2,3,4};由编译其根据初始值自动算出array 的值
2 初始化vector
1) vector<int> elem_seq(seq_size);
elem_seq[0]=1;
elem_seq[1]=2;
.....
elem_seq[[17]==22;
2) 利用一个以初始化的array
int elem_val[seq_size]={1,2,3,4}
vector<int>elem_seq(elem_val,elem_val+seq_size); 其中elem_val 为内存地址
7 array 和 vector 的使用
vector 知道自己的大小,而array 不知道
for(int i=0;i<elem_seq.size();i++){
cout<<elem_seq[[i]<<'';
}
8指针 指针为程序引入了一层间接性,我们可以操作指针(代表某特定内存地址),而不再直接操控对象。
指针主要形成两件事,可以增加程序本身的弹性,但同时也增加了直接操控对象时所没有的复杂度
1 int ival=1024
int *p=&ival; 其中*p 指int型对象的地址
2 指针所具有的双重性,既可以让我们操控指针内含的内存地址,也可以让我们操作指针所指定的对象值
pi 指定pi所含有的内存地址
*pi 核定ival的值
3 指针的提领(dereference)
如果pi 寻址到某个对象,则执行提领操作,如果pi 不指定任何对象,提领会导致未知的执行结果
一个为只想任何对象的指针,其内含地址为0,我们称为null,任何指针都可以被初始话,或是令值为0
if(pi&&...)
只有pi含一个非0值时,其结果为true
vector<int> *pv=0;
const int seq_cnt=6;
vector<int> *seq_addres[seq_cnt]={
&fibonacci,&lucas,&pell...
};
一个指针数组,容量为seq_cnt,每个指针都指向vector<int>
4 #include<cstdlib>
rand(seed) 返回一个介于0和seed 之间的随机数
5 对象指针
if(!fibonacci.empty()&&....){
pv.empty()..
}
9 文件写
对文件的读写,首先的含入fstream
#include<fstream>
1 ofstream outfile("seq_data.txt"); 如果文件不存在,产生一个文件,如果文件已经存在,这个文件
被开启作为输出只用,但是源文件中的数据会输调
2 ofstream outfile("seq_data.txt",ios_base::app) 追加模式
3 oufile 为false 表示文件未开启成功
10 文件读
ifstream 将文件名传人,如果文件未能开启成功,ifstream 对象被核定为false ,如果成功,为true
ifstream infile("seq_data.txt");
int num_tries=0;
int num_cor=0;
if(!infile){
//由于某种原因,文件无法开启
}
else
{
string name;
int nt;
int nc;
while(infile>>name)
{
// 一旦读到到文件尾,infile 尾false
// infile>>name>>nt>>nc ,把文件 anna 24 19 分别读到name,nt,nc 中
infile>>nt>>nc;
if(name==usr_name)
{
//find hime
count<<"Welcome back,"<<usr_name
<<"\nYour current score is" <<nc
<<" out of " <<nt<<"\nGood Luck"!\n";
num_tries=nt;
num_cor=nc;
}
}
11 同时读写同一个文件
fstream iofile("seq_data.txt",ios_base::in|ios_base::app);
if(!iofile)
...
else
{
iofile.seekg(0); 将文件重新定位的文件的最末端
}
12
#include<iostream>
#include<string>
using namespace std;
//---------------------------------------------------------------------------
#pragma argsused
int main()
{
string username;
cout<<"Please enter your name:";
cin>>username;
switch(username.size()){
case 0:
cout<<"with no name";
break;
case 1:
cout<<"with one character";
break;
default:
cout<<"hollo ,"<<username<<endl;
break;
}
return 0;
}
13
#include<iostream>
#include<vector>
#include<string>
using namespace std;
//---------------------------------------------------------------------------
int main()
{
vector<int> ivec;
string str;
int val;
while(cin>>val){
ivec.push_back(val);
}
int sum=0;
for(int i=0;i<ivec.size();i++){
sum+=ivec[i];
}
int average=sum/ivec.size();
cout<<"sum of "<<ivec.size()
<<"elements "<<sum
<<"average "<<average<<endl;
return 0;
}
14
//---------------------------------------------------------------------------
#include<iostream>
#include<vector>
#include<string>
using namespace std;
//---------------------------------------------------------------------------
int main()
{
const int array_size=120;
int la[array_size];
int ival,icnt=0;
while(cin>>ival&&icnt<array_size){
la[icnt++]=ival;
}
int sum=0;
for(int i=0;i<array_size;i++){
sum+=la[i];
}
int average=sum/array_size;
cout<<array_size
<<"\n"<<sum
<<"\n"<<average<<endl;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include<iostream>
#include<vector>
#include<string>
#include<fstream>
#include<algorithm>
using namespace std;
//---------------------------------------------------------------------------
int main()
{
ifstream in_file ("D:\inputfile.txt");
ofstream out_file("D:\outputfile.txt");
if(!in_file){
cerr<<"unable to open the inputfile" ;
}
if(! out_file){
cerr<<"unable to open the outputfile" ;
}
string word;
vector<string> text;
while(in_file>>word)
{
text.push_back(word);
}
cout<<"unsort file";
for(int i=0;i<text.size();++i)
{
cout<<text[i]<<" "<<endl;
}
cout<<"sort file";
sort(text.begin(),text.end());// sort the vector
for(int i=0;i<text.size();++i)
{
out_file<<text[i]<<" "<<endl;
}
}
1 条件分之语句
1 简单条件判断
declare
v_sal number(6,2);
begin
select sal into v_sal from emp
where lower(ename)=lower('&&name');
if v_sal<2000 then
update emp set sal=v_val+200
where lower(ename)=lower('&name');
end if;
end;
2 二重条件分支
if v_comm<>0 then
.....
else
........
end if;
3 多重条件分支
IF THEN
ELSIF THEN
ELSIF THEN
ELSE
END IF;
2 case 语句
1 在case 语句中使用单一选择符进行等值比较
declare
v_deptno emp.deptno%type
begin
v_deptno:=&no;
case v_deptno
when 10 then
update emp...
when 20 then
update ......
else
dems_out.put_line('不存在该部门');
end case;
end;
2 在case 语句中使用多种比较条件
declare
v_sal emp.sal%type
v_ename emp.ename%type
begin
select ename ,sal into vv_ename,v_sal
from emp where empno=&no;
case
when v_sal<1000 then
update emp set ...
when v_sal<2000 then
end case;
3 循环语句
1 基本循环
declare
i INT:=1;
begin
loop
insert into temp valuse(1);
exit when i=10;
i:=i+1;
end loop;
end;
2 while 循环
while i<=10 loop
insert into tem valuse(i);
i:=i+1;
end loop;
3for 循环
for i in reverse 1..10 loop
insert into temp values(1);
end loop;
4 顺序控制语句
1 goto
goto label_name;
loop
...
goto end_loop;
<<end loop>>
dbms_output
2 null 语句不会执行任何操作,并且会直接将控制传递道下一条语句
if v_sal<3000 then
update emp set .....
else
null;
end if;
在pl/sql 中只能直接嵌入sql,dml,以及事务控制语句,而不能嵌入ddl语句如create。。和dcl 语句如grant
1 检索单行数据
1 使用游标变量接受数据
declare
v_ename emp.ename%type
v_sal emp.sal%type
begin
select ename,sal into v_ename,v_sal
from emp
2 使用记录变量接受数据
declare
type emp_record_type is record(
ename emp.ename%type,sal emp.sal%type
);
emp_record emp_record_type;
begin
select ename,sal into emp_record
from emp
3 嵌入 select 语句注意的事项:语句必须返回一条数据,且只能返回一条数据,否则回触发例外,或显示错误
1) no_data_found
2) too_many_rows
2 操纵数据
1 插入数据
1) 使用values子句插入数据
declare
v_deptno dept.deptno%type
v_dname dept.dname%type
v_deptno:=&no
v_dname:=&name;
insert into dept(deptno,dname)
values(v_deptno,v_danme);
2)使用子查询插入数据
declare
v_deptno emp.deptno%type:=no;
begin
insert into employee
select * from emp where deptno=v_deptno
3 更新数据
1)使用表达时更新列值
declare
v_deptno dept.deptno%type:=&no;
v_loc dept.loe%type:='&loc';
begin
update dept set loc=v_loc
where deptno=v.deptno;
end;
2) 使用子查询更新列值
declare
v_ename emp.ename%type:='&name';
begin
update emp set(sal,comm)=
(select sal ,comm from emp where ename=v_ename)
where job=(select job from emp where ename=v_ename);
3 sql 游标
1 sql%isopen 用于确定sql 游标是否已经打开。当在pl/sql 块中执行select into ,update 以及delete 语句
时oracle 会隐含的打开游标,并且在语句执行完之后会隐含的关闭游标。
2 sql/%found 用于确定sql 语句执行是否成功。
declare
v_deptno emp.deptno%type:=$no;
begin
update emp set sal=sal*1.1
where deptno=v_deptno;
if sql%found then
dbma_output.put_line('语句执行成功');
else
dbms_output.put_line('not success')
end if
end
3 sql%notfound
4 sql%rowcount 用于返回sql 语句所作用的总计行数
4
1字符函数
1 ascII(char) 返回字符串首字符的ascII 码
2 chr(n) 将asccII 转化成字符
3 v_chr varchar2(10)
begin
v_char:=chr(56);
dbms_output.put_line('ascII 码 为'||v_chr);
end;
4 concat 该函数用于连接字符串,其作用余连接操作符|| 完全相同
5 initcap(char) 用于将字符串中的每个字符大写
6instr(char1,char2) 该函数用于取得子串在字符串中的位置 select instr('morning','n') from ,,,
7 length(char)
8 lower(char)
9 lpda(char1,n,char2) 该函数用于在字符串char1的左端填充字符串char2 ,直至字符串总长的为n,
v_lpas:=lpad('aaa',10,'*');---*******aaa
10 ltrim 去掉字符串char1 左端所包含的热乎字符
select ltirm('morning','m') from dual
11 replace('缺省值为10','缺省','默认')--默认值为10
12 rpad rpad('aaa',10,'*')--aaa*******
13 rtirm
14 substr v_sub:=substr('morning',1,3)
15 upper
2 数值处理函数
1 abs(),floor(),round(),power(),sort(),....
3 日期时间函数
1 add_months(d,n) 返回特定日期时间d 之后,的n个月所对应的日期
v_date:=add_months(sysdate,-14)
2 current_date select current_date from dual
3 current_timestamp
4 dbtimesone
5 extract 从日期时间中取得所需要的特定数据
select extract(year from sysdate) year from dual
6 months_between(d1,d2) 返回日期d1 和d2 之间相差的月数
7 next_day(d,char)
4 转换函数
1 to_char()
2 to_date()
5 集合函数
6 其它单行函数
7 分组函数
1 检索日期
1 select birthday from ...使用的是日期的默认格式
2 使用YYYY-MM_DD 格式 select to_char(birthday,'YYYY-MM-DD') from ..
2 处理null值
1 使用nvl函数处理null值:nvl 函数用于将null 转变为实际值,其语法格式为nvl(exp1,exp2),如果exp1是null 则反会exp2,否则返回exp1
select nvl(comm,0) as salary from
2 使用nvl2 处理null :nvl2(exp1,exp2,exp3),如果exp1 是null 返回exp3,否则返回exp3,exp2 ,和exp3 不可以是long,并需要和exp1匹配
3 连接字符:select eanme||'is a '|| job as "employee detail" form emp
4 在where 中使用 日期值
select * from hiredate>to_date('1982-01-01','YYYY-MM-DD')
5 在where 子句中使用like
select * from ename like 'S%' select * from ename like '__A%' select * from ename like '%a_%' 字符a为转义符
6 插入数据
insert into emp(empno ,ename,job,hiredate)values(1234,'mary','clerk',to_datee('1983-02-02','YYYY-MM-DD'))
insert into dept values(50,'train','boston')
7 使用子查询插入数据
1 使用子查询
insert into employee (empno,ename,sal,deptno,form emp where deptno=20);
2 使用查询执行直接转载
insert /*+append*/ into employee (empno,ename,sal,deptno)
select ..............(大批量数据直接转载时速度更快一些)
8使用多表插入数据
1 使用all 操作符执行夺标插入
insert all
when deptno=10 then into dept10
when deptno=20 then into dept20
when job='clerk' then into clerk
else into other
select * from emp;
2 使用first 操作符执行多表插入L:如果数据已经满足先前条件,并且已经被插入到某表,那么
该行数据在后续插入中将不会被再次使用。即不会出现既插入到dept10 中又插入到 clerk 中的
情况
insert first
when deptno=10 then into dept10
when deptno=20 then into dept20
when job='clerk' then into clerk
else into other
select * from emp
9 更新数据
1 update emp set job default where cname='scott' 如果存在默认使用默认,否则使用null
2 使用子查询更新数据,可以减少网络开销
update emp set (job,sal,comm)= (select job,sal,comm from emp where ename='cmith')
where ename='scott'
3 复制数据 update employee set deptno=7788 where job=(select job form emp where empno=7788)
10 删除数据
1 delete 使用delete 的时候只删去数据,而不会释放空间,可以回退
2 truncate table emp 不仅删除数据,而起回释放空间,不可一回退
11 使用事务控制语句
1 提交事务 commit
2 回退事务
1 回退部分事务:savepoint a
rollback a
2 回退全部事务 rollback
3 只读事务,只允许运行查询操作。可重复读 set transaction read only
4 顺序事务 set transaction isolation level serializable
12 分组函数,作用于多行,一般情况下于group by 字句结合使用,在使用分组函数时,如果忽略了 groub by 则汇总所有的行
select max(sal),min(sal) from emp
select avg(sal),sum(sal) from emp
select count(*) form emp
select count(emp) from emp
13 使用group by and having
1 select deptno,avg(sal),max(sal) from emp group by deptno
2 select deptno ,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000
分组函数只能出现在选择列表,having 和order 中
当选择表包含有列表达式,和分组函数,那么这些列表和表达式必须出现在group by 字句中
3 rollup 和cube 中 产生横向纵向 的统计结果
在使用rollup操作符时,在生成原有统计结果的基础,还会生成横向小计结果,在使用cube 操作
符时,在软有rollup 统计结果的基础,还会生成纵向小计结果
select deptno,job,avg(sal) from emp group by rollup(deptnojob);
select deptno,job,avg(sal) from emp group by cube(deptnojob);
14 连接查询
在使用连接查询时,必须在where 子句中指定有效的连接条件。如果不指定连接条件,或者指定无效的连接条件
那么会导致生成笛卡尔乘积。
1 select e.name,esal, from emp e,dept d where e.deptno=d.deptno;
2 自然连接:在同一张表之间连接查询
select manager.ename form emp manager,emp worker
where manager.empno=worker.mgr and worker.ename='blanke'
3 内连接由于返回满足连接条件的记录,而外连接则是内连接的扩展,还会返回不满足的连接条件的记录
4 左外连接: 不仅返回满足条件的所有记录,而且还会返回不满足连接条件的连接符左表的其它行
select a.name,b,ename from adpt a left join emp b on a.deptno=b.deptno
5 右外连接 right join
6 完全外连接 不仅返回满足条件的所有行,而且还会返回不满足连接条件的所有其它行
select a.dname,b,ename from dept a full join emp b on a.deptno=b.deptno
15 子查询
1 单行子查询 返回一行数据的子查询语句
select ename,sal,deptno form emp where deptno=(select deptno from emp where ename='scott')
2 多行子查询,返回多行子查询
1) 使用in操作符
select ename ,job,sal,deptno from emp where job in
(select distince job from emp where deptno='10')
2)在多行子查询中使用all操作符
select ename,sal,deptno from emp where sal>all(select sal from emp where deptno='30')
3)在多行子查询中使用any操作符 任何一个结果即可
select ename,sal,deptno from em where sal>any(select sal from emp where deptno='30')
3 多列子查询
select ename,job,sal,deptno from emp where (deptno,job)=(select deptno,job from emp where ename='smith')
1) 成对比较示例
select ename,sal,comm,deptno from emp where (sal,nvl(cpmm.-1)) in (select sal,nvl(comm,-1) from emp where deptno='30')
2) 非成对比较
select ename,sal.comm,deptno from emp where sal_in(select sal from emp where deptno='30')
and nvl(comm,-1) in (select nvl) in (select nvl(comm,-1) from emp where deptno=30)
4 相关子查询
SELECT ENAME,JOB.SAL,DEPTNO FROM EMP FROM EXISTS(SELECT l FROM DEPT WHERE.......)
16 在dml 中使用子查询
1)在insert 中使用
insert into employee(id,name,title,salary)
select ename,job,sal from emp
2)update emp sset (sal,comm)=
(select sal,comm fromm emp where ename='smtp')
where job=(select job from emp where ename='smith')
17 在ddl
1 在create table 语句中使用子查询
create table new_emp(id,name,sql,jog,deptno) as
select empno,ename,sal,job,deptno from emp
18 合并查询
1) union 自动去掉集合中重复的行,定对第一列结果排序
select ename,sal,job from emp where sal>2500
union
select ename,sal,job from emp where job='manager'
2) union all 不会取消重复值
3)intersect 取两个结果继的交集
4) ninus 取两个结果结的差集
19 其它复杂查询
1 层次查询
1 oracle universal installer(OUI)
used to install,upgrade,or remove software components and create a database
./runInstaller(unix)
Non-interactive installation using response files
./runInstaller -responsefile myrewpfile -silent(用指定的安装文件)
2 OracleDatabase Configuration Assistant(DBCA)
creaste a database ,configure database options ,delete a database,manage template
3 Database Administrator Users
Sys is the owner of the database data dictionary
System is the owner of additional internal tables and views used by oracle tools
4 Local DataBase Administrator
create os user id
create os group ora dba,ora fox dba
ora_oper,ora_fox_oper
add os user id to ora_dba,group
edit sqlnet file: slqnet.authentication_services=(nts)
you can login in database
conn / as sysdba
5 User Password File Authentication(由于数据库还没有启动,需要利用数据库外面的如文件系统,或口令文件来管理具有特出权限的用户)
1 create the password file using the password
orapwd file='d:\oracle\ora90\database\pwd<sid>.ora' password=admin1 entries=10;
conn sys/admin1 as sysdba
2 set remote_login_passwordfile to exclusice
1 orapwd
2 edit inti parameter file remote_login_passwordfile to exclusive
3 grant system to kang (最多只能授权orapwd 中 entries参数指定用户用户数,具有此特出权限)
revoke sysdba form kong
select * from V$pwfile_users(查看有多少用户具有特出权限)
6 sql/plus
sqlplus /nolog sqlplusw /nolog
set autocommmit on
set linesize 1000
7 Oracle Enterprise Manager Architecture
Oracle Management Server,repository ,agent ,oracle server
oracle 独立登陆,虽然能够联机oracle ,但是很多管理更能不能操作,如backup 等
8 oem console
central launching point for all applications
can be run in thin mode(web) or as a fat client
can bu launched either standalone or through oracle management server
1 An oracle server consists of an oracle instance ans oracle database
2 startup nomount (allocate physical memory)
alter database mount (control file)
alter database open (data file and log file)
3 instance memory strusture
background process
database--data file
log file
control file
4 an oracle instance
is a means to access an oracle database
alwary opens one and only one database
consists of memory and process structures
5 show sga
select * from v$bgprocess;
select * from where v$bgprocess where paddr<>'00'列出必须的后台进程
6 connection to an oracle instance consists of establishing a user connection and creating a session
user process server process
7 an oracle database is collection that is treated as a unti
consist s of thress file types data file control file log file
8 the physical structure of an oracle database is determined by the orpertion system file
that provide the actual
select * from v$controlfile(列出所有控制文件)
select * from v$datafile (列出说数据文件)
53
select * from v$logfile (列出所有日志文件)
9memory structure
oracle menory structure consists of two menory areas known as
sga and pga(程序全局区2)
10 The SGA consists of several menory structures:
shared pool
Database buffer cache
redo log buffer
there are two optional menory structure than can be configured within the SGA
large pool
java pool
11 SGA
show parameter shared (列出系统全局区的参数设置)
show parameter db_cache(列出系统数据库缓存参数设置)
SGA is dynamic an d sized using SGA_MAX_SIZE,调整各个部分值的总合不能超过SGA_MAX_SIZE
alter session set nls_lanage=american
alter system set db_cache_size=64m
12 Share Pool
Share pool is used to store the most recently executed SQL statement s and the the most recently
used data definitions
it consists of two key performance related memory structure
-library cache
-Data dictionary cache
it sized by the parameter share_pool_size
alter system set share_pool_size=64
13 libray cache
The libray cache stores information about the most recently used sql and pl/sql statement
1)Enable the shreing of commonly used statments
is managed by ta least recently used LRU
2)consists of two structures
shared sql area
Shared Pl/SQL area
3)Has its size determined by the shared pool sizing
14 Data Dictionary Cache
The data dictionary cache is a collection of the most recently used definitions in the database
15 Database Buffer Cache
1)The database buffer cache stores copies of data blocks that have been retrieved form the data files
2)it enable great performace gains when you obtain and update data
3)it is managered through a LRU
4)DB_BLOCK_SIZE determines the primary block size
5)show parameter db (列出db 中所有的参数)
6)Consists of indepent sub-cache
db_cache_size
db_keep_cache_size
db_recycle_cache_size
7)Database buffer cache can by dynamically resize to grow or shrink using alter system
alter system set db_cache_xiae=96m
8)DB_CACHE_ADVICE can be set gater statistics for predictin different cache size behavior
alter system set db_cache_advice=on ?
16 The redo log buffer
The redo log buffer cache records all changes made to the database data block
1)its primary perpose is recovery
2)change record within are called redo entries
3)redo entries contain information to reconstruct or redo changes
4)size is defined by log_buffer
17 large Pool
the loarge pool is an optional area of memory in the SGA
1)it relivere the burden placed on the shared pool
2)this configured memory area is used for sesion memory(UGA) ,
i/o slavers and backup and restore operation
3) the large pool does not use an LRU list
show parameter log_buffer
18 Process Structure
Oracle takes advantage of various types of
processes:
1) User process :Started at the time a database user requests connection to the oracle server
2) Serer process connects to the oracle instance and is started when a user establishes a session
3) background process available when an oracle instance is started
19 user process
A suer process is a program that requests interaction with the oracle server
1)it must first establish a connection
2) it does not interact directly with the oracle
20 Server Process
Aserver process is a program that directly interacts with the oracle server
1)it fulfills call generate and returns results
2) can bi dedicated or shared server
21 DBWn write s when checkpoint, dirty buffers threshold reach, no free buffer,timeout ,tablespaxe
offline,tablespacee read only ,table drop or turncate,tablspace begin backup
22 LGWR write
at commit,went one third full,when threre is 1mb of redo ,every 3 seconds ,before DBWn writes
24 System Moritor,PMON
25 Checkpoint
Responsible for signalling DBWn at checkpoints
Updating datafile header with checkpoint information
26 Archiver ARCn
optional background process automaticall archives online redo logs when ARCHIVELOG mode is set
Preserves the record of all changes made to database
27 Lpgoca; Structure
The logical structure of the oracle architecture dictates how the physical space of a database is to be
sued
A hierarchy seists in this structure that consists of tablespaces ,segments ,extents and blocks