Oracle11g

110 阅读5分钟

1、建表

 create table sys_user (
   user_id           number(20) CONSTRAINT pk_employee PRIMARY KEY not null,
   dept_id           number(20)      default null,
   user_name         varchar2(30)    not null,
   nick_name         varchar2(30)    default '',
   user_type         varchar2(2)     default '00',
   email             varchar2(50)    default '',
   phonenumber       varchar2(11)    default '',
   sex               char(1)         default '0',
   avatar            varchar2(100)   default '',
   password          varchar2(100)   default '',
   status            char(1)         default '0',
   del_flag          char(1)         default '0',
   login_ip          varchar2(128)   default '',
   login_date        date,
   create_by         varchar2(64),
   create_time       date,
   update_by         varchar2(64)    default '',
   update_time       date,
   remark            varchar2(500)   default ''
 );
 ​
 # 主键自增序列
 create sequence seq_sys_user
  increment by 1
  start with 100
  nomaxvalue
  nominvalue
  cache 20;

1.1、主键序列

 -- emp表, empno的自增序列:
 create sequence seq_on_scott_emp_empno
 increment by 1 -- 每次加几个
 start with 8000 -- 从几开始
 nomaxvalue -- 不设置最大值
 nocycle -- 一直累加,不循环
 nocache;
 ​
 -- 记得提交:
 commit;
 ​
 -- currval 当前序列;nextval 下一个序列
 select seq_on_scott_emp_empno.currval from dual;
 ​
 -- dept表, deptno的自增序列:
 create sequence seq_on_scott_dept_deptno
 -- 每次加几个
 increment by 10
 -- 从几开始
 start with 50
 -- [{MAXVALUE/ MINVALUE n| NOMAXVALUE 不设置最大值}]
 maxvalue 100
 -- [{CYCLE | NOCYCLE 一直累加,不循环}]
 NOCYCLE
 -- [{CACHE n| NOCACHE}]
 nocache;
 ​
 -----
 create sequence seq_on_scott_dept_deptno
 increment by 10
 start with 50
 maxvalue 9999
 NOCYCLE
 nocache;

1.2、约束

-- 外键:
constraint fk_user_txt_user_id foreign key (txt_userid) references tb_user111(userid);

-- 主键
ALTER TABLE tb_user ADD CONSTRAINT pk_user_userid PRIMARY KEY (userid);

-- check
ALTER TABLE tb_user ck_user_username CHECK ( length( username ) BETWEEN 4 AND 20 ); 

-- 唯一
ALTER TABLE tb_user  ADD CONSTRAINT uq_user_email UNIQUE ( email ) 

-- 非空
ALTER TABLE tb_user modify ( username CONSTRAINT nn_user_username NOT NULL ); 

-- 默认值
ALTER TABLE tb_user modify ( age DEFAULT ( 18 ) ); 

-- 外键
ALTER TABLE "SCOTT"."TB_TXT" ADD CONSTRAINT "SYS_C0011117" FOREIGN KEY ("TXT_USERID") REFERENCES "SCOTT"."TB_USER" ("USERID") ON DELETE SET NULL;

-- 删除约束
ALTER TABLE tb_user DROP constraint uq_user_email cascade;

2、字段属性

类型
varchar2(size)可变长度字符串,size=1~4000,必须指定size值。
char(size)固定长度字符串,size=1~2000。
long可变长字符,长度2G个字节。
number(p,s)整数:number(5) 小数:number(7,2),有效位数7位,整数5位,小数2位(p=1~38,s=-84~127)
date有效日期:公元前4712年1月1日,到公元后4712年1月1日。
clob一个字符大型对象,可容纳单个字节的字符,不支持宽度不等的字符集,最大4G字节。
nclob一个字符大型对象,可容纳单个字节的字符,不支持宽度不等的字符集,最大4G字节(存储国家字符集)。
blob一个二进制大型对象,最大4G字节。

3、函数

3.1、字符串函数

-- 有空值
nvl(ename,'')

-- 字符串拼接
select ename, ename||'职位是'||job from emp;
SELECT ename,concat( concat( ename, '职位是' ), job ) 描述 FROM emp;

-- 字符串截取、替换
replace(str,old,new)
substr(str,start,length)

-- 查询
instr( 'helloworld', 'l' )
-- 这4表示起始位置; 这2表示字符若重复,查找第2个字符
instr( 'helloworld', 'l', 4, 2 )

-- 字符串转数字
to_number('11'+1)

3.2、日期函数

-- 系统当前时间:
sysdate
current_date

-- 系统最后一天:
sysdate+1

-- 3个月后转正时间:
add_months(hiredate,3)

-- 当前时间最后一天:
last_day(sysdate)

-- 当前时间最后一天:
last_day(sysdate)-- 查询入职时间到现在共几个月:	
SELECT sysdate,hiredate,months_between ( sysdate, hiredate ) FROM emp;

-- 查询当前时间,到下周周一的时间:
select sysdate,next_day(sysdate,'Monday') from dual;

