oracle笔记

最近几天学习了一下oracle数据库,顺手做的笔记

  • 一直使用的一个工具叫做pl/sql devloper,一边可以运行,一边可以做笔记,很方便

  • oracle安装会自动的生成sys 和 system用户

    • sys 超级用户 权限最高 具有sysdba角色 有create database权限
      默认的密码是manager
    • system 管理操作员 权限也很大 具有sysoper角色
      没有create database的权限 默认的密码是change_on_install

一般讲,对数据维护,使用system用户登录就可以

连接数据库

  • 连接
  • conn[ect] 用户名/密码
    • 例如:conn system/root;

当用特权用户身份连接时,必须带上 as sysdba 或者是 as sysoper

  • conn还可以切换用户
  • 断开连接
    disc[onnect]
  • 修改用户的密码
    passw[ord]
  • 显示当前用户
    show user
  • 断开与数据库的连接
    exit

文件操作命令

  • 运行sql脚本 start 和 @ 后边加上路径\文件名.sql
    • 例如 @E:\install.sql
  • 编辑脚本 edit
  • spool 将sqlplus屏幕上的内容输出到指定的文件中去
    • spool + 位置
    • 执行一条语句
    • spool off
  • &可以替代变量 ,变量在执行时,需要接收用户输入
  • 显示行的宽度 linesize 默认是80个字符

    • set linesize 50
  • desc tableName 查看表结构

权限

权限分为两类

  • 系统权限 : 用户对数据库的相关权限
  • 对象权限 : 用户对其他用户的数据对象操作的权限

角色

角色相当于是拥有某些权限的用户,使用角色的目的就是为了简化指定权限的过程
给某个用户指定某个角色,使得该用户拥有某些特定权限

角色分两类

  • 预定义角色 connect,dba,resource..
  • 自定义角色

用户管理

  • 创建用户 create user NAME identified by PASSWORD 具有dba权限的用户才能创建
  • 密码是以字母开头

    conn system/root as sysdba;
    create user tom identified by m123;
    
  • 刚创建的用户是连接不上的,因为没有任何权限,需要指定相应的权限,由sys/system指定

    grant connect to tom;
    
  • 用tom用户创建表,又提示权限不够

    grant resource to tom;
    
  • 创建表 create table table_name();

    create table stu (id number , nmae varchar2(20),sex varchar2(4));
    
  • 希望别的用户可以查看tom的stu表

    --创建Jerry用户
    conn system/root as sysdba;
    create user jerry identified by m123;
    --权限
    grant connect,resource to jerry;
    --查看tom的stu表
    select * from tom.stu;
    

结果是 ORA-00942: 表或视图不存在,原因还是因为权限.需要给jerry用户赋予权限。
希望查看的是tom用户的stu表,所以这个权限需要由tom用户给jerry指定.

conn tom/m123;
grant select on stu to jerry;

然后在登录jerry用户看看是否能够查看了

conn jerry/m123;
select * from tom.stu;

可以查看

赋予jerry可以修改、删除、查询tom的stu表的权限

grant all on stu to jerry;
  • 修改密码

    • 给自己修改密码直接使用passw[ord]
    • 给别的用户修改密码则需要dba权限,或者是拥有alter user的系统权限
  • 删除用户,以dba权限删除 drop user

    • 如果删除的用户已经创建了表,那么就需要在删除的时候带一个参数 cascade

收回权限 revoke

revole select on stu from jerry;

profile

profile是口令限制,资源限制的命令的集合。
当建立数据库时,oracle会自动创建名称为default的profile
当建立用户没有制定profile选项,那oracle就会将default分配给用户

  • 账户锁定
    制定该用户登录时最多可以输入密码的次数,也可以指定用户锁定的时间(天)
    一般用dba身份去执行命令

    create profile aa limit failed_login_attempts 3 password_lock_time 2;
    

创建一个profile名字是aa,登录失败次数限制为3次,3次都失败则账户锁定2天

alter user tom profile aa;

可以尝试一下故意输错密码

ORA-28000: the account is locked

