Oracle笔记

   1、启动:通过启动Oracle的服务启动。

    OracleServiceORCL:核心服务,必须启动。

    OracleOraDb11g_home1TNSListener:监听服务,是否有客户端连接,启动后客户端程序(sqldeveloper.exe)才能连接上。

 

  2、 登录:

 

    1)  字符界面:使用Oracle提供的Sql Plus登录。Exit退出

    2)  图形界面:使用客户端程序(sqldeveloper.exe)登录。

  1、  权限:系统权限、对象权限。(700余种权限)

    1)  系统权限:针对某项操作的权限,而不是针对某个或某些数据库对象的权限,如:CREATE SESSION(创建会话,登录权限)、CREATE TABLE

    2)  对象权限:针对某个或某些数据库的权限,如:针对某个数据的添加、删除、修改、查询。

  2、  角色:预定义角色、自定义角色

    权限太多不方便管理,可以将多种权限包装为一个角色,当给用户授权时,只需要授予某个角色就相当于授予这个角色下面的所有权限。

  3、  Oracle种常用的3个预定义角色:

  1.     1) CONNECT
  2.       CREATE SESSION(创建会话,登录权限)
  3.     2) RESOURCE
  4.       CREATE TRIGGER:创建触发器
  5.       CREATE SEQUENCE:创建序列
  6.       CREATE TYPE:创建类型
  7.       CREATE PROCEDURE:创建存储过程
  8.       CREATE CLUSTER:创建簇
  9.       CREATE OPERATOR:创建操作符
  10.       CREATE INDEXTYPE:创建索引类型
  11.       CREATE TABLE:创建表
  12.     3) DBA:拥有所有的对象权限和大部分的系统权限,system用户默认拥有的就是DBA角色。
  13.         注:权限放置在dba_sys_privs表中,查询该表可以看到权限和角色。

 

  1. /*三、 管理用户:
  2. 1. 创建表空间:
  3. MySQL在一个实例中可以创建多个数据库,但Oracle在一个实例中就只有一个数据库(orcl),
  4. 为了将来为每个项目具体一个独立的存储容器,所有需要创建表空间,类似于MySQL中的数据库。
  5. 语法:
  6. CREATE TABLESPACE <表空间名称>
  7. DATAFILE ‘数据文件路径\数据文件名.dbf’
  8. [SIZE <表空间初始容量>]
  9. [AUTOEXTEND {OFF|ON} NEXT <每次扩展的容量> MAXSIZE {表空间最大值 
  10. |UNLIMITED}]
  11. 说明:
  12. 1) 容量的单位:K M G
  13. 2) AUTOEXTEND设置为OFF表示不能自动扩展,ON表示能自动扩展,同时还可以设置每次增长多少的容量。
  14. 3) MAXSIZE设置最大值:具体的最大值。UNLIMITED:没有最大值
  15. */
  16. -- 创建一个名为TS_USER39的表空间
  17. CREATE TABLESPACE ts_user39
  18. DATAFILE \'g:\oracle_data\tablespace\ts_user39.dbf\'
  19. SIZE 200M /*表空间初始容量*/
  20. AUTOEXTEND ON NEXT 20M /*可以扩展,每次扩展20M*/
  21. MAXSIZE UNLIMITED; /*没有最大值的限制*/

 

   2、  创建用户:user39


  1. /*
    2. 创建用户:user39
  2. 语法:
  3. CREATE USER <用户名称>
  4. [IDENTIFIED BY <密码>]
  5. [DEFAULT TABLESPACE <表空间名称>]
  6. 说明:
  7. 1) 密码不需要单引号,否则他认为密码包含单引号
  8. 2) 在创建用户时最好给每个用户指定一个默认的表空间
  9. */
  10. -- 创建用户
  11. CREATE USER user39
  12. IDENTIFIED BY 123456
  13. DEFAULT TABLESPACE ts_user39;

 

  3、  给用户授权:

  1. /*3. 给用户授权:
  2. 语法:
  3. GRANT {系统权限|角色权限}TO <用户名> 
  4. [WITH ADMIN OPTION]
  5. GRANT {对象权限列表} ON <数据库对象列表> TO 
  6. <用户名> [WITH GRANT OPTION]
  7. 举例:
  8. GRANT DBA TO user39 WITH ADMIN OPTION;
  9. */
  10. GRANT DBA TO user39 WITH ADMIN OPTION;

 

   4、 回收用户权限:

  1. -- 回收权限
  2. REVOKE DBA FROM user39;

 

  1. /*四、 创建序列:
  2. 语法:
  3. CREATE SEQUENCE <序列名称> 
  4. [MINVALUE <最小值>] ――默认值为1
  5. [START WITH <初始值>] ――默认值为1,若初始值小于默认值的1,就需要同时设置最小值
  6. [INCREMENT BY <步长>] ――设置递增(正数)或递减的值,默认值为1
  7. {MAXVALUE <最大值>|NOMAXVALUE} –设置最大值或没有最大值(默认)
  8. */
  9. CREATE SEQUENCE seq_type
  10. MINVALUE 0
  11. START WITH 0
  12. INCREMENT BY 10
  13. MAXVALUE 99999;
  14. /*查看序列的值:当前值、下一列值;
  15. dual时Oracle中的虚拟临时表,在查看变量、函数、序列等没有表名或视图时使用*/
  16. SELECT seq_type.NEXTVAL FROM dual;
  17. SELECT seq_type.CURRVAL FROM dual;

 

 

  1、  Oracle中的数据类型:

  1. 1) 字符型:CHARVARCHAR
  2.     2) 数值型:NUMBER(既可以表示整数,也可以表示小数)、INTFLOATDOUBLE
  3.     3) 日期时间:DATETIMEDATETIMETIMESTEAMP

 

  2、  创建数据表时Oracle与MySQL的不同点:

  1.     1) MySQL的默认主键生成策略使用自动增长(AUTO_INCREMENT),Oracle的默认主键生成策略使用序列,需要单独创建序列完成增长。
  2.     2) MySQL没有check约束(检查约束),但Oracle有检查性约束:
  3.     约束区间值:student_score NUMBER) check (BETWEEN  AND 100
  4.     约束枚举值:sex CHAR(3) check(\'\',\'\')
  5.     3) MySQL可以在字段上直接使用comment关键字编写注释,但Oracle要使用comment语句来完成。
  1.       给表添加注释:COMMENT ON TABLE <表名> IS '注释的内容'
  2.       给表添加注释:COMMENT ON TABLE  tb_grade IS '年级表'
  3.       给表字段添加注释:
  4.       Comment ON COLUMN <表名.字段名> IS '注释内容'
  5.       Comment ON COLUMN  tb_grade.grade_id IS '年级编号'

 

 

  1.      在使用INSERT INTO 插入数据时,MySQL可以一次插入多条记录,而Oracle只能一行。
  2.      日期:使用“日—月-年”,如“20-8月-2018”,也可以使用转换函数来操作。
  3.       将字符串转为日期:TO_DATE(\'2018-06-21\',\'yyyy-mm-dd\')    用于插入数据时
  4.       将日期转化为字符串:TO_CHAR(HIREDATE,\'yyyy-mm-dd\')    用于查询数据时
  5.      MySQL默认采用自动提交模式,当执行完增、删、改语句后会自动完成提交,
  6.       Oracle默认采用手动提交,所以执行完增、删、改后还需要执行COMMIT语句才会提交。

 

 

  1. 与字符相关的函数:
  2. 与数值相关的函数:
  3. 与日期相关的函数:
  4. 转换函数:
  5. 其他函数
  6. 随机生成:字符串、小数、整数、日期、枚举值、范围值。
  7. 在Oracle中批量插入记录。
  1. /*七、 Oracle中的系统函数*/
  2.  
  3. -- 1. 与字符相关的函数:
  4. SELECT UPPER(\'javascript\') FROM dual;
  5. SELECT LOWER(\'javascript\') FROM dual;
  6. SELECT LENGTH(\'javascript\') FROM dual;
  7. SELECT LENGTH(\'中国\') FROM dual;
  8. SELECT INITCAP(\'java script\') FROM dual; /*首字母大写*/
  9. /*CONCAT()在Oracle中只能添加两个参数
  10. Oracle中的字符连接使用通道符"||"完成连接多个字符,类似于Java中的"+"。
  11. */
  12. SELECT CONCAT(\'aa\',\'bb\') FROM dual;
  13. SELECT \'aa\'||\'bb\'||\'dd\' FROM dual;
  14. -- 字符串替换函数,将原始字符串中的a替换为A
  15. SELECT REPLACE(\'javascript\',\'a\',\'A\') FROM dual;
  16. -- 字符串截取函数:原始字符串,截取索引(1开始),截取的长度
  17. SELECT SUBSTR(\'javascript\',5,6) FROM dual;
  18. -- 2. 与数值相关的函数:
  19. SELECT ROUND(65.66944,2) FROM dual; /*四舍五入,截取两位小数*/
  20. SELECT TRUNC(65.66944,2) FROM dual; /*截断函数,截取两位小数*/
  21. SELECT CEIL(65.66944) FROM dual; /*向上取整,多用于分页*/
  22. SELECT MOD(156) FROM dual; /*取模*/
  23.  
  24. -- 3. 与日期相关的函数:
  25. SELECT TO_CHAR(sysdate, \'YYYY-mm-dd\') FROM dual; /*获取当前系统日期*/
  26. SELECT TO_CHAR(sysdate, \'YYYY-mm-dd\'),add_months(sysdate,3) FROM dual; /*月份递增(向将来推)3个月或递减函数(负数向过去推)*/
  27. SELECT TO_CHAR(last_day(sysdate), \'YYYY-mm-dd\') FROM dual;/*获取指定日期所在的最后一天*/
  28. SELECT MONTHS_BETWEEN(TO_DATE(\'02-02-1995\',\'MM-DD-YYYY\'),TO_DATE(\'01-01-1995\',\'MM-DD-YYYY\') ) FROM dual;/*获取两个日期的月份差*/
  29. SELECT MONTHS_BETWEEN(sysdate,BIRTHDAY) from tb_student;
  30. -- 4. 转换函数:
  31. -- 日期转字符串
  32. SELECT TO_CHAR(sysdate,\'yyyy-mm-dd hh24:mi:ss\') FROM dual; /*获取当前日期的时间(到秒)转换为字符串,如果用于订单号去掉中间的连接符*/
  33. -- 指定日期和Oracle基准日之间的差值
  34. SELECT TO_CHAR(sysdate,\'J\') FROM dual; /*朱利安日期公元前4713年1月1日0:0:0。返回的是天数差值*/
  35. -- 字符串转换为日期
  36. SELECT TO_DATE(\'2019-11-13\',\'yyyy-mm-dd hh24:mi:ss\') FROM dual; /*只显示到天*/
  37. -- 获取指定与基准日之间天数差对应的日期
  38. SELECT TO_DATE(2458801,\'J\') FROM dual;
  39. -- 5. 判断函数
  40. SELECT sal,comm,(sal + comm) * 12 年薪 FROM scott.emp; /*第二个参数为空时,整体为空*/
  41. /*NVL(paraml1,paraml2):
  42. 若paraml1不为空时取paraml1的值;
  43. 如果paraml1为空,取paraml2的值*/
  44.  
  45. SELECT sal,comm,(sal + NVL(comm,0)) * 12 年薪 FROM scott.emp;
  46. /*NVL2(paraml1,paraml2,paraml3):
  47. 若paraml1不为空时取paraml2的值;
  48. 如果paraml1为空,取paraml3的值*/
  49. /*相当于三元运算*/
  50. SELECT sal,comm,(sal + NVL2(comm,comm,0)) * 12 年薪 FROM scott.emp;
  51. /*DECODE(value,if,if的值,else if,else if的值,...,else的值),当value与哪个判断条件相等就取他的值。相当于switch case*/
  52. SELECt grade_id,DECODE(grade_id,\'1\',\'一年级\',\'2\',\'二年级\',\'不知道\') FROM TB_STUDENT;
  53. -- 6. 随机生成:字符串、小数、整数、日期、枚举值、范围值。
  54. SELECT dbms_random.string(\'\',20) FROM dual; /*大写字母,长度20*/
  55. SELECT dbms_random.string(\'U\',20) FROM dual; /*大写字母,长度*/
  56.  
  57. SELECT dbms_random.string(\'L\',20) FROM dual; /*小写字母,长度*/
  58. SELECT dbms_random.string(\'A\',20) FROM dual; /*大小写字母混合,长度*/
  59. SELECT dbms_random.string(\'X\',20) FROM dual; /*大写字母和数字,长度*/
  60. SELECT dbms_random.string(\'P\',20) FROM dual; /*所有可打印的字符串,长度*/
  61.  

 

  1. -- 7. Oracle中批量插入记录。
  2. /*批量插入记录:字段值采用随机生成
  3. 以tb_student为例,完成批量插入记录
  4. */
  5. CREATE OR REPLACE PROCEDURE proc_batchinsertstudent(recordNums IN NUMBER)
  6. AS
  7. BEGIN
  8.   DECLARE
  9.     nos NUMBER(10) := 11;
  10.     mobile CHAR(11);
  11.   BEGIN
  12.     FOR nums IN 1..recordNums
  13.     LOOP
  14.       mobile := \'1\' || substr(dbms_random.value(),3,10);
  15.       INSERT INTO TB_STUDENT VALUES(
  16.         \'s\' || nos, /*STUDENT_NO*/
  17.         dbms_random.string(\'A\',6), /*LOGIN_PWD*/
  18.         sys_guid(), /*STUDENT_NAME*/
  19.         substr(\'男女\',CEIL(dbms_random.value(0,2)),1), /*SEX*/
  20.         CEIL(dbms_random.value(0,5)), /*GRADE_ID*/
  21.         mobile , /*PHONE*/
  22.         substr(\'批量插入记录字段值这里面的值采用随机截取\',CEIL(dbms_random.value(1,84)),ROUND(dbms_random.value(5,10))), /*ADDRESS*/
  23.         to_date(to_char(to_date(\'1990-01-01\',\'yyyy-mm-dd\'),\'J\') + TRUNC(dbms_random.value(0,366)),\'J\'), /*日期*/
  24.         mobile || \'@qq.com\' /*电子邮箱*/
  25.       );
  26.       nos := nos + 1;
  27.     END LOOP;
  28.   END;
  29. END;
  30. -- 调用
  31. EXECUTE proc_batchinsertstudent(1000);
  32. select * from tb_student ORDER BY STUDENT_NO;
  33. DELETE FROM tb_student where STUDENT_NO > \'s10\';

 

1. 查看实例名称:
2. 查看数据库名称:
3. 查看数据文件、控制文件、日志文件
4. 接触Oracle默认180需要修改密码的规定
5. 解除用户的锁定
6. 修改用户的密码

  1. */
  2. select * from v$instance;
  3. select * from v$database;
  4. select * from dba_data_files;
  5. select * from v$controlfile;
  6. select * from v$logfile;
  7. -- 修改密码生存时间为无限制(永久不过期)
  8. ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
    -- 解除用户贴锁定(当用户被锁定,可用别的用户进行更改)
  9. ALTER USER user39 ACCOUNT UNLOCK;
    -- 修改用户密码
  10. ALTER USER user39 IDENTIFIED BY 654321;

Oracle中有两类索引,唯一索引(unique)、位图索引(bitmap),
当字段的值时有限的某几个值时,比较适合创建位图索引,它是采用二进制进行存储,查询时效率非常高。

  1. /*九、 索引的创建、查看、删除
  2. Oracle中有两类索引,唯一索引(unique)、位图索引(bitmap),
  3. 当字段的值时有限的某几个值时,比较适合创建位图索引,它是采用二进制进行存储,查询时效率非常高。
  4. */
  5. -- student_name 添加唯一索引,
  6. CREATE UNIQUE INDEX idx_studentname_u ON tb_student (student_name);
  7. -- sex添加位图索引
  8. CREATE BITMAP INDEX idx_sex_b ON tb_student (sex);
  9. -- 查看索引:user_indexes
  10. select * from user_indexes;
    -- 删除索引
  11. DROP INDEX idx_sex_b;

 

  1. /*十、 创建同义词
  2. 语法:
  3. CREATE [PUBLIC] SYNONYM <同义词> FOR <数据库对象名>
  4. 说明:若没有添加public表示创建的同义词使用范围为当前用户,
  5. 反之就是所有用户
  6. 举例:
  7. */
  8. select * from emp;
  9. CREATE PUBLIC SYNONYM emp FOR SCOTT.emp;
    -- 查看同义词All_SYNONYMS,私有的条件指定为大写用户名,公共的用public
  10. select * from All_SYNONYMS where owner = \'PUBLIC\' and TABLE_OWNER = \'SCOTT\';
    -- 删除同义词,若同义词是公共的需要添加public
  11. drop public synonym emp;

 

 

版权声明:本文为zhangzimuzjq原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhangzimuzjq/p/11820775.html