-- 查询入职时间大于1985年的
SELECT empno FROM emp WHERE HIREDATE > TO_DATE( '1985', 'yyyy' ) 

3.3、日期 | 字符串互转

-- publish_time使用NUMBER(15)  1577145600
select to_char(unix_to_date(publish_time), 'YYYY-MM-DD') from assi_sys_notice;

-- 日期转字符:
select hiredate,to_char(hiredate, 'yyyy/mm/dd') from emp;
-- 中文需要加上 "" 双引号
SELECT hiredate,to_char ( hiredate, 'yyyy"年"mm"月"dd"日"' ) FROM emp;

-- 字符转日期:
SELECT to_date ('1996-04-14', 'yyyy/mm/dd') FROM DUAL;

4、更新数据MERGE INTO

查询目标表和原表中是否有相同的数据,有就修改,没有就新增。

merge into 目标表 using 原表或者select查询的表 on 匹配相同字段如id,when matched then 有相同,when not matched then 没有相同。

MERGE INTO target_table t
USING source_table s
ON (t.id = s.id)
WHEN MATCHED THEN
  UPDATE SET t.col1 = s.col1, t.col2 = s.col2
WHEN NOT MATCHED THEN
  INSERT (t.id, t.col1, t.col2) VALUES (s.id, s.col1, s.col2);
  
-- scott数据:
MERGE INTO emp e1
USING (SELECT * FROM emp WHERE empno = 8000) e2
ON (e1.empno = e2.empno)
WHEN MATCHED THEN
  UPDATE
     SET e1.ename = e2.ename
        ,e1.hiredate = to_date(to_char(SYSDATE, 'YYYY/MM/DD'), 'YYYY/MM/DD')
WHEN NOT MATCHED THEN
  INSERT (e1.empno,e1.ename,e1.job,e1.mgr,e1.sal,e1.comm)
  VALUES (e2.empno,e2.ename,e2.job,e2.mgr,e2.sal,e2.comm)

5、分页ROWNUM

oracle使用rownum分页,但是rownum不支持直接使用大于号。

-- rownum: 到第6行, rw:从第1行开始
SELECT * 
FROM ( SELECT ROWNUM rw, a.* FROM ( SELECT * FROM emp ) a WHERE ROWNUM <= 6 ) b 
WHERE b.rw > 0;
	
-- 表连接分页
SELECT * FROM
(SELECT ROWNUM rw,	a.* FROM
 	( SELECT e.*, d.dname FROM emp e LEFT JOIN dept d ON e.DEPTNO = d.deptno ORDER BY e.empno ) 
 	a WHERE ROWNUM <= 10)
 b WHERE b.rw > 5;

6、系统 | 用户 | 表空间管理

sysdba系统管理员:sys/system/sysdba。

普通用户:normal。

sqlplus sys/12345678 AS sysdba
-- 只进入sql服务端,不连接用户:
sqlplus /nologin

-- 查看当前用户:
SHOW USER;

-- 切换账号:
conn scott/123456;
conn 用户名/密码 AS sysdba;

-- 修改密码:
ALTER USER liubin IDENTIFIED BY 123456;
-- 账号解锁:
ALTER USER liubin account unlock;

表空间

是数据的逻辑划分。

永久表空间:

一个表空间只能属于一个数据库,所有的数据库,所有数据库对象都存放在指定的表空间中。

临时表空间:

主要来做查询和存放一些缓冲区数据;

临时表空间消耗的主要原因是:需要对查询的中间结果进行排序,重启数据库可以释放临时表空间。

-- 需要先登录上,system或sys
-- size 当空间存满了,以10M为单位,进行扩展
-- 永久表空间物理文件位置,系统的物理位置
create tablespace 永久表空间名称 datafile '永久表空间物理文件位置' size 15M autoextend on next 10M permanent online;

CREATE tablespace DATA datafile '/oracleData/oracle/oradata/orcl/DATA.DBF' SIZE 15M autoextend ON NEXT 10M permanent ONLINE;

-- 创建用户分配表空间:
create user jc identified by 123456 default tablespace DATA temporary tablespace TEMP profile DEFAULT password expire;

-- 授权:
GRANT dba TO jc;

ALTER USER jc IDENTIFIED BY 123456;

-- 创建用户分配表空间:
CREATE tablespace DATA datafile '/oracleData/oracle/oradata/orcl/DATA.DBF' SIZE 15M autoextend ON NEXT 10M permanent ONLINE;

启动数据库

## 启动数据库实例(管理员权限下):
## 启动,不加载数据库
startup nomount
## 启动实例,加载数据并保持数据库关闭状态。
startup mount
## 启动实例,加载并打开数据库(默认)
startup open
## 终止实例,重启数据库
startup force


## 关闭数据库实例:
## 等待所用用户退出,正常关闭数据库。
shutdown normal
## 当前所有华东事务被提交后,关闭数据库。
shutdown transactional
## 不等待连接的所有用户退出,强行回滚当前所有事务,断开所有连接用户
shutdown immediate
## 终止,关闭数据库
shutdown abort