创建用户: CREATE USER 用户名 IDENTIFIED BY 密码;
用户解锁: ALTER USER 用户名 ACCOUNT UNLOCK/LOCK;
授予权限: GRANT CREATE SESSION TO 用户名;
管理员权限: GRANT DBA TO 用户名;
删除用户: DROP USER 用户名;
删除用户及数据:DROP USER 用户名 cAScade;
创建表:
CREATE TABLE 表名 (id Number NOT NULL Primary Key,email Varchar2(20),age Number Default 0);
修改数据表名:ALTER TABLE 表名 RENAME TO 新表名;
修改列名:ALTER TABLE 表名 RENAME COLUMN 列名 TO 新列名;
修改列的数据类型:ALTER TABLE 表名 MODIFY 列名 NEW_DATATYPE;
插入列:ALTER TABLE 表名 ADD 列名 DATATYPE;
删除列:ALTER TABLE 表名 DROP COLUMN 列名;
清空表: TRUNCATE TABLE 表名;
删除表: DROP TABLE 表名;
创建序列:
CREATE SEQUENCE SEQ_序列名 START WITH 1 INCREMENT BY 1 NOCYCLE nomaxvalue;
修改序列: ALTER SEQUENCE SEQ_序列名 INCREMENT BY 10 MAXVALUE 10000 ;
删除序列: DROP SEQUENCE SEQ_序列名;
创建视图:
CREATE OR REPLACE VIEW VW_视图名 AS SELECT * FROM 表名 [WITH READ ONLY];
查询视图: SELECT VIEW_NAME FROM USER_VIEWS;
视图授权: GRANT CREATE ANY VIEW TO 用户名;
删除视图: DROP VIEW 视图名;
强制创建视图: CREATE FORCE VIEW
创建复杂视图:
CREATE VIEW VW_视图名 (job,avg,sum,max,min) AS SELECT job,avg(sal),sum(sal),max(sal),min(sal) FROM emp group by job;
创建连接视图:
CREATE VIEW 视图名 AS SELECT d.deptno,d.dname,d.loc,e.ename,e.sal FROM dept d,emp e where d.deptno= e.deptno and d.deptno in(10,30);
查询索引: SELECT * [INDEX_NAME] FROM USER_INDEXES;
创建索引: CREATE INDEX PK_索引名 ON 表名(列1,列2);
删除索引: DROP INDEX PK_索引名;
PL/SQL:
结构:
DECLARE
声明部分
BEGIN
编写主题
EXCEPTION
捕获异常
END;
//结果不显示时 set serveroutput on
SSH模式下:打开输出
SQL> set serveroutput on
SQL语句最后加上斜杠 /
1、 DECLARE
i number;
BEGIN
i:=1/0;
exception
when zero_divide THEN
dbms_output.put_line('error');
end;
2、Loop 循环(do…while):
DECLARE
cou number;
BEGIN
cou:=1;
loop
dbms_output.put_line(cou);
exit when cou>10;
cou:=cou+1;
end loop;
end;
3、(while 循环):
DECLARE
x number;
BEGIN
x:=1;
while(x<5)loop
dbms_output.put_line(x);
x:=x+1;
end loop;
end;
4、(for 循环):
DECLARE
x number;
BEGIN
FOR x IN 1..7LOOP
DBMS_OUTPUT.put_line(x) ;
end loop;
end;
5、(IF…ELSIF…ELSE 语句):
DECLARE
x number;
BEGIN
x:=1;
if x>5 THEN
dbms_output.put_line(x);
elsif x>3 THEN
dbms_output.put_line('less');
else
dbms_output.put_line('fail');
end if;
end;
6、 插入表:
declare
no number;
begin
no:=1;
while(no<=5)loop
insert into emp(id,salary,name) values(no,20,'ss');
no:=no+1;
end loop;
end;
游标操作步骤:
声明游标->打开游标->取出结果,此时的结果取出的是一行数据->关闭游标
使用 for 循环操作游标(比较常用)
DECLARE
-- 声明游标
CURSOR mycur IS SELECT * FROM emp where empno=-1;
empInfo emp%ROWTYPE ;
cou NUMBER ; BEGIN
-- 游标操作使用循环,但是在操作之前必须先将游标打开
FOR empInfo IN mycur LOOP
cou := mycur%ROWCOUNT ; DBMS_OUTPUT.put_line(cou||'雇员编号:'||empInfo.empno) ; DBMS_OUTPUT.put_line(cou||'雇员姓名:'||empInfo.ename) ; END LOOP ;
END ;
创建函数:
CREATE OR REPLACE FUNCTION 函数名(en emp.ename%type) return number as is_exist number;
begin
SELECT count(*) into is_exitst from emp where ename=upper(en);
return is_exist;
end;/
查询函数:SELECT 函数名(7369) FROM dual ;
创建存储过程:
Create Proc dbo.csp_AddInfo
-- 存储过程参数
@UserName varchar(16),
@Pwd varchar(50),
@Age smallint,
@Sex varchar(6)
AS
-- 存储过程语句体
insert into Uname (UserName,Pwd,Age,Sex)
values (@UserName,@Pwd,@Age,@Sex)
RETURN
-- 执行
GO
-- 执行存储过程
EXEC csp_AddInfo 'Junn.A','123456',20,'男'
例: CREATE OR REPLACE PROCEDURE SP_存储过程名 AS
i NUMBER ;
BEGIN
i := 100 ;
DBMS_OUTPUT.put_line('i = '||i) ;
END ;
执行存储过程: SQL> exec SP_存储过程名;
删除存储过程: DROP PROCEDURE SP_存储过程名;
查看存储过程:SELECT distinct name from user_source;
1.带参数:
create or replace procedure sp_t2(n in varchar2,a in number) as
begin
insert into mytest(name,age) values(n,a);
end sp_t2;
/
SQL> exec sp_t2('ou',30);
2.有返回值的存储过程:
CREATE OR REPLACE PROCEDURE SP_EMP(V_ENO IN NUMBER,V_EN OUT VARCHAR2) AS
BEGIN
SELECT ENAME INTO V_EN FROM EMP WHERE EMPNO=V_ENO;
END;
/
3.返回列表:
创建包:
CREATE OR REPLACE PACKAGE PA_EMP AS
TYPE T_CURSOR IS REF CURSOR;
END PA_EMP;
/
创建存储过程:
CREATE OR REPLACE PROCEDURE SP_EMP2(p_CURSOR out PA_EMP.T_CURSOR) IS
BEGIN
OPEN p_CURSOR FOR SELECT * FROM EMP;
END SP_EMP2;
/
导出数据:EXT 用户名/密码@数据库名 FILE=路径名 OWNER=用户名
导入数据:IMP 用户名/密码@数据库名 FILE=路径名 FULL=Y
查询语句:
1、TOP前5: SELECT * FROM ts where rownum<=5;
2、TOP末5: SELECT * FROM (SELECT * FROM ts order by id desc) where rownum<=5;
删除ID唯一的重复数据
1、delete FROM ts where id not in (SELECT min(id) FROM ts group by name,age);
2、delete FROM ts where id in(SELECT distinct a2.id FROM ts a1,ts a2 where a1.id>a2.id and a1.name=a2.name and a1.age=a2.age);
3、delete FROM ts a1 where exists(SELECT * FROM ts a2 where a1.id>a2.id and a1.name=a2.name and a1.age=a2.age);
高级查询:
1、随机返回 5 条记录: SELECT *from (SELECT ename,job from emp order by dbms_random.value()) where rownum<=5;
2、得到当前行上一行或者下一行的数据
SELECT ename,sal,lead(sal) over(order by sal) aaa ,lag(sal) over(order by sal) bbb from emp;
lead是根据over的规则取下行记录,lag是根据over的规则取上行记录,两者可以从逻辑上互相取代。
3、确定一年内的天数: SELECT add_months(trunc(sysdate,'y'),12)-trunc(sysdate,'y') from dual;
1 sequence用法
create sequence seq_emp
increment by 1 --每次加几个
start with 1 --从1开始计数
maxvalue n --设置最大值
nomaxvalue --不设置最大值
nocycle --不循环累加
cycle --循环累加
cache 10 --缓存大小10
nocache --无缓存
创建好后
seq_emp.currval --sequence 当前值
seq_emp.nextval --sequence 增加值