1.如何查看Oracle中的表呢
select * from tab;
2.
使用“/”是执行上一条语句,使用;号也是可以执行的
3.
select empno,ename,sal,job,mgr,hiredate,comm,deptno
from emp;
该条语句是查看这个表的empno,ename,sal,job,mgr,hiredate,comm,deptno
4.
也可以查看几个属性
empno,ename,sal,job
from emp;
这个语句就是查看EMP这张表的ename,sal,job属性
5.
select empno,ename,sal,sal*12
from emp;
上面的语句是查看EMP表中的员工 编号,姓名,月薪,年薪。
6.
select empno,ename,sal,sal*12,comm,sal*12+comm
from emp;
这条语句是说,去EMP这张表中查看 编号,姓名,月薪,年薪,奖金,年收入
可是这条语句有缺陷,什么缺陷呢,就是有些员工没有奖金,但是其他的年收入
都没有出现了,这样导致数据出错,为了避免数据出错我么需要判断是否是空值
7.
select empno,ename,sal,sal*12,comm,sal*12+nvl(comm,0)
from emp;
这条语句是说,去EMP这张表中查看 编号,姓名,月薪,年薪,奖金,年收入
如果奖金为NULL,那么我么赋值为0,这样即使没有奖金,我么也会出现年收入
从而解决了数据丢失的缺陷
8.
select *
from emp
where comm=null
这句话意思是 查看 emp表中 comm为null的语句,但是,我么这条语句是有缺陷的
应为 =null是找不到的,而是需要 is null 才能呢
9.
select *
form emp
where comm is null;
这句话意思是 查看 emp表中 comm为null的语句,就是打印出为null的数据
10.
select empno as "员工号",ename "姓名",sal 月薪
from emp
/
这条语句是给属性取个别名,as可以省掉不写的
所以打印出来的是 员工号 姓名 月薪
11.
select deptno from emp;
这句话是查看这个表中的depton,我么查看得知有很多重复的
所以出现了DISTINCT去除重复值
select DISTINCT deptno from emp;
这句话就是去除掉EMP表单deptno重复的值,留下不重复的
12.
select concat('hello','world')from emp;
这句话是说连接此字符串,其中concat(,)就是连接
但是其中有个个缺陷就是,我么连接字符串和EMP表没半毛钱关系
所以我么改进。
select concat('hello','world')from dual;
这样,在和没有与任何一张表中产生关系的时候,我么就可以使用dual
并且还有一个好处就是,只是打印出一次hello,world。
13.
这里简单的介绍一下dual,我么称之为 “伪表” 看其名,知其意,就是一张假表
所以,在没和其他表产生关系,我么就可以使用“伪表”
14.
select 3+2 from dual
这句话意思是 3+2 悲催吧,但是我么指向的是一张“伪表”
15.
select 'hello' || 'world' one from dual;
想要看明白就要知道||是什么意思,||在Oracle数据库中的作用是
字符串连接符号,即打印 helloworld,其中one是它么的名字,指向
一张伪表。
16.
select ename || '薪水是'||sal one
from emp;
这句话意思是查看EMP表中的名字薪水是¥
ONE
——————
base薪水是1000000
这就是打印的结果了
17.
select *
from emp
where deptno=10;
这句话的意思是查看EMP表中编号为10的全部输出
18.
select *
from emp
where ename='KING';
这句话是在EMP表中查找'KING'这个人,但是Oracle区分大小写
如果cname是大写,你输入小写那就会找不到的
19.
select *
from emp
where hiredate='17-11月-81';
这句话是查找EMP表中的出生为17-11-81的人,其实这个日期我么是可以修改的
但是系统默认是这个
20.
select sysdate from dual;
这句话是查看本地系统的时间配置
默认是24-7月-13
21.
alter session set NLS_DATE_FORMAT='yyyy-mm-dd';
首先我么需要执行这句话,此语句修改当前时间的会话。
select * from emp where hiredate='1981-11-17';
当会话修改后我么就可以使用上面的日期就不会报错了
22.
select *
from emp
where sal beween 2000 and 3000;
这句话意思是EMP表中查询薪水在2000~3000
并输出
23.
select *
from emp
where deptno in(10,20);
这句话意思是查找EMP表中的编号为10或者20的员工
如果没有就显示为选定行。
select *
from emp
where deptno in(5,10);
这条语句会不会报错,是不会的,只是从查找有没有编号有没有
5这个编号的员工,或者10这个编号的员工。
24.
select *
from emp
where deptno not in(10,20);
这个语句意思是,查找EMP表中不是编号 10,20的员工
即编号30,40,…N0的员工都会被显示。
25.
select *
from emp
where ename like 'S%';
这句话意思是在EMP表中如果存在开头是S的姓名
like:意思是模糊查询
%:意思是0个或多个字符(任意字符)
26.
select *
from emp
where ename like'____'
这句话的意思就是,在EMP表中,就查找为4个字符的员工名字
_:意思是:代表一个字符
27.
select *
from emp
where ename like '%_%';
这句话是非常有缺陷的,哪个员工的名字都会被打印出来的
我么的_是一个字符,这个字符并没有被转意,所以每个员工
姓名都会被答应,怎么解决呢?
select *
from emp
wherer ename like '%\_%' eacape '\'
/
eacape是将字符转义,我么将转义的字符插在_前面
即\_如果名字带_下划线的员工才会被输出
28.
select *
from emp
order by sal;
这句话的意思是按照sal进行排序
order by:排序
order by sal; 后面更的是子句结尾,sal即为子句
29.
select *
from emp
order by sal desc
这句话是薪水进行降序,进行的排序
desc:降序
select *
from emp
order by sal asc
这句话意思是薪水进行升序,进行排序
select *
from emp
order by sal;
默认的情况下使用升序进行排序
30.
select ename,sal,sal*12
from emp
order by sal*12 desc;
这句话意思是,查找EMP表中 姓名,月薪,年薪
并且是以年薪进行降序的
31.
select *
from emp
order by deptno,sal;
这句话的意思是,如果编号一样,那么久以薪水进行排序。
32.
select *
from emp
order by deptno desc,sal,desc
/
这句话它是更具那个进行排序的?
里desc最近的一个子句进行排序的
也就是说,该排序是按照编号进行排序
33.
笛卡尔积,只要记住列*列,行+行
EMP
empno ename sal deptno
1001 Tom 5000 1
1002 Jos 5000 2
1003 Base 5000 1
1004 Helen 5000 1
BuMen
depton dname
1 行政部
2 开发部
这两张表存在关系,就形成笛卡尔积
empno ename sal deptno depton dname
1001 Tom 5000 1 1 行政部
1002 Jos 5000 2 1 行政部
1003 Base 5000 1 1 行政部
1004 Helen 5000 1 1 行政部
1001 Tom 5000 1 2 开发部
1002 Jos 5000 2 2 开发部
1003 Base 5000 1 2 开发部
1004 Helen 5000 1 2 开发部
这样就形成了很多重复,并且有些还是错误的值
这就是笛卡尔积。怎么去除笛卡尔积呢?
用EMP的deptno = BuMen的depton
如果这两个编号相等就是成立的
否则就不成立
34.
select lower('HELLO WORLD')转小写,upper('hello world')转大写,
initcap('hello world')首字母大写
from dual;
这条语句意思是将字符串 大写,小写以及首字母大写
lower:将字符串进行小写
upper:将字符串进行大写
initcap:将字符串首字母大写
35.
select substr('Hello World',3) from dual;
这条语句就是截取字符串
从第3个字符串截取到最后
36.
select substr('hello world',2,4)from dual;
这句话意思是从第二个字符截取到第4个字符串
37.
select lpad('abc',10,'*')左填充,rpad('abcd',10,'*')右边
from dual;
这句话的结果就是*******abc abcd******缺了几个位就补*
——————————————————————————————-
由于时间不充足的关系只能写上这个含义
38.
ROUND:四舍五入
TRUNC:截断
MOD:求余
39:
lower('Hello WOrld') 转小写
upper('Hello WOrld') 转大写,
initcap('hello world') 首字母大写
trim:默认去掉字符串两边的空格,如果给定参数就去除给定参数值
40.
ADD_MONTHS:向指定日期中加上若干月数
LAST_DAY:本月的最后一天
NEXT_DAY:指定日期的下一个日期
MONTHS_BETWEEN:两个日期相差的月数
41.
group by
对其分组
===============================================================================================
2013-7-25
1.
select sal from emp where ename='SOCTT';
这句话的意思是说,我么在EMP表中查找名字叫
SOCTT这个人的薪水
2.
select * from emp where sal > 3000
这句话意思是说,在EMP表中,如果有比这个
薪水高的人就打印出来
3.
select *
from emp
sal > (select sal from emp where ename='SCOTT');
这句话的意思就是,先执行子查询语句,查找到name为SCOTT
获取到这个员工的薪水,然后在遍历EMP表中所有员工的薪水
薪水值大于SCOTT这个人的员工
子查询的作用范围以及注意事项:
1.可以在主查询的where select from having 放置子查询
2.不可以在主查询的group by后面放置子查询
3.单独强调from后面的子查询
4.主查询和子查询可以不是同一张表,只要子查询返回的结果主查询可以使用即可
5.一般,先执行子查询 再执行主查询;但相关子查询除外
6.一般不在子查询中使用order by;但在Top-N分析问题中,必须使用order by
7.单行子查询只能使用单行操作符 多行子查询只能使用多行操作符
8.子查询中的null
4.
select ename,sal,(select job from emp where empno=7839)一列
from emp;
这句话的意思就是,先看子查询的内容就是,查找EMP表中编号为7839这个职位
然后外面有select就是查找 ename,sal,job了
这样我么拆分出来看是非常容易理解的。
5.
select *
from(select ename,sal from emp);
这句话的意思是,子查询语句的结果是查询EMP表中的 ename,sal
外层的*代表所有的员工ename,sal
6.
select *
from (select ename ,sal,sal*12 annlsal from emp);
这句话的意思是说,查找EMP表中的ename,sal,年薪
首先查看下子查询,意思是在EMP表中查找ename,sal,sal*12,其中annlsal只是取个名字而已
外层的*是代表输出所有的员工 ename,sal,sal*12
7.
select *
from emp
where deptno = (select deptno
from dept
where dname='SALES');
首先我么分析子查询的意思,查询DEPT这张表部门名字为SALES编号
如果找到了,就把编号赋值给了外层的EMP表的deptno,如此一来,打印的都是
同一个编号部门咯,这里我么就运用到了两张表了
8.
select e.*
from emp e,dept d
where e.deptno=d.deptno and d.dname='SALES';
.代表所有列,这里的判断条件是如果 员工的编号 = 部门编号 成立
和部门=‘SALES’
如果我么找到了,那么就输出是此部门的员工
9.
select *
from emp
where deptno in(select deptno from dept where dname='SALES' or dname='ACCOUNTING');
这句话的意思是:
我么查找dept表中的编号,但是条件是,部门需要是‘SALES’,或者是ACCOUNTING
的部门下的才会被输出
其中这个in:等于列表中的任何一个
10.
select *
from emp
where sal > any (select sal from emp where deptno=30);
先来解释一下any:和子查询集合中的值任意进行比较
这句话的意思是说,查询工资比30号部门任意一个员工高的员工信息
所以我么这里应该找到一个最小值进行比较,这样就会高出来了
最后在重员工表中遍历出所有员工的sal进行比较,如果比any的值大
则输出
11.
select *
from emp
where sal > (select min(sal) from emp where deptno=30)
/
这句话的意思是,查找EMP表中编号为30的最少sal,找到了
外面在进行遍历,如果低于编号30员工的薪水则不输出
12.
select *
from emp
where sal > (select max(sal) from emp where deptno=30)
/
这句话的意思是:查找EMP表中编号为30的最高sal,如果低于
编号30的员工薪水则不输出.
13.
slect *
from emp
where empno not in(select mgr from emp);
这句话的意思就是说,查询不是老板的员工,如果是为选定行就是没找到
14.
select *
from emp
where empno in(select mgr from emp);
这句话的意思就是说,查询是老板的员工。
在第13—14 这两条sql语句输出的结果大家可能看的有些奇怪,其实,数据都是加载到内存中
内存中的数据都是 “树”形结构,一层一层的关系,所以只要它的父节点是子节点就不用被输出
可参见图:“关系图”画出的关系观看
下面是 几个课堂练习“引发”出的血案
15.
select rownum,empno,ename,sal
from emp;
这句话的意思是说,遍历出EMP表中rownum,empno,ename,sal
上面的语句只是简单的输出全部的,而我么只需要前3名的sal
增强版本:
select rownum,empno,sal,ename
from emp
where rownum<=3
order by sal desc;
这里就有明显的改变了哈,但是还是没有觉得,因为rownum是乱的。。。。
怎么办啊?卧槽,各种压力,看我怎么破解这个命案,真相只有一个
终极版解决:
select rownum,ename,empno,sal
from (select * from emp order by sal)
where rownum<=3;
这句话,首先执行子查询,按照sal排序,接着遍历输出,但是,此时
我么已经限定了rownum它只能在3行内,所以,最后是有顺序,并且还是在
3行内的.
关于rownum
rownum永远按照默认的顺序生成
rownum只能使用< <=, 不能使用> >=
哈哈哈哈哈~~,这个命案的手法被我名侦探“李小贱”解决了把。
16.
在来看看我么如果使用>=的rownum把,见证奇迹的时刻到了
select rownum,eanme,empno,sal
from emp
where rownum>=5 and rownum<=8;
这句话将会导致什么结果呢?本世纪最牛的“魔术师”为你揭晓
答案是:为选定行,哈哈,找不到
没办法都说了不行,可是你还要测试,“犯贱”吗?哈哈哈~
但是,如果按照常理来说,我么有1~14个数据,但是怎么就是没显示出来呢?
答案 在上面我已经说过了
分页:
select *
from (select rownum r,el.*
from (select * from emp order by sal)el
where rownum<=8
)
where r>=5;
沃勒了个去,这个手法有些棘手,看我是怎么来推理的把
首先我么先来到现场看到 地上的前由高到底进行排序的
并且还了el的名字,继续观察发现,摆放的rownum并为超过8行
这就证明凶手的口袋装不下了,e.*是遍历rownum的所有列
哈哈,有14列,但是只剩下8列,看来凶手不是贪心之人
最后外层进行判断r即rownum,是>=5开始的。
由此,内层行号<=8,外层重行5开始进行
也就是形成了 5,6,7,8进行了分页
17.
select empno,ename,sal,avgsal
from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) d
where e.deptno = d.deptno and e.sal>d.avgsal;
分析一下:
我么先看子查询语句,查找EMP表的编号和平均工资,并且是以编号进行排序的
外层的select语句,where进行过滤,如果e(EMP).deptno = d(EMP)from内的
并且e.sal > d.avgsal,EMP表的工资大于from内的平均工资
18.
select empno,enaem,sal,(select avg(sal) from emp where deptno=e.deptno)avgsal
from emp e
where sal > (select avg(sal) from emp where deptno=e.deptno);
这个看起来比较麻烦,如果去看呢?我么先看子查询的把
这个是求出每个部门的平均工资
出了子查询就是遍历EMP表
进行判断,如果 sal (个人sal)> (员工的部门的平均工资)
则输出
19.
select deptno,wm_concat(ename) names
from emp
group by deptno;
这几句的意思是做什么的呢?有我来说明下把
先来了解一下 wm_concat()这个函数是行转列函数
好把,我么先来第一句
查找编号,并把名字排成一列
在EMP表中查询
如果相同的编号则视为一个编号
最后答案
————————————————-
10 CLARK,KING,MILLER
20 SMITH,FORD,ADAMS,SCOTT,JONES
30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD
————————————————-
显然的,我么的名字是在一列上,并且相同的编号视为同一编号
20.
select * from emp where deptno=10
union
select * from emp where deptno=20
查找编号为10或者20的员工
union : 并集,去掉重复元素后的所有记录
21.
select deptno,job,sum(sal) from emp group by deptno,job
union
select deptno,to_char(null),sum(sal) from emp group by deptno
union
select to_number(null),to_char(null),sum(sal) from emp;
注意的问题
1. 参与运算的各个集合必须列数相同,且类型一致
2. 采用第一个集合的表头作为最后表头
3. 如果排序,必须在每个集合后 使用相同的order by
4. 括号
22.
select deptno,job,sum(sal) from emp group by deptno,job
union
select deptno,to_char(null),sum(sal) from emp group by deptno
union
select to_number(null),to_char(null),sum(sal) from emp
这几句的意思是,查找EMP表的编号,职位,和薪水
使用union进行并集,去掉重复的在显示
23.
select count(*) Total
sum(decode(to_char(hiredate,'YY'),'80',1,0))"1980",
sum(decode(to_char(hiredate,'YY'),'81',1,0))"1981",
sum(decode(to_char(hiredate,'YY'),'82',1,0))"1982",
sum(decode(to_char(hiredate,'YY'),'87',1,0))"1987"
from emp
/
这个意思是:统计所有员工是什么日期入职的
/*
SQL的类型:
1. DML语句(Data Manipulation Language 数据操作语言): insert update delete select
2. DDL语句(Data Definition Language 数据定义语言):create/drop/alter/truncate table
create/drop view,sequence,index,synonym
3. DCL语句(Data Control Language 数据控制语句): commit rollback
我么先来了解数据操作语言
insert into emp(empno,ename,sal,deptno) values(1001,'Tom',3000,10);
创建一行
隐式/显式 插入空值
地址符 &
insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno);
输入 empno 的值: 1002
输入 ename 的值: 'Mary'
输入 sal 的值: 5000
输入 deptno 的值: 20
原值 1: insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno)
新值 1: insert into emp(empno,ename,sal,deptno) values(1002,'Mary',5000,20)
-批处理
create table emp10 as select * from emp where 1=2;
其中这里只是把emp表的结构赋值给了emp10这个表,里面并没数据
insert into emp10
select * from emp where deptno=10
这句话的意思是说,把emp表中为编号10的员工值赋值给emp10表中为10编号的员工
delete和truncate的区别
1. delete逐条删除 truncate先摧毁 再重建
2.*** delete是DML语句(可以回滚) truncate 是DDL语句(不可以回滚)
3. delete不会释放空间 truncate会
4. delete会产生碎片 truncate不会
5. delete可以闪回 truncate不可以
oracle中的事务
1. 起始标志: DML语句
2. 结束标志: 提交 显式–> commit
隐式–> 正常退出exit ,DDL语句
回滚 显式–> rollback
隐式–> 非正常退出,停电
create table testsavepoint
(tid number,tname varchar(20));
这里就创建了一张表了,并且设置了一个tid为number类型和tname为varchar类型
insert into testsavepoint values(1,'Tom');
创建数据
savepoint a;
创建保存点
insert into testsavepoint values(2,'Mike');
insert into testsavepoint values(3,'Mary');
rollback to savepoint a
回退到保存点
select * from testsavepoint;
TID TNAME
——————————
1 Tom
这样就是回退到保存点
DDL:
alter table test1 add photo blob;
修改表结构,
alter table test1 修改的是哪张表
add ptoto blob 添加什么数据是什么数据类型
alter table test1 rename column tname to username
把tname换成username
drop table 表名
删除一张表,其实并没有删除,只是放在了回收站而已
show recyclebin
查看回收站
当把一张表删除的时候在查看就是一堆看不懂的乱码了,我么还可以使用
select * from "被删除的文件表码"
一定要加""否则出错
purger recyclebin;
清空回收站
———————————————————————–
其他数据库对象
create view empinfoview
as
select e.empno,e.ename,e.sal,e.sal*12 annlsal,d.dname
from emp e, dept d
where e.deptno=d.deptno
上面是创建一个视图,可是我么没有权限?
如何获取到权限呢?让管理员给你权限把
1–>sqlplus / as sysdba
2–>进入到管理员输入 grant create view to scott;
3–>授权成功
select * from empinfoview
查看内容,其实操作视图和操作表是一样的
create or replace view empinfoview
as
select e.empno,e.ename,e.sal,e.sal*12 annlsal,d.dname
from emp e,dept d
where e.deptno=d.deptno
with read only;
其中 with read only 只做查询操作
序列:
create sequence myseq;
序列被创建
create table tableA
(
tid number,
tname varchar2(20)
);
创建表
select myseq.nextval from dual;
nextval : 返回下一个有效值
这句话是说,查看下一个值,和任何表都没关系,从而使用一张伪表
insert into tableA values(myseq.nextval,'base');
/
/
执行两次后,使用commit进行提交
select * from tableA;
输出
TID TNAME
———————
2 base
3 base
4 base
insert into tableA values(myseq.nextval,'base');
/
/
rollback;
进行回退
insert into tableA values(myseq.nextval,'xss');
插入一条数据
select * from tableA
结果
TID TNAME
—————————————–
2 base
3 base
4 base
7 aa
他不会因为回退而改变数。
select count(*) from hr.EMPLOYEES
查看HR账户的EMPLOYEES表,但是这样会错误,没有视图或者表
因为自己更本就没有权限,所以需要进行授权
来到HR—>grant select on EMPLOYEES to scott
这样就授权给了scott
1.如何查看Oracle中的表呢
select * from tab;
2.
使用“/”是执行上一条语句,使用;号也是可以执行的
3.
select empno,ename,sal,job,mgr,hiredate,comm,deptno
from emp;
该条语句是查看这个表的empno,ename,sal,job,mgr,hiredate,comm,deptno
4.
也可以查看几个属性
empno,ename,sal,job
from emp;
这个语句就是查看EMP这张表的ename,sal,job属性
5.
select empno,ename,sal,sal*12
from emp;
上面的语句是查看EMP表中的员工 编号,姓名,月薪,年薪。
6.
select empno,ename,sal,sal*12,comm,sal*12+comm
from emp;
这条语句是说,去EMP这张表中查看 编号,姓名,月薪,年薪,奖金,年收入
可是这条语句有缺陷,什么缺陷呢,就是有些员工没有奖金,但是其他的年收入
都没有出现了,这样导致数据出错,为了避免数据出错我么需要判断是否是空值
7.
select empno,ename,sal,sal*12,comm,sal*12+nvl(comm,0)
from emp;
这条语句是说,去EMP这张表中查看 编号,姓名,月薪,年薪,奖金,年收入
如果奖金为NULL,那么我么赋值为0,这样即使没有奖金,我么也会出现年收入
从而解决了数据丢失的缺陷
8.
select *
from emp
where comm=null
这句话意思是 查看 emp表中 comm为null的语句,但是,我么这条语句是有缺陷的
应为 =null是找不到的,而是需要 is null 才能呢
9.
select *
form emp
where comm is null;
这句话意思是 查看 emp表中 comm为null的语句,就是打印出为null的数据
10.
select empno as "员工号",ename "姓名",sal 月薪
from emp
/
这条语句是给属性取个别名,as可以省掉不写的
所以打印出来的是 员工号 姓名 月薪
11.
select deptno from emp;
这句话是查看这个表中的depton,我么查看得知有很多重复的
所以出现了DISTINCT去除重复值
select DISTINCT deptno from emp;
这句话就是去除掉EMP表单deptno重复的值,留下不重复的
12.
select concat('hello','world')from emp;
这句话是说连接此字符串,其中concat(,)就是连接
但是其中有个个缺陷就是,我么连接字符串和EMP表没半毛钱关系
所以我么改进。
select concat('hello','world')from dual;
这样,在和没有与任何一张表中产生关系的时候,我么就可以使用dual
并且还有一个好处就是,只是打印出一次hello,world。
13.
这里简单的介绍一下dual,我么称之为 “伪表” 看其名,知其意,就是一张假表
所以,在没和其他表产生关系,我么就可以使用“伪表”
14.
select 3+2 from dual
这句话意思是 3+2 悲催吧,但是我么指向的是一张“伪表”
15.
select 'hello' || 'world' one from dual;
想要看明白就要知道||是什么意思,||在Oracle数据库中的作用是
字符串连接符号,即打印 helloworld,其中one是它么的名字,指向
一张伪表。
16.
select ename || '薪水是'||sal one
from emp;
这句话意思是查看EMP表中的名字薪水是¥
ONE
——————
base薪水是1000000
这就是打印的结果了
17.
select *
from emp
where deptno=10;
这句话的意思是查看EMP表中编号为10的全部输出
18.
select *
from emp
where ename='KING';
这句话是在EMP表中查找'KING'这个人,但是Oracle区分大小写
如果cname是大写,你输入小写那就会找不到的
19.
select *
from emp
where hiredate='17-11月-81';
这句话是查找EMP表中的出生为17-11-81的人,其实这个日期我么是可以修改的
但是系统默认是这个
20.
select sysdate from dual;
这句话是查看本地系统的时间配置
默认是24-7月-13
21.
alter session set NLS_DATE_FORMAT='yyyy-mm-dd';
首先我么需要执行这句话,此语句修改当前时间的会话。
select * from emp where hiredate='1981-11-17';
当会话修改后我么就可以使用上面的日期就不会报错了
22.
select *
from emp
where sal beween 2000 and 3000;
这句话意思是EMP表中查询薪水在2000~3000
并输出
23.
select *
from emp
where deptno in(10,20);
这句话意思是查找EMP表中的编号为10或者20的员工
如果没有就显示为选定行。
select *
from emp
where deptno in(5,10);
这条语句会不会报错,是不会的,只是从查找有没有编号有没有
5这个编号的员工,或者10这个编号的员工。
24.
select *
from emp
where deptno not in(10,20);
这个语句意思是,查找EMP表中不是编号 10,20的员工
即编号30,40,…N0的员工都会被显示。
25.
select *
from emp
where ename like 'S%';
这句话意思是在EMP表中如果存在开头是S的姓名
like:意思是模糊查询
%:意思是0个或多个字符(任意字符)
26.
select *
from emp
where ename like'____'
这句话的意思就是,在EMP表中,就查找为4个字符的员工名字
_:意思是:代表一个字符
27.
select *
from emp
where ename like '%_%';
这句话是非常有缺陷的,哪个员工的名字都会被打印出来的
我么的_是一个字符,这个字符并没有被转意,所以每个员工
姓名都会被答应,怎么解决呢?
select *
from emp
wherer ename like '%\_%' eacape '\'
/
eacape是将字符转义,我么将转义的字符插在_前面
即\_如果名字带_下划线的员工才会被输出
28.
select *
from emp
order by sal;
这句话的意思是按照sal进行排序
order by:排序
order by sal; 后面更的是子句结尾,sal即为子句
29.
select *
from emp
order by sal desc
这句话是薪水进行降序,进行的排序
desc:降序
select *
from emp
order by sal asc
这句话意思是薪水进行升序,进行排序
select *
from emp
order by sal;
默认的情况下使用升序进行排序
30.
select ename,sal,sal*12
from emp
order by sal*12 desc;
这句话意思是,查找EMP表中 姓名,月薪,年薪
并且是以年薪进行降序的
31.
select *
from emp
order by deptno,sal;
这句话的意思是,如果编号一样,那么久以薪水进行排序。
32.
select *
from emp
order by deptno desc,sal,desc
/
这句话它是更具那个进行排序的?
里desc最近的一个子句进行排序的
也就是说,该排序是按照编号进行排序
33.
笛卡尔积,只要记住列*列,行+行
EMP
empno ename sal deptno
1001 Tom 5000 1
1002 Jos 5000 2
1003 Base 5000 1
1004 Helen 5000 1
BuMen
depton dname
1 行政部
2 开发部
这两张表存在关系,就形成笛卡尔积
empno ename sal deptno depton dname
1001 Tom 5000 1 1 行政部
1002 Jos 5000 2 1 行政部
1003 Base 5000 1 1 行政部
1004 Helen 5000 1 1 行政部
1001 Tom 5000 1 2 开发部
1002 Jos 5000 2 2 开发部
1003 Base 5000 1 2 开发部
1004 Helen 5000 1 2 开发部
这样就形成了很多重复,并且有些还是错误的值
这就是笛卡尔积。怎么去除笛卡尔积呢?
用EMP的deptno = BuMen的depton
如果这两个编号相等就是成立的
否则就不成立
34.
select lower('HELLO WORLD')转小写,upper('hello world')转大写,
initcap('hello world')首字母大写
from dual;
这条语句意思是将字符串 大写,小写以及首字母大写
lower:将字符串进行小写
upper:将字符串进行大写
initcap:将字符串首字母大写
35.
select substr('Hello World',3) from dual;
这条语句就是截取字符串
从第3个字符串截取到最后
36.
select substr('hello world',2,4)from dual;
这句话意思是从第二个字符截取到第4个字符串
37.
select lpad('abc',10,'*')左填充,rpad('abcd',10,'*')右边
from dual;
这句话的结果就是*******abc abcd******缺了几个位就补*
——————————————————————————————-
由于时间不充足的关系只能写上这个含义
38.
ROUND:四舍五入
TRUNC:截断
MOD:求余
39:
lower('Hello WOrld') 转小写
upper('Hello WOrld') 转大写,
initcap('hello world') 首字母大写
trim:默认去掉字符串两边的空格,如果给定参数就去除给定参数值
40.
ADD_MONTHS:向指定日期中加上若干月数
LAST_DAY:本月的最后一天
NEXT_DAY:指定日期的下一个日期
MONTHS_BETWEEN:两个日期相差的月数
41.
group by
对其分组
===============================================================================================
2013-7-25
1.
select sal from emp where ename='SOCTT';
这句话的意思是说,我么在EMP表中查找名字叫
SOCTT这个人的薪水
2.
select * from emp where sal > 3000
这句话意思是说,在EMP表中,如果有比这个
薪水高的人就打印出来
3.
select *
from emp
sal > (select sal from emp where ename='SCOTT');
这句话的意思就是,先执行子查询语句,查找到name为SCOTT
获取到这个员工的薪水,然后在遍历EMP表中所有员工的薪水
薪水值大于SCOTT这个人的员工
子查询的作用范围以及注意事项:
1.可以在主查询的where select from having 放置子查询
2.不可以在主查询的group by后面放置子查询
3.单独强调from后面的子查询
4.主查询和子查询可以不是同一张表,只要子查询返回的结果主查询可以使用即可
5.一般,先执行子查询 再执行主查询;但相关子查询除外
6.一般不在子查询中使用order by;但在Top-N分析问题中,必须使用order by
7.单行子查询只能使用单行操作符 多行子查询只能使用多行操作符
8.子查询中的null
4.
select ename,sal,(select job from emp where empno=7839)一列
from emp;
这句话的意思就是,先看子查询的内容就是,查找EMP表中编号为7839这个职位
然后外面有select就是查找 ename,sal,job了
这样我么拆分出来看是非常容易理解的。
5.
select *
from(select ename,sal from emp);
这句话的意思是,子查询语句的结果是查询EMP表中的 ename,sal
外层的*代表所有的员工ename,sal
6.
select *
from (select ename ,sal,sal*12 annlsal from emp);
这句话的意思是说,查找EMP表中的ename,sal,年薪
首先查看下子查询,意思是在EMP表中查找ename,sal,sal*12,其中annlsal只是取个名字而已
外层的*是代表输出所有的员工 ename,sal,sal*12
7.
select *
from emp
where deptno = (select deptno
from dept
where dname='SALES');
首先我么分析子查询的意思,查询DEPT这张表部门名字为SALES编号
如果找到了,就把编号赋值给了外层的EMP表的deptno,如此一来,打印的都是
同一个编号部门咯,这里我么就运用到了两张表了
8.
select e.*
from emp e,dept d
where e.deptno=d.deptno and d.dname='SALES';
.代表所有列,这里的判断条件是如果 员工的编号 = 部门编号 成立
和部门=‘SALES’
如果我么找到了,那么就输出是此部门的员工
9.
select *
from emp
where deptno in(select deptno from dept where dname='SALES' or dname='ACCOUNTING');
这句话的意思是:
我么查找dept表中的编号,但是条件是,部门需要是‘SALES’,或者是ACCOUNTING
的部门下的才会被输出
其中这个in:等于列表中的任何一个
10.
select *
from emp
where sal > any (select sal from emp where deptno=30);
先来解释一下any:和子查询集合中的值任意进行比较
这句话的意思是说,查询工资比30号部门任意一个员工高的员工信息
所以我么这里应该找到一个最小值进行比较,这样就会高出来了
最后在重员工表中遍历出所有员工的sal进行比较,如果比any的值大
则输出
11.
select *
from emp
where sal > (select min(sal) from emp where deptno=30)
/
这句话的意思是,查找EMP表中编号为30的最少sal,找到了
外面在进行遍历,如果低于编号30员工的薪水则不输出
12.
select *
from emp
where sal > (select max(sal) from emp where deptno=30)
/
这句话的意思是:查找EMP表中编号为30的最高sal,如果低于
编号30的员工薪水则不输出.
13.
slect *
from emp
where empno not in(select mgr from emp);
这句话的意思就是说,查询不是老板的员工,如果是为选定行就是没找到
14.
select *
from emp
where empno in(select mgr from emp);
这句话的意思就是说,查询是老板的员工。
在第13—14 这两条sql语句输出的结果大家可能看的有些奇怪,其实,数据都是加载到内存中
内存中的数据都是 “树”形结构,一层一层的关系,所以只要它的父节点是子节点就不用被输出
可参见图:“关系图”画出的关系观看
下面是 几个课堂练习“引发”出的血案
15.
select rownum,empno,ename,sal
from emp;
这句话的意思是说,遍历出EMP表中rownum,empno,ename,sal
上面的语句只是简单的输出全部的,而我么只需要前3名的sal
增强版本:
select rownum,empno,sal,ename
from emp
where rownum<=3
order by sal desc;
这里就有明显的改变了哈,但是还是没有觉得,因为rownum是乱的。。。。
怎么办啊?卧槽,各种压力,看我怎么破解这个命案,真相只有一个
终极版解决:
select rownum,ename,empno,sal
from (select * from emp order by sal)
where rownum<=3;
这句话,首先执行子查询,按照sal排序,接着遍历输出,但是,此时
我么已经限定了rownum它只能在3行内,所以,最后是有顺序,并且还是在
3行内的.
关于rownum
rownum永远按照默认的顺序生成
rownum只能使用< <=, 不能使用> >=
哈哈哈哈哈~~,这个命案的手法被我名侦探“李小贱”解决了把。
16.
在来看看我么如果使用>=的rownum把,见证奇迹的时刻到了
select rownum,eanme,empno,sal
from emp
where rownum>=5 and rownum<=8;
这句话将会导致什么结果呢?本世纪最牛的“魔术师”为你揭晓
答案是:为选定行,哈哈,找不到
没办法都说了不行,可是你还要测试,“犯贱”吗?哈哈哈~
但是,如果按照常理来说,我么有1~14个数据,但是怎么就是没显示出来呢?
答案 在上面我已经说过了
分页:
select *
from (select rownum r,el.*
from (select * from emp order by sal)el
where rownum<=8
)
where r>=5;
沃勒了个去,这个手法有些棘手,看我是怎么来推理的把
首先我么先来到现场看到 地上的前由高到底进行排序的
并且还了el的名字,继续观察发现,摆放的rownum并为超过8行
这就证明凶手的口袋装不下了,e.*是遍历rownum的所有列
哈哈,有14列,但是只剩下8列,看来凶手不是贪心之人
最后外层进行判断r即rownum,是>=5开始的。
由此,内层行号<=8,外层重行5开始进行
也就是形成了 5,6,7,8进行了分页
17.
select empno,ename,sal,avgsal
from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) d
where e.deptno = d.deptno and e.sal>d.avgsal;
分析一下:
我么先看子查询语句,查找EMP表的编号和平均工资,并且是以编号进行排序的
外层的select语句,where进行过滤,如果e(EMP).deptno = d(EMP)from内的
并且e.sal > d.avgsal,EMP表的工资大于from内的平均工资
18.
select empno,enaem,sal,(select avg(sal) from emp where deptno=e.deptno)avgsal
from emp e
where sal > (select avg(sal) from emp where deptno=e.deptno);
这个看起来比较麻烦,如果去看呢?我么先看子查询的把
这个是求出每个部门的平均工资
出了子查询就是遍历EMP表
进行判断,如果 sal (个人sal)> (员工的部门的平均工资)
则输出
19.
select deptno,wm_concat(ename) names
from emp
group by deptno;
这几句的意思是做什么的呢?有我来说明下把
先来了解一下 wm_concat()这个函数是行转列函数
好把,我么先来第一句
查找编号,并把名字排成一列
在EMP表中查询
如果相同的编号则视为一个编号
最后答案
————————————————-
10 CLARK,KING,MILLER
20 SMITH,FORD,ADAMS,SCOTT,JONES
30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD
————————————————-
显然的,我么的名字是在一列上,并且相同的编号视为同一编号
20.
select * from emp where deptno=10
union
select * from emp where deptno=20
查找编号为10或者20的员工
union : 并集,去掉重复元素后的所有记录
21.
select deptno,job,sum(sal) from emp group by deptno,job
union
select deptno,to_char(null),sum(sal) from emp group by deptno
union
select to_number(null),to_char(null),sum(sal) from emp;
注意的问题
1. 参与运算的各个集合必须列数相同,且类型一致
2. 采用第一个集合的表头作为最后表头
3. 如果排序,必须在每个集合后 使用相同的order by
4. 括号
22.
select deptno,job,sum(sal) from emp group by deptno,job
union
select deptno,to_char(null),sum(sal) from emp group by deptno
union
select to_number(null),to_char(null),sum(sal) from emp
这几句的意思是,查找EMP表的编号,职位,和薪水
使用union进行并集,去掉重复的在显示
23.
select count(*) Total
sum(decode(to_char(hiredate,'YY'),'80',1,0))"1980",
sum(decode(to_char(hiredate,'YY'),'81',1,0))"1981",
sum(decode(to_char(hiredate,'YY'),'82',1,0))"1982",
sum(decode(to_char(hiredate,'YY'),'87',1,0))"1987"
from emp
/
这个意思是:统计所有员工是什么日期入职的
/*
SQL的类型:
1. DML语句(Data Manipulation Language 数据操作语言): insert update delete select
2. DDL语句(Data Definition Language 数据定义语言):create/drop/alter/truncate table
create/drop view,sequence,index,synonym
3. DCL语句(Data Control Language 数据控制语句): commit rollback
我么先来了解数据操作语言
insert into emp(empno,ename,sal,deptno) values(1001,'Tom',3000,10);
创建一行
隐式/显式 插入空值
地址符 &
insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno);
输入 empno 的值: 1002
输入 ename 的值: 'Mary'
输入 sal 的值: 5000
输入 deptno 的值: 20
原值 1: insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno)
新值 1: insert into emp(empno,ename,sal,deptno) values(1002,'Mary',5000,20)
-批处理
create table emp10 as select * from emp where 1=2;
其中这里只是把emp表的结构赋值给了emp10这个表,里面并没数据
insert into emp10
select * from emp where deptno=10
这句话的意思是说,把emp表中为编号10的员工值赋值给emp10表中为10编号的员工
delete和truncate的区别
1. delete逐条删除 truncate先摧毁 再重建
2.*** delete是DML语句(可以回滚) truncate 是DDL语句(不可以回滚)
3. delete不会释放空间 truncate会
4. delete会产生碎片 truncate不会
5. delete可以闪回 truncate不可以
oracle中的事务
1. 起始标志: DML语句
2. 结束标志: 提交 显式–> commit
隐式–> 正常退出exit ,DDL语句
回滚 显式–> rollback
隐式–> 非正常退出,停电
create table testsavepoint
(tid number,tname varchar(20));
这里就创建了一张表了,并且设置了一个tid为number类型和tname为varchar类型
insert into testsavepoint values(1,'Tom');
创建数据
savepoint a;
创建保存点
insert into testsavepoint values(2,'Mike');
insert into testsavepoint values(3,'Mary');
rollback to savepoint a
回退到保存点
select * from testsavepoint;
TID TNAME
——————————
1 Tom
这样就是回退到保存点
DDL:
alter table test1 add photo blob;
修改表结构,
alter table test1 修改的是哪张表
add ptoto blob 添加什么数据是什么数据类型
alter table test1 rename column tname to username
把tname换成username
drop table 表名
删除一张表,其实并没有删除,只是放在了回收站而已
show recyclebin
查看回收站
当把一张表删除的时候在查看就是一堆看不懂的乱码了,我么还可以使用
select * from "被删除的文件表码"
一定要加""否则出错
purger recyclebin;
清空回收站
———————————————————————–
其他数据库对象
create view empinfoview
as
select e.empno,e.ename,e.sal,e.sal*12 annlsal,d.dname
from emp e, dept d
where e.deptno=d.deptno
上面是创建一个视图,可是我么没有权限?
如何获取到权限呢?让管理员给你权限把
1–>sqlplus / as sysdba
2–>进入到管理员输入 grant create view to scott;
3–>授权成功
select * from empinfoview
查看内容,其实操作视图和操作表是一样的
create or replace view empinfoview
as
select e.empno,e.ename,e.sal,e.sal*12 annlsal,d.dname
from emp e,dept d
where e.deptno=d.deptno
with read only;
其中 with read only 只做查询操作
序列:
create sequence myseq;
序列被创建
create table tableA
(
tid number,
tname varchar2(20)
);
创建表
select myseq.nextval from dual;
nextval : 返回下一个有效值
这句话是说,查看下一个值,和任何表都没关系,从而使用一张伪表
insert into tableA values(myseq.nextval,'base');
/
/
执行两次后,使用commit进行提交
select * from tableA;
输出
TID TNAME
———————
2 base
3 base
4 base
insert into tableA values(myseq.nextval,'base');
/
/
rollback;
进行回退
insert into tableA values(myseq.nextval,'xss');
插入一条数据
select * from tableA
结果
TID TNAME
—————————————–
2 base
3 base
4 base
7 aa
他不会因为回退而改变数。
select count(*) from hr.EMPLOYEES
查看HR账户的EMPLOYEES表,但是这样会错误,没有视图或者表
因为自己更本就没有权限,所以需要进行授权
来到HR—>grant select on EMPLOYEES to scott
这样就授权给了scott
1.如何查看Oracle中的表呢
select * from tab;
2.
使用“/”是执行上一条语句,使用;号也是可以执行的
3.
select empno,ename,sal,job,mgr,hiredate,comm,deptno
from emp;
该条语句是查看这个表的empno,ename,sal,job,mgr,hiredate,comm,deptno
4.
也可以查看几个属性
empno,ename,sal,job
from emp;
这个语句就是查看EMP这张表的ename,sal,job属性
5.
select empno,ename,sal,sal*12
from emp;
上面的语句是查看EMP表中的员工 编号,姓名,月薪,年薪。
6.
select empno,ename,sal,sal*12,comm,sal*12+comm
from emp;
这条语句是说,去EMP这张表中查看 编号,姓名,月薪,年薪,奖金,年收入
可是这条语句有缺陷,什么缺陷呢,就是有些员工没有奖金,但是其他的年收入
都没有出现了,这样导致数据出错,为了避免数据出错我么需要判断是否是空值
7.
select empno,ename,sal,sal*12,comm,sal*12+nvl(comm,0)
from emp;
这条语句是说,去EMP这张表中查看 编号,姓名,月薪,年薪,奖金,年收入
如果奖金为NULL,那么我么赋值为0,这样即使没有奖金,我么也会出现年收入
从而解决了数据丢失的缺陷
8.
select *
from emp
where comm=null
这句话意思是 查看 emp表中 comm为null的语句,但是,我么这条语句是有缺陷的
应为 =null是找不到的,而是需要 is null 才能呢
9.
select *
form emp
where comm is null;
这句话意思是 查看 emp表中 comm为null的语句,就是打印出为null的数据
10.
select empno as "员工号",ename "姓名",sal 月薪
from emp
/
这条语句是给属性取个别名,as可以省掉不写的
所以打印出来的是 员工号 姓名 月薪
11.
select deptno from emp;
这句话是查看这个表中的depton,我么查看得知有很多重复的
所以出现了DISTINCT去除重复值
select DISTINCT deptno from emp;
这句话就是去除掉EMP表单deptno重复的值,留下不重复的
12.
select concat('hello','world')from emp;
这句话是说连接此字符串,其中concat(,)就是连接
但是其中有个个缺陷就是,我么连接字符串和EMP表没半毛钱关系
所以我么改进。
select concat('hello','world')from dual;
这样,在和没有与任何一张表中产生关系的时候,我么就可以使用dual
并且还有一个好处就是,只是打印出一次hello,world。
13.
这里简单的介绍一下dual,我么称之为 “伪表” 看其名,知其意,就是一张假表
所以,在没和其他表产生关系,我么就可以使用“伪表”
14.
select 3+2 from dual
这句话意思是 3+2 悲催吧,但是我么指向的是一张“伪表”
15.
select 'hello' || 'world' one from dual;
想要看明白就要知道||是什么意思,||在Oracle数据库中的作用是
字符串连接符号,即打印 helloworld,其中one是它么的名字,指向
一张伪表。
16.
select ename || '薪水是'||sal one
from emp;
这句话意思是查看EMP表中的名字薪水是¥
ONE
——————
base薪水是1000000
这就是打印的结果了
17.
select *
from emp
where deptno=10;
这句话的意思是查看EMP表中编号为10的全部输出
18.
select *
from emp
where ename='KING';
这句话是在EMP表中查找'KING'这个人,但是Oracle区分大小写
如果cname是大写,你输入小写那就会找不到的
19.
select *
from emp
where hiredate='17-11月-81';
这句话是查找EMP表中的出生为17-11-81的人,其实这个日期我么是可以修改的
但是系统默认是这个
20.
select sysdate from dual;
这句话是查看本地系统的时间配置
默认是24-7月-13
21.
alter session set NLS_DATE_FORMAT='yyyy-mm-dd';
首先我么需要执行这句话,此语句修改当前时间的会话。
select * from emp where hiredate='1981-11-17';
当会话修改后我么就可以使用上面的日期就不会报错了
22.
select *
from emp
where sal beween 2000 and 3000;
这句话意思是EMP表中查询薪水在2000~3000
并输出
23.
select *
from emp
where deptno in(10,20);
这句话意思是查找EMP表中的编号为10或者20的员工
如果没有就显示为选定行。
select *
from emp
where deptno in(5,10);
这条语句会不会报错,是不会的,只是从查找有没有编号有没有
5这个编号的员工,或者10这个编号的员工。
24.
select *
from emp
where deptno not in(10,20);
这个语句意思是,查找EMP表中不是编号 10,20的员工
即编号30,40,…N0的员工都会被显示。
25.
select *
from emp
where ename like 'S%';
这句话意思是在EMP表中如果存在开头是S的姓名
like:意思是模糊查询
%:意思是0个或多个字符(任意字符)
26.
select *
from emp
where ename like'____'
这句话的意思就是,在EMP表中,就查找为4个字符的员工名字
_:意思是:代表一个字符
27.
select *
from emp
where ename like '%_%';
这句话是非常有缺陷的,哪个员工的名字都会被打印出来的
我么的_是一个字符,这个字符并没有被转意,所以每个员工
姓名都会被答应,怎么解决呢?
select *
from emp
wherer ename like '%\_%' eacape '\'
/
eacape是将字符转义,我么将转义的字符插在_前面
即\_如果名字带_下划线的员工才会被输出
28.
select *
from emp
order by sal;
这句话的意思是按照sal进行排序
order by:排序
order by sal; 后面更的是子句结尾,sal即为子句
29.
select *
from emp
order by sal desc
这句话是薪水进行降序,进行的排序
desc:降序
select *
from emp
order by sal asc
这句话意思是薪水进行升序,进行排序
select *
from emp
order by sal;
默认的情况下使用升序进行排序
30.
select ename,sal,sal*12
from emp
order by sal*12 desc;
这句话意思是,查找EMP表中 姓名,月薪,年薪
并且是以年薪进行降序的
31.
select *
from emp
order by deptno,sal;
这句话的意思是,如果编号一样,那么久以薪水进行排序。
32.
select *
from emp
order by deptno desc,sal,desc
/
这句话它是更具那个进行排序的?
里desc最近的一个子句进行排序的
也就是说,该排序是按照编号进行排序
33.
笛卡尔积,只要记住列*列,行+行
EMP
empno ename sal deptno
1001 Tom 5000 1
1002 Jos 5000 2
1003 Base 5000 1
1004 Helen 5000 1
BuMen
depton dname
1 行政部
2 开发部
这两张表存在关系,就形成笛卡尔积
empno ename sal deptno depton dname
1001 Tom 5000 1 1 行政部
1002 Jos 5000 2 1 行政部
1003 Base 5000 1 1 行政部
1004 Helen 5000 1 1 行政部
1001 Tom 5000 1 2 开发部
1002 Jos 5000 2 2 开发部
1003 Base 5000 1 2 开发部
1004 Helen 5000 1 2 开发部
这样就形成了很多重复,并且有些还是错误的值
这就是笛卡尔积。怎么去除笛卡尔积呢?
用EMP的deptno = BuMen的depton
如果这两个编号相等就是成立的
否则就不成立
34.
select lower('HELLO WORLD')转小写,upper('hello world')转大写,
initcap('hello world')首字母大写
from dual;
这条语句意思是将字符串 大写,小写以及首字母大写
lower:将字符串进行小写
upper:将字符串进行大写
initcap:将字符串首字母大写
35.
select substr('Hello World',3) from dual;
这条语句就是截取字符串
从第3个字符串截取到最后
36.
select substr('hello world',2,4)from dual;
这句话意思是从第二个字符截取到第4个字符串
37.
select lpad('abc',10,'*')左填充,rpad('abcd',10,'*')右边
from dual;
这句话的结果就是*******abc abcd******缺了几个位就补*
——————————————————————————————-
由于时间不充足的关系只能写上这个含义
38.
ROUND:四舍五入
TRUNC:截断
MOD:求余
39:
lower('Hello WOrld') 转小写
upper('Hello WOrld') 转大写,
initcap('hello world') 首字母大写
trim:默认去掉字符串两边的空格,如果给定参数就去除给定参数值
40.
ADD_MONTHS:向指定日期中加上若干月数
LAST_DAY:本月的最后一天
NEXT_DAY:指定日期的下一个日期
MONTHS_BETWEEN:两个日期相差的月数
41.
group by
对其分组
===============================================================================================
2013-7-25
1.
select sal from emp where ename='SOCTT';
这句话的意思是说,我么在EMP表中查找名字叫
SOCTT这个人的薪水
2.
select * from emp where sal > 3000
这句话意思是说,在EMP表中,如果有比这个
薪水高的人就打印出来
3.
select *
from emp
sal > (select sal from emp where ename='SCOTT');
这句话的意思就是,先执行子查询语句,查找到name为SCOTT
获取到这个员工的薪水,然后在遍历EMP表中所有员工的薪水
薪水值大于SCOTT这个人的员工
子查询的作用范围以及注意事项:
1.可以在主查询的where select from having 放置子查询
2.不可以在主查询的group by后面放置子查询
3.单独强调from后面的子查询
4.主查询和子查询可以不是同一张表,只要子查询返回的结果主查询可以使用即可
5.一般,先执行子查询 再执行主查询;但相关子查询除外
6.一般不在子查询中使用order by;但在Top-N分析问题中,必须使用order by
7.单行子查询只能使用单行操作符 多行子查询只能使用多行操作符
8.子查询中的null
4.
select ename,sal,(select job from emp where empno=7839)一列
from emp;
这句话的意思就是,先看子查询的内容就是,查找EMP表中编号为7839这个职位
然后外面有select就是查找 ename,sal,job了
这样我么拆分出来看是非常容易理解的。
5.
select *
from(select ename,sal from emp);
这句话的意思是,子查询语句的结果是查询EMP表中的 ename,sal
外层的*代表所有的员工ename,sal
6.
select *
from (select ename ,sal,sal*12 annlsal from emp);
这句话的意思是说,查找EMP表中的ename,sal,年薪
首先查看下子查询,意思是在EMP表中查找ename,sal,sal*12,其中annlsal只是取个名字而已
外层的*是代表输出所有的员工 ename,sal,sal*12
7.
select *
from emp
where deptno = (select deptno
from dept
where dname='SALES');
首先我么分析子查询的意思,查询DEPT这张表部门名字为SALES编号
如果找到了,就把编号赋值给了外层的EMP表的deptno,如此一来,打印的都是
同一个编号部门咯,这里我么就运用到了两张表了
8.
select e.*
from emp e,dept d
where e.deptno=d.deptno and d.dname='SALES';
.代表所有列,这里的判断条件是如果 员工的编号 = 部门编号 成立
和部门=‘SALES’
如果我么找到了,那么就输出是此部门的员工
9.
select *
from emp
where deptno in(select deptno from dept where dname='SALES' or dname='ACCOUNTING');
这句话的意思是:
我么查找dept表中的编号,但是条件是,部门需要是‘SALES’,或者是ACCOUNTING
的部门下的才会被输出
其中这个in:等于列表中的任何一个
10.
select *
from emp
where sal > any (select sal from emp where deptno=30);
先来解释一下any:和子查询集合中的值任意进行比较
这句话的意思是说,查询工资比30号部门任意一个员工高的员工信息
所以我么这里应该找到一个最小值进行比较,这样就会高出来了
最后在重员工表中遍历出所有员工的sal进行比较,如果比any的值大
则输出
11.
select *
from emp
where sal > (select min(sal) from emp where deptno=30)
/
这句话的意思是,查找EMP表中编号为30的最少sal,找到了
外面在进行遍历,如果低于编号30员工的薪水则不输出
12.
select *
from emp
where sal > (select max(sal) from emp where deptno=30)
/
这句话的意思是:查找EMP表中编号为30的最高sal,如果低于
编号30的员工薪水则不输出.
13.
slect *
from emp
where empno not in(select mgr from emp);
这句话的意思就是说,查询不是老板的员工,如果是为选定行就是没找到
14.
select *
from emp
where empno in(select mgr from emp);
这句话的意思就是说,查询是老板的员工。
在第13—14 这两条sql语句输出的结果大家可能看的有些奇怪,其实,数据都是加载到内存中
内存中的数据都是 “树”形结构,一层一层的关系,所以只要它的父节点是子节点就不用被输出
可参见图:“关系图”画出的关系观看
下面是 几个课堂练习“引发”出的血案
15.
select rownum,empno,ename,sal
from emp;
这句话的意思是说,遍历出EMP表中rownum,empno,ename,sal
上面的语句只是简单的输出全部的,而我么只需要前3名的sal
增强版本:
select rownum,empno,sal,ename
from emp
where rownum<=3
order by sal desc;
这里就有明显的改变了哈,但是还是没有觉得,因为rownum是乱的。。。。
怎么办啊?卧槽,各种压力,看我怎么破解这个命案,真相只有一个
终极版解决:
select rownum,ename,empno,sal
from (select * from emp order by sal)
where rownum<=3;
这句话,首先执行子查询,按照sal排序,接着遍历输出,但是,此时
我么已经限定了rownum它只能在3行内,所以,最后是有顺序,并且还是在
3行内的.
关于rownum
rownum永远按照默认的顺序生成
rownum只能使用< <=, 不能使用> >=
哈哈哈哈哈~~,这个命案的手法被我名侦探“李小贱”解决了把。
16.
在来看看我么如果使用>=的rownum把,见证奇迹的时刻到了
select rownum,eanme,empno,sal
from emp
where rownum>=5 and rownum<=8;
这句话将会导致什么结果呢?本世纪最牛的“魔术师”为你揭晓
答案是:为选定行,哈哈,找不到
没办法都说了不行,可是你还要测试,“犯贱”吗?哈哈哈~
但是,如果按照常理来说,我么有1~14个数据,但是怎么就是没显示出来呢?
答案 在上面我已经说过了
分页:
select *
from (select rownum r,el.*
from (select * from emp order by sal)el
where rownum<=8
)
where r>=5;
沃勒了个去,这个手法有些棘手,看我是怎么来推理的把
首先我么先来到现场看到 地上的前由高到底进行排序的
并且还了el的名字,继续观察发现,摆放的rownum并为超过8行
这就证明凶手的口袋装不下了,e.*是遍历rownum的所有列
哈哈,有14列,但是只剩下8列,看来凶手不是贪心之人
最后外层进行判断r即rownum,是>=5开始的。
由此,内层行号<=8,外层重行5开始进行
也就是形成了 5,6,7,8进行了分页
17.
select empno,ename,sal,avgsal
from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) d
where e.deptno = d.deptno and e.sal>d.avgsal;
分析一下:
我么先看子查询语句,查找EMP表的编号和平均工资,并且是以编号进行排序的
外层的select语句,where进行过滤,如果e(EMP).deptno = d(EMP)from内的
并且e.sal > d.avgsal,EMP表的工资大于from内的平均工资
18.
select empno,enaem,sal,(select avg(sal) from emp where deptno=e.deptno)avgsal
from emp e
where sal > (select avg(sal) from emp where deptno=e.deptno);
这个看起来比较麻烦,如果去看呢?我么先看子查询的把
这个是求出每个部门的平均工资
出了子查询就是遍历EMP表
进行判断,如果 sal (个人sal)> (员工的部门的平均工资)
则输出
19.
select deptno,wm_concat(ename) names
from emp
group by deptno;
这几句的意思是做什么的呢?有我来说明下把
先来了解一下 wm_concat()这个函数是行转列函数
好把,我么先来第一句
查找编号,并把名字排成一列
在EMP表中查询
如果相同的编号则视为一个编号
最后答案
————————————————-
10 CLARK,KING,MILLER
20 SMITH,FORD,ADAMS,SCOTT,JONES
30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD
————————————————-
显然的,我么的名字是在一列上,并且相同的编号视为同一编号
20.
select * from emp where deptno=10
union
select * from emp where deptno=20
查找编号为10或者20的员工
union : 并集,去掉重复元素后的所有记录
21.
select deptno,job,sum(sal) from emp group by deptno,job
union
select deptno,to_char(null),sum(sal) from emp group by deptno
union
select to_number(null),to_char(null),sum(sal) from emp;
注意的问题
1. 参与运算的各个集合必须列数相同,且类型一致
2. 采用第一个集合的表头作为最后表头
3. 如果排序,必须在每个集合后 使用相同的order by
4. 括号
22.
select deptno,job,sum(sal) from emp group by deptno,job
union
select deptno,to_char(null),sum(sal) from emp group by deptno
union
select to_number(null),to_char(null),sum(sal) from emp
这几句的意思是,查找EMP表的编号,职位,和薪水
使用union进行并集,去掉重复的在显示
23.
select count(*) Total
sum(decode(to_char(hiredate,'YY'),'80',1,0))"1980",
sum(decode(to_char(hiredate,'YY'),'81',1,0))"1981",
sum(decode(to_char(hiredate,'YY'),'82',1,0))"1982",
sum(decode(to_char(hiredate,'YY'),'87',1,0))"1987"
from emp
/
这个意思是:统计所有员工是什么日期入职的
/*
SQL的类型:
1. DML语句(Data Manipulation Language 数据操作语言): insert update delete select
2. DDL语句(Data Definition Language 数据定义语言):create/drop/alter/truncate table
create/drop view,sequence,index,synonym
3. DCL语句(Data Control Language 数据控制语句): commit rollback
我么先来了解数据操作语言
insert into emp(empno,ename,sal,deptno) values(1001,'Tom',3000,10);
创建一行
隐式/显式 插入空值
地址符 &
insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno);
输入 empno 的值: 1002
输入 ename 的值: 'Mary'
输入 sal 的值: 5000
输入 deptno 的值: 20
原值 1: insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno)
新值 1: insert into emp(empno,ename,sal,deptno) values(1002,'Mary',5000,20)
-批处理
create table emp10 as select * from emp where 1=2;
其中这里只是把emp表的结构赋值给了emp10这个表,里面并没数据
insert into emp10
select * from emp where deptno=10
这句话的意思是说,把emp表中为编号10的员工值赋值给emp10表中为10编号的员工
delete和truncate的区别
1. delete逐条删除 truncate先摧毁 再重建
2.*** delete是DML语句(可以回滚) truncate 是DDL语句(不可以回滚)
3. delete不会释放空间 truncate会
4. delete会产生碎片 truncate不会
5. delete可以闪回 truncate不可以
oracle中的事务
1. 起始标志: DML语句
2. 结束标志: 提交 显式–> commit
隐式–> 正常退出exit ,DDL语句
回滚 显式–> rollback
隐式–> 非正常退出,停电
create table testsavepoint
(tid number,tname varchar(20));
这里就创建了一张表了,并且设置了一个tid为number类型和tname为varchar类型
insert into testsavepoint values(1,'Tom');
创建数据
savepoint a;
创建保存点
insert into testsavepoint values(2,'Mike');
insert into testsavepoint values(3,'Mary');
rollback to savepoint a
回退到保存点
select * from testsavepoint;
TID TNAME
——————————
1 Tom
这样就是回退到保存点
DDL:
alter table test1 add photo blob;
修改表结构,
alter table test1 修改的是哪张表
add ptoto blob 添加什么数据是什么数据类型
alter table test1 rename column tname to username
把tname换成username
drop table 表名
删除一张表,其实并没有删除,只是放在了回收站而已
show recyclebin
查看回收站
当把一张表删除的时候在查看就是一堆看不懂的乱码了,我么还可以使用
select * from "被删除的文件表码"
一定要加""否则出错
purger recyclebin;
清空回收站
———————————————————————–
其他数据库对象
create view empinfoview
as
select e.empno,e.ename,e.sal,e.sal*12 annlsal,d.dname
from emp e, dept d
where e.deptno=d.deptno
上面是创建一个视图,可是我么没有权限?
如何获取到权限呢?让管理员给你权限把
1–>sqlplus / as sysdba
2–>进入到管理员输入 grant create view to scott;
3–>授权成功
select * from empinfoview
查看内容,其实操作视图和操作表是一样的
create or replace view empinfoview
as
select e.empno,e.ename,e.sal,e.sal*12 annlsal,d.dname
from emp e,dept d
where e.deptno=d.deptno
with read only;
其中 with read only 只做查询操作
序列:
create sequence myseq;
序列被创建
create table tableA
(
tid number,
tname varchar2(20)
);
创建表
select myseq.nextval from dual;
nextval : 返回下一个有效值
这句话是说,查看下一个值,和任何表都没关系,从而使用一张伪表
insert into tableA values(myseq.nextval,'base');
/
/
执行两次后,使用commit进行提交
select * from tableA;
输出
TID TNAME
———————
2 base
3 base
4 base
insert into tableA values(myseq.nextval,'base');
/
/
rollback;
进行回退
insert into tableA values(myseq.nextval,'xss');
插入一条数据
select * from tableA
结果
TID TNAME
—————————————–
2 base
3 base
4 base
7 aa
他不会因为回退而改变数。
select count(*) from hr.EMPLOYEES
查看HR账户的EMPLOYEES表,但是这样会错误,没有视图或者表
因为自己更本就没有权限,所以需要进行授权
来到HR—>grant select on EMPLOYEES to scott
这样就授权给了scott
哪里写错了,或者有误区的地方希望大家指出