zoukankan      html  css  js  c++  java
  • oracle

    //回收
    希望收回xiaoming对emp表的查询权限
    revoke select on emp from xiaoming;

    //对权限的维护
    希望xiaoming用户可以去查询scott的emp表/还希望小明可以把这个权限继续给别人
    --如果是对象权限,就加入with grant option
    grant select on emp to xiaoming with grant option
    --如果是对象权限
    system给xiaoming权限时:
    grant connect to xiaoming with admin option

    --如果scott把xiaoming对emp表的查询权限回收,那么xiaohong会怎样?
    被回收

    表名和列的命名规则
    1.必须以字母开头
    2.长度不能超过30字符
    3.不能使用oracle的保留字
    4.只能使用如下字符:A-Z,a-z,0-9,$,#等

    字符型

    char 定长 最大2000字符
    例子:char(10) '小韩' 前四个字符放'小韩',后添加6个空格 补全

    varchar2(20) 变长 最大4000字符
    例子:varchar2(10) '小韩' oracle分配二个字符.这样可以节省空间

    clob(character large objiect) 字符型大对象最大4G

    数字型
    number 范围 -10的38次方--10的38次方

    number(5,2)
    表示一个小数有5位有效数,2位小数
    范围 -999.99--999.99

    number(5)
    表示一个五位整数

    范围-99999--99999

    日期类型
    date 包括年月日和时分秒
    timestamp 这是oracle9i对date数据类型的扩展

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

    建表

    学生表
    sql>create table student (--表名
    xh number(4),--学号
    xm varchar2(20),--姓名
    sex char(2),--性别
    birthday date,--出生日期
    sal number(7,2)--奖金
    );

    create table student(
    xh number(4),
    xm varchar(20),
    sex char(2),
    birthday date,
    sal number(7,2)
    );
    --班级表
    create table class(
    classid number(2),
    cname varchar2(20));

    create tabel classes(
    classId number(2),
    cname varchar2(40),
    );

    --添加字段
    alter table student add(classid number(2));
    --修改字段的长度
    alter table student modify (xm varchar2(30));
    --修改字段的类型/或是名字(不能有数据)
    alter table student modify (xm char(30));
    --删除一个字段
    alter table student drop column sal;
    --修改表的名字
    rename student to  stu;
    --删除表
    drop table student;
    所有字段都插入
    insert into student values(1,'小明','男','11-12月-1997',2345.23,'A102')

    oracle默认的日期格式'DD-MON-YY' dd 日子(天) mon月份 yy 2位的年 '09-6月-99' 1999年6月9号

    改日期的默认格式
    alter session set nls_date_format ='yyyy-mm-dd'
    修改后,可以用我们熟悉的格式添加日期类型
    insert into student values(2,'小明','男','1999-08-07',2345.23,'A102')


    插入部分字段
    insert into student(xh,xm,sex) values ('A003','john','女')

    插入空值
    insert into student(xh,xm,sex,birthday) values ('A004','MARtin','男',null);
    查询空值
    select*from student where birthday is null;
    查询非空值
    select*from student where birthday is not null;

    修改一个字段
    update student set sex='女' where xh='A001'

    修改多个字段
    update student set sex='男',birthday='1980-04-08' where xh='A001';

    修改含有null值的数据
    is null

    删除数据

    delete from student;
    删除所有记录,表结构还在,写日志,可以恢复的,速度慢
    savepoint aa;
    delete from student;
    rollback to aa;


    drop table student;删除表的结构和数据

    delete from student where xh='A001';删除一条记录

    truncate table student;
    删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快

    显示运行时间命令
    set timing on

    如何处理null值
    使用nvl函数来处理
    select sal*12+nvl(comm,0)*13 年工资,ename,comm from emp;

    如何连接字符串
    select ename || 'is a' || job from emp;

    在多行子查询中使用all操作符
    如何显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
    select ename,sal,deptno from emp where sal>(select max(sal) from emp where deptno=30);
    SQL> select ename,sal,deptno from emp where sal>all(select sal from emp where deptno=30);

    在多行子查询中使用any操作符
    如何显示工资比部门30的任意一个员工的工资高的员工的姓名、工资和部门号
    select ename,sal,deptno from emp where sal>any (select sal from emp where deptno=30);
    select ename,sal,deptno from emp where sal> (select min(sal) from emp where deptno=30);

    多列子查询
    单行子查询是指子查询只返回单列、单行数据,多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
    如何查询与smith的部门和岗位完全相同的所有雇员
    select *from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH');
    select *from emp where deptno=(select deptno from emp where ename='SMITH')and job=(select job from emp where ename='SMITH');


    oracle的分页一共有三种方式:

    1.rownum分页
    select *from emp
    2.显示rownum【oracle分配的】
    select a1.*,rownum rn from (select *from emp) a1;
    3
    select*from(select a1.*,rownum rn from (select *from emp) a1 where rownum<=10)where rn>=6;
    4
    几个查询的变化

    a.指定查询列,只需修改最里层的子查询
    b.如何排序,只需修改最里层的子查询

    用查询结果创建新表
    这个命令是一种快捷的建表方法
    create table mytable(id,name,sal,job,deptno) as select empno,ename,sal,job,deptno from emp;


    //合并查询
    有时在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号 union,union all,intersect,minus

    1,union操作符,该操作符用于取得两个结果集的并集,当使用该操作符时,会自动去掉结果集中重复行。相当于集合中的并
    SQL> select ename,sal,job from emp where sal>2500;

    ENAME            SAL JOB
    ---------- --------- ---------
    JONES        2975.00 MANAGER
    BLAKE        2850.00 MANAGER
    SCOTT        3000.00 ANALYST
    KING         5000.00 PRESIDENT
    FORD         3000.00 ANALYST

    已执行耗时 0.157 秒

    SQL> select ename,sal,job from emp where job='MANAGER';

    ENAME            SAL JOB
    ---------- --------- ---------
    JONES        2975.00 MANAGER
    BLAKE        2850.00 MANAGER
    CLARK        2450.00 MANAGER

    已执行耗时 0.141 秒

    SQL> select ename,sal,job from emp where sal>2500 union select ename,sal,job from emp where job='MANAGER';

    ENAME            SAL JOB
    ---------- --------- ---------
    BLAKE        2850.00 MANAGER
    CLARK        2450.00 MANAGER
    FORD         3000.00 ANALYST
    JONES        2975.00 MANAGER
    KING         5000.00 PRESIDENT
    SCOTT        3000.00 ANALYST

    6 行 已选择

    2,union all
    该操作与union相似,但是它不会取消重复行,而且不会排序。
    SQL> select ename,sal,job from emp where sal>2500 union all select ename,sal,job from emp where job='MANAGER';

    ENAME            SAL JOB
    ---------- --------- ---------
    JONES        2975.00 MANAGER
    BLAKE        2850.00 MANAGER
    SCOTT        3000.00 ANALYST
    KING         5000.00 PRESIDENT
    FORD         3000.00 ANALYST
    JONES        2975.00 MANAGER
    BLAKE        2850.00 MANAGER
    CLARK        2450.00 MANAGER

    8 行 已选择

    已执行耗时 0.062 秒

    3、intersect
    使用该操作符用于取得两个结果集的交集
    SQL> select ename,sal,job from emp where sal>2500 intersect select ename,sal,job from emp where job='MANAGER';

    ENAME            SAL JOB
    ---------- --------- ---------
    BLAKE        2850.00 MANAGER
    JONES        2975.00 MANAGER

    已执行耗时 0.11 秒


    4、minus
    使用该操作符用于取得两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据


    SQL> select ename,sal,job from emp where sal>2500 minus select ename,sal,job from emp where job='MANAGER';

    ENAME            SAL JOB
    ---------- --------- ---------
    FORD         3000.00 ANALYST
    KING         5000.00 PRESIDENT
    SCOTT        3000.00 ANALYST

    已执行耗时 0.062 秒
    SQL>  select ename,sal,job from emp where job='MANAGER' minus select ename,sal,job from emp where sal>2500;

    ENAME            SAL JOB
    ---------- --------- ---------
    CLARK        2450.00 MANAGER

    已执行耗时 0.063 秒

    to_date函数
    使用特定格式插入日期值
    如何插入列带有日期的表,并按照-月-日的格式插入?
    insert into emp values(9997,'小红2','manager',7782,to_date('1988-11-11','yyyy-mm-dd'),78.9,55.33,10);

    insert into emp values(9996,'小红2','manager',7782,to_date('1988/11/11','yyyy/mm/dd'),78.9,55.33,10);

    当使用values子句时,一次只能插入一行数据,当使用子查询插入数据时,一条insert语句可以插入大量的数据。当处理行迁移或者装载外部表的数据库时,可以使用子查询来插入数据。
    insert into kkk(myId,myname,myDept) select empno,ename,deptno from emp where deptno=10;

    使用子查询更新数据
     
    使用update语句更新数据时,既可以使用表达式或者数值直接修改数据,也可以使用子查询修改数据。
    希望员工scott的岗位、工资、补助与smith员工一样
    oracle特有:
    update emp set(job,sal,comm)=(select job,sal,comm from emp where ename='SMITH') where ename='SCOTT';

    什么是事务(transaction):
    事务是用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml(数据操作语言,增删改)语句要么全部成功;要么全部失败。
    如:网上转账就是典型的要用事务来处理,用以保证数据的一致性。

    事务和锁
    当执行事务操作时(dml语句),oracle会在被作用的表上加锁,防止其它用户改变表的结构,这对我们用户来讲是非常重要的。

    提交事务
    当执行使用commit语句就可以提交事务,当执行了commit语句后,会确认事务的变化、结束事务、删除保存点、释放锁,当使用commit语句结束事务后,其它会话将可以查看到事务变化后的新数据。

     
    回退事务
    在介绍回退事务前,我们先介绍一下保存点(savepoint)的概念和作用。保存
    点是事务中的一点,用于取消部分事务。当结束事务时,会自动的删除该事务所
    定义的所有保存点。当执行rollback 时,通过指定保存点可以回退到指定的点,
    这里我们作图说明。  


    事务的几个重要操作ν  
    1.设置保存点 savepoint a  
    2.取消部分事务 rollback to a  
    3.取消全部事务 rollback  

    注意:这个回退事务,必须是没commit 前使用的;如果事务提交了,那么无
    论你刚才做了多少个保存点,都统统没。  
    如果没手动执行commit,而是exit了那么会自动提交
     


    sqlserver查询的执行顺序是:
    (1)FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate> 
    (2)WHERE <where_predicate>
    (3)GROUP BY <group_by_specification>
    (4)HAVING <having_predicate>
    (5)SELECT DISTINCT TOP(<top_specification>) <select_list>   
    (6)ORDER BY <order_by_list>               

    所以在where执行的时候,别名还不存在,而order by的时候已经存在


     

  • 相关阅读:
    Java虚拟机JVM学习05 类加载器的父委托机制
    java 接口
    java 抽象类
    代码块(2)
    获取超额收益的思考
    HttpServer
    交易过程思考
    A股时间窗口
    redash学习记录
    MySQL学习记录
  • 原文地址:https://www.cnblogs.com/MR-Guo/p/3420307.html
Copyright © 2011-2022 走看看