[1].创建表空间
CREATE TABLESPACE SYPRO_201310 DATAFILE 'F:\ORACLE_11G\oradata\orcl\SYPRO_201310.DBF' SIZE 10M AUTOEXTEND ON
在指定的F盘下创建一个名SYPRO_201310.DBF的文件初始空间是10M当空间不足时自动增加
[2].删除表空间同时删除表空间所有硬盘上的物理文件
DROP TABLESPACE SYPRO_201310 INCLUDING CONTENTS AND DATAFILES
[3].查看当前用户所有表空间
SELECT * FROM DBA_TABLESPACES
[4].创建用户liutao 密码 liutao 默认表空间 SYPRO_201310 临时表空间 TEMP
CREATE USER liutao IDENTIFIED BY liutao DEFAULT TABLESPACE SYPRO_201310 TEMPORARY TABLESPACE TEMP
[5].用户授权-连接数据库的权限
GRANT CONNECT TO LIUTAO WITH ADMIN OPTION
[6].用户授权-数据库管理员DBA角色
GRANT DBA TO LIUTAO WITH ADMIN OPTION
-- 创建表空间
CREATE TABLESPACE BOAICRM_201310 DATAFILE 'F:\ORACLE_11G\oradata\orcl\BOAICRM_201310.DBF' SIZE 50M AUTOEXTEND ON ;
-- 创建用户
CREATE USER BOAI IDENTIFIED BY BOAI DEFAULT TABLESPACE BOAICRM_201310 TEMPORARY TABLESPACE TEMP ;
-- 用户授权
GRANT DBA TO BOAI WITH ADMIN OPTION ;
[7].删除用户
DROP USER LIUTAO
[8].删除登录数据库的权限
REVOKE CONNECT FROM LIUTAO
=========修改数据表的一些常用操作=========
A.快速复制表结构但不复制表中的数据的方法:
CREATE TABLE TB_STUDENT_NEW AS SELECT * FROM TB_STUDENT_OLD WHERE 1 = 2 ;
B.快速复制表结构和表中的数据的方法:
CREATE TABLE TB_STUDENT_NEW AS SELECT * FROM TB_STUDENT_OLD
[9].修改已创建的表-添加字段
ALTER TABLE TB_STUDENT ADD EMAIL VARCHAR2(50)
[10].修改已创建的表-重新定义字段属性
ALTER TABLE TB_STUDNET MODIFY EMAIL VARCHAR2(100)
[11].修改已创建的表-删除字段
ALTER TABLE TB_STUDNET DROP COLUMN EMAIL
[12].修改已创建的表-字段重命名
ALTER TABLE TB_STUDNET RENAME COLUMN EMAIL TO EMAIL_163
[13].修改已创建的表-表重命名
RENAME TB_STUDNET TO TD_STUDNET
[14].给表加注释
COMMENT ON TABLE TB_STUDNET IS '学生表'
[15].给字段加注释
COMMENT ON COLUMN TB_STUDENT.EMAIL IS '邮箱'
[16].删除表
DROP TABLE TB_STUDNET 保留回滚段可恢复
DROP TABLE TB_STUDNET Purge 删除后不可恢复
[17].恢复已删除的表-10G新特性
FlashBack TABLE TB_STUDNET TO BEFORE DROP
=========数据表的约束和维护=========
[18].添加约束
ALTER TABLE TB_STUDENT ADD CONSTRAINTS TB_STUDENT_ID_PK PRIMARY KEY ID 主键约束
ALTER TABLE TB_STUDENT ADD CONSTRAINTS TB_STUDENT_EMAIL_UK UNIQUE EMAIL 唯一性约束
ALTER TABLE TB_STUDENT ADD CONSTRAINTS TB_STUDENT_CLASS_ID_FK FOREIGN KEY (CLASS_ID) REFERENCES TB_CLASS (CLASS_ID) 外键约束
[19].删除约束
ALTER TABLE TB_STUDENT DROP CONSTRAINTS TB_STUDENT_CLASS_ID_FK
[20].禁用约束
ALTER TABLE TB_STUDENT DISABLE CONSTRAINTS TB_STUDENT_CLASS_ID_FK
[21].激活约束
ALTER TABLE TB_STUDENT ENABLE CONSTRAINTS TB_STUDENT_CLASS_ID_FK
[22].用户解锁
ALTER USER SCOTT ACCOUNT UNLOCK
[23].重新设密码
ALTER USER SCOTT IDENTIFIED BY TIGER
===========PL/SQL编程部分=========
[24].PLSQL语法规则:
DECLARE
/**声明部分在此处声明要使用的变量、游标、以及局部的存储过程及函数。**/
BEGIN
/** 执行部分过程及SQL **/
EXCEPTION
/** 异常处理部分 **/
END
/** 结束部分 **/
DECLARE
STR varchar(50):='HELLOWORD' ;
BEGIN
STR:=STR || 'LIUTAO' ;
dbms_output.put_line(STR) ;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('发生错误');
END ;
其中 := 是赋值符号 || 是字符连接符号 dbms_output.put_line()是一个输出方法
[1].--查询功能实现
DECLARE
V_ID NUMBER ;
V_NAME VARCHAR(50) ;
BEGIN
SELECT STU_ID,STU_NAME
INTO V_ID ,V_NAME FROM TB_STUDENT
WHERE STU_ID = 11 ;
dbms_output.put_line('V_ID=' || V_ID) ;
dbms_output.put_line('V_NAME=' || V_NAME);
END ;
[2].--添加功能
DECLARE
BEGIN
INSERT INTO TB_STUDENT(STU_ID,STU_NAME,STU_AGE) VALUES(20,'刘江红',10) ;
commit;
END ;
%TYPE 和 %ROWTYPE 用来表示不确定类型
%TYPE 可以理解成对数据库表一个字段的副本
%ROWTYPE 可以理解成对数据库一行记录提取出来的一个副本
[3].-- %TYPE用法示例 :
DECLARE
V_STU_ID TB_STUDENT.STU_ID%TYPE ;
V_STU_NAME TB_STUDENT.STU_NAME%TYPE ;
V_STU_AGE TB_STUDENT.STU_AGE%TYPE ;
BEGIN
SELECT STU_ID ,STU_NAME,STU_AGE INTO V_STU_ID ,V_STU_NAME,V_STU_AGE FROM TB_STUDENT WHERE STU_ID = 14 ;
DBMS_OUTPUT.PUT_LINE('STU_ID=' || V_STU_ID);
DBMS_OUTPUT.PUT_LINE('STU_NAME=' || V_STU_NAME) ;
DBMS_OUTPUT.PUT_LINE('STU_AGE=' || V_STU_AGE) ;
END ;
[4].-- %ROWTYPE用法示例 :
DECLARE
V_TB_STU_ROW TB_STUDENT%ROWTYPE ;
BEGIN
SELECT * INTO V_TB_STU_ROW FROM TB_STUDENT WHERE STU_ID=10;
DBMS_OUTPUT.PUT_LINE('STU_ID=' || V_TB_STU_ROW.STU_ID) ;
DBMS_OUTPUT.PUT_LINE('STU_NAME=' || V_TB_STU_ROW.STU_NAME) ;
DBMS_OUTPUT.PUT_LINE('STU_AGE=' || V_TB_STU_ROW.STU_AGE) ;
DBMS_OUTPUT.PUT_LINE('STU_SEX=' || V_TB_STU_ROW.STU_SEX) ;
END ;
[5].复合数据类型 特点包含多个内部组件、用于存放多个值。需要先定义类型然后用该类型可重复定义多个变量
1.数组 VARRAY
语法:TYPE TYPE_NAME IS VARRAY (MAXINUM_SIZE) OF ELEMENT_TYPE
TYPE_NAME : 可变数组的名称
MAXINUM_SIZE : 可变数组元素的最大数目
ELEMNET_TYPE : 数组元素的类型
可变数组的下标从1开始
用法示例 :
-- VARRAY 用法示例 :
DECLARE
TYPE ARY IS VARRAY (5) OF VARCHAR2(20) ;
V_ARY ARY := ARY('LIUTAO','MANY','KING','SAN','ABBY') ; /** 不能直接使用需赋值给一个变量 **/
BEGIN
DBMS_OUTPUT.PUT_LINE(V_ARY(1)) ;
DBMS_OUTPUT.PUT_LINE(V_ARY(2)) ;
DBMS_OUTPUT.PUT_LINE(V_ARY(3)) ;
DBMS_OUTPUT.PUT_LINE(V_ARY(4)) ;
DBMS_OUTPUT.PUT_LINE(V_ARY(5)) ;
END ;
=======================================
2.可变数组 TABLE 与JAVA中的数组类似、可以理解成可变数组、下标无限、按照二进制进行索引
-- TABLE 用法示例 :
DECLARE
TYPE ARY IS TABLE OF VARCHAR(30) INDEX BY BINARY_INTEGER ;
V_LIST ARY ;
BEGIN
V_LIST(10) := 'HELLOWORD_LIUTAO' ;
V_LIST(12) := 'WHERE AND STU_ID' ;
DBMS_OUTPUT.PUT_LINE('V_LIST(10) = ' || V_LIST(10)) ;
DBMS_OUTPUT.PUT_LINE('V_LIST(12) = ' || V_LIST(12)) ;
END ;
=======================================
3.RECORD 可以理解成JAVA中的集合类型
-- RECORD 用法示例 :
DECLARE
TYPE ARY IS RECORD (
V_ID NUMBER ,
V_NAME TB_STUDENT.STU_NAME%TYPE ,
V_TB_STU TB_STUDENT%ROWTYPE
) ;
V_STUDENT ARY ;
BEGIN
SELECT STU_ID , STU_NAME , STU_AGE , STU_BIRTHDAY , STU_SEX INTO V_STUDENT.V_ID , V_STUDENT.V_NAME ,
V_STUDENT.V_TB_STU.STU_AGE , V_STUDENT.V_TB_STU.STU_BIRTHDAY , V_STUDENT.V_TB_STU.STU_SEX FROM TB_STUDENT WHERE STU_ID = 10 ;
DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_ID) ;
DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_NAME) ;
DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_TB_STU.STU_AGE) ;
DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_TB_STU.STU_BIRTHDAY) ;
DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_TB_STU.STU_SEX) ;
END ;
[6].PLSQL异常处理部分实例 :
-- 异常处理
DECLARE
TB_ROWS TB_STUDENT%ROWTYPE ;
V_SQL_CODE VARCHAR2(200) ;
V_SQL_MSG VARCHAR2(200) ;
BEGIN
SELECT * INTO TB_ROWS FROM TB_STUDENT ;
DBMS_OUTPUT.PUT_LINE('STU_NAME = ' || TB_ROWS.STU_NAME) ;
EXCEPTION -- 处理异常通用将异常信息记录到数据库表中保存
WHEN OTHERS THEN
V_SQL_CODE := SQLCODE ; -- 返回错误编码
V_SQL_MSG := SQLERRM ; -- 返回错误信息
INSERT INTO TB_ERROR (ID,TABLE_NAME,SQL_CODE,SQL_MSG) VALUES (TB_ERROR_SEQ.NEXTVAL ,'TB_STUDENT',V_SQL_CODE,V_SQL_MSG) ;
COMMIT ;
END ;
[7].PLSQL流程控制语句与循环语句实例 :
[7.1] ************ 流程控制分支语句 ************
-- 语法规则
-- IF (条件) THEN 执行的语句
-- ELSIF (条件) THEN 执行的语句
-- ELSE
-- END IF ;
DECLARE
V_STR VARCHAR2(20) := 'LIUTAO' ;
BEGIN
IF (V_STR = 'LIUTAO') THEN
DBMS_OUTPUT.PUT_LINE('V_STR = ' || 'LIUTAO') ;
ELSIF (V_STR = 'HELLO') THEN
DBMS_OUTPUT.PUT_LINE('V_STR = ' || 'HELLO') ;
ELSE
DBMS_OUTPUT.PUT_LINE('V_STR = ' || '都不满足条件') ;
END IF ;
END ;
[7.2] ********** 循环语句 简单循环 LOOP **********
DECLARE
V_INDEX NUMBER := 10 ;
BEGIN
LOOP
V_INDEX := V_INDEX + 1 ;
DBMS_OUTPUT.PUT_LINE(V_INDEX);
EXIT WHEN V_INDEX = 15 ;
END LOOP ;
END ;
[7.3] ***************** 嵌套循环 *****************
DECLARE
V_A NUMBER := 0 ;
V_B NUMBER := 0 ;
BEGIN
LOOP
V_A := V_A + 1 ;
DBMS_OUTPUT.PUT_LINE('V_A = ' || V_A) ;
EXIT WHEN V_A = 4 ; -- 外循环四次
V_B := 0 ;
LOOP
EXIT WHEN V_B = 4 ; -- 内循环再次
V_B := V_B + 2 ;
DBMS_OUTPUT.PUT_LINE('V_B = ' || V_B) ;
END LOOP ;
END LOOP ;
DBMS_OUTPUT.PUT_LINE('结束循环...........') ;
END ;
[7.4] *************** 跳出循环体方法 ***************
DECLARE
V_A NUMBER := 0 ;
V_B NUMBER := 0 ;
BEGIN
<<OUTER>>LOOP -- 加上外层循环标识符 OUTER
V_A := V_A + 1 ;
DBMS_OUTPUT.PUT_LINE('V_A = ' || V_A) ;
EXIT WHEN V_A = 4 ; -- 外循环四次
V_B := 0 ;
<<INNER>>LOOP -- 加上内层循环标识符 OUTER
EXIT OUTER WHEN V_B = 8 ; -- 内循环两次 当V_B = 8 时结束外层循环
V_B := V_B + 2 ;
DBMS_OUTPUT.PUT_LINE('V_B = ' || V_B) ;
END LOOP ;
END LOOP ;
DBMS_OUTPUT.PUT_LINE('结束循环...........') ;
END ;
[7.5] ************ FOR 循环语句 ****************
BEGIN
FOR V_INDEX IN 1..20 LOOP
DBMS_OUTPUT.PUT_LINE(V_INDEX) ;
END LOOP ;
END ;
[7.6] ************ WHILE 循环语句 ************
DECLARE
V_INDEX NUMBER := 1 ;
BEGIN
WHILE V_INDEX < 10 LOOP
DBMS_OUTPUT.PUT_LINE(V_INDEX);
V_INDEX := V_INDEX + 2 ;
END LOOP ;
END ;
[7.6] ************ 游标的使用 ************
游标的作用 :提取结果集
DECLARE
CURSOR C_STUDENT IS SELECT * FROM TB_STUDENT ; -- 定义一个游标提取表 TB_STUDNET 中的所有数据
C_STUDENT_ROW TB_STUDENT%ROWTYPE ; -- 声明变量接收结果
BEGIN
OPEN C_STUDENT ; -- 打开游标
LOOP
FETCH C_STUDENT INTO C_STUDENT_ROW ; -- FETCH关键字用来提取一行记录
EXIT WHEN C_STUDENT%NOTFOUND ; -- 判断是否还有记录提取
DBMS_OUTPUT.PUT_LINE('STU_ID = ' || C_STUDENT_ROW.STU_ID || 'STU_NAME = ' || C_STUDENT_ROW.STU_NAME) ;
END LOOP ;
CLOSE C_STUDENT ; -- 关闭游标
END ;
-- 游标使用案例查询所有班级信息并列出对应班级的所有学生信息
-- 学习使用带参数的游标
DECLARE -- 声明部分
CURSOR C_CLASS_CURSOR IS SELECT * FROM TB_CLASS ;-- 班级游标
CURSOR C_STUDENT_CURSOR(V_CLASS_ID NUMBER) IS SELECT * FROM TB_STUDENT WHERE STU_CLASS_ID = V_CLASS_ID ; -- 学生游标
V_CLASS_RESULT TB_CLASS%ROWTYPE ; -- 保存班级信息
V_STUDENT_RESULT TB_STUDENT%ROWTYPE ; -- 保存学生信息
BEGIN -- 执行部分
OPEN C_CLASS_CURSOR ; -- 打开游标
LOOP
FETCH C_CLASS_CURSOR INTO V_CLASS_RESULT ; -- 提取结果
EXIT WHEN C_CLASS_CURSOR%NOTFOUND ; -- 判断是否还有结果
DBMS_OUTPUT.PUT_LINE('CLASS_ID = ' || V_CLASS_RESULT.CLASS_ID || 'CLASS_NAME = ' || V_CLASS_RESULT.CLASS_NAME) ;
OPEN C_STUDENT_CURSOR(V_CLASS_RESULT.CLASS_ID) ; -- 打开学生游标要传参数
LOOP
FETCH C_STUDENT_CURSOR INTO V_STUDENT_RESULT ;
EXIT WHEN C_STUDENT_CURSOR%NOTFOUND ;
DBMS_OUTPUT.PUT_LINE('STU_ID = ' || V_STUDENT_RESULT.STU_ID || 'STU_NAME' || V_STUDENT_RESULT.STU_NAME);
END LOOP ;
CLOSE C_STUDENT_CURSOR ; -- 关闭游标
END LOOP ;
CLOSE C_CLASS_CURSOR ; -- 关闭游标
END ; -- 结束部分
[8].PLSQL程序单元
主要有四类:过程:执行特定操作、无返回值
函数:进行复杂计算、有返回值
包:逻辑上相关的过程和函数组合到一起
触发器:事件触发执行相应操作
[8.1] ************ 存储过程 ************
-- 第一个无参的存储过程
CREATE OR REPLACE PROCEDURE INSERT_TB_STUDENT
IS V_SEX VARCHAR2(4) := '女';
BEGIN
INSERT INTO TB_STUDENT
(STU_ID, STU_NAME, STU_AGE, STU_SEX, STU_BIRTHDAY, STU_CLASS_ID)
VALUES
(TB_ERROR_SEQ.NEXTVAL, 'LIUTAO', 11, V_SEX, SYSDATE, 1015,);
COMMIT ;
END INSERT_TB_STUDENT;
-- 有参数的存储过程
CREATE OR REPLACE PROCEDURE INSERT_TB_STUDENT_PARAMS (
STU_NAME IN VARCHAR2 ,
STU_AGE IN NUMBER ,
STU_SEX IN VARCHAR2 ,
STU_BIRTHDAY IN DATE ,
STU_CLASS_ID IN NUMBER
)
IS
BEGIN
INSERT INTO TB_STUDENT
(STU_ID, STU_NAME, STU_AGE, STU_SEX, STU_BIRTHDAY, STU_CLASS_ID)
VALUES
(TB_ERROR_SEQ.NEXTVAL, STU_NAME ,STU_AGE, STU_SEX, STU_BIRTHDAY, STU_CLASS_ID);
COMMIT ;
END INSERT_TB_STUDENT_PARAMS ;
-- 测试存储过程的方法
BEGIN
INSERT_TB_STUDENT_PARAMS('张三',14,'男',SYSDATE,1015) ;
END ;
-- 存储过程实例应用之数据表定时备份:
-- 将TB_STUDENT表中的数据备份到TB_STUDENT_BACK表中、TB_BACK_MAXID表记录备份的表名、和已完成备份的最大ID
CREATE OR REPLACE PROCEDURE BACK_DATA(MAX_ID NUMBER)
IS
CURSOR C_STUDENT_CURSOR IS
SELECT * FROM TB_STUDENT WHERE STU_ID > MAX_ID ; -- 定义游标提取TB_STUDENT表中的数据
TB_STUDENT_ROW TB_STUDENT%ROWTYPE ; -- 定义变量存储游标的数据
V_INDEX NUMBER := 0 ; -- 分段提交的标识
V_MAX_ID NUMBER := 0 ; -- 最在备份ID
BEGIN
IF C_STUDENT_CURSOR%ISOPEN THEN -- 断送游标是否打开
NULL ;
ELSIF
OPEN C_STUDENT_CURSOR ; -- 打开游标
END IF ;
LOOP
INDEX := INDEX + 1 ;
FETCH C_STUDENT_CURSOR INTO TB_STUDENT_ROW ; -- 提取学生表中的数据
EXIT WHEN C_STUDENT_CURSOR%NOTFOUND ;
INSERT INTO TB_STUDENT_BACK (STU_ID,STU_NAME,_STU_AGE,STU_SEX,STU_BIRTHDAY,STU_CLASS_ID)
VALUES (C_STUDENT_ROW.STU_ID,C_STUDENT_ROW.STU_NAME,C_STUDENT_ROW.STU_AGE,C_STUDENT_ROW.STU_BIRTHDAY,C_STUDENT_ROW.STU_CLASS_ID) ;
IF V_INDEX = 2000 THEN
COMMIT ; -- 分段提交防止内存溢出
V_INDEX := 0 ;
END IF ;
END LOOP ;
SELECT MAX(MAX_ID) INTO V_MAX_ID FROM TB_STUDENT_BACK ;
-- 备份完成及时更新已完成的最大备份ID
UPDATE TB_BACK_MAXID SET MAX_ID = V_MAX_ID WHERE TABLE_NAME = 'TB_STUDENT' ;
COMMIT ;
CLOSE TB_STUDENT_CURSOR ;
END BACK_DATA ;
-- 调用备份存储过程
CREATE OR REPLACE PROCEDURE EXECUTION_BACK
IS
V_MAX_ID NUMBER := 0 ;
BEGIN
SELECT MAX_ID INTO V_MAX_ID FROM TB_BACK_MAXID WHERE TABLE_NAME='TB_STUDENT' ;
BACK_DATA(V_MAX_ID) ;
END EXECUTION_BACK ;
-- 测试备份存储过程
BEGIN
EXECUTION_BACK ;
END ;
-- 定时完成备份工作
DECLARE
JOBNO NUMBER ;
BEGIN
DBMS_JOB.SUBMIT(
JOBNO ,
WHAT => 'EXECUTION_BACK ;' , -- 要执行的存储过程名称
Interval => 'TRUNC(SYSDATE,''MI'')+3/(24*60)' -- 定义时间间隔每三分钟
) ;
COMMIT ;
END ;
[8.2] ***************PLSQL函数***************
函数与过程的区别是函数有返回值
-- 计算年薪的函数
CREATE OR REPLACE FUNCTION FUN_COUNT_SAL(
SAL IN NUMBER
)
RETURN NUMBER IS
BEGIN
RETURN SAL*12 ;
END FUN_COUNT_SAL;
-- 测试函数
DECLARE
V_SAL NUMBER ;
BEGIN
SELECT SAL INTO V_SAL FROM EMP WHERE EMPNO='7521' ;
DBMS_OUTPUT.PUT_LINE(FUN_COUNT_SAL(V_SAL)) ;
END ;
[8.3] ***************PLSQL程序包***************
A.-- 定义程序包 :
CREATE OR REPLACE PACKAGE FK_COUNT_SAL IS
V_BOUNS NUMBER := 150 ; -- 定义变量每月150奖金
-- 定义一个求年薪的函数
FUNCTION COUNT_EMP_SAL(V_SAL NUMBER) RETURN NUMBER ;
-- 定义一个添加学生的过程
PROCEDURE INSERT_STUDENT ;
END FK_COUNT_SAL;
B.-- 定义包体用于实现包中定义的函数和方法:
CREATE OR REPLACE PACKAGE BODY FK_COUNT_SAL IS
FUNCTION COUNT_EMP_SAL(V_SAL NUMBER) RETURN NUMBER IS
BEGIN
RETURN (V_SAL+V_BOUNS)*12 ;
END ;
PROCEDURE INSERT_STUDENT IS
BEGIN
INSERT INTO TB_STUDENT (STU_ID,STU_NAME,STU_AGE,STU_SEX) VALUES (TB_ERROR_SEQ.NEXTVAL,'POW',12,'男') ;
COMMIT ;
END ;
END FK_COUNT_SAL;
C.-- 测试程序包
DECLARE
V_SAL NUMBER ;
BEGIN
SELECT SAL INTO V_SAL FROM EMP WHERE EMPNO = '7369' ;
DBMS_OUTPUT.PUT_LINE(FK_COUNT_SAL.COUNT_EMP_SAL(V_SAL => V_SAL)) ;
FK_COUNT_SAL.INSERT_STUDENT ;
END ;
[8.4] ***************PLSQL触发器***************
[二]. ***************ORACLE表连接查询***************
普通等值连接(内连接)查询:
SELECT * FROM EMP E ,DEPT D WHERE E.DEPTNO = D.DEPTNO ; 可连接多张表、可用 AND 加多个条件限定结果。
标准SQL写法:
SELECT * FROM EMP E INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO ; 标准SQL写法等值连接称为内连接条件用ON限定。
外连接查询分为左外连接和右外连接:
左外连接:以左表为主表、右表为驱动表、左表中的数据全部列出、在右表中没有匹配的项则用NULL补齐。
右外连接:以右表为主表、左表为驱动表、右表中的数据全部列出、在左表中没有匹配的项则用NULL补齐。
普通写法:
SELECT * FROM EMP E ,DEPT D WHERE E.DEPTNO(+) = D.DEPTNO ; 加号在左边表示以右表为主表。
SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO(+) ; 加号在右边表示以左表为主表。
标准SQL写法:
SELECT * FROM EMP E RIGHT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO ; 右连接查询。
SELECT * FROM EMP E LEFT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO ; 左连接查询。
[三]. 组函数、GROUP BY 分组子句、ORDER BY 排序子句
HAVING 与 WHERE 的区别 :
WHERE是在分组前进行条件过滤
HAVING是在分组后进行条件过滤
WHERE子句中不能存在分组函数
HAVING子句中可以使用分组函数
[四]. 多行比较运算符
IN 与列表中的任一成员相等
ANY 与子查询返回的每一个值比较
ALL 与子查询返回的所有值比较
SELECT * FROM EMP WHERE SAL > ANY (
SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 工资大于子查询返回结果中最小的值都满足条件 。
SELECT * FROM EMP WHERE SAL < ANY (
SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 工资小于子查询中返回结果最大的值都是满足条件。
SELECT * FROM EMP WHERE SAL < ALL (
SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 工资小于子查询中返回结果最小的值才满足条件 。
SELECT * FROM EMP WHERE SAL > ALL (
SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 大于所有返回值即大于最大的值才满足条件 。
案例:删除表中的重复数据保留一条、现在TB_STUDNET表假设STU_NAME和STU_SEX完全相同则认为是重复。
1.创建临时表 CREATE TABLE TB_STUDENT_TMP AS SELECT DISTINCT STU_NAME , STU_SEX FROM TB_STUDENT
2.删除原有数据表中的数据 TRUNCATE TABLE TB_STUDENT
3.将临时表中的数据插回来 INSERT INTO TB_STUDENT SELECT * FROM TB_STUDENT_TMP
案例:删除表中的重复数据不保留
DELETE FROM TB_STUDENT WHERE ROWID IN ( SELECT ROWID FROM TB_STUDENT GROUP BY STU_NAME , STU_SEX HAVING COUNT(*) > 1 )
[五].DECODE 函数的用法
SELECT DECODE(ENAME,'SCOTT','LIUTAO','POW') ENAME ,DEPTNO FROM EMP 查询员工表如果姓名是SCOTT则显示LIUTAO否则显示WANGWU 。
[六].ORACLE 中的序列 SEQUENCE
-- 创建序列
CREATE SEQUENCE STUDENT_SEQ
MINVALUE 1 -- 最小值
MAXVALUE 9999999 -- 最大值
START WITH 1 -- 从1开始
INCREMENT BY 1 -- 每次递增1
CACHE 20 -- 缓存20个值
SELECT STUDENT_SEQ.NEXTVAL FROM DUAL ; 查看下一值
SELECT STUDENT_SEQ.CURRVAL FROM DUAL ; 查看当前值必须是至少执行一次NEXTVAL才有值
-- 删除序列
DROP SEQUENCE STUDENT_SEQ
[七].ORACLE中的同义词
-- 同义词 为简化操作有时需要对某些表或视图创建一个同义词来引用
CREATE SYNONYM TB_CLS FOR SCOTT.TB_CLASS ; 以后则查询TB_CLS就是查询表TB_CLASS
[八].ORACLE中的索引 加快数据检索
主键约束和唯一性约束系统自动创建对应的索引。
手动创建索引:
CREATE INDEX TB_ERROR_SQL_MSG ON TB_ERROR(SQL_MSG) ; 为TB_ERROR表中字段SQL_MSG创建索引名称为TB_ERROR_SQL_MSG
删除索引:
DROP INDEX TB_ERROR_SQL_MSG
[九].ORACLE视图 简化查询
简单视图:
CREATE VIEW LIU_EMP AS SELECT * FROM SCOTT.EMP ;
来源:oschina
链接:https://my.oschina.net/u/1859292/blog/634932