1. 可以用什么存放数据及它们的优缺点?
<1>可以用文件或者数据库存放数据
<2>文件存放的缺点:
不安全,不利于数据的查询和管理 ,不利于存放大量的数据,文件在程序中控制不方便
2. Oracle的三层结构: ..........
细节: Oracle的数据对象包含 表,视图,触发器,函数,序列,包等等。
3. 各种数据库优缺点的比较: .............
4. Oracle的安装系统的要求:
系统最好是windows server
大约要吃掉0.25的内存
占用2g的硬盘空间
Oracle的安装演示:
下载地址:http://download.oracle.com/otn/nt/oracle10g/10201/10201_database_win32.zip
http://download.oracle.com/otn/nt/oracle10g/10201/10201_client_win32.zip
把10201_database_win32.zip解压,安装到指定的文件夹中。
注意:
1. 要安装在没有中文的文件夹中,习惯上文件夹建两层
2. 以前的Oracle一定要卸载干净
3. scott用户不能禁止,应该打开。(如果禁止了,则需要输入命令: alter user scott account unlocked;)
4. 只需要启动后面两个服务(如果需要用企业管理器的话,则需要启动第一个服务)
Oracle工具的安装:...
5. Oracle常见的开发工具:
1. 使用黑窗口来开发,输入sqlplusw(使用自带的工具来开发)
2. 使用自己下载的工具来开发
3. 用企业管理器来开发(启动第一个服务)
6.9g与10g的区别?
1.所谓9g到10g是表示了增加了网格的计算
2.安装更加的方便
3.增加了浏览器管理器
7. 常见的sql的命令:
alter user scott account unlocked;
conn scott/tiger;
show user;
password scott;
disconnect ;
exit;
&;
edit;
spool;
set linesize 140 (默认是80,所以容易换行)
set pagesize 18 (默认显示14行)
--------------------------用户管理---------------------------------------------
1. 创建一个用户,并且给它一些权限。
eg:conn system/system;
create user xiaogang identified by xg7480158
default tablespace users
temporary tablespace emp
quota 3m on users
; (注意:密码的第一个不能使数字;权限必须是system,sysdb)
grant create session to xiaogang;
grant connect to xiaogang; //给它连接的角色
grant resource to xiaogang; //给它创建表,curd的角色
conn system/system;
revoke connect from xiaogang;
revoke resource from xiaogang;
drop user xiaogang cascade; (注意:一定要加cascade,把以前它创建的表也要一起删除,不然会报错)
2. 理解什么临时表空间?
在磁盘中有许多的文件,为每一个文件分配了不同的表空间,可以在创建表的时候指定放在哪个表空间中。
3. 什么是系统权限,什么是对象权限?
系统权限主要是指 create session ,create table,create trigger....
对象权限主要是指: insert,delete,update,select
4. 什么是方案?
每一个用户对应着一个方案,在方案中会有不同的表。
eg:如何让scott的表给给xiaogang看?
conn scott/tiger;
grant select on emp to xiaogang;
conn xiaogang/xg7480158;
select * from scott.emp; (注意:只有这样才能区分要用哪一张表,如果不写scott的话,则默认为xiaogang方案的那一张表)
5.*********
如何将权限的分派? 1-》2--》3
whth admin option //系统权限的分派
with grant option //对象权限的分派
6. dos常见的命令:
lsnrctl start 【启动监听服务】
oradim -startup orcl 【启动数据库的实例】
7. profile对口令进行管理
create profile 文件名 limit failed_login_attempt 3 password_lock_time 2; 如果登录失败3次就被锁住两天,密码对了也上不了
create profile 文件名 limit password_life_time 10 password_grace_time 2; 生命周期三天,还可以宽限2天
alter user 用户名 profile 文件名
alter user 用户名 account unlock 对用户名进行解锁
8. --------------------------- Oracle登录的认证方式和找回密码 ----------------------------------------------------------
如果系统当前用户(注意:不是登录oracle的用户)是以sysdba的身份登录oracle,则是系统验证,而不是oracle验证。就直接进去了。
并且登录之后的用户是sys用户。
eg: conn xxxx/xxx as sysdba;
show users; "SYS"
解决方案:
搜索sqlnet.ora,修改 SQLNET.AUTHENTICATION_SERVICES= (NTS) 为 SQLNET.AUTHENTICATION_SERVICES =(NONE)
这样,则系统用户也要经过oracle认证。
如何找回密码:
搜索pwd.ora,然后复制一份放在里面以防万一,在cmd中输入以下命令:
orapwd file = d:\myoracle\oracle\pwd.ora password = huxin entries=10;
9. ------------------------------ oracle的数据类型详解 ------------------------------------------------------------------
文本,二进制类型
char(n) 定长的,最大为2000个字符。 读取方便
varchar2(n) 可变的,最大为4000个字符。
nchar(n) 定长的,编码方式是unicode。比如说汉字是占用一个字符的空间。
clob 字符型大对象
blob 二进制的 (比如说文件,图像存放在数据库中)但是一般不建议使用这种方法,效率不高,速度很慢。可以通过流来实现。
数值类型
number 使用number的范围最广,最大可以为22个字节
123.69 number(6,1) 123.7
123.69 number(4,2) 会报错
123.89 number(6,-2) 100
有效位是指第一个从非零单位开始算起, p是1-38,q是-84到127。
使用dump(price)查询
日期类型
Date
注意:当我们插入数据的时候,可能插不进去。因为习惯插入格式为 'dd-mm-yyyy';如果我们希望使用自己习惯的日期格式添加,则需要使用函数来实现。
Timestamp
注意一点就行: 当改变这一条记录的时候,这个日期字段也会跟着动。
10. ------------------------------------ oracle的curd操作 ---------------------------------------------------------------------
关于update的操作:
注意的问题: update students set fellowship = 1000 where fellow = null;这种写法是错误的
应该写成 update students set fellowship = 1000 where fellow is null;!!!!!
关于delete的操作:
注意的问题:
1.当一张表删不了的时候,注意级联的问题
2.注意,删除是指删除数据,而不是删除表,如果要想删除表,使用drop table 表名
3.如果使用delete的删除,可以找寻它的数据,只要设一个savepoint aa; rollback to aa;数据又回来了。
4.使用truncate的删除,速度快,但是不可回滚。
关于查询的操作:
注意的问题:
1. 用distinct取消重复行 eg: select distinct deptno,job from emp; (所谓重复指的是查出来的两列完全一样)
2. sql不区分大小写,但是内容区分大小写。
3. nvl()函数可以去掉null的问题,实际上null值就是一个无底洞。
4. 可以使用 ename || '是一个'|| sal来让数据更加的清楚。
一道面试题:
如果需要删除该用户,而又可以使用该用户的数据对象,应该怎么办?
首先用 system 的身份登录,然后可以锁定该用户。这样就行了。
关于where的查询:
1.使用like,%,-进行模糊查询。
2.使用in进行包含查询。
3.使用is null的空查询。
4.or and ()进行逻辑查询。
5.使用order by sal asc进行升序查询,使用 sal desc进行降序查询。
6.使用别名进行查询。
------------------------------------------- 分组查询 -------------------------------------------------------------
常见的分组函数与group by ,having,order by的使用。
max min (注意:如果有两个都是最大的话,它会随便返回一个值)
avg (注意:它是对不为null的,进行求平均) 所以可以这样用: eg: num(sal)/count(*)
num
group by cube(1,2) ***********老是爱考这个cube
1. 分组函数必须放在选择列或者having或者order by中!!!!!!!!!!
2. 顺序不能错
3. 列或者表达式必须有一个出现在group by中。否则会错报!
自连接: 注意:是从右到左的。
11. ---------------------------------------- 多表查询----------------------------------------------------------------
1.多表查询出现笛卡尔积德原理。(条件的个数等于表的个数-1)
2. all,any用于子查询。
注意: any指的是比它的一个高就行。
补充:一个重要的子查询:多列子查询。关于并列条件的问题(又包含子查询) where (sal,job) = (select sal,job from emp);
3. 常见的一些查询的方法:
把一个子查询当作一个一张临时表对待。
注意:在子查询中不能用order by 排序,这是么有意义的。
12. --------------------------------------- 分页查询 ----------------------------------------------------------------------
通过三层机制,过滤特别的快。(使用rownum,表上没有这个字段,但是可以使用)
eg: select t2.* from (select t1.*,rownum rn from (select * from emp) t1 where rownum < 6) t2 where rn >=3;
注意:rownum在第二层过滤的时候,要使用别名。
可以用于测试效率
如果复制一张表?
create table mytest as select * from emp;
如何实现行迁移?
create table emp# as select ename from emp where ename like 'S%';
如何重复插入数据?
insert into mytest values (ename,sal,deptno) select * from emp;
insert into mytest values (ename,sal,deptno) select * from emp;
insert into mytest values (ename,sal,deptno) select * from emp;
如何使用子查询完成更新?
update emp set (deptno,sal,comm) = (select deptno,sal,comm from emp where ename='SMITH') where ename='scott';
13. --------------------------------------- 合并查询 ------------------------------------------------------------------------
union : 会去掉重复的行。
eg : select ename,sal,job from emp where sal>2500 union select ename,sal,job from emp where job ='MANAGER';
注意: 列名要完全一样
union all :不会去掉重复的行,不会排序。
intersect : 取得两个结果集的交集。
minus : 取得两个结果集的差集。
14 ---------------------------------------- 内连接与外连接 ------------------------------------------------------------------
内连接:特点是只有两张表同时匹配上的时候,才被选中。
select emp.ename ,deptno.dname from emp, dept where emp.deptno = dept.deptno;
等同于如下写法:
select emp.ename, deptno.dname from emp inner join dept on emp.deptno = dept.deptno;
外连接: 左连接(突出左边),右连接,全外连接
select stu.name,exam.grade from stu left join exam on stu.id = exam.id;
select stu.name,exam.grade from stu ,exam where stu.id = exam.id(+);
右连接: 同理
全外连接:
select stu.name,exam.grade from stu full outer join exam on stu.id = exam.id;
15. 如何创建一个数据库的实例?
方法一: 在电脑的程序中找到oracle中dca的目录按步骤安装。
方法二: 建文档安装
注意: 在连接的时候,注意要指定连接哪个数据库的实例。
16. java操作数据库的细节:
1.DriverManager是一个类,而不是一个接口
2.遇到异常的时候,还可以 throws RuntimeException(e.printStackTrace())
3.通过数据源连接数据库
步骤一: 通过控制面板,配置数据源
步骤二:
driver: sun.jdbc.odbc.JdbcodbcDriver
url : "jdbc:odbc:数据源";
注意: 什么时候使用jdbc ,jdbc-odbc?
如果数据库与java程序不在同一台机器上面,使用jdbc,在同一台机器上,两者都可,总是一个原则,jdbc优先。
17. --------------------------------------- 68个重要的函数大全 -----------------------------------------------------------------
-------------字符函数-----------------
1.将一个字符串装换成指定格式的日期类型。to_date
eg : insert into emp (empno, hiredate) values (2222, to_date('1991-02-27','yyyy-mm-dd'));
2.将冒一个字段的数据a替换成中国。 replace
eg : select replace(ename,'a','中国') from emp;
注意:实际上表中的数据没有改变,只是换了一种表现形式。
3. 取出冒一个字段的长度。 length
4. 出掉两端的一些字符: ltrim,rtrim,trim
ltrim(' ni hao ','') 就把左边的空格去掉了
trim ('a' from 'aaahuxina') from dual;
--------------- 数学函数 --------------
5. asin, atan, cos,cosh ,sin , sinh, sqrt反正弦,反正切,余弦,反余弦值,正弦值,双曲正弦,平方根
6. ceil 返回大于或者等于的给出的数字的最小整数。
比如 3.14 返回一个4
7. exp 返回一个数字的e的N次方根。
8. floor 对给定的数值取整数的那一部分。
9. ln 返回对数值
10. log(n1,n2) 返回一个以N1为底,n2的对数。
11. mod ,求余数。
12. power(n1,n2),返回N1的n2次方根。
13. round 四舍五入
14. trunc 默认截断它的整数的一部分。还可以指定截取多少位。
eg : trunc(3.1415,3) 返回3.141
15. sign 返回符号, 大于零返回1, 小于零返回-1, 等于零返回0.
---------------- 日期函数 ----------------
16. 返回一个系统的时间:(默认返回的只有年月日)
SQL> select sysdate from dual; (这是默认显示的格式)
SYSDATE
-----------
2012-12-18
select to_char(sysdate,'yyyy-mm-dd , hh24:mi:ss') from dual;
17. add_months 增加当前的月份 (需求:如果要返回3个月份内入职的员工,可以增加三月与当前的sysdate进行比较)
18. to_date,to_char
19. last_day 将日期改为最后一天,然后返回系统的时间。
SQL> select last_day(sysdate) from dual;
LAST_DAY(SYSDATE)
-----------------
2012-12-31 下午 12:
20. months_between(date2, date1) 返回月份的差值。2000年到2005年,则返回-60
21. new_time(date,'this','that');
22. next_day(date,'星期五');
eg : select next_day(sysdate,'星期一') from dual;
NEXT_DAY(SYSDATE,'星期一')
--------------------------
2012-12-24 下午 12:42:26
23. chartorowid 将字符类型转换成为 rowid类型
eg: select rowid, rowidtochar(rowid),from emp;
24. to_char 再说明
select to_char(sal,'L999G999D99') FROM EMP; 用另外一种格式显示薪水。
25. to_number 将字符串转换成数字。
eg: select to_number('1999') year from dual;
26. decode 相当于一个switch的语句。
eg: select decode(deptno,10,'十号部门',20,'20号') from emp;
27.可以用来看内部的数据 dump
28. greatest可以返回一个字符编码较大的函数。
least返回一个最小的。
eg: select greatest('aa','bb','cc') from dual; 返回的是cc
29. uid唯一标识用户的整数。
-------------------- 7个系统函数 -------------------------
sys_context
1.terminal : 当前会话客户所对应的终端标识符
2.language
3. host
4.db_name
5.nls_date_formate 当前用户多对应的日期格式
6. session_user
7.current_schema 所对应的默认方案名
eg: select sys_context('schema','current_schema') from dual;
18. ******************************** 事务 ****************************************************
1. 事务的概念:(如果不知道事务的话,人家会笑死了,哈哈)
事务时把数据库的一系列的操作看做是一个整体,要么全部成功,要么全部失败。事务具有原子性。
比如说转账的问题,一个银行加钱,一个银行减钱。只有所有的操作完成以后再提交事务。
2. 保存点的说明:
如果事务没有提交就可以进行回滚。
注意:1.可以有多个保存点。
2.当事务提交了之后,就不能进行事务的回滚了、
3. 在java程序中通过事务来处理crud (create,read,update,delete)
注意: 1.什么时候使用事务的处理?
当一个事务中存在多个insert,update,delete的操作的时候,使用事务的处理。
2.conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); java程序中默认为READ_COMMITTED。
4. 隔离级别的问题:
read commited
oracle默认的方式,没有脏读,但不可重复读(说不准先读有,后再读就没有),和幻读(数据自动改变了)。
serilizable 无脏读,不可重复读,幻读,可以增删改查
read only 不可以crud操作。
19. -------------------------------- 表的完整性 -------------------------------------------------------------------
三种方法维护表的完整性:
约束,序列,索引, 程序
约束: primary key ,unique, not null, default, check(), references(外键可以为空,但是主键一定要唯一)
注意: 如果要修改表的一些约束,则使用如下语句:
eg: alter table goods modify goodNames not null;
eg: alter table customers add constraint 约束名 unique(adreass);
eg: alter table customers add/drop constraint 约束名 check(adreass in ('蕲春');
eg: alter table customers drop constraint 约束名 ;
eg: alter table customers drop primary key cascade;
注意:有时需要带一个cascade!!!!!!
序列 :如何创建和使用序列
create sequence myseq
start with 1
increment by 1
minvalue 1
maxvalue 3000
cycle
nocache
;
insert into students values (myseq.nextval , '胡鑫');
注意:1. myseq.nextval是返回序列的下一个值,而 myseq.currval 是返回当前的序列值。
只有先myseq.nextval初始化之后,才能 myseq.currval,不然会报错。
2. 多个用户可以共享一个序列。而且是接着那一个序列进行编号。
3. 序列一般是用于主键或者unique,并且类型是number
4. nocache的意思是在缓存中存一些序列,然后取出,提高效率,但是当数据库突然断掉的时候,会出现序列的丢失
有可能出现跳号。
索引: create index index_name on students(id,name);
补充: 创建索引一般是大量的数据库,并且维护需要花费很大的代价。
有单列索引,多列索引,还有复合索引....等等。
20. ------------------------------- 权限与角色 ---------------------------------------------------------------------------
系统权限 : 1. 共有166种。 可以通过命令查看 select * from system_privilege_map order by name;
常用的有 : create session , create table ,create view ,create trigger, create procedure,create cluster,
create public synonym.
2. 主要是对数据库的管理与以及对数据对象的操作(创建,删除,修改)。
对象权限 : 1. 共有17种,可以通过命令查看 select distinct privilege from dba_tab_privs;
2. 主要是对数据对象内部值的一些操作。
数据字典 : 会记录哪一张表会自动创建...等等。
案例 : conn system/system
create user ken identified by 123;
create user gougou identified by 123;
grant create session to ken with admin option; (将系统权限给一个用户)
注明: 用了with admin option的话,则可以以ken的身份给gougou授权。
revoke create session from ken;(不是级联回收)!!!!!!!!!!!!!!!!
grant select/update/delete/all/alter/execute on scott.emp to ken with grant option; (将对象权限给一个用户,可以由本人给权限)
注意: with grant option只能授予用户,
使用:with grant option
eg: conn scott/tiger;
grant select on scott.emp to monkey with grant option;
conn monkey/monkey;
grant select on scott.emp to join;
回收对象的权限: 注意:是级联的
revoke select on emp from monkey;
角色 : 是权限的集合。
33种预定义的角色,常用的有: connect, resource, dba;
在system的用户下使用命令查询 : select * from dba_roles;
看看一个角色有哪些权限?
select * from dba_sys_privs where grantee ='DBA';
注意: 角色的名字要大写
sys/system用户默认为dba的角色,但是这个角色没有关闭数据库的功能。
自定义的角色:由sys/system的用户来建立,别的用户如果需要建立则需要具有create role的系统权限。
如何创建自定义的角色?
create role '角色名' not identified;
或者 create role '角色名' identified by '密码'
grant create session to '用户名'
接着就可以使用这个角色了。
drop role '角色名'
常见的命令:
显示所有角色 select * from dba_roles;
显示角色具有的系统权限 select privilege,admin_option from role_sys_privs where role=‘角色名';
显示角色具有的对象权限 select granted_role, default_role from dba_role_privs where grantee = '角色名';
查看某个用户具有怎么样的角色? select * from dba_role_privs where grantee ='用户名';
注意: 用户名和角色名都要大写,不然会查不到的。