oracle小知识点
来源:互联网 发布:电脑淘宝怎么实名认证 编辑:程序博客网 时间:2024/06/05 09:07
select instance_name from v$instance;
2.当oracle数据库中有多个实例,怎样连接其中的某个实例:
conn sys/password@orcl as sysdba
或者 conn sys/password@orcl
3,怎样远程登录到某个oracle实例:
conn scott/tiger@192.168.0.101/orcl
4,在往数据库里插入数据的时候报下面的错:
Exception in thread "main" java.lang.AbstractMethodError:
oracle.jdbc.driver.T4CPreparedStatement.getParameterMetaData()Ljava/sql/ParameterMetaData;
这个可能是数据库驱动问题,驱动版本不对,或者是驱动的jar包忘记加了。
5.五种分类
sql的五大分类:
Data retrieval:数据查询
select
DML:数据操纵语言(行级操作语言):操作的是表格当中一条一条的数据
insert update delete
DDL:数据定义语言(表级操作语言):操作的内容为表格(对象)
create alter drop truncate rename
transaction control:事务控制
commit rollback savepoint
DCL:数据控制语言
grant revoke
集合连接
union:将上下结果取并集,去除掉重复的记录(重复的只显示一次)
union all:将上下结果全部显示
minus:取差集 A-B
intersect:取交集
rownum:记录行号
如
id namerownum
100 zs1
200 ls2
300 ww3
oracle 无密码登录
sqlplus "/as sysdba"无密码登陆。
drop user;
alter user **** identified by 密码;修改用户的密码;
sqlplus sys/bjsxt as sysdba用sysdba的身份登录到sqlplus
conn sys/bjsxt as sysdba;
grant create table,create view to scott;
conn scott/tiger;
alter user scott account unlock;解开账户
查看一个用户下的所有表的名字,:
select table_name from user_tables;
desc 表 :查看表的信息。
dual 表只有一个字段,一个记录。
sysdate 查看日期
保持原来的格式用“”;
计算值:selec 2*3 from dual;
select ename,sal*12 anuual from 表;
任何含有空值的数学表达式计算出来的值都是空值
字符串连接:select ename||sal from emp;
select ename||'ni hao'from emp;
字符串表示单引号引起了的一大串字符。
select ename||'ni''de'有一个单引号是写两个单一号,输出时:ni'de
desc 表 :查看表的信息。
dual 表只有一个字段,一个记录。
sysdate 查看日期
保持原来的格式用“”;
计算值:selec 2*3 from dual;
select ename,sal*12 anuual from 表;
任何含有空值的数学表达式计算出来的值都是空值
字符串连接:select ename||sal from emp;
select ename||'ni hao'from emp;
字符串表示单引号引起了的一大串字符。
select ename||'ni''de'有一个单引号是写两个单一号,输出时:ni'de
distinct 去重,也可以去除组合一样的
select distinct deptno,job from emp;
当deptno字段和job字段的值都一样是,去掉,否则不去,显示出来
select * from emp where deptno=10;
where是过滤条件,
select *from emp where ename='clark';
等值判断,也可以用不等值,>< <>不等于
字符串比较:where ename>'cba' 比较阿斯科码
where sal between 800 and 1500;包含
>=800 and<=1500;是一样的
控制的处理:
select ename,sal,comm from emp where comm is not null;// is null;
where sal in <800,1500,2000>;
where ename in <'ni','hao','ni'>;
对日期的处理:
where hiredate >'20-2月-81';现在只能特定的格式 ,以后会学日期处理函数。
where depton=10 and sal>1000;
where depton=10 or sal<1000;
where sal not in<100,10000>;
模糊查询:
%代表一个多个,_代表一个字母
where ename like '%all%';
where ename like '_A%';
转义字符
默认的是反“\”;
也可以自己指定转义字符:
where ename like '%$%%' escape '$';
select *from dept order by deptno desc;//降序
order by empno asc;//升序
select * from emp where deptno <> 10 order by empno asc;
order by deptno asc,ename desc;
select ename,sal*1 2 annual_sal from emp where ename not like '_A%' and sal>500 order by sal desc;
常用的sql函数:
select lower(ename) from emp;小写
select ename from emp where lower(ename)like'_a%';
select ename from emp where ename like'_a%'
or ename like '_A%';
select substr(ename,2,3) from emp;//从第二个字符开始截,一个截三个;
select chr(65) from dual;//数字转化为字符
select ascii('A') from dual;
select round(23.45) from dual; 23
select round(16.564,2)from dual;16.56
select round(56.564,-1)from dual;十位
select to_char(sal,'$99,999.9999') from em
L 本地货币
0代表以为数字,没有的话,强制补0;
*****systimestamp 时间戳
select to_char(hiredate,'YYYY-MM-DD HH:MI:SS') from emp;
select to_char(hiredate,'YYYY-MM-DD HH24:MI:SS') from emp;
to_date:::
select ename,hiredate from emp where hiredate > to_date('1981-2-20 12:25:22','YYYY-MM-DD HH24:MI:SS');
where sal < to_number('$1,235.00','$9,999.99');
select ename,sal*12+nvl(comm,0) from emp;//必须是同类型的转换,即字符串对应字符串,整形对应整形。
如果comm 为null 用0替代它;
select max(sal) from emp;
select min(sal)from emp;
select avg(sal)from emp;
select to_char(avg(sal),'9999999,99')from emp;
select round(avg(sal),2) from emp;
select sum(sal)from emp;
select count(*) from emp;
select count(*) from emp where deptno = 10;
group by
select deptno,avg(sal) from emp group by depton;
group by depton,job;
select ename from emp where sal =
(select max(sal)from emp);
select ename,max(sal) from emp group by deptno;//错误的
select 后面的查询的项要不出现在组函数中,就必须出现在group by的后面,否则是错误的
select depton,max(sal) from emp group by depton;//正确的
select ava(sal),deptno from emp group by depton having avg(sal)>2000;
having 是对分组的限制。
select avg(sal) from emp where sal>1200 group by deptno having avg(sal)>1500 ordedr by avg(sal) desc;
子查询:
select ename,sal from emp where sal = (select max(sal) from emp);
select ename,sal from emp where sal >(select avg(sal) from emp);
select ename ,sal from emp join(select max(sal) max_sal,deptno from emp group by deptno) t on (emp.sal = t.max_sal and emp.deptno = t.deptno);
************************************
select last_name ,salary from s_emp
join (select max(salary) max_salary ,dept_id from s_emp group by dept_id) t on (s_emp.salary = t.max_salary and s_emp.dept_id = t.dept_id)
、、每个部门平均薪水,平均薪水的等级。
select deptno ,avg_sal ,grade from
(select deptno ,avg(sal) sal_sal from emp group by deptno) t join salgrade s on (t.avg_sal between s.losal and s.hisal);
自连接:每个员工的名字和其对应经理的名字。
select e1.last_name ,e2.last_name from s_emp e1,s_emp e2
where e1.manager_id = e2.id
cross join 交叉连接。
等值连接
select ename,dname from emp,dept where emp.deptno = dept.deptno;//旧语法
select ename,dname from emp join dept on (emp.deptno = dept.deptno);
select ename ,dname from emp join dept using (deptno);//新语法的两种写法,等值连接。
不等值连接;
select ename,grade from emp e join salgrade s on (e.sal between s.losal and s.hisal);
三张表的连接
select ename,dname,grade from emp e join dept d on(e.deptno = d.deptno)join salgrade s on(e.sal between s.losal and s.hisal) where ename not like'_A%';
自连接的新语法L:
select e1.name,e2.name from emp e1 join emp e2 on(e1.mgr = e2.empno);
左外连接:
select e1.name,e2.name from emp e1 left join emp e2 on(e1.mgr = e2.empno);
右外连接:
select e1.name,e2.name from emp e1 right join emp e2 on(e1.mgr = e2.empno);
全连接:
select e1.name,e2.name from emp e1 full join emp e2 on(e1.mgr = e2.empno);
求部门中那些人的薪水最高:
select ename ,sal from emp join(select max(sal) max_sal,deptno from emp group by deptno) t on (emp.sal = t.max_sal and emp.deptno = t.deptno);
select last_name,salary from s_emp
, (select max(salary) max_sal,dept_id d from s_emp
group by dept_id) t where (salary=max_sal and dept_id =d)
求部门平均薪水的等级:
select deptno ,avg_sal grade from (select deptno,avg(sal) avg_sal from emp group by deptno) t join salgrade s on (t.avg_sal between s.losal and s.hisal);
求部门平均的薪水等级
select deptno ,avg(grade) from (select deptno ,ename,grade from emp join salgrade s on (emp.sal between s.losal and s.hisal)) t group by deptno;
求雇员中有那些人是经理人:
select last_name from s_emp where id in(select distinct manager_id from s_emp)
不准用组函数,求薪水的最高值(面试题)
select e1.salary,e2.salary from s_emp e1 left join s_emp e2 on(e1.salary <e2.salary)
或者:
select distinct sal from emp where sal not in(select distinct e1.sal from emp e1 join emp e2 on(e1.sal<e2.sal));
求平均薪水最高的部门的部门编号:
select deptno,avg_sal from (select avg(sal)avg_sal,deptno from emp group by deptno)where avg_sal = (select max(avg_sal) from (select avg(sal) avg_sal ,deptno from emp group by deptno));
求平均薪水最高的部门的部门名称:
select dname deptno avg_sal from dept where depton= (
select deptno,avg_sal from (select avg(sal)avg_sal,deptno from emp group by deptno)where avg_sal = (select max(avg_sal) from (select avg(sal) avg_sal ,deptno from emp group by deptno)));
求平均薪水等级最低的部门的名称:
select dname ,t1.deptno,grade ,avg_sal from
(
select deptno,grade,avg_sal from (select deptno,avg(sal) avg_sal from emp group by deptno) t join salgrade s on(t.avg_sal between s.losal and s.hisal))t1
join dept on (t1.deptno = dept.deptno)
where t1.grade =
(
select min(grade) from (
select deptno,grade,avg_sal from (select deptno,avg(sal) avg_sal from emp group by deptno) t join salgrade s on(t.avg_sal between s.losal and s.hisal))
)
比普通员工的最高薪水还要高的经理人的名称:
select ename from emp
where empno in (select distinct mar from emp where mgr is not null) and
sal>(
select max(sal) from distinct mar emp where mgr in not null);\
rownum 只接受《和《=号’
求薪水最高的前五个人;
select ename,sal from emp where rownum<=5 order by sal desc;
求薪水最高的第六个到第十个人;
select last_name ,salary ,r from
(select last_name,salary ,rownum r from
(select last_name,salary from s_emp order by salary desc)) where r>=6 and r <=10
面试题:比较效率:
select * from emp where deptno=10 and ename like '%A%';
select * from emp where enam like '%A%' and deptno = 10;
理论上第一个的效率高点,但实际也不一定是这样的,也许数据库对其进行了优化。
创建新用户:
backup scott
exp
create user liuchao identified bu liuchao default tablespace users quota 10M on users
gant create session ,create table ,create view to liuchao;
imp
******************************************
DML
insert into dept values(50,'dd','bj');
数据备份:
rollback;
回退
creat table dept2 as select * from dept;
insert into dept2 (deptno,dname) values(60,'games');
update emp2 set sal= sal*2 ,ename =ename||'_' where deptno = 10;
不写where,全部更新。
delete from emp2;
delete from dept2 where deptno=25;
*******************DML结束*******************
rollback;回退
一个事务,起始于一个DML语句,结束于commit;提交了,rollback全部回退。
碰见ddl语句,事务自动提交
当用户自动断开时,事务自动提交
非正常断开的时候,事务自动回退。
数据库常用对象
表:
create table stu
(
id number(6) primary key,
name varchar2(20) not null,
sex number(1),
age number(4),
sdate date,
grade number(2) default 1,
class number(4) references class (id),
email varchar2(50) ,
constraint stu_name_email_uni unique(email,name)//字段的组合必须唯一
)
主键约束:
主键(primary key):可以唯一标识整条记录的一个属性。
主键不能为空,唯一。。逻辑上代表唯一的一个记录。
可以加到表级上:constraint stu_id_pk primary key(id),
也可以多个字段,组合主键:constraint stu_id_pk primary key(id,name),
外键约束:涉及两个表的两个字段或一个表的两个字段。某一个字段会参照另外一个字段的值。**被参考的字段必须是主键**
class number (2) references class (id),
也可以加在表级上:
constraint stu_class_pk foreign key (class) references class(id),
修改表结构:
alter table stu (addr varchar2(100));
alter talbe str drop (addr);
alter table stu modify(addr varchar2(25));
修改约束条件:
alter table stu drop constraint sut_class_fk;
alter table stu add constraint stu_class_fk froeign key (class) references class (id);
删除一张表:
drop table **;
desc user_tables;
当前用户下面有多少张表。
当前用户下有多少长表:
select table_name from user_tables;
当前用户有多少视图:
select view_name from user_views;
当前用户有哪些约束:
select constraint_name from user_constraints;
desc dictionary
*********************************************
索引:
create index idx_stu_email on stu(emali);
也可以为一个组创建索引。为某个字段建立索引,查的时候效率会高,但插入的时候,修改的时候会慢。
访问某个字段的次数多的时候,可以考虑为这个字段建立一个索引。
视图:就是一个子查询。 能简化我们的查询。
一张虚表,可以保护一些私有的数据。
create view v$_stu as select id,name,age from stu;只能看到某些字段。
*********************
序列:
create sequence s_dept_id
increment by 1
start with 4
maxvalue 999999//nomaxvalue,nominvalue,
nocycle
no cache;// cache n;
******************************
数据库设计三范式:
范式:数据库设计是要遵循的一些规则,姓范的兄弟设计的。所以叫范式。
数据库设计的目标:不存在冗余数据,
一范式:
1.要有主键,
2.列不可分,也不能重复,
第二范式:
不能部分依赖,依赖主键。
第三范式:
1NF:一个table中的列是不可再分的(即列的原子性)
2NF:一个table中的行是可以唯一标示的,(即table中的行是不可以有重复的)
3NF:一个table中列不依赖以另一个table中的非主键的列,还是不通俗!巨寒!!
******************
PL/SQL
set serveroutput on;
begin
dbms_output.put_line('helloworle');
end;
declare
v_name varchar2(200;
begin
v_name := 'myname';
dbms_output.put_line(v_name);
end;
/
declare
v_num number := 0;
begin
v_num := 2/v_num;
dbms_output.put_line(v_num);
exception
when others then
dbms_output.put_line('error');
end;
/
变量声明的规则:
变量名不能使用保留字,如:from
第一个字符必须是字母
变量名最多包含30个字符
不要与数据库的表或者列同名
每一行只能声明一个变量
常用的变量的类型:
binary_integer:整数,主要用来计数而不是用来表示字段类型
number:数字类型
char:定长字符串
varchar2:变长字符串
date:日期
long:长字符串,最长2gb
boolean:布尔类型,可以取值为true,false,和null值。
table变量类型
declare
type type_table_emp_empno is table of emp.empno%type index by binary_integer;
v_empnos type_table_emp_empno;
begin
v_empnos(0):=7369;
v_empnos(2):=5897;
v_empnos(-1):= 9999;
dbms_output.put_line(v_empnos(-1));
end;
--Record 变量类型
declare
type type_record_dept is record
(
deptno dept.deptno%type;
dname dept.dname%type;
loc dept.loc%type;
);
v_temp type_record_dept;
begin
v_temp.deptno :=50;
v_temp.dname :='aaa';
v_temp.loc :='bj';
dbms_output.put_line(v_temp.deptno ||' '||v_temp.dname);
end;
--使用%rowtype声明record变量
declare
v_temp dept%/rowtype;
begin
v_temp.deptno :=50;
v_temp.dname:='aaa';
v_temp.loc :='vj';
dbms_output_line(v_temp.deptno ||' '|| v_temp.dname);
end;
在pl/sql中select语句中,有且只能有一条语句返回。必须和into一块使用。
declare
v_emp emp%rowtype;
begin
select * into v_emp form emp where empno = 7369;
dbms_output_line(v_emp.ename);
end;
declare
v_deptno dept.deptno%type :=50;
v_dname dept.dname%type :='aa';
v_loc dept.loc%type :='bj';
begin
insert into dept2 values(v_deptno,v_dname,v_loc);
commit;
end;
游标
存储过程:
执行存储过程:
exec p;
或者:
begin
p;
end;
DDL:数据定义语言。
- Oracle 小知识点
- Oracle小知识点
- oracle 小知识点
- ORACLE小知识点
- Oracle小知识点
- oracle 小知识点
- oracle小知识点
- Oracle小知识点
- oracle小知识点
- Oracle小知识点
- oracle 小知识点
- oracle 10g 小知识点
- 关于oracle的小知识点
- oracle常用小知识点备忘录
- Oracle 小知识点(备忘)
- Oracle碰到的小知识点
- oracle database的几个小知识点
- 小知识点
- louis vuitton outlet store-614861
- C++学习之STL线程安全性考虑
- louis vuitton outlet store-010830
- otool 与dylib
- coach outlet store online-576128
- oracle小知识点
- UVA 12124 UVAlive 3971 Assemble(二分 + 贪心)
- 迷你播放器--第一阶段(6)--添加搜索定位功能(进阶)-使用filter过滤以及对汉语拼音的排序匹配
- ios--block用法之UIAlertView控件的修改
- ARM-Linux触摸屏驱动移植--问题总结
- centos上安装nodejs
- js object如何获取key值
- C++/CLI学习入门(三):数组(转)
- POJ 3934 Queue(DP)