您的位置:首页 > 数据库 > Oracle

Java Web笔记(三) - Oracle

2017-11-06 11:13 274 查看

Oracle数据库

Oracle版本

Oracle 9i、10g、11g,最新版本是12c。

Oracle的三个版本

1)企业版

企业版主要用于构建安全、可靠、大容量的互联网应用和数据仓库。面向企业级应用。(使用于企业使用)

2)标准版

标准版提供了能够通过Web浏览器进行管理的高性能数据库服务,面向部门级应用。(适应于公司内部使用)

3)个人版

个人版是Oracle全功能单用户版本,面向开发技术人员。(适用于个人学习使用)

安装OracleXE112_Win32

1)安装:

按照默认方式安装即可。

2)配置

修改安装路径下

oraclexe\app\oracle\product\11.2.0\server\network\ADMIN\tnsnames.ora文件

修改为:

    XE =

      (DESCRIPTION =

        (ADDRESS = (PROTOCOL = TCP)(HOST = YOS-20170408CDD)(PORT = 1521))

        (CONNECT_DATA =

          (SERVER = DEDICATED)

          (SERVICE_NAME = XE)

        )

      )

    247 =

      (DESCRIPTION =

        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.247)(PORT = 1521))

        (CONNECT_DATA =

          (SERVER = DEDICATED)

          (SERVICE_NAME = ORCL)

        )

      )

Oracle的使用

注:Oracle数据库不区分大小写。

Oracle中的注释

-- 注释内容 单行注释

/* 注释内容 */
多行注释

Oracle的简单使用

1)连接远程数据库服务器

注意:必须安装Oracle客户端,并且不能安装oracle精简版客户端。

sqlplus 用户名/密码
[@IP地址/数据库名]
本地数据库不用写中括号中的内容

示例:sqlplus shop/shop @192.168.2.247/orcl

2)查询当前用户下所有表

select table_name from user_tables;

Oracle中的数据类型

常用的数据类型

Number(11) 数字类型 最大值是38位

Number(11,2) 这样表示小数,2表示小数位数,11代表有效位数是11位,最大位数是38。

Integer 整数类型,不推荐使用

CHAR(4) 定长字符

VARCHAR2(50) 可变长度字符串,50表示最长可以有50个字符。最大可存放4000个字符。

CLOB 存放大字符数据

BLOB 存放字节数据

VARCHAR() 和VARCHAR2()相同,但不推荐使用,它是为了oracle后期扩展使用的。

DATE 日期类型

Timestamp 日期类型(时间戳)

表的操作

1)创建表(我们班的表名命名规则:J0508_姓名_表名)

创建表的语法:

    create table 表名(

        字段名1
字段类型,

        字段名2
字段类型,

        ......

    );

通过select创建表

    创建表1,同时将表2中的数据存入到表1中。

    crate table 表名1
as

    select * from 表名2

示例1:

    create table j0508_wez_t_user(

        id number,

        name varchar2(50),

        sex char(1)

    );

示例2:

    create table

注:在oracle中,一个汉字占3个字节。

2)修改表字段

alter table j0508_wez_t_user
modify sex char(4);

3)修改字段名

alter table j0508_04_post_type rename column
id to typeId

4)查看表结构(只能在命令提示符下使用,plsql使用不了该命令)

desc j0508_wez_t_user;

5)新增字段

alter table j0508_wez_t_user
add email char varchar2(100);

6)删除字段

alter table j0508_wez_t_user
drop column sex;

7)删除表

drop table j0508_wez_t_user;

增删改查(CURD)

DML 数据操纵语言 增删改 必须提交事务,才能把数据持久化到数据库中

DQL 数据查询语言 查

提交事务:commit;

回滚事务:rollback;

注:在oracle中如果没有使用commit命令提交事务,那么数据是不会存储到数据库中的,即使使用查询语句可以查询到,那是因为oracle会为每个用户开辟一块内存空间,数据会暂存在这片内存空间中,但是并没有真正存储到数据库中。

a)插入数据(值与字段一一对应)

insert into j0508_wez_t_user (id, name, email)

values(1, ‘zhangsan’, ‘zhangsan@qq.com’);

b)修改数据

修改所有数据:

