用于建立、修改、删除数据库对象。
数据库对象包括:表、视图、索引、序列。包括:
CREATE :创建表或其他对象的结构
ALTER :修改表或其他对象的结构
DROP:删除表或其他对象的结构
TRUNCATE:删除表数据,保留表结构
用于改变数据表中的数据。和事务相关,执行完后需要经过事务控制语句提交后才能真正的将改变应用到数据库中。
包括:
INSERT:将数据插入到数据表中
UPDATE:更新数据表中已存在的数据
DELETE:删除数据表中的数据
用来维护数据一致性的语句。
包括:
COMMIT:提交,确认已经进行的数据改变
ROLLBACK:回滚,取消已经进行的数据改变
SAVEPOINT:保存点,使当前的事务可以回退到指定的保存点,便于取消部分改变
用来查询所需要的数据。
SELECT语句
用于执行权限的授予和收回操作。
包括:
GRANT:授予,用于给用户或角色授予权限
REVOKE:用于收回用户或角色已有的权限
CREATE USER:创建用户
oracle中的数据类型
number(p,s) NUMBER表示数字类型 p表示数字的总位数 s表示小数点后的总位数
char(n) 表示固定长度的字符类型 最大长度是2000字节 N表示占用的字节数
varchar2(n) 表示变长的字符类型 oracle特有的数据类型 n最大为4000
date 用于定义日期时间的数据。长度是7个字节 默认格式为DD-MON-RR
CREATE语句(创建表)
CREATE TABLE employee(
id NUMBER(4),
name VARCHAR2(20) NOT NULL,
gender CHAR(1) DEFAULT 'M',
birth DATE,
salary NUMBER(30),
job VARCHAR2(30),
deptno NUMBER(2)
);
desc语句(查看表)
DESC employee;
default语句
在创建表的时候可以使用DEFAULT为某个字段单独指定一个默认值。
例如,给gender列赋默认值‘M’,如果没有指定性别的员工,默认是男性
注意:
1.数据库中的字符串字面量是使用单引号的。
2.虽然SQL语句本身不区分大小写,但是字符串的值是区分大小写的。
not null语句
1.非空(NOT NULL)是一种约束条件,用于确保字段值不为空
2.默认情况下,任何列都允许有空值
3.当某个字段被设置了非空约束条件,这个字段中必须存在有效值
4.当执行插入数据的操作时,必须提供这个列的数据
5.当执行更新操作时,不能给这个列的值设置为NULL
修改表名 (使用rename语句)
RENAME employee TO myemp
修改表结构
1.添加新字段
给表增加列时使用alter table的add子句实现。列只能添加到最后,不能插入到现有的列中
ALTER TABLE myemp
ADD(
hiredate DATE DEFAULT SYSDATE
)
2.修改现有字段
建表之后,可以改变表中列的数据类型、长度、默认值、是否为空 的属性。
注意:修改表结构都应当避免在表中有数据以后进行,若表中有数据,修改表中字段时尽量不要修改类型,若修改长度尽量增大避免缩小,否则可能导致失败。
ALTER TABLE myemp
MODIFY(
job varchar2(40) DEFAULT 'CLERK'
)
3.删除现有字段 使用ALTER TABLE 的子句 DROP 删除不需要的列
注意:删除字段需要从每行中删掉该字段占据的长度和数据,并释放在数据块中占据的空间,如果表记录比较大,删除字段可能需要比较长的时间。
ALTER TABLE myemp
DROP(
hiredate
)
DML语句是对表中的数据进行的操作,DML伴随事务控制(TCL),包含的操作:增、删、改
1. INSERT增加语句
给数据表里增加记录(执行了DML操作后,需要执行commit语句,才算真正确认了此操作)
INSERT INTO myemp
(id,name,salary,dempno)
VALUES(1,'jian',6000,10)
SELECT * FROM myemp
COMMIT
但是如果插入的数据中有日期的字段,就需要考虑日期的格式
默认格式:'DD-MON-RR' 若需要自定义日期的格式,可以使用TO_DATE函数
INSERT INTO myemp
(id,name,job,borth)
VALUES(
1003,'jian','technician',TO_DATE('2022-06-27','YYYY-MM-DD')
)
2. UPDATE语句
修改表中的数据。
修改表中的数据需要添加WHERE过滤条件,这样会将只满足条件的记录进行修改,否则将会把所有的数据都修改。一次也可以修改多个字段。
UPDARE myemp
SET salary=6000,name='jian',gender='F'
WHERE id=1
3. DELETE语句
删除表中数据
1. 如果没有WHERE子句,则全表的数据都会被删除
2. DDL语句中的TRUNCATE语句,同样有删除表数据的作用
DELETE FROM myemp
WHERE name='jian'
DESC myemp
DELETE与TRYNCATE的区别
(1)DELETE可以有条件删除,TRUNCATE将表数据全部删除。
(2)DELETE是DML语句,可以回退,TRUNCATE是DDL语句,立即生效,无法回退。
(3)如果是删除全部表记录,且数据量较大,DELETE语句效率比TRUNCATE语句低。
删除全部记录:
DELETE FROM myemp;
TRUNCATE TABLEmyemp;
1. char和varchar2 类型
都表示字符串数据类型,在表中存放字符串信息,比如姓名、职业、地址。
- char存放定长字符,存不满补空格
- varchar2存放可变长字符,存多少占用多少
保存‘helloworld’,共10个英文字母
- char(100):10个字母,补90个空格,实际占用100(浪费空间,节省时间)
- varcgar2(100):10个字母,实际占用10(浪费时间,节省空间)
2. char和varchar2 的存储编码及最大长度
默认单位是字节,可指定为字符。
- CHAR(10),等价于CHAR(10 BYTE)
- 指定单位为字符: CHAR(10 CHAR ),20个字节
- VARCHAR2(10),等价于VARCHAR2(10 BYTE)
- 指定单位为字符,VARCHAR2(10 CHAR ),20个字节
❤️ 注意:
每个英文字符占用一个字节,每个中文字符按照编码不同,占用2~4个字节
- ZHS16GBK :2个字节
- UTF-8 : 2~4个字节
CHAR最大取值为2000字节
最多保存2000个英文字符,1000个汉字(GBK)VARCHAR2最大取值为4000字节
最多可保存4000个英文字符,2000个汉字(GBK)CHAR可以不指定长度,默认为1, VARCHAR2必须指定长度。
3. long和clob类型
- LONG:VARCHAR2加长版,存储变长字符串,最多可达2GB的字符数据
LONG有诸多限制:
(1)每个表只能有一个LONG类型列
(2)不能作为主键
(3)不能建立索引
(4)不能出现在查询条件中
- CLOB:存储定长或变长字符串,最多可达4GB的字符串数据
❤️ Oracle建议开发中使用CLOB替代LONG类型
CREATE TABLE student(
id NUMBER(4),
name CHAR(20),
detail CLOB
);
4. concat和"||"
CONCAT(char1,char2)
返回两个字符串连接后的结果,两个参数char1,char2是要连接的两个字符串。等价操作:连接操作符“||”
如果char1,char2任何一个为NULL,相当于连接了一个空格
注意:建议多个字串连接时,用“||”更直观
#字符串函数 CONCAT()函数,用来连接字符串
SELECT CONCAT(ename,sal)
FROM emp
SELECT CONCAT( CONCAT(ename,','),sal)
FROM emp
SELECT ename||','||sal
FROM emp
5. length upper lower initcap
LENGTH(char)
用于返回字符串的长度如果字符类型是VARCHAR2,返回字符的实际长度,如果字符类型是CHAR,长度还要包括后补的空格。
LENGTH函数,查看字符串长度 SELECT ename,LENGTH(ename) FROM emp
大小写转换函数,用来转换字符的大小写
- UPPER(char):用于将字符转换为大写形式
- LOWER(char):用于将字符转换为小写形式
- INITCAP(char):用于将字符串中每个单词的首字母大写,其他字符小写
❤️ 注意:
(1)对于INITCAP而言,可以使用空格隔开多个单词,那么每个单词首字母都会大写。
(2)如果输入的参数是NULL值,仍然返回NULL值。
SELECT UPPER('helloword'), LOWER('HELLOWORD'), INITCAP('HELLOWORD') FROM dual /*此处的dual是伪表的意思 伪表:dual 当查询的内容不和任何表中数据有关系时,可以使用伪表,伪表只会查询出一条记录。*/
trim,ltrim,rtrim
去除当前字符串中两边的指定重复字符,LTRIM仅去除左侧的,RTRIM则仅去除右侧的。
RTRIM、 LTRIM可以去掉字符串中指定的多个字符,凡是出现的给定的字符统统去掉(不是按照字符给定的顺序去掉的)。
SELECT RTRIM('LIVEDBAC','ABCD') FROM dual live
SELECT TRIM('A' FROM 'AAAALIVEAAAAA') FROM dual live
SELECT LTRIM('AAAAALIVEAAAA','A') FROM dual liveaaaa
SELECT RTRIM('AAAALIVEAAAA','A') FROM dual aaaalive
lpad,rpad 补位函数
实用的地方:实现左对齐右对齐
实现右对齐: SELECT LPAD(sal,5,' ') FROM emp
实现左对齐: SELECT RPAD(sal,5,' ') FROM emp
substr截取字符串
SUBSTR(char , [m,[,n]]) 用于获取字符串的子串,返回char中从m位开始取n个字符
如果m = 0,则从首字符开始,如果m取负数,则从尾部开始
如果没有设置n,或者n的长度超过了char的长度,则取到字符串末尾为止
❤️ 注意:
(1) 数据库中的下标都是从1开始的
(2)截取的位置可以是负数,若是则表示从倒数第几个字符开始截取SELECT SUBSTR('THINKING IN JAVA',13,4) FROM dual java
instr
INSTR(char1,char2[,n,m])函数
查找char2在char1中的位置
n为从第几个字符开始检索
m为第几次出现
n,m不写则默认都是1SELECT INSTR('THINKING IN JAVA','IN',3,1) FROM dual 3
NUMBER ( P ) 表示整数
完整语法: NUMBER(precision , scale)
- 如果没有设置scale,则默认取值为0,即NUMBER( P )表示整数
- P表示数字的总位数,取值为1~38
NUMBER ( P , S ) 表示浮点数
- NUMBER(precision , scale)
- precision: NUMBER可以存储的最大数字长度(不包括左右两边的0)
- scale:在小数点右边的最大数字长度(包括左侧0)
- 指定了s但是没有指定p,则默认p为38,如:
列名 NUMBER ( * , s )
ROUND
- ROUND(n [ , m ]) :用于四舍五入
- 参数中的n可以是任何数字,指要被处理的数字
- m必须是整数
- m取正数则四舍五入到小数点后第m位
- m取0值则四舍五入到整数位
- m取负数,则四舍五入到小数点前m位
- m缺省,默认值是0
SELECT ROUND(45.68,2) FROM dual 45.68
SELECT ROUND(45.678,0) FROM dual 46
SELECT ROUND(55.678,-2) FROM dual 100
TRUNC
- TRUNC ( n [ , m ]) :用于截取数字
SELECT TRUNC(45.68,2) FROM dual; 45.68
SELECT TRUNC(45.678,0) FROM dual; 45
SELECT TRUNC(55.678,-2) FROM dual 0
MOD
MOD(m,n)求余数 如果n为0 则直接返回m
CEIL,FLOOR
向上取整,向下取整
DATE
DATE表示的日期范围可以是公元前4712年1月1日至公元9999年12月31日。
DATE类型在数据库中的存储固定为7个字节,格式为:
- 第1字节:世纪+100
- 第2字节:年
- 第3字节:月
- 第4字节:天
- 第5字节:小时+1
- 第6字节:分+1
- 第7字节:秒+1
TIMESTAMP
TIMESTAMP是Oracle常用的日期类型。与DATE的区别是不仅可以保存日期和时间,还能保存小数秒,最高精度可以到ns(纳秒)
- 数据库内部用7或者11个字节存储,精度为0,用7字节存储,与DATE功能相同,精度大于0则用11字节存储。
- 格式为:
第1字节~第7字节:和DATE相同
第8~11字节:纳秒,采用4个字节存储,内部运算类型为整形。
SYSDATE
SYSDATE其本质是一个Oracle的内部函数,返回当前的系统时间,精确到秒。
默认显示格式:DD-MON-RR
SELECT SYSDATE FROM dual
SYSTIMESTAMP
内部函数,返回当前系统日期和时间,精确到毫秒。
SELECT SYSTIMESTAMP FROM dual
TO_DATE
- TO_DATE(char[,fmt [, nlsparams]]):将字符串按照定制格式转换为日期类型。
- char要转换的字符串
- fmt:格式
- nlsparams:指定日期语言
常用格式
- YY 2位数字的年份
- YYYY 4位数字的年份
- MM 2位数字的月份
- MON 简拼的月份
- MONTH 全拼的月份
- DD 2位数字的天
- DY 周几的缩写
- DAY 周几的全拼
- HH24 24小时制的小时
- HH12 12小时
- MI 显示分钟
- SS 显示秒
SELECT TO_DATE('2008年08月08日20:08:08','YYYY"年"MM"月"DD"日"HH24:MI:SS') `在这里插入代码片` FROM dual
日期的计算:
日期可以与一个数字进行加减法,这相当于加减指定的天
两个日期可以进行减法,差为相差的天。--查看员工入职多少天了
SELECT ename,SYSDATE-hiredate FROM emp
TO_CHAR
将其他类型的数据转换为字符类型。
- TO_CHAR(date[,fmt[,nlsparams]]):将日期类型数据date按照fmt的格式输出字符串。nlsparams用于指定日期语言。
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM dual
LAST_DAY(date)
- LAST_DAY(date) : 返回日期date所在月的最后一天。按照自然月计算某些业务逻辑,或者安排月末周期性活动时很有用处。
--查看当月底
SELECT LAST_DAY (SYSDATE) FROM dual
ADD_MONTHS(date,i)
- ADD_MONTHS(date,i):返回日期date加上i个月后的日期值。
- 参数 i 可以是任何数字,大部分时候取正值整数
- 如果 i 是小数,将会被截取整数后再参与运算
- 如果 i 是负数,则获得的是减去 i 个月后的日期值。
查看每个员工入职20周年纪念日
SELECT ename,ADD_MONTHS(hiredate,12*20) FROM emp
MONTHS_BETWEEN(date1,date2)
- MONTHS_BETWEEN(date1,date2):计算date1和date2两个日期值之间间隔了多少个月
- 实际运算是date1-date2,如果date2时间比date1晚,会得到负值。
- 除非两个日期间隔是整数月,否则会得到带小数位的结果,比如计算2009年9月1日到2009年10月10日之间间隔多少个月,会得到1.29个月。
SELECT MONTHS_BETWEEN(SYSDATE,hiredate) FROM emp
NEXT_DAY(date,char)
- NEXT_DAY(date,char):返回date日期数据的下一个周几,周几是由参数char来决定的
❤️ 注意:
- NEXT_DAY不是明天!!!!
- 1表示周日,2表示周一,依次类推
查看下一个周天是几月几号 SELECT NEXT_DAY(SYSDATE,7) FROM dual
LEAST,GREATEST
- GREATEST(expr1[,expr2[,expr3]]…)
- LEAST(expr1[,expr2[,expr3]]…)
- 也被称作比较函数,可以有多个参数值,返回结果是参数列表中最大或最小的值
- 参数类型必须一致
- 在比较之前,在参数列表中第二个以后的参数会被隐含的转换为第一个参数的数据类型,所以如果可以转换,则继续比较,如果不能转换将会报错。
SELECT LEAST(SYSDATE,TO_DATE('2008-08-08','YYYY-MM-DD')) FROM dual
SELECT LEAST(98,27) FROM dual
EXTRACT
- EXTRACT(date FROM datetime) :从参数datetime中提取参数date指定的数据,比如提取年,月,日。
查看1980年入职的员工
SELECT ename,sal FROM emp WHERE EXTRACT(YEAR FROM hiredate)=1980
插入NULL值
CREATE TABLE student(
id NUMBER(4),
name CHAR(20),
gender CHAR(1)
);
INSERT INTO student VALUES(0001,'jian','F');
INSERT INTO student VALUES(0002,'jian',null);
INSERT INTO student(id,name) VALUES(0003,'jian');
SELECT * FROM student
COMMIT
更新成NULL值
- UPDATE student SET gender = NULL;
❤️ 注意:
- 这种更新只有在此列没有非空约束的情况下才可操作
- 如果某列有非空约束,则无法更新为NULL值,上述语句会报错
将1更新为NULL值
UPDATE student SET gender= NULL WHERE id=0001 SELECT * FROM student
NULL条件查询
- 判断字段的值是否为NULL需要使用 IS NULL或者 IS NOT NULL
DELETE FROM student WHERE gender IS NULL;
NULL值的运算操作
- NULL与任何数字运算结果还是NULL
- NULL与字符串拼接等于什么都没干
空值函数
NVL
- 空值函数NVL(arg1,arg2)
当arg1为NULL,函数返回arg2的值,若不为NULL,则返回arg1本身。
所以该函数的作用是将NULL值替换为一个非NULL值。SELECT ename,sal,comm,sal+NVL(comm,0) FROM emp
NVL2
- NVL2(arg1,arg2,arg3)
当arg1不为NULL,则函数返回arg2
当arg1位NULL,则函数返回arg3
该函数是根据一个值是否为NULL来返回两个不同结果
/*
查看每个人的绩效情况,即:
有绩效的,显示为“有绩效”;
没绩效的,显示为“没有绩效”
*/
SELECT ename,sal,NVL2(comm,'没有绩效','有绩效')FROM emp
文章参考博客:
Oracle数据库基础(一)_Alive~的博客-CSDN博客_oracle数据库
Oracle数据库基础(二)_Alive~的博客-CSDN博客_oracle的substr函数用法