Oracle最全基础教程
用户与权限
创建用户
CREATE USER USER_NAME IDENTIFIED BY PASSWD; --创建用户
修改密码
ALTER USER USER_NAME IDENTIFIED BY NEW_PASSWD; --修改新密码
--修改用户密码
PASSWD USER_NAME;
删除用户
--可选参数 CASCADE
DROP USER USER_NAME [CASCADE];
--注意:
/*
在进行删除用户操作时,如果此用户已创建表,删除时需要加参数“CASCADE”,它具有级联的作用
*/
给用户赋权限
GRANT 权限/角色 TO USER_NAME;
收回用户权限
REVOKE 权限/角色 FROM USER_NAME;
系统权限
-- “系统权限是数据库管理相关的权限”
CREATE SESSION --登录权限
CREATE TABLE --建表权限
CREATE INDEX --创建索引权限
CREATE VIEW --创建视图权限
CREATE SEQUENCE --创建序列权限
CREATE TRRIGER --创建触发器权限
连接角色
--“是授予用户的最基本的权利,能够连接到Oracle数据中,能够访问其他用户的表权限时”
CREATE SESSION --创建会话
CREATE VIEW --创建视图
CREATE SEQUENCE --创建序列
资源角色
--“具有创建表、序列、视图的权限”
CREATE TABLE --创建表
CREATE TRIGGER --创建触发器
CREATE PROCEDURE --创建过程
CREATE SEQUENCE --创建序列
CREATE TYPE --创建类型
DBA角色
--“是授予系统管理员的,拥有该角色的用户即系统管理员,拥有系统的所有权限”
表空间
--创建表空间
CREATE TABLESPACE SPACE_NAME
--DATAFILE '/' 指向数据文件路径
--SIZW NM 表示初始化表空间为N(M)
--AUTOEXTEND ON NEXT 2M 自动扩展,每次扩展2M
--MAXSIZE UNLIMITED UNLIMITED最大扩展没有限制,N(M)最大扩展到N(M)
创建用户指定默认表空间
CREATE USER USER_NAME IDENTIFIED BY PASSWD DEFAULT TABLESPACE SPACE_NAME
修改用户默认表空间
ALTER USER USER_NAME IDENTIDIED BY PASSWD DEFAULT TABLESPACE SPACE_NAME
查看表表空间
SELECT * FROM v$TABLESPACE
查看用户默认表空间
SELECT USERNAME, DEFAULT_TABLESPACE FROM DBA_USERS WHERE USERNAME = 'SCOTT';
--用户名SCOTT必须为大写
表结构操作
--创建表1
CREATE TABLE TABLE_NAME(
COLUMN_1 DATA_TYPE,
COLUMN_2 DATA_TYPE
);
--创建表2
CREATE TABLE TABLE_NAME AS SELECT COLUMN_1, COLUMN_2 ...FROM TABLE_NAME;
--修改表
ALTER TABLE 语句添加、修改或删除列的语法
--添加列
ALTER TABLE TABLE_NAME ADD(
COLUMN_1 DATA_TYPE,
COLUMN_2 DATA_TYPE
);
ALTER TABLE TABLE_NAME ADD COLUMN_1 DATA_TYPE;
--修改列
ALTER TABLE TABLE_NAME MODIFY(
COLUMN_1 DATA_TYPE
);
--删除列
ALTER TABLE TABLE_NAME DROP(
COLUMN_1,
COLUMN_2
);
--修改表名称
RENAME TABLE TO NEW_TABLE_NAME
--修改列名
ALTER TABLE TABLE_NAME RENAME COLUMN OLD_COLUMN TO NEW COLUMN;
--查看表结构
DESC 表名;
约束
约束
- 非空约束(NOT NULL)
- 唯一约束(UNIQUE)
- 主键约束(PRIMARY KEY)
- 外键约束(FOREIGN KEY)
- 条件约束(CHECK)
- 约束存在表中(USER_CONSTRAINTS)
非空约束(NOT NULL)
--添加非空
CREATE TABLE TABLE_NAME(
COLUMN_1 DATA_TYPE,
COLUMN_2 DATA_TYPE NOT NULL
);
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME NOT NULL;
--删除非空约束
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME NULL;
唯一约束(UNIQUE)
--添加唯一
CREATE TABLE TABLE_NAME(
COLUMN_1 DATA_TYPE,
COLUMN_2 DATA_TYPE UNIQUE
);
--修改唯一
ALTER TABLE TABLE_NAME ADDCONSTRAINT sUNIQUE_NAME UNIQUE (COLUMN_1, COLUMN_2);
--删除唯一
ALTER TABLE TABLE_NAME DROP CONSTRINT UNIQUE_NAME;
--备注:Oracle中,UNIQUE可以为单个NULL,也可多行为NULL
主键约束(PRIMARY KEY)
--添加主键
CREATE TABLE TABLE_NAME(
COLUMN_1 DATA_TYPE,
COLUMN_2 DATA_TYPE PRIMARY KEY
);
CREATE TABLE TABLE_NAME(
COLUMN_1 DATA_TYPE,
COLUMN_2 DATA_TYPE,
CONSTRAINT 约束名 PRIMARY KEY (COLUMN_1, COLUMN_2)
);
--修改主键
ALTER TABLE TABLE ADD CONSTRAINT 约束名 PRIMARY KEY (COLUMN_1, COLUMN_2);
--删除主键
ALTER TABLE TABLE_NAME DROP PRIMARY KEY CASCADE;
--备注:如果两表存在主从关系,删除主键约束时,需要加上CASCADE
/*
注意:每张表有且只有一个主键约束。
特别说明:
PRIMARY KEY 与 UNIQUE 的区别:
1、一张表可以对应多个UNIQUE(唯一约束)
2、一张表只要存在一个主键
3、设置为主键的列不能存在NULL值
*/
外键约束(FOREIGN KEY)
外键约束的作用:用来维护从表与主表之间的引用完整性,能够维护数据库的数据一致性,数据完整性,防止错误数据进库。
解释:用于定义主表和欧辰那个表之间的关系,外键约束要定义在从表上,主表则必须具有主键约束或UNIQUE约束,当i当以外键约束后,要求外键列数据必须在主表的主键列存在或为NULL。
--添加主键
CREATE TABLE TABLE_NAME(
COLUMN_1 DATA_TYPE,
COLUMN_2 DATA_TYPE REFERENCES MAIN_TABLEE_NAME(COLUMN)
);
CREATE TABLE TABLE_NAME(
COLUMN_1 DATA_TYPE,
COLUMN_2 DATA_TYPE,
CONSTRAINT 约束名 FOREIGN KEY(COLUMN) REFERENCES, MAIN_TABLE_NAME(COLUMN))
);
--修改主键
ALTER TABLE TABLE_NAME CONSTRAINT 约束名 FOREIGN KEY(COLUMN) REFERENCES MAIN_TABLE_NAME(COLUMN);
--删除主键
ALTER TABLE TABLE_NAME DROP CONSTRAINT 约束名称;
/*
特别说明:FOREIGN KEY外键细节
1、外键指向主键列
2、外键可指向UNIQUE列
3、建表时先建主表,再建立从表,删除时,先删除从表,再删除主表
4、外键列属性值要与主键或UNIQUE列属性值的类型保持一致
5、外键列的值,必须再主键列中存在,但外键列的值运行为NULL
*/
条件约束(CHECK)
--添加条件
CREATE TABLE TABLE_NAME(
COLUMN_1 DATA_TYPE,
COLUMN_2 DATA_TYPE CHECK (COLUMN_2 IN (VALUE1, VALUE2...))
);
--修改条件
ALTER TABLE TABLE_NAME ADD CONSTRAINT 约束名 CHECK(COLUMN IN (VALUE1, VALUE2...))
--删除条件
ALTER TABLE TABLE_NAME DROP CONSTRAINT 约束名称;
约束命名规则
- 非空约束:NN_表名__列名
- 唯一约束:UK_表名__列名
- 主键约束:PK_表名
- 外键约束:FK_表名__列名
- 条件约束:CK_表名__列名
查看约束信息
SELECT * FROM USER_CONSTRAINT WHERE TABLE_NAME = "TABLE_NAMWE";
数据操作
插入数据
INSERT INTO TABLE_NAME[(COLUMN [, COLUMN 2...])] VALUE(VALUE [, VALUE 2...]);
插入全部数据
INSERT INTO TABLE_NAME VALUES(VALUE[, VALUE 2...]);
从另一张表中导入数据
INSERT INTO TABLE_NAME1 (SELECT VALUE1, VALUE2, VALUE3,....FROM TABLE_NAME2);
修改数据
UPDATE TABLE_NAME SET COLUMN_NAME = EXP(表达式) [, COLUMN 2 = EXP 2,....][WHERE 条件];
删除数据
DELETE FROM TABLE_NAME [WHERE 条件表达式];
--删除的几种方式
DELETE FROM TABLE_NAME;
--删除所有记录,表结构还在,写日志,可以恢复,但速度较慢
DROP TABLE TABLE_NAME
--删除表的结构和数据
TRUNCATE TABLE TABLE_NAME;
--删除表中的所有记录,表接哦古还在,不屑日志,无法找回删除记录,速度块
查询数据
基本语法
SELECT
[DISTINCT] *|{COLUMN1(), COLUMN2()}
FROM TABLE_NAME AS AS_NAME
[WHERE {条件}];
/*
“解释”
1、SELECT 指向列进行查询
2、COLUMN 指定列名
3、* 代表查询所有数据
4、FROM 指定查询表源
5、DISTINCT 是否进行数据去重
6、WHERE 条件
7、AS 别名
*/
--使用列别名
SELECT
ENAME AS "姓名",
SAL * 12 + NVL(COMM, 0) * 13 AS "年收入"
FROM
EMP;
/*
解释:
Oracle在使用别名时,可以使用双引号或不使用, 或使用 AS 来表明别名,但是不能使用单引号。
*/
处理NULL值
NVL函数:用于处理NULL值使用
SELECT ENAME, SAL * 13(COMM, 0) * 13 FROM EMP;
--NVL(VALUE1, VALUE2)
--解释:NVL值VALUE1为NULL时则取值VALUE2,VALUE1部位NULL时则取值VALUE1原值
拼接字符串
在进行查询时,希望将多列内容结果作为一列内容结果进行返回时。可使用 ” || “进行连接。
SELECT ENAME || "年收入" || SAL * 13 + NVL(COMM, 0) * 13 "雇员的年收入" FROM EMP;
取范围内的值
在进行查询时,想获取一个范围内的数据时,可使用BETWEEN
SELECT * FROM EMP WHERE SAL BETWEEN 2000 AND 2500;
--BETWEEN AND 指定区间内取值
LIKE操作符
%:表示任意0到多个字符
_:表示任意单个字符
--如何显示首字符为S的员工姓名和工资
SELECT ENAME, SAL FROM EMP WHERE ENAME LIKE 'S%';
--如何显示第三个字符为大写O的所有员工的姓名和工资
SELECT ENAME, SAL FROM EMP WHERE ENAME LIKE 'O%';
区间判断
在WHERE语句中使用IN
SELECT * FROM EMP WHERE EMPNO IN (123, 345, 800);
--注意:IN只能放1000个值
操作符(IS NULL)
在查询语句中不能使用=或者!= NULL来进行判空
SELECT * FROM EMP WHERE MAGE IS NULL;
SELECT * FROM EMP WHERE MAGE IS NOT NULL;
逻辑操作符
--查询薪资高于100或职位为CODE的人员,同时还要曼珠他们姓名首字母大写J的
SELECT * FROM EMP WHERE (SAL > 100 OR JOB = 'CODE') AND (ENAME LIKE 'J%');
排序
使用ORDER BY进行排序(ASC写或不屑都是升序排序即从小到大,DESC则是降序排序从大到小排序)
SELECT * FROM EMP ORDER BY SAL SAC;
--使用别名排序
SELECT ENAME, SAL * 12 "年薪" FROM EMP ORDER BY "年薪" ASC;
--备注:别名使用需要用 ""
分组查询
在进行复杂的数据统计时,往往需要使用分组函数,如:MAX(), MIN(), AVG(), SUM(), COUNT()等
MAX(), MIN()
取最大值和取最小值
--如何显示所有员工最高工资和最低工资
SELECT MAX(SAL) "最高工资", MIN(SAL) "最低工资" FORM EMP;
--查询最高年工资
SELECT MAX(SAL * 13 + NVL(COMM, 0) * 13) "最高年工资", MIN(SAL * 13 + NVL(COMM, 0) * 13) "最低年工资" FROM EMP;
AVG()
求平均值
--显示平均工资和工资总和
SELECT AVG(SAL) "平均工资", SUM(SAL) "工资总和" FROM EMP;
--备注:AVG(SAL)不会把SAL为NULL的行进行统计,如果为空值也需要考虑,则可以
SELECT SUM(SAL) COUNT(*) FROM EMP;
COUNT(*)
计算总数
SELECT COUNT(*) "共有员工" FROM EMP;
GROUP BY
对查询结果进行分组统计
HAVING:限制(过滤)分组显示结果
--显示每个部门的平均工资和最高工资
SELECT AVG(SAL) "平均工资", MAX(SAL) "最高工资", DEMPNO "部门编号" FROM EMP GROUP BY DEPTNO;
/*
分组函数总结:
1、分组函数(AVG)只能出现在选中列表、HAVING、ORDER BY子句中
2、如果在SELECT 语句中同时包含GROUP BY/ HAVING/ ORDER BY,其顺序为GROUP BY/ HAVING/ ORDER BY
3、在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须有一个出现在GROUP BY子句中,否则会报错
*/
函数
ASCII()
返回与指定的字符对应的十进制
SELECT ASCII('A') A, ASCII('a') a, ASCII('0') ZERO, ASCII(' ') SPACE FROM DUAL;
CHR()
给出整数,返回对应的字符
SELECT CHR(54740) ZHAO, CHR(65) CHR65 FROM DUAL;
CONCAT()
连接连个字符串,与 || 作用相同
SELECT CONCAT('HELLO', 'WORLD') FROM DUAL;
INITCAP()
返回字符串并将字符串的第一个字母变成大写
SELECT INITCAP('SMITH') UPP FROM DUAL;
INSTR(C1, C2, J)
在一个字符中搜索指定的字符,返回发现指定的字符位置
/*
C1 被搜索的字符串
C2 希望被搜索的字符串
L 搜索的开始位置,默认为1
J 第J次出现的位置,默认为1
*/
SELECT INSTR('ORACLE TRAING', 'RA', 1, 2) INSTRING FROM DUAL;
LENGTH()
返回字符串的长度
SELECT ENAME, LENGTH(ENAME) FROM EMP;
LOWER()
返回字符串,并将所有的字符小写
SELECT LOWER('AaBbCc') "LOWER" FROM DUAL;
UPPER()
返回字符串,并将所有的字符大写
SELECT UPPER('AaBbCc') "UPPER" FROM DUAL;
粘贴字符
RAPD在列的右边粘贴字符, RAPD(“显示内容”或字段, 显示长度, “填充占位符”)
LAPD在列的右边粘贴字符, LAPD(“显示内容”或字段, 显示长度, “填充占位符”)
SELECT LAPD(RAPD('MNB', 10, "*"), 17, "=") FROM DUAL;
删除字符
ltrim 删除左边出现的字符串 ltrim('原内容’或字段,‘要删除的字符串’)
rtrim 删除右边出现的字符串 rtrim('原内容’或字段,‘要删除的字符串’)
SELECT RTRIM('**NBA CODE**', '*') FROM DUAL;
截取字符串
SUBSTR截取子字符串,从STRAT开始,取COUNT个
SELECT SUBSTR('1110000000', 3, 8) FROM DUAL;
替换字符串
REPLACE(‘STRING’, ‘S1’, ‘S2’)
/*
STRING 希望被替换的字符或常量
S1 被替换的字符串
S2 要替换的字符串
*/
SELECT REPLACE('i L C', 'i', 'I') FROM DUAL;
TRIM
TRIM(‘S’ FROM ‘STRING’)
如果不指定参数,默认为空格符
SELECT TRIM(0 FROM 0009) "TRIM EXAMPLE" FROM DUAL;
数学函数
CEIL()
向上取整:返回大于或等于给出数字的最小整数
SELECT CEIL(3.14159) FROM DUAL
FLOOR()
向下取整:对给定的数字取整数
SELECT FLOOR(2345.67) FROM DUAL;
TRUNC()
精度截取:按照指定的精度截取一个数
SELECT TRUNC(124,1666, -2), TRUNC(124,16666, 2) FROM DUAL;
ROUND()
按照指定的精度进行舍入
ROUND函数为四舍五入
TRUNC函数直接截取
SELECT ROUND(55.5), ROUND(-55.4), TRUNC(-55.5), TRUNC(55.5) FROM DUAL;
ABS()
返回指定值的绝对值
SELECT ABS(-100) FROM DUAL;
ACOS()
返回反余弦的值
SELECT ACOS(-1) FROM DUAL;
ASIN()
返回正余弦的值
SELECT ASIN(0.5) FROM DUAL;
ATAN()
返回反正切的值
SELECT ATAN(1) FROM DUAL;
COS()
返回余弦值
SELECT COS(-3.14159265) FROM DUAL;
MOD()
返回一个N1除以N2的余数(取模)
SELECT MOD(10, 3), MOD(3,3) FROM DUAL;
日期函数
日期函数用于处理DATE类型的数据
ADD_MONTHS(日期值, 增加(减少))
减去或减去月份
SELECT TO_CHAR(LAST_DAY(SYSDATE), 'YYYY-MM-DD') FROM DUAL;
MONTHS_BETWEEN(DATE2, DATE1)
给出DATE2-DATE1的月份,计算总的月份数
SELECT MONTHS_BETWEEN('1999-12-01', '2000-02-19') MON_BET FROM DUAL;
SYSDATE
系统的当前时间
SELECT TO_CHAR(SYSDATE, 'DAY') FROM DUAL;
日期转换函数
TO_CHAR(DATE, ‘FORMAT’)
日期类型转换成字符串格(主要用于将日期以习惯的格式输出显示)
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') FROM DUAL;
/*
TO_CHAR()
解释说明:
1、YY:两位数字的年份 2004 --04
2、YYYY:四位数字的年份 2004年
3、MM:两位数字的月份 8月 --08
4、DD:两位数字的天数 30日 --30
5、HH24:二十四小时制 8点 --20
6、HH12:十二小时制 8点 --08 MI:SS --显示分钟/秒
7、DAY:显示星期几
8、MONTH:显示月份
9、YEAR:显示年
数字格式:
1、9:显示数字,并忽略前面的0
2、0:显示数字,如位数不足,则用0补齐
3、.:在指定的位置显示小数点
4、,:在指定的位置显示逗号
5、$:在数字前面加美元符号
6、L:在数字前面加本地货币符号
7、C:在数字前面加国际货币符号
8、G:在指定位置显示组分隔符
9、D:在指定位置显示小数点符号(.)
说明:
,逗号.和小数点可以合在一起使用,G 分隔符和 D 小数点符可以合在一起使用,但,.不能和 GD, 综合使用,否则报错。
*/
TO_DATE(STRING, ‘FORMAT’)
将字符串转换成日期(主要用于将日期按习惯的格式输入到数据库中)
TO_NUMBER
将给出的数字类型的字符串转换为数字
系统函数
DECODE()
类似与JAVA中的SWITCH CASE分支语句
DECODE(
VALUE, IF1, THEN1, IF2, THEN2, IF3, THEN3, ... ELSE
)
--若VALUE为0,则为1,否则为2
DECODE(VALUE, '0', '1', '2')
表连接
自连接
指在同一种表的来凝结查询(把一张表看两张表)
--显示职员上级领导的姓名
SELECT E2.ENAME FROM EMP E1, EMP E2 WHERE E1.MAGE = E2.EMPNO;
内连接(INNER JOIN ON)
基本语法:
SELECT COLUMN_NAME1, ... FROM TABLE_NAME INNER JOIN TABLE_NAME ON CONDITION;
--说明:内连接只要两张表同时满足条件曹辉被查询到
--显示职员的信息和部门名称
SELECT E.*, D.DNAME FROM EMP E INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO
左外连接(LEFT JOIN ON)
如果查询出左表完全显示,称为左外连接
基本语法:
SELECT COLUMN_NAME_1, COLUMN_NAME_2,...FROM TABLE_NAME_1 LEFT JOIN TABLR_NAME_2 ON CONDITION;
SELECT COLUMN_NAME_1, COLUMN_NAME_2,...FROM TABLE_NAME_1, TABLE_NAME_2 WHERE CONDITON_1 = CONDITION_2(+);
右外连接
如果查询的表右侧完全显示,称为右外连接
基本语法:
SELECT COLUMN_NAME_1, COLUMN_NAME_2, ...FROM TABLE_NAME_1 RIGHT JOIN TABLE_NAME_2 ON CONDITION;
SELECT COLUMN_NAME_1, COLUMN_NAME_2 TABLR_NAME_1, TABLE_NAME_2 WHERE CONDITION_1(+) = CONDITION_2;
完全外连(FULL OUTER JOIN ON)
完全显示两张表,没有匹配的记录记录为空
基本语法:
SELECT COLUMN_NAME_1, COLUMN_NAME_2, ... FROM TABLE_NAME_1 FULL OUTER JOIN TABLE_NAME_2 ON CONDITION;
分页查询
SELECT T2.* FROM (SELECT T1.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) t1
WHERE RN<=大范围(取到多少条数据)) T2 WHERE RN>=小范围(从第几条数据开始取);
/*
说明:Oracle分页查询时通过三层筛选进行查询的。每一次都可以带WHERE条件来对目标数据进行筛选。
1、第一层:构建所需查询字段信息并排序
2、第二层:构建ROWNUM, 别名为RN
3、第三层:加WHERE条件, RN >= M AND M <= N
*/
视图
创建视图基本语法:
CREATE VIEW VIEW_NAME AS SELECT 语句 [WITH READ ONLY]
--说明:WITH READ ONLY表示只进行查询操作
创建或修改视图的基本语法:
CREATE OR REPLACE VIEW VIEW_NAME AS SELECT 语句 [WITH READ ONLY]
--说明:WITH READ ONLY表示只进行查询操作
删除视图的基本语法:
DROP VIEW VIEW_NAME
创建序列
基本语法:
-----------------------------------------
------创建序列
-----------------------------------------
CREATE SEQUENCE CREATE_SEQUENCE_NAME_ROW_NUM_AUTOINC --序列名称
INCREMENT BY 1 --每次增长多少
START WITH 1 --从几开始
MINVALUE 1 --最小值
NOMAXVALUE --无最大值
NO CYCLE 序列到达最大值之后怎么办,CYCLE
CACHE 10 --需要不需要使用缓
创建触发器
基本语法:
-----------------------------------------
------创建触发器
-----------------------------------------
CREATE OR REPLACE TRIGGER insert_CREATE_TRIGGER_NAME_ROW_NUM_AUTOINC
BEFORE INSERT ON CREATE_TRIGGER_NAME
FOR EACH ROW
BEGIN
SELECT CREATE_TRIGGER_NAME_ROW_NUM_autoinc.NEXTVAL INTO :NEW.ROW_NUM FROM DUAL;
END;