update j0508_wez_t_user
set name=’lisi’;

修改某条数据:

update j0508_wez_t_user
set name=’lisi’, email=’lisi@qq.com’

where id = 1;

c)删除数据

删除某条数据:

delete from j0508_wez_t_user
where id = 1;

删除所有数据:

delete from 表名 ---
只删除表的中数据,但是表中数据对用的空间是不会被删除的,只有提交事务时才会删除数据。

truncate table 表名 --
删除表中所有的数据,并删除表中数据对应的空间,truncate一旦删除,不可恢复。

约束

a)主键约束

        primary key

    特点:非空唯一

    作用:查询数据或关联表

b)非空约束

    not null

    特点:值不允许为空

c)唯一约束

    unique

    特点:值不允许重复

d)检查约束

    check

    特点:值必须满足check条件

    示例:sex char(4) check(sex in(‘男’, ‘女’))

          score number(11,2) check(score>=0 and score<=100)

e)外键约束

    references

    特点:关联表

    示例:pid number
references j0508_wez_t_user(id)

查询数据(DQL语句)

select 字段1,
字段2,
字段3, ...
from 表名

查询所有字段

    select * from 表名 (注:能不使用*尽量不使用,*会导致SQL查询性能的下降)

条件查询

    select 字段1,
字段2, ...
from 表名
where 条件

    注:能用where不用group by。

group by子句

    group by在使用的时候,对select查询的字段有要求

    如果直接查询字段,则该字段必须出现在group by后面

    select查询的字段可以使用聚合函数

    Oracle中常用的聚合函数有:sum()->求和,avg()->求平均值,count()->求记录数,max()->求最大值,min()->求最小值

having子句

    having不能单独使用,只能出现在group by子句后面;

    having是对分组后的结果进行筛选。

    order by子句

    asc 升序(默认的)

    desc 降序

    作用:排序

    order by后跟要排序的字段;

    注:order by有去重的功能。

distinct

    查询的结果去除重复

    示例:select
distinct name from t_teacher;

顺序

    select 字段 from
表名

    where 条件

    group by 字段

    having 筛选

    order by 字段

    asc/desc

多表连接

多对多

    利用中间表维护关系

    例:用户和角色的关系

    示例:

        -- 用户表

        create table j0508_wez_t_user (

            id number primary key, -- 主键

            name varchar2(20), -- 用户名

            password varchar2(128), -- 密码

            ip varchar2(20) -- 登录IP

        );

        -- 角色表

        create table j0508_wez_t_role (

            id number primary key, -- 主键

            roleName varchar2(50), -- 角色名

            roleDesc varchar2(100) -- 角色描述

        );

        -- 用户角色中间表

        create table j0508_wez_t_user_role (

            userId number references j0508_wez_t_user(id),

            roleId number references j0508_wez_t_role(id),

            primary key(userId, roleId) --
联合主键

        );

多对一

    在多的一方中维护关系

    例:学生和教师的关系

    示例:

        -- 学生表

        create table j0508_wez_t_student (

            id number primary key, -- 主键

            name varchar2(20), -- 学生姓名

            -- 在多的一方中维护关系

            teacherId number references j0508_wez_t_teacher(id)

        );

        -- 教师表

        create table j0508_wez_t_teacher (

            id number primary key, -- 主键

            name varchar2(20) -- 教师姓名

        );

一对一

    通常的做法是在附表中维护主表的信息

    例:用户表和用户信息表

    示例:

        -- 用户表同上

        -- 用户信息表

        create table j0508_wez_t_userInfo(

            id number primary key, -- 主键

            tel varchar2(11), -- 电话

            email varchar2(20), -- 电子邮箱

            idcard varchar2(18), -- 身份证号

            userId number references j0508_wez_t_user(id) --
在附表中维护关系

        );

模糊查询

    关键字:like

    % 代表零个或多个

_ 代表匹配一个任意字符(相当于一个占位符)

示例:

    -- 查询用户名以z开头的用户信息

    select * from t_user where name like 'z%';

    -- 查询用户名包含a的用户信息

    select * from t_user where name like
'%a%';

    -- 查询用户名以u结尾的用户信息

    select * from t_user where name like
'%u';

    -- 查询用户名只有2个字符的用户信息

    select * from t_user where name like
