千家信息网

数据库——oracle

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,为什么要用数据库?文件存储:1、不易于管理和分析(Linux操作系统下输入ls命令会卡死)2、不易于共享3、文件内容不断增大,不易于存储数据库:用数据结构来管理、存储数据的仓库DB:Database数
千家信息网最后更新 2025年01月23日数据库——oracle
为什么要用数据库?文件存储:1、不易于管理和分析(Linux操作系统下输入ls命令会卡死)2、不易于共享3、文件内容不断增大,不易于存储数据库:用数据结构来管理、存储数据的仓库DB:Database数据库DBMS:数据库管理系统数据库软件:Oracle  MySQL  db2    sql-server   sybase关系型数据库:由二维表组成非关系型数据库(NOSQL   not only  sql):Web  高并发性mongodb   redis关系:二维表二维表:由行和列组成的表格行:Record一条记录信息列:字段(Feild) 属性SQL:(structured  query  language 结构化查询语言)Oracle甲骨文Java   sun ---> oracle收购Mysql   my ----> sun(2008年1) ---> oracle(2009年4)db2IBMSybasesybase  C/S数据库Sql server  MS 微软现在是oracle的天下Oracle商业(收费)大型数据库个人使用Sql serverWindows 商业(收费)Mysql开源免费  --->收费免费版本(不提供服务)一般中小型企业用mysql阿里用mysql移动、联通、电信都用oracle 数据库是以二维表的形式存储数据数据库客户端:sqldeveloperplsql developer(公司一般用)查看数据库里有哪些表:select * from all_tables;显示用户有权限看到的所有的表,包括系统表select *from user_tables;当前用户的所有表selet *from dba_tables;是管理员可以看到的数据库中所有的表数据库不难,提升效率难:如双11SQL:所有数据库基本通用的语言所有数据库都遵循一套规则主体语言:Java脚本:数据库:数据结构和算法:业务知识,业务框架:SQL:DDL:Data Definition Language数据定义语言(操作对象是表)关键字:CREATE:创建数据库对象  建表DROP:删表ALTER:改表结构TRUNCATE:删除表数据,不删除表结构DML:Data Manipulation Language数据操作语言(操作对象是表的记录)关键字:INSERT:插入数据DELETE:删除数据UPDATE:修改数据影响的数据,需要事物控制语句才能生效eg:一张表里两个字段的值Update** set coll=**,col=**;TCL:Transaction Control Language事物控制语句关键字:COMMIT:提交,确定把数据提交到数据库ROLLBACK:回滚,把影响数据的操作撤销SAVEPOINT:设置保存点,更有利于回滚到特定的场景DCL:Data Contro Language数据控制语句(操作对象是用户student)关键字:GRANT:赋权REVOKE:回收权限CREATE USER:创建用户企业中对权限管理非常严格:允许插数据,不允许删数据DQL:Data Query Language数据查询语句关键字:SELECT oracle数据类型:1、数字类型(只用NUMBER)NUMBER(p,s)P表示总位数S:表示小数的位数可正可负,最多位数为38位INTERGER == NUMBER(38)例子:NUMBER(7,3)能表示的最大的数:9999.999 2、字符串类型CHAR(n):固定长度的字符,定长字符串n可以省略,默认为1指定n,代表n个字节宽度,即使存储的数据的字节小于n,也占n个字节,其余的补空格最长只能存储2000个字节VARCHAR2(n):变长字符串N表示字符串最大的长度Varchar2(100)只存储10个字符,实际上字符串占的内存和它自身长度是一致的如:varchar2(100) hello存储5个字节节省内存最长能存储4000个字节LONG:2GBCLOB 3、时间类型DATE默认'DD-MON-YY(RR)'Systimestamp  时间辍  (时间毫秒)Sysdate 系统时间 DDL:CREATEcreate建表:Create  table  table_name(字段名1   字段类型,字段名2   字段类型,....);自动提交,不用COMMIT all_tables:记录数据库所有的表//owner属有者,拥有者Table_name:表名user_tables:记录当前用户下所有的表//dba_tables:记录所有的表,包括系统表(现在不讲) 约法三章:1、同一个数据库,同一个用户下,只能有唯一的标识符,同名的表只能有一个;2、不要用别人的表;3、自己建了之后记得删掉Sql语句除了字符串里的内容,都要是英文的创建表:create  table  ly_student(name varchar2(20),id number(12),gender  char(1),birth  date);Number:默认38位查看表结构:desc wly_student;能够查看表的所有字段以及字段类型 往里面插入数据:Insert into table_name(字段名)   values(值);字符串用单引号表示 ' '日期:to_date('2017-08-02','YYYY-MM-DD')alter session set nls_date_format = 'yyyy mm dd hh34:mi:ss';select sysdate-1,sysdate,sysdate+1 from dual;查找昨天,今天,明天这一时刻的时间,按指定格式输出插入:insert into ly_student(name,id,gender,birth)values('龙',001,'M',to_date('2017-08-02','YYYY-MM-DD'));精度或者位数超长,报错!Commit;//插入后要提交EMPLOYEE_ID NUMBER Primary Key:主键(唯一非空:值不能有重复)当前面赋值过的值,后面再次被赋值时,会报错,必须赋值查看表的内容:seletct * from wly_student;comment on table ly_student is 'student information';comment on column ly_student.name is 'student name';comment on column ly_student.id is 'student id';comment on column ly_student.gender is 'student gender';comment on column ly_student.birth is 'student birth';完整的建表语句:建表的sql脚本及表和字段的详尽说明===============================================drop:删除表drop table ly_student;按照表名查找特定的表:select * from user_tables where table_name like '%LY_STUDENT&';like '%LY_STUDENT&' 可以换成=table_name需要注意的是:表名大写drop table ly_student;create  table  ly_student(name varchar2(20),id number(12),gender  char(1),birth  date); Alter table table_name add(字段名 字段类型);alter table ly_student add(address VARCHAR2(100));Alter table table_name drop column字段名;Alter table table_name drop column address;删除字段时,要逐行删除该字段的数据,当数据量较大时,效率会比较慢Alter table table_name modify(字段名 字段类型);Rename  old_table_name to new_table_name;修改一个表的名字  模型DDL语句  CREATE  drop  alter提交DB变量流程,提供 建表:1、emp:员工表id:员工idnumber(5)first_namelast_name     varchar2(20)Gender性别char(1)birth 生日datehiredate  入职时间dateDeptid  部门idchar(2)2、Dept表:部门表Id:部门idchar(2)Name:部门名称varchar2(40)插入三个部门,每个部门插入若干员工 建表加复制数据Create table table_name as select * from other_table_name;*表示复制所有字段Create table table_name as select id,name from other_table_name;可以Create table table_name as select id*2,name from other_table_name;不可以(因为other_table_name里面没有"id*2"这个字段名)表名不区分大小写修改字段的类型,(如果有记录可能报错)Alter table table_name modify column_name type;修改字段的名字Alter table table_name rename column old_column to new_column DML:(所有操作只有不commit,都可以通过回退,得到原来的数据)Insert into  table_name(字段名)  values(值);csex CHAR(6) check(csex='男' OR csex='女'),//如果插入数据不是男或者女,会报错如果插入全表的字段,table_name后面可以省略字段名;如果是指定插入某些字段,或者值的顺序和字段名的顺序不一样,则需要字段名和值一一匹配。修改字段的值:Update table_name set字段名1=值1,字段名2=值2;全表所有记录的该字段的值都被修改了Update table_name set 字段=值 where condition;不带where条件的update请慎重!删除记录:Delete [ from ] table_name;全表的数据被删除,不带where条件的delete请慎重!删除指定数据:Delete [from] table_name where condition;Truncate:清空表数据,不会对表结构造成影响Truncate table table_name和delete table_name都可以把表里的数据全部清空(删除)1、truncate 不可以带条件,delete可以有2、Truncate 删除数据不可以修复,delete可以通过rollback将删除的数据回复回来(如果commit了,则回退不了)3、Truncate效率非常高,delete效率比较慢,如果实际中需要清空一张表,优先选择truncate TCL:(transaction)Commit:提交Rollback:执行DML语句之后,只要没有commit;都可以回退;但是如果执行了commit,再去rollback都无法回退。DQL:selectSelect * from table_name;*代表所有字段都显示,查询tabble_name所有字段的所有记录Selete 字段1,字段2,...from table_name查询指定字段的信息字符串函数:concat   ||拼接字符串Concat(char1,char2)  concat可以连用注意转义字符 'select concat(first_name,last_name) from ly_emp;  //拼接select first_name||' '||last_name name from ly_emp; //拼接,中间加空格select first_name||''''||last_name name from ly_emp; //拼接,中间加 ' dual 测试表Length:求字符串的长度char类型的长度是固定的,varchar2是根据字符串的长度Lower:将字符串小写Upper:将字符串大写Initcap:首字母大写,其余小写Trim(c1 from c2):把字符c1从字符串c2两端去掉Ltrm(c1 c2):把字符c2从字符串c1左边去掉Rtrim(c1,c2):把字符c2从字符串c1右边去掉Lpad(char1,n,char2):把char1填充为n个字节,在左边补char2如果n小于length(char1),则会截断,右边截断,剩下左边Rpad:与lpad相反select rpad('abcd',7,'*') from dual; ---> abcd***translate(char1,char2,char3);把字符串char1里面和char2相同的字符,变成char3select translate('hello','le','WX') from dual; ----> hXWWoreplace(char1,char2,char3):把char1中的char2子字符串换成char3字符串,如果没有char3,则表示去掉char2子字符串部分;Substr(char1,n,m)从字符串char1中,从第n个开始截取,截取m个字符n=0(或1)表示从第一个字符开始截取,n<0表示从末尾倒数第n个开始,-1表示最后一个字符Instr(char1,char2,n,m)在char1中匹配char2,从第n个字符开始,匹配第m个,返回下标如果匹配不到,返回0Ascii(char1):求字符串char1第一个字母的ASCII码值 Number函数:Round(n,m):m>0,表示保留m位小数,四舍五入m<0,表示保留m+1位数字,四舍五入select round(123.23,-2) from dual;------> 100Trunc(n,m):和round是一样,但方法不一样,直接舍弃Ceil(n):向上(大的)取整select ceil(-125.56) from dual; ---> -125Floor(n):向下(小的)取整select floor(-125.56) from dual; ---> -126Mod(n,m):取余n%m:当m=0时,直接返回0函数可以直接作用于字段Emp(salary number(8,2) );Select salary*12 from number;To_date();按格式把字符串转换成一个日期YYYY ---> 年; MM---> 月 ; DD ---> 日;Mon--->英文的月份;day --->星期几(1表示日)HH ---> 小时; HH24 ---> 24小时制;mi --->分钟;ss ---> 秒Add_month:select add_months(birth,3) from ly_emp;所有月份加3Last_day():select last_day(birth) from ly_emp;返回月的最后一天Months_between(a,b):select months_between(birth,hiredate) from ly_emp;    //两个日期相差的月份Next_day():select next_day(sysdate,1) from dual;//下周的星期日的日期To_char():可以把时间和数字转换成字符串select to_char(sysdate,'yyyy-mm-dd hh34:mi:ss') from dual;将当前时间转化成指定格式TruncRound   Select:查询数据库的数据单表查询:1、查询所有字段所有记录:select * from 表名2、查询指定字段所有记录:select字段,...  form 表名;3、可以给字段取别名:Select 字段 字段别名,... from 表名4、可以用字符串、数字、日期函数对字段进行处理5、Select可以带条件用where来过滤数据1、指定字段的值  where  字段=值2、指定字段的值在某个区间,数字的值可以通过< 和 >来匹配,< >  != 来匹配不等于某个值的数据可以用and来连接两个有表达式,表示两个表达式都满足的情况下的所有记录可以用or来连接两个表达式,只要满足其中之一的表达式则匹配Select * from table_name where id=1;Select*from table_name where sal <> 800(或者sal !=800)Select * from table_name where sal>800 and sal<1800;3、字符串可以用= 和 != 来匹配;  模糊匹配:like% 匹配任意多个任意字符_  能够匹配任意一个字符Select*from emp where ename like 'A%';把名字是以A开头的匹配出来Select*from emp where ename like '_A%';匹配第二个字符是A的匹配以A开头或者S结尾的名字:Select*from emp where ename like 'A%' or ename like '%s';4、between  and相当于  字段 <= **  and  字段 >=**Select * from table_name where sal>=800 and sal<=1800;Select * from table_name where sal between 800 and 1800;5、in 来匹配零散的值Select * from table_name where sal in(1250,800,1300);匹配工资为这三个值的数据,括号里可以有多个值Select * from table_name where sal not in(1250,800,1300);匹配除了这三条的其他数据; In(list) 用表的记录来list里面进行逐一比较(=),如果相等,则匹配该条记录;List里面如果有null,null匹配不出来Not in(list) 用表里的记录来list里逐一进行比较(!=),如果全部都不相等,则匹配该记录;表中null的记录匹配不出来Not in(list)所有值都不等于list里面的值才匹配,null只要list里面有null值,not in(list)将没有一个被匹配出来。    例子:建表时:给默认值default设置默认值字段非空:not null表示不为空Create emp(id number(10) not null,//不插入数据,报错Name varchar2(20),//不插入数据,为nullGender char(1) default 'F'//不插入,默认为F);插入数据时,如果该字段没有值,默认为null,但是如果该字段是not null,则插入失败,非空字段一定要有值存在Null值在oracle中非常关键Null:是一种特殊的值,空值任何数据类型都可以是空值一个字段的值未确定或者没有必要时可以为null;Null值不可以用= 和 !=来进行比较判断select * from emp where mgr is (not)null; 空值处理函数Nvl(expr1,expr2)如果expre1为空,则取expr2的值如果expr1不为空,则取它自身的值select empno,ename,(nvl(comm,0)+sal)*12 from emp;Nvl2(expr1,expr2,expr3)如果expr1为空,则取expr2的值如果不为空,则取expr3的值select empno,ename,(nvl(comm,comm,0)+sal)*12 from emp;给字段取别名会自动变成大写的,如果想保持原状,可以用双引号"";如果别名需要空格,也可以用双引号""可以给字段取别名,用as关键字,但as可以省略select empno,ename,(nvl(comm,0)+sal)*12 "salary" from emp; 查找所有的部门emp:去重:去除重复的没必要的数据  distinctDistinct可以对单个字段去重,也可以对多个字段一起进行去重select distinct deptno,job from emp;  //查找每个部门都有哪些岗位 排序:Order by 字段asc/desc   升序/降序默认是按升序排序,所以asc可以省略//查找所有的员工,按部门升序显示所有的员工的薪资从多到少select * from emp order by deptno asc , sal desc;对多个字段进行排序时,先按前面的字段进行排序(分组),然后再按后面的字段进行排序,注意:每一个字段都要指定排序方式(asc/desc,asc可以省略(默认值));order by和distinct只出现一次。Null最大,asc排序,null排在最后面    日期:要对日期进行判断select sysdate +1 from dual;系统时间加n天select trunc(sysdate,'dd')-to_date('2017-01-01','yyyy-mm-dd') from dual;截取系统时间到天,距离2017-1-1日的天数;日期可以直接加减运算,也可以用<,>,<=,>=,=,!=来判断两个日期 To_char() 整数按格式转换为字符串格式字符串里以fm开头9 代表任意一个数字0 强制显示前导0,如果该位置有数字,则显示数字,数字不足则显示0. 代表小数点$ 代表美元符号L 代表本地货币符号select to_char(123.34,'fm09999.99') from dual; ==》00123.34select to_char(123.34,'fm99.99') from dual; ==》######select to_char(123.456,'fmL999.999') from dual; ==》¥123.456select to_char(123456.456,'fm$999,999.999') from dual; ==》$123,456.456 聚合函数:对数据进行分组,然后进行统计工作一个组返回一条记录分组函数,集合函数Max:select max(sal) from emp;//找到sal最高的员工Min:select min(sal) from emp;select max(sal) max_sal,min(sal) min_sal from emp;//找到并重命名可以用于number,char,date类型过滤掉记录里的null值 Avg  sum  平均值  和值1、求所有员工的平均工资select avg(sal) avg_sal from emp;2、求公司一个月要发放的工资select sum(sal+nvl(comm,0)) from emp;Avg  sum只能用于number,自动过滤掉null3、平均奖金 select avg(nvl(comm,0)) from emp;Select avg(comm) from emp;求有奖金员工的每个人的平均奖金 Count求记录的数目Select count(*) from emp;//emp里面有多少个员工Select count(1) from emp;//计数所有的记录,可以随便填Select count(ename) from emp;//emp里面有多少个名字Count可以对任意内容进行统计,会自动过滤掉null值   1、每个部门里工资最大、最小select deptno,max(sal),min(sal) from emp group by deptno;2、统计每个部门的平均工资和工资总和select deptno,avg(sal),sum(sal) from emp group by deptno;3、每个部门有多少员工select deptno,count(1) from emp group by deptno;分组:Group by 字段组函数自动过滤null记录1、查找部门编号大于10的部门的员工平均工资Select avg(sal) from emp where deptno>10;2、查找部门编号大于10的部门平均工资:先过滤数据然后再组函数Select avg(sal) from emp where deptno>10 group by deptno;3、查找部门平均工资大于1600的部门编号及其平均工资:先用组函数求值(分组),然后再过滤数据Select deptno,avg(sal) from emp group by deptno having avg(sal)>1600;Having:用来过滤分组数据,只能用在group by之后;  SQL语句的执行顺序:1、from语句:从右往左,从后往前执行,建议把数据量少的放后面,数据大的表放前面;2、Where语句:从右往左,从下往上执行;建议把过滤数据量多的语句放后面;3、Group by语句:非常消耗资源,建议少用;建议在where的时候尽量过滤多的数据;4、Having语句:从左往右5、Select语句:oracle在解析*的时候,会先根据表名去查找这个表的字段(解析字段),需要消耗时间,所以尽量避免使用*,而是用具体的字段替代;6、Order by语句:从左往右,非常耗资源。  多表查询:1、显示员工编号、员工姓名、员工所在部门编号及部门名称关联查询select * from emp;//14条数据Select * from dept;//4条语句Select * from emp,dept;//56条数据笛卡尔积:两个表数据的记录相乘得到的就是笛卡尔积等值连接Select empno,ename,emp.deptno,dname from emp,dept where emp.deptno=dept.deptno 多表查询:多个表之间用逗号隔开;如果两个表有同名的字段,需要显示同名的字段时,需要表名.字段名来区别,对于表,也可以有别名Select e.empno,e.ename,d.deptno,d.dnameFrom emp e,dmpt dWhere e.deptno=d.deptno;内连接:把等值连接中表名之间','换成join,再把where换成on;Select e.empno,e.ename,d.deptno,d.dnameFrom emp e join dept dOn e.deptno=d.deptno外连接:左外连接:left join左边表里的数据一条都不会少(全部匹配),左边表也称为驱动表,然后根据条件去右边的表匹配,匹配不上的记录,该表的字段自动填充为null值。Select e.empno,e.ename,d.deptno,d.dnameFrom emp e left join dept dOn e.deptno=d.deptno;也可以写成:Select e.empno,e.ename,d.deptno,d.dnameFrom emp e ,dept dWhere e.deptno=d.deptno(+);//(+) 一定写在驱动表的对面 右外连接:Select d.deptno,d.dname,e.empno,e.enameFrom emp e right join dept dOn e.deptno=d.deptno;也可以写成:Select d.deptno,d.dname,e.empno,e.enameFrom emp e , dept dWhere e.deptno(+)=d.deptno;全外连接:Select d.deptno,d.dname,e.empno,e.enameFrom emp e full join dept dOn e.deptno=d.deptno;自连接:对同一张表用别名的方式扩展为两张表,然后再进行关联匹配select distinct e1.empno,e1.ename from emp e1 , emp e2 where e1.empno=e2.mgr;记住:外连接有个关键字outer;left outer join  Sql高级查询:条件、表可能是从一个select语句中获得Select语句作为where的子句:可能where依赖的条件不是一个确定的值,也不是通过函数求得;依赖于一条select的返回值select语句中嵌套一个select语句,这个嵌入的select语句称为select子句Select 子句先执行,得到结果之后,再进行父select比较根据select语句的返回值,可以分为:单行select子句(= in < > != ...)多行select子句(ANY  ALL  in  not in)多列select子句(in)Select语句:返回一行数据,多行数据,多列数据 返回多条语句:ANY,ALL函数,不能单独使用,只能和< > <= >= 一起使用1000 and name like '%A%');Insert into wj_emp values(110,'wng',20);//报错Insert into wj_emp values(1110,'wang',20);//不会报错 非空约束 not null唯一约束 unique 可以往里插入多个null值主键约束  不可以为空外键约束  可以插入空值检查约束  只要不检查是否为空,那就可以插入null值可以在建表时建立约束,也可以在建表之后添加、删除Alter table table_name add constraint constraint_name ***Unique(col)Primary key(col)Foreign key(col) references table_name(col)Check(condition) User_constraints 保存着用户下所有的约束名(如果创建时没有指定约束名,系统会自动生成一个约束名) 视图:把一个select语句的结果集当做一个表一样使用,虚拟的表,是数据的逻辑表示,其本质是一个select语句加了一个名字创建一个视图Create  [or  replace] view view_name   as  subquery;Subquery:一个select语句试图分为:1、简单视图:select 语句包含一张表,但是没有有函数、表达式、group by的约束2、复杂视图:select 语句包含一张表,但是有函数、表达式、group by的条件3、连接视图:select  多张表Create view emp_view_20 as select empno,ename,deptno,sal from emp创建视图需要权限:grant create view to 用户(student);所有的视图名都保存在User_views里视图是一个select语句的结果集,他没有具体的数据,而是一种映射关系。当视图建立以后,可以把试图当做一张表一样使用(select)视图作用:1、对于复杂的select语句,建立视图之后,可以提升查询效率2、通过视图只能查询特定的记录和字段,能够隐藏和保护一些数据及字段,保护数据和屏蔽数据的作用(安全措施)3、操作视图就等于操作视图映射的表。(不建议通过视图修改表里的数据),可以在创建视图时指定视图只能查询,不能修改数据在创建视图的语句后面加With read only;对于复杂的视图,根本就不允许插入和删除。Create view emp_view_20 as select empno,ename,deptno,sal from emp where deptno = 20;当插入部门不是20的数据时,视图不会有变化,但是映射所对应的表会多一行数据;当修改一个deptno为20的数据变成不是20时,视图里会消失。可以通过限定用户智能操作视图里有的数据:with check option-- DML只能操作视图里有的数据(只对视图可见)Delete时只能删除视图里有的数据Insert时只能插入满足select条件的数据Create or replace view 可以创建和修改视图Drop view view_name 删除视图 在用函数和表达式进行创建视图时,必须用别名Create view emp_view_20 as select empno,lower(ename) name,deptno,sal from emp   序列:(sequence)可以自动生成数字值的数据库对象CREATE sequence seq_name [ start with i ] [ increment by i ] [ minvalue n|no minvalue] [maxvalue m|no maxvalue] [cycle | nocycle] [ cache p | on cache];Start with i表明从i开始计数Increment by j 表明每次递增多少(j是负数,递减)如果没有指定i和j,从1开始递增,每次递增1Cycle:表明值取到了最大值之后,可以从最小值开始重新开始计数如果是取到了最小值,可以从最大值重新开始计数Cache p:表示每次生成多少个数字,缓存的值的个数,默认是20 序列可以有效的用来生成主键的值多个表可以共用一个序列,但是建议一个表用一个序列user_sequences所有的序列都存储在这个表里Nextval:获取序列的下一个值,每执行一次nextval会增长一次,在序列刚创建时,必须使用一次nextval才能使用currvalCurrval:获取序列的当前值 Create sequence seqly_emp2Start witn 1000 increment by 1Minvalue 1 maxvalue 1000000000 nocycle cache 2000 create table wly_emp_test( id number(10) primary key, name varchar2(30) ); select seqly_emp2.nextval from dual; insert into wly_emp_test(id) values(seqly_emp2.nextval); select * from wly_emp_test;序列可以高效的用来生成主键的值 删除:drop sequence seq_name;  索引:Rowid是一个伪列,用于标识数据表里每一条记录的地址Pl sql developer里面:select e.*,e.rowid from emp e;可以在表中直接修改 索引是保存记录的地址及索引关键字,用于提升查询效率最有效的方法字典:通过目录去查找视图:把内容大的拆分成每一块内容较小的,再去查找 Create index [unique] index_name on table_name(col); 注意事项:1、数据量小的时候应该避免建索引2、一般给where条件,group by 这些经常用来查询的字段建索引3、索引的个数没有限制,但不是越多越好4、索引对于查询的效率有很好的提高,但是得建立合适的索引5、索引也是占用资源的(需要保存值和地址)6、二叉树 oracle实现索引是用二叉树:B-tree7、对于经常DML操作的列,应当根据情况避免建索引,因为索引会影响insert操作的执行效率删索引 --> 导数据 --> 再建索引 会比直接导数据的效率要高 Create index deptno_index on dept(deptno); User_objects;---索引、视图、序列均可在这个表里查到索引一旦建立之后,oracle自动维护,查询时不需要指定使用哪个索引Select * from emp where empno =**  ---empnoSelect * from emp where ename =**  ---ename 如果某个字段的值是唯一的,可以建唯一索引Create unque index empno_index on(empno);如果索引字段的值经常DML,可以用Alter index index_name rebuild;更新索引,将删除的数据的索引删掉,提高内存效率索引:建在那个字段,经常用来查询数据的字段,这个字段可以是组合字段,group by deptno,mgr       -------> On(deptno,mgr);在生产中,索引用的非常多索引:用空间换时间,消耗内存空间提升效率


0