用户已经锁定

  • 解锁

     alter user tom account unlock;
    
  • 终止口令
    为了让用户定期修改密码

    create profile bb limit password_life_time 10 password_grace_time 2;
    

创建profile bb 密码的时长是10天,宽限2天

alter user tom profile bb;
  • 口令历史
    如果希望用户在修改密码的时候,不能使用以前使用过的密码,可以使用口令历史,这样oracle就会将口令修改的信息存放到数据字典中,当用户修改密码时,就会对新旧密码进行比较,发现新密码和旧密码一样时,就提示用户重新输入新密码

    create profile password_history limit password_life_time  10 password_grace_time 2 password_reuse_time 10;
    
    password_reuse_time 10;//旧密码 10 天后可以重用.
    

删除profile

drop profile aa ;
如果指定了用户  需要 CASCADE

数据类型

  • char 定长 最大2000字符 速度快 空间浪费
  • varchar2 变长 最大4000字符 速度慢 空间节省
  • clob 字符型大对象 最大4G

数字类型

  • number 10的-38次方到10 的 38次方 可以表示整数,也可以表示小数
  • number(5,2)
    表示一个小数有5位有效数,2位小数-999.99—999.99
  • number (5)表示一个5位整数 -99999———-99999

日期类型

  • date 年月日时分秒

  • timestamp

图片

  • blob 二进制数据 可以存放图片 声音 最大4G

创建表