'__';

    -- 查询用户名姓张的,并且只有两个字符的用户信息

    select * from t_user where name like
'张_';

多表查询

    1)使用笛卡尔积查询

        -- 查询所有用户信息和角色信息

        select u.*, r.* from t_user u, t_user_role ur, t_role r

        where u.id=ur.userId and ur.roleId=r.id;

    2)左外连接(掌握)

        特点:以左边的表为主表,查询的记录以左边表的记录为准。

              左表是指left outer左边的表

        示例:

            select u.*,r.* from t_user u

            left outer join t_user_role ur on u.id = ur.userid

            left outer join t_role r on ur.roleid = r.id;

    

            select u.*,r.id roleId, r.rolename,r.roledesc from t_role r

            left outer join t_user_role ur on r.id = ur.roleid

            left outer join t_user u on ur.id = u.id;

            注:outer可以省略。

    3)右外连接

        类同于左外连接

    4)内连接(掌握)

        特点:查询表中有关系的记录

        示例:

            select u.*,r.id roleId, r.rolename,r.roledesc from t_role r

            inner join t_user_role ur on r.id = ur.roleid

            inner join t_user u on ur.userid = u.id;

    5)全连接

            特点:将两张表中的数据都查询出来。

    6)自连接(掌握)

        与内连接相同,只是自连接是自己连接自己。

子查询

a)在查询字段上使用子查询

        示例:

            -- 查询用户信息表中的电话

            -- 方式一:一般查询方法

            select u.*, f.tel from t_user u

            left join t_user_info f

            on u.id = f.userid;

            -- 方式二:使用子查询

            select u.*, (

                select f.tel from t_user_info f

                where f.userid = u.id

            ) as tel

            from t_user u;

b)在where条件上使用子查询

        示例:

        -- 查询电话号码不为空的用户信息

        select * from t_user u

        where exists (

            select * from t_user_info f

            where f.tel is not null and f.userid=u.id

        )

注:能用exists就不要使用in,in会影响性能。

数据库分页

    Oracle的分页是借助rownum伪列实现的。

示例:

    -- pageSize:每页显示的记录个数

    -- page:当前页

    -- start:开始条数,(page - 1) * pageSize + 1

    -- end:结束条数,page * pageSize

    rownum:数据库伪列,代表数据库查询出来数据的出库顺序。(实际不存在,每个表都有)

    分页写法一:

        select t2.* from (

            select t1.*, rownum r  from (

                select * from t_teacher

            ) t1

         )t2 where r>=1 and r<=5

    分页方式二:

        select t2.* from (

            select t1.*, rownum r from (

                select * from t_teacher

            ) t1 where rownum <= 5

        ) t2 where r>= 1

    注:rownum只能=或<=。

主键生成策略

a)通过Java代码生成唯一的值作为oracle数据库的主键,采用时间戳+随机数

b)通过获取数据库中最大值+1作为新数据的主键

c)通过oracle提供的函数sys_guid()来生成一个值作为主键(缺点:太长不便于处理)

d)采用序列的方法 sequence

    create sequence t_user_seq
start with 1 -- 从1开始

    increment by 1 nocache; --
每次增长1(默认为1,为1时可以不写该句)

    -- nocache:表示不缓存;cache:表示缓存

    插入主键的方法:

        insert into t_teacher(id, name) values(t_user_seq.nextval, ‘name’);

集合操作

集合操作是将多个查询结果合并到一起的过程。

求并集

a)UNION ALL(不去重)

    select 字段1,
字段2, ... from
表名1

    union all

    select 字段1,
字段2, ... from
表名2

b)UNION(去重)

    select 字段1,
字段2, ... from
表名1

    union

    select 字段1,
字段2, ... from
表名2

使用要求:查询的字段要求类型、顺序都要一致。

求交集

intersect

求差集

minus

授权 grant DCL语句

-- 不推荐在超级管理员用户下创建表

-- 新建用户命令

    create user shop -- 用户名

    identified by shop; -- 口令(即密码)

 

-- 授权(DCL语句)

    grant connect to shop; -- 赋予连接权限

    grant resource to shop; -- 赋予资源权限

    -- grant sysdba to shop; -- 赋予管理员权限(一般不赋予)

