Oracle数据库入门 基础知识day05 火推阳光笔记

来源:互联网 发布:弈乐麻将 游戏网络 编辑:程序博客网 时间:2024/06/04 19:30

 
Oracle 05



DML 数据操作语言

事务 , insert
数据的删除

格式1.    

    删除指定表格中的所有数据 

    delete from 表名;

格式2.

    根据where条件 ,删除匹配的数据

    delete from 表名 where 条件;

练习: 

    需求: 删除id为11的person表格数据
    delete from person where id=11;
    commit;
    需求: 删除id为12 或 22的person表格数据
    commit;
    delete from person where id=12 or id=22;
    需求: 删除所有的person数据
    commit;
    delete from person;
数据的修改

格式: update 表名 set 字段名1=字段值1,字段名2=字段值2...字段名n=字段值n [where 条件];

在update语句中, set后面的字段名与值列表, 使用逗号隔开多个字段名/值

练习:

    需求:
    -   修改person表中的所有的age 为  18.
        update person set age=18;
        commit;
    -   修改person表中的 id为12的 人 ,将他的年龄设置为188
        update person set age=188 where id=12;
        commit;
    -   修改person表中的 id为13的人, 设置它的年龄为20 , 姓名为逗逼
        update person set age=20,name='逗逼' where id=13;
        commit;
TCL    事务控制语句

事务: 

    需要把多条的DML sql语句看作一个整体 , 要么一起成功, 要么一起失败

    oracle 数据库 事务是需要手动结束的 , 如果不结束则对数据库产生不了任何的影响 !

    Mysql 数据库 事务默认是自动提交 ,在你执行的每一条的dml语句后, 自动执行commit;
事务的特性:

1.  原子性: 同一个事务中的操作, 不可分割 ,要么一起成功, 要么一起失败 !

2.  一致性: 同一个事务的操作, 保持一致 !

3.  隔离性: 一个事务的dml操作, 在没有提交之前, 对于其他的事务来说, 数据应是不可见的 !

4.  持久性: 数据要一直保持
如何结束事务

1.  commit
    -   提交事务, 将数据写入数据库 !

2.  rollback
    -   回滚事务(回退操作) , 撤回, 回退本次事务的所有dml操作

    使用格式: 

        1.  rollback; 回退之前的所有dml操作:
        2.  rollback to 保存点

    保存点添加的方式: 

        savepoint 保存点名称;

    案例:

        将对于perosn表的四次插入, 看作一个事务

        insert into person values(10001,'凯凯',8);
        savepoint a;
        insert into person values(10002,'凯凯自充气版',8);
        savepoint b;
        insert into person values(10003,'凯凯合金弹头限量款',1);
        savepoint c;
        insert into person values(10004,'凯凯双马达动力款',20);
        savepoint d;
        --rollback to b;
        rollback;
        commit;
日期类型

在创建表格时, 字段类型指定为date即可, 不需要指定长度

创建表格: 

    表名: person
    列: 
        -   id  number类型 长度5
        -   name varchar2类型 长度100
        -   age number类型 长度5
        -   createdate date类型
    --------------------------------------------
    create table person(
        id number(5),
        name varchar2(100),
        age number(5),
        createdate date
    );
向表格插入日期

传入当前时间

sysdate : 表示系统(本机电脑)当前时间


insert into person values(10001,'凯凯',18,sysdate);
insert into person values(10002,'志强',28,sysdate);
使用to_char对日期进行格式化

to_char(参数1,参数2);
    -   1.  将一个数字 转换为指定格式的 字符串
    -   2.  将一个date 转换为指定格式的 字符串

-   类似Java中的 SimpleDateFormat (yyyy年-MM月-dd日 HH时mm分ss秒 sss毫秒)

参数1.    日期类型的数据
参数2.    日期格式化的模版

            -   模版中的特殊字符的含义

            yyyy:四位年
            MM  :月 (英文环境下 显示月份单词前三个字母)
            dd  :日
            hh  :12小时制
            hh24:24小时制
            mi  :分钟
            ss  :秒

            ---------------------------

            特殊: 

            day : 星期
            month:月(英文环境下,显示月份整个单词)
            am: 12小时制 , 
                中文显示:   上午/下午
                英文显示:   am / pm

    练习: 

        查询id为10002的person数据, 要求 ,创建日期要展示年月日时分秒

        select id,name,age,to_char(createdate,'yyyy-MM-dd am hh:mi:ss day') from person where id=10002;

        select id,name,age,to_char(createdate,'yyyy-MM-dd hh24:mi:ss day') from person where id=10002;
如何插入一个过去时间

向数据库插入北京奥运会开幕式的日期:  2008-8-8

默认日期格式: 

    英文环境: dd-mon-yy
        例如: 2008年8月8日:  08-aug-2008
    中文环境: 日-月-年
        例如: 2008年8月8日:  08-8月-2008
通过上述格式的字符串 即可插入

insert into person values(10003,'凯凯3',18,'08-8月-2008');
to_date(参数1,参数2)
    将一个日期字符串, 转换为date

使用方式与to_char基本一致 !

参数1.    字符串类型的时间
参数2.    匹配参数1的字符串 时间格式模版

-------------

使用to_date 像数据库中插入 2008年8月-8日 20时08分08秒

insert into person values(10004,'志强2',28,to_date('2008-08-08 20:08:08','yyyy-mm-dd hh24:mi:ss'));
commit;
日期的设置 与 取出