create table student(
    xh number(4),
    xm varchar(20),
    sex char(4),
    birthday date,
    sal number(7,2)
);
  • 添加一个字段

     alter table student add (classId number (2));
    
  • 修改字段的长度

     alter table student modify (xm varchar2(30));
    
  • 修改字段的类型/或者是名字(不能有数据)

    alter table student drop column sal;
    
  • 修改表的名字

        rename student to stu;
    
  • 删除表

  •     drop table student;
        truncate; 
        drop;
    
  • 添加数据

    insert into STUDENT values ( 1,'小明','男','9-9月-1999',2345.6,12);
    
    date默认的日期格式是‘DD-MON-YY’
    
  • 修改日期格式

    alter session set nls_date_format='yyyy-mm-dd';
    
  • 插入部分字段

    insert into student (xh,xm,sex) values (''''''');
    
  • 插入空值

    insert into student (xh,xm,sex) values (''''''',null);
    
  • 查询空值

    select * from student where birthday is null;
    
  • 修改一个字段

        update student set sal = sal/2 where...
        update  studen set sex = '女' where xh = '1'
        修改多个字段用逗号隔开
    
  • 删除数据

    • delete from student
      删除所有记录,表结构还在,可以恢复
  • savepoint a;

  • rollback;

    • drop table student 删除表的结构和数据
    • truncate table student删除所有记录,表结构还在,不写日志,速度快,不可恢复

查询

表的管理(创建 维护)
各种查询技巧
创建新的oracle数据库

表名和列的命名规范

必须以字母开头
长度不能超过30字符
不能使用oracle保留字

  • 尽量避免使用select *

别名 select last_name a,first_name b from s_emp;

  • nvl函数处理null值

    select sal*13 + nvl (comm,0)* 13 “年工资” ,ename from emp;

  • 有序排列 order by

  • 降序排列 desc

  • where 子句操作符

    =           等于
    <>          不等于
    !=          不等于
    <           小于
    <=          小于等于
    !           不小于
    >           大于
    >=          大于等于
    !<          不大于
    
    between     在制定的两个值之间
    is null     为null值
    
    AND
    OR
    IN          用来制定要匹配值得清单的关键字,功能与OR相当
    NOT
    

LIKE操作符

  • %通配符 多个

        以s开头的词      's%'
        中间有s            '%s%'
        以s开头s结尾 's%s'
    
  • _通配符 单个

文字处理函数

    UPPER()函数       讲文本转换为大写         select last_name,UPPER(first_name) from s_emp order by 2 desc;
    LOWER()         讲字符串转换为小写
    RTRIM()函数       去除列值右边的空格 
    LTRIM()         去除左边的空格
    LEFT()          返回字符串左边的字符
    RIGHT()         范湖字符串右边的字符
    LENGTH()        返回字符串的长度
    SOUNDEX()       返回字符串的soundex值      发音类似的

数值处理函数

        ABS()           绝对值
        COS()           余弦
        EXP()           指数值
        PI()            圆周率
        SIN()           正弦
        SQRT()          平方根
        TAN()           正切

聚集函数

        AVG()           平均值
        COUNT()         某列的行数
        MAX()           某列的最大值
        MIN()           最小值
        SUM()           总和

分组 GROUP BY和 HAVING

select username ,count(*) as namecount from users group by username;

having支持所有where操作符

查询所有表

 select table_name from tabs;
  • to_char(to_date(),’yyyy/mm/dd/day’)
  • to_date(‘2010-07-2’,’yyyy-mm-dd’)
    今天是一年中的第几天
  • to_char (sysdate,’ddd’)

https://www.douban.com/note/31849478/

?? 何时使用group by

如果查询字段中有sum、count类似的聚合函数 那么其他字段必须要在group by 中出现

不是单独分组函数
此处不允许使用分组函数

何时使用having???

  • 错误:不是group by 表达式

having后面是 条件
group by后面是字段


  • 如果指定了GROUP BY子句,则HAVING子句的查询条件将应用于GROUP BY子句创建的组。
    如果指定了WHERE子句,而没有指定GROUP BY子句,那么HAVING子句的查询条件将应用于WHERE子句的输出结果集。
    如果既没有指定WHERE子句,又没有指定GROUP BY子句,那么HAVING子句的查询条件将应用于FROM子句的输出结果集。

多表查询:

两张表:a,b
如果没有条件则是 一对 多的关系 相当于a.columnNum * b.columnNum条数据
加上条件才是一对一
a.xId = b.xId;

多表查询的条件是:至少不能少于表的个数-1

select ??? from a,b where a.x = b.x;
  • 查询员工姓名、工资及工资级别

一张员工表 emp 、一张工资级别表 salgrade

select a.name,a.sal,b.grade from emp a,salarygrade b where a.sal between b.low and b.high;
  • 显示员工姓名,员工工资及所在部门,并按部门排序

    select a.name,a.sal,b.deptname from emp a,dept b where a.deptid = b.deptid order by a.deptid;
    
  • 自连接

查询某个员工的上级领导的姓名

查询该员工的姓名及manager_id

select first_name,manager_id from s_emp where first_name='Mai';
  • 自连接查询

    select worker.first_name,boss.first_name from s_emp worker,s_emp boss where worker.manager_id=boss.id and worker.first_name='Mai';

  • 查询与Smith相同部门的员工信息

    • –1.查询Smith的部门

      select dept_id from s_emp where last_name = 'Smith';

    • –2.显示员工信息

      select * from s_emp where dept_id=
      (select dept_id from s_emp where last_name = 'Smith');
      
  • 多行子查询 返回多行数据

in

  • 多列查询

    select * from s_emp where (dept_id,title)= (select dept_id,title from s_emp where last_name='Smith');

  • –查询各个部门的平均工资和部门号

    select dept_id ,avg (salary) from s_emp group by dept_id;

    • –把上面的看做一张子表

      select a1.dept_id,a1.avg_sal,a2.dept_id,a2.first_name ,a2.salary from s_emp a2, (select dept_id,avg(salary) avg_sal from s_emp group by dept_id ) a1
      where a2.dept_id = a1.dept_id and a2.salary > a1.avg_sal;
      

分页查询

1.

select * from s_emp;

2.

select a.* ,rownum rn from (select * from s_emp)a where rownum <= 10;

3.

select a.*,rownum rn  from (select a.* ,rownum rn from (select * from s_emp)a where rownum <= 10) a where rownum <= 5;

4.几个查询变化
a.指定查询列,只需修改最里层的子查询

select a.*,rownum rn  from (select a.* ,rownum rn from (select * from s_emp)a where rownum <= 10) a where rownum <= 5;

b.排序 修改最里层

select a.*,rownum rn  from (select a.* ,rownum rn from (select last_name from s_emp order by salary ///desc) a where rownum <= 10) a where rownum <= 5;

你可能感兴趣的:(oracle,数据库)