5. Oracle
5.1 后台的服务
OracleService服务名 :OracleServiceXE 数据库主服务
Oracle服务名TNSListener :OracleXETNSListener 监听服务 1521
5.2 连接oracle服务
- 用命令行(黑窗口)
权限最高的用户 Sys
管理员用户 System
命令:sqlplus 用户名/密码 - 用网页管理
http://127.0.0.1:8080/apex/f?p=4950 - 用第三方的工具
plsql developer
修改oracle(web)服务的端口号
exec dbms_xdb.sethttpport(8083);
查看oracle(web)服务的端口号
select dbms_xdb.gethttpport() from dual;
5.3 oracle存储结构
表空间 - 逻辑单位
SYSTEM 表空间,用来存储系统表
TEMP 表空间,临时表空间
USERS 表空间,应用程序使用空间
表空间下在存储具体的表
5.4 创建和管理用户
create user 用户名 identified by 密码;
create user scott identified by tiger;
刚创建的用户没有权限,需要授权
grant 权限 to 用户名;
grant connect, resource to scott;
5.5 测试用户 hr
解锁hr用户
alter user hr account unlock;
alter user hr identified by hr;
5.6 查看有哪些表
select table_name from user_tables; 查询系统视图
5.7 查看表结构
desc 表名
5.8 建表
create table 表名(
列名 数据类型 约束,
…
);
数字类型: Number(有效数字最大位数, 小数点后位数)
Number(10) 长度最大为10的整数
Number(10,2) 整数部分最大8位,小数2位
可变字符类型
VARCHAR2(最大长度) 注意最大长度按字节处理, 一个汉字一般占3个字节(底层是utf-8)
NVARCHAR2(最大长度) 这回最大长度按字符为单位处理
日期
DATE 可以保存年月日,时分秒
TIMESTAMP 保留的日期信息更多
获取当前时间:sysdate, systimestamp
一般用 number(1) 代表布尔值,0代表false, 非0代表true
注意:oracle数据库中没有自增列
5.9 序列 sequence
create sequence 序列名;
从序列中获取值
select 序列名.nextval from dual;
插入时数据时使用序列
insert into 表(id, …) values (序列名.nextval, …);
5.10 dual 表
只有一行一列, 使用场景:当某个计算或某个函数只想调用一次的时候,必须配合dual表
select 1+1 from countries; // 返回多行2 ,太浪费
select 1+1 from dual; // 只会返回一个2
5.11 rownum 行号
作用,可以给查询结果做个一编号,
可以被看做特殊的列(伪列)
例子: 与 order by 使用时需要注意, 是先编号,再排序,所以结果与我们期望的不同
(select region_name from regions order by region_name) a
select rownum, a.region_name from (select region_name from regions order by region_name)a;
例子: 可以用做比较条件, 只能是< , <=
但不能是=, >, >=
Argentina
Australia
Belgium
Brazil
Canada
Switzerland
China
Germany
Denmark
Egypt
select rownum, country_name from countries where rownum<10;
rownum 的应用: 分页
select c.* from countries c where rownum<=5;
(select c.*, rownum rn from countries c where rownum <=10) b
select * from (select c.*, rownum rn from countries c where rownum <=10) b where b.rn > 5;
完整的写法:三层嵌套子查询配合rownum实现分页
select * from
(select a., rownum rn from
(select * from 表 c order by 排序列) a
where rownum <= 页号每页记录数) b
where b.rn > (页号-1)*每页记录数
例:
select * from
(select a.*, rownum rn from
(select * from countries c order by country_name) a
where rownum <= 15) b
where b.rn > 10;