我们正常需求下 , 一般通过to_date 将数据插入数据库 
通过to_char将数据从数据库中取出并展示
日期(date)的调整

sysdate : 系统当前时间,date类型的数据

    date类型可以与数字进行加减 !

    date类型可以减去date类型
        sysdate-sysdate=0;
    date类型无法与date类型相加

sysdate+1:当前时间增加一天

    select to_char(sysdate+1,'yyyy-mm-dd hh24:mi:ss') from dual;

sysdate-1:当前时间减少一天

    select to_char(sysdate-1,'yyyy-mm-dd hh24:mi:ss') from dual;

求出当前时间 向前推一小时的时间: (减少一小时)

sysdate-(1/24)
    select to_char(sysdate-(1/24),'yyyy-mm-dd hh24:mi:ss') from dual;

练习: 

    求出当前时间增加10分钟
    select to_char(sysdate+(10/60/24),'yyyy-mm-dd hh24:mi:ss') from dual;

    求出当前时间减少一个半小时
    select to_char(sysdate-(1.5/24),'yyyy-mm-dd hh24:mi:ss') from dual;
求出当前时间增加一个月的时间

add_months(参数1,参数2);

    参数1. date类型的数据
    参数2. number类型 , 1表示一个月 , -1表示负一个月

select to_char(add_months(sysdate,1),'yyyy-mm-dd hh24:mi:ss') from dual;
截取日期

trunc(参数1,参数2);

参数1. 要截取的日期类型的数据(date)
参数2. 要截取的日期单位 (默认截取单位是dd)(传入的值为日期模版中的单位)

2017-09-21 14:38:55
默认截取到dd
select to_char(trunc(sysdate),'yyyy-mm-dd hh24:mi:ss') from dual;

截取到mm
select to_char(trunc(sysdate,'mm'),'yyyy-mm-dd hh24:mi:ss') from dual;

截取到hh
select to_char(trunc(sysdate,'hh'),'yyyy-mm-dd hh24:mi:ss') from dual;
日期操作练习题

1.  求出当前时间 , 当前月份的最后一分钟
    select to_char(add_months(trunc(sysdate,'mm'),1)-(1/60/24),'yyyy-mm-dd hh24:mi:ss') from dual;

2.  查询s_emp表格(id,last_name,start_date) , 按照start_date排序
    select id,last_name,to_char(start_date,'yyyy-mm-dd hh24:mi:ss') from s_emp order by start_date;

3.  查询s_emp表格(id,last_name,start_date) , 查询的条件为入职日期在1990年1月份 到 1990年12月份
    select id,last_name,to_char(start_date,'yyyy-mm-dd hh24:mi:ss') from s_emp where start_date>to_date('1990-1-1','yyyy-mm-dd') and start_date<'31-12月-1990';
约束

数据库的约束, 是对于在数据库中进行数据插入时的一些限制!

满足约束条件的 则可以正常插入数据, 不满足的则报错!
约束的分类与含义

-   主键约束(primary key)(pk) :一个表格只允许存在一个主键列 ,  一般用来做唯一标识 ,  一个字段加了主键约束以后 ,则这个字段不能为null , 并且这个字段不可重复 ! 可以理解为: 非空+唯一

-   非空约束(not null) (nn):字段的值不能为空

-   唯一性约束(unique)(uk) :字段的值不可重复

-   检查约束(check)(ck) : 字段的值必须符合检查条件

-   外键约束:以后再说


----------------------------------------------------
约束的使用方式:

1.  列级约束:   在定义表的某一列时 , 在列后面追加约束关键字, 叫做列级约束!

2.  表级约束:   在定义完毕表的所有列之后, 再选择某些列添加约束, 叫做表级约束 !
列级约束-主键约束

创建一个person表格, 设置它的id为主键: 

create table person(
    id number primary key,
    name varchar2(100),
    age number
);


向上述的表格插入两行数据: 
insert into person(name,age) values('a',18);
    我们在尝试插入数据时, 忽略了主键字段, 报错!

insert into person values(1,'a',18);
    我们在尝试插入全字段数据时, 插入成功
insert into person values(1,'b',28);
    重复插入相同的主键, 报错 : 违反唯一与约束


练习: 

创建一个表格person_1

    拥有如下字段: 
    id number  主键
    name varchar(100) 唯一
    age number 非空


create table person_1(
    id number primary key,
    name varchar2(100) unique,
    age number not null
);
约束别名

每个约束, oracle都会为其生成一个不重复的别名 , 系统生成的别名 不具备 见名知意的效果

我们可以主动在添加约束时, 给约束指定一个别名, 方便我们后期进行调试!

别名的特点: 
    具备唯一性 

别名的命名规范: 
    表名_字段名_约束的简写

格式: 

    create table 表名(
        字段名1 字段类型 constraint 别名 约束关键字,
        字段名2 字段类型
        ...
    );

create table person(
    id number constraint person_id_pk primary key,
    name varchar2(100) constraint person_name_uk unique,
    age number constraint person_age_nn not null
);

尝试违反约束条件, 观看报错时的约束名称:

insert into person values(1,'凯凯',88);
commit;
insert into person values(1,'凯凯',88);
commit;
列级约束--检查约束

练习: 

创建一个用户表格 , 因为网站的特殊性, 要求年龄满18岁才可以注册

    create table user13(
        uname varchar2(20),
        upass varchar2(20),
        age number constraint user13_age_ck check(age>=18)
    );

尝试插入年龄低于18岁的信息

insert into user13 values('kaikai','yibaige6',12);
commit;