grant create view to shop; -- 赋予创建视图权限

解锁用户

alter user shop account unlock;

撤销权限

关键字:revoke

伪列、伪id、伪表

伪列:rownum,用于分页,存储的是数据的出库顺序,每个表都有

伪id:rowid,存储的记录的物理地址,每个表都有

伪表:dual

常用的函数 /
日期处理

字符类函数

    a)连接字符串
方式1:
    concat(字符串1,
字符串2)
    示例:
        select concat(id,
concat(tel, email)) from t_user_info;
    注:concat一次只能连接两个字符串,如果连接多个,要嵌套使用concat
方式2:
    字符串1||字符串2||字符串3||...
    示例:
        select id || tel
|| email from t_user_info;
    b)获取字符串的长度
length(字符串)
示例:select
length(id || tel || email) from t_user_info;
c)lengthb()
获取字符串所占的字节
    d)转大写
lower(字符串)
    e)转小写
upper(字符串)
    f)去空格
trim(字符串):去除字符串两端的空格
ltrim(字符串):去除字符串左端的空格
rtrim(字符串):去除字符串右端的空格
    g)替换
replace()
    h)截取字符串
substr()
日期函数
a)添加月份
    add_months(日期,
添加的月数)
    b)获取系统当前时间

        sysdate()

        注:在oracle中如果方法没有参数,则可以不写括号。

转换函数

    a)将日期数据类型转成字符串

        to_char(日期类型,
日期模式)

        yyyy:表示年

        mm:表示月

        dd:表示日

        hh:表示12小时制

        hh24:表示24小时制

        mi:表示分钟

        ss:表示秒

        示例:select
to_char(hire_date, ‘yyyy-mm-dd hh24:mi:ss’) from
表名

    b)将日期字符串转成日期类型

        to_date(日期字符串,
日期模式)

        Oracle中的日期模式是yyyy-mm-dd hh24:mi:ss;

        示例:select
to_date(‘2017-07-26 12:13:15’, ‘yyyy-mm-dd hh24:mi:ss’);

    c)将字符串转成数字

        to_number(字符串)
如果字符串不是数字则报错。

d)decode()

    -- decode()类似于java中的switch

        select degree, decode(floor(degree/10), 9 , '优' ,8 ,'良',

        7 , '中' , 6 ,'及格' , '不及格')
as ret from j0508_chengjingqi_score

case when else end

    -- if else if else

    select degree ,

        case

            when degree >=90 then '优'

            when degree >=80 then '良'

            when degree >=70 then '中'

            when degree >=60 then '及格'

        else

            '不及格'

        end as ret    

    from j0508_chengjingqi_score

nvl(值,
默认值)
当字段值为空时,可以使用默认值

nvl2(逻辑表达式,
表达式,
表达式)
类似于三目运算符,当逻辑表达式为null时返回第个三表达式。

创建表索引

    索引创建的位置

    a)主键上创建索引

    b)外键上创建索引

    c)出现在where条件上的字段,可以适当的创建索引

    d)枚举类型的字段适当的创建索引

创建的语法

    Create index 索引名 on
表名 (字段1,
字段2, ......)

索引的作用

    提高查询的效率

创建视图

视图的作用

    简化查询,但是不能提高查询的效率。

创建视图

    create view 视图名

    as

    查询语句

Oracle数据库的批量插入

insert into 表名 (字段1,
字段2, ......)

(select 值1,
值2, ...
from dual)
union

(select 值1,
值2, ...
from dual)
union

(select 值1,
值2, ...
from dual)
union

(select 值1,
值2, ...
from dual);

注:dual是虚表

sql语句的优化

a)能用where不要用group by;

b)能用exists不要用in;

c)能用>不要用>=;(<不适用)

数据库事务

1)事务

同一个操作,要么成功,要么失败。

2)事务的特性(ACID)

A:原子性 C:一致性
I:隔离性
D:持久性

3)事务的隔离级别

有4个隔离级别。

a)读未提交

b)读已提交(oracle采用的)

c)不可重复度

d)序列化读

        序列化读就是同时只能有一个人在操作表,如果有其他人,则等待。

4)事务的命令

commit:提交

rollback:回滚
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: