数据库操作语言
一、基本知识
1、Oracle服务器由两大部分组成:Oracle数据库和Oracle实例
Oracle数据库:位于硬盘上实际存放数据的文件,以.DBF结束的文件
Oracle实例:位于物理内存里的数据结构
2、数据库中的语言:
DML:数据库操作语言(select、insert、update、delete)
DDL:数据库定义语言(create table、alter table、drop table、create view)
DCL:数据库控制语言(commit、rollback、grant、revoke)
二、:数据库操作语言-select
1、简单的查询:
select * from 表名; --查询表的所有信息
select 列名1,列名2,列名3... from 表名; --查询表的部分信息
select e.ename 姓名, e.sexl 性别, e.age 年龄 from emp e; --查询语句中别名的使用
2、条件查询where
select * from emp where deptno = 10;
select * from emp where hiredate='09-6月 -81'; --正确,'09-6月 -81'为日期默认格式 DD-MON-RR
对于日期有两种修改方式:
a)修改系统默认日期格式:alter session set NLS_DATE_FORMAT='yyyy-mm-dd';
b)使用to_date:select * from emp where hiredate = to_date('1981-6-9', 'yyyy-mm-dd');
to_date(要转换的内容, 格式)
3、比较运算符
a)、between ... and ... 在两个值之间(包含边界值),小值在前大值在后,可以作用于数字、日期
select * from emp where sal between 1000 and 2000; --查询薪水1000-2000的员工:
b)、[not] in(set)
select * from emp where deptno in (10, 20); --查询10号和20号部门的员工:
如果使用not in,那么括号里不能有null值
c)、like
模糊查询 % 代表零个或多个字符 _ 代表一个字符
select * from emp where ename like 'S%'; --查询以S开头的员工:
select * from emp where ename like '____'; --查询名字是4个字的员工
select e.ename from emp e where e.ename not like '%R%' order by e.ename; --显示不带有"R"的员工的姓名
4、逻辑运算
and:逻辑并
or:逻辑或
not:逻辑非
5、排序
--order by:排序(升序asc(默认);降序desc)
order by 后面可以跟:列名、表达式、别名、序号
如果后面的多列都按降序排,那么每列后面跟desc
select e.ename,e.sal,e.hiredate from emp e order by e.ename; ----(1)查询EMP表显示所有雇员名、工资、雇佣日期,并以雇员名的升序进行排序。
6、单行函数:只对一行进行变换,每行返回一个结果。函数可以嵌套使用
字符函数:
lower:转为小写
upper:转为大写
initcap:每个单词的首字母大写
concat:字符串连接
substr:取子串
length:字符数长度
lengthb:字节数长度
instr:在母串中返回子串的位置
rpad:右填充
lpad:左填充
trim:去除首尾字条
replace:替换
数字函数:
round:四舍五入
trunc:截断
mod:求余
日期函数:
在日期上加上或减去一个数字,结果仍为日期
两日期相减,返回相关的天数
用数字除以24来向日期中加上或减去小时
sysdate:返回当前时间
months_between(日期1, 日期2):按实际月份算出相关的月数
add_months(日期, 1):在日期上加一个月
next_day(开始的日期, '星期六'):从当前日期开始,下一个星期六
last_day(日期):返回此日期中本月的最后一天
round(日期, 'MONTH'):四舍五入到月
trunc(日期, 'YEAR'):截断到年
7、分组函数
作用于一级数据,并对一级数据返回一个值。会自动去除空值再计算 avg(平均)、count(计数)、max(最大)min(最小)sum(求和)
注意:
a)不能在where子句中使用组函数,可以在having子句中使用组函数。尽量使用where
b)在组函数中使用nvl函数,使分组函数无法忽略空值
select e.deptno,count(e.deptno) from emp e group by e.deptno having count(e.deptno) >=1; -- 列出至少有一个雇员的所有部门。
8、多表查询
等值连接(内连接):
不等值连接:
外连接:
当条件不满足时,仍然希望显示某些在结果中包含某些不成立的记录时,使用外连接
左外连接:当连接条件不成立时,没有加号(+)的列的信息仍然显示,通常放在等号(=)的左边
右外连接:当连接条件不成立时,没有加号(+)的列的信息仍然显示,通常放在等号(=)的右边
自连接:会先产生笛卡尔积,再根据条件进行过滤记录。效率低
三、数据库操作语言-insert
格式:insert into 表名(column1,column2...) values(value1 value2...)
insert into person values(111, '张三', '男');
insert into person( pname) values( '李四');
注意:
a)列名与值必须一一对应
b)如果列名涵盖了表里所有的列,那么列可以省略,但值必须与表里列的顺序一致
隐式方式:如果插入的数据中,列名只是表中的一部分,那么其他未指明的列的值为null
显式方式:在values中指定空值
四、数据库操作语言-update
格式:
update 表名 set column1 = value1 , column2 = value2,... where ……
update emp02 set comm=1000 where deptno=10;
五、数据库操作语言-delete
格式:delete from 表名 where condition
清空表:
a)delete from 表名;
b)truncate 表名;
六、Oracle中的事务:
设置自动提交:
SET AUTOCOMMIT ON/OFF; --oracle默认为关闭off
事务开始标志:
DML语句(insert、update、delete)会自动开启事务
事务结束标志:
提示:
显示提交:commit
隐式提交:使用DDL(create table...);正常退出时会自动提交
回滚:
显式回滚:rollback
隐式回滚:宕机、非正常退出
保存点的使用:可以让数据回滚至指定的地方
设置保存点:savepoint a;
回滚至保存点:rollback to savepoint a;