oracle数据库知识点

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_42177478/article/details/99447739

1.起别名:select empno as “编号”,ename “姓名”,job 月薪 from emp;//三种方式,如果起别名时,遇到特殊符号时必须加引号例如:空格;
2.清屏:host cls;表放长:set linesize 300;查找运行空间的参数:select * from v$nls_parameters;清空表:truncate table …;
3.基本概念
实体:Java中的类;
记录:Java的对象,也就是一行数据;
字段:Java中的属性,也就是一列;
表:同一个实体中,所有记录,字段组合起来;也就是全部的行加全部的列;
4.范围查询
between 小 and 大:
*例:select * from emp where sal between 600 and 10000;//数字和日期都可以查询;
5.模糊查询
like:配合通配符使用:_:一个字符;%:任意个字符;
*例:select * from emp where ename like '%C%';//名字里面含有C的人;
//字符,日期都可查询;
*例:查询姓名中第二个字母是M的员工信息:select * from emp where ename like '_M%';
*例:查询姓名长度>6的人:select * from emp where ename like '_______(7个下划线)%'
*例:查询谁的名字中包含下划线:select * from emp where ename like '%\\_%' escape '\\';(转义符)、
6.not in 不能出现 null;如果出现null结果为空;
7.排序:oder by 字段名|表达式|序号
*例:按公司排序:select * from emp order by sal asc/desc;
查询三列按第一列排序:select empno,ename,sal from emp oder by 1 asc;
//排序时null是最大值
,若要改变最后写:nulls last;
*例:先根据工资降序,再根据雇佣日期升序:select * from emp order by sal desc ,hiredate asc;
8.函数:单行函数:一次操作一行;多行函数:一次操作多行;
单行函数:字符函数 数值函数 日期函数 展缓函数 通用函数;
字符函数: lower upper initcap//转小写,大写,每个单词首字母大写;dual:单行;

select 'helLO woRD'一,lower('helLO woRD') 二,upper('helLO woRD') 三,initcap('helLO woRD') from dual;

9.substr(str,begin,len);//(一个字符串,从一开始数,数到几展示几位);
*例:select substr('hello word',3,3) from dual;
10.length字符数/lengthb字节数;
*例:select length('西安'),lengthb('西安') from dual;得2和6(一个字符是三个字节)
11.insert(a,b):在a中找b;
*例:select insert('helloword','ll')from dual; 得3;
12.lpad/rpad;左填充/右填充;
*例:select lpad('hello',10,*)左,rpad('hello',10,'d')右 from dual;得***hello,helloddddd;
13.trim:去掉任意字符(空格);
*例:select trim('c' from 'cccchello')from dual得:hello,;
14.replace:替换掉字符;
*例:select replace ('hello' ,'ll','*') from dual得:he
o;
数值函数:
15.round(数字,位数):四舍五入,保留n位小数;
*例:select ruond(67.183,2),round(67.183,1),round(67.183,0),round(67.183,-1),round(67.183,-2)
得:67.18,67.2,67,70,100;
16.trunc(数字,n位数):舍尾,保留n位小数;
*例:select trunc(67.183,2),trunc(67.183,1),trunc(67.183,0),trunc(67.183,-1),trunc(67.183,-2)
得:67.18,67.1,67,60,0;
17.mod():求余;
*例:select mod(13.3) from dual;得:1(13%3 = 1);
日期函数:
18.sysdate:当前时间
*例:select sysdate from dual
格式化日期:to_char(日期,格式);
*例:select to_char(sysdate,'yyyy-mm-dd') from dual;得:2019-08-17;
19.日期可以加减数字但是日期只能减日期(加的是天);
20.计算员工工龄: 入职日期 天 星期 月 年;
*例:select ename,hiredate,(sysdate-hiredate),(sysdate-hiredate)/7,
或精确计算select ename,months_between(sysdate,hiredate) from emp(日期大的放左边,小的放右边);
21.加日期:add_months(日期,月数):当月最大是多少天:last_day

selct last_day(sysdate) from dual;

下一星期n是哪一天:next_day;

select next_day(sysdate,'星期五') from dual;

22.对日期四舍五入:round(sysdate,‘month’);//对月四舍五入;
通用函数
23.nvl/nvl2
34.nullif(a,b):若a = b返回null;若a≠b返回a的值;
*例:select bullif('abc','abccc');得abc;
35.coalesce:从左往右找第一个不为null的值;
*例:select comm,sal,coalesce(comm,sal) from emp;
36.条件判断函数:decode(字段,条件1,返回值1,条件2,返回2 ,。。。都不是返回最后表达式)
*例:给PRESIDENT涨工资1000,MANAGER涨工资500,其他人涨300;

select ename,job,sal 涨前,decode(job,'PRESIDENT',sal+1000,'MANAGER',sal+500,sal+300) 涨后 from emp;

case…end表达式
*例:给PRESIDENT涨工资1000,MANAGER涨工资500,其他人涨300;

select ename,job,sal 涨前,case job when 'PRESIDENT' then sal +1000 when 'MANAGER' then sal + 500 else sal +300 end 涨后 from emp;

37.转换函数

显式转换:to char:数字转字符;to number:字符转数字;to date:字符转日期;to char:日期转字符;
例:select to_date('2019-05-24','yyyy-mm-dd') from dual;
多行函数
38.count(
) 自动排除null,max,min,avg,sum;
*例:select count(*) 员工总数,sum(sal) 总工资,max(sal) 最大工资,min(sal) 最小工资, avg(sal) 平均工资 from emp;
39.列的计算:select empno,ename,sal,sal*12 from emp;
40.null的计算;任何数字和null计算结果为null;把null变为0计算;
转变方法:select ename ,nvl(comm,0) from emp;//如果comm是null则变为0;
select ename,nvl2(comm,comm,0) from emp;//如果为空则为0,如果不为空则为本身的comm值;
41.对结果集去重:select distinct deptno from emp;
42.连接符拼接:concat和||;

select concat('hello','word') from emp;
select 'hello'||'word' from dual;//dual表示单行单列表;

43.修改默认日期格式;默认:DD-MON-RR;
修改:alter session set NLS_DATE_FORMAT = ‘yyyy-mm-dd’;
44.SQL语句的类型;
DQL:数据查询语言Select;
DML:数据操作语言:insert delete update;
DDL:数据库定义语言:create/drop/truncate/alter table;
DCL:数据控制语言:grant/revoke
45.DML:insert:insert into 表名(字段名,字段名2,。。。) values (字段值1,字段值2,。。。)字段名和字段值要一一对应,数据类型,个数,顺序;
插入完整的数据可以省略字段名;
46.批量插入数据:
1.创建新表(批量插入之前不存在)

//将一个表的数据全部复制到另一个表:
create table mytable as select * from emp;
//将这个表的一部分复制到另一个全新表;
create table mytab2 as select ename,epno,job from emp;	

还可以用于快速创建表结构(将另一个表的结构复制到新表中不要数据):

create table mytable3 as select * from emp where 1 = 0;

2.在旧表中插入(在新表中批量插入旧表中的值);

insert into mytab 3(empno,ename,sal) select empno,ename,sal from emp;

3.begin…end;+/
4.海量数据:数据泵、SQL LOADER\外部表
47.删除delete;撤销:rollback;
1.delete from 表名;全表删除可以回退;
truncate table 表名;不能回退
增删改可以回退;
2.二者执行时间
打开执行时间:set time on
对于少量数据:delete效率高;一行一行删除
对于海量数据:truncate效率高;丢弃表,重新创建表;
3.闪回问题
delete支持闪回;
truncate不支持闪回;
4.delete不会释放空间,只是换了个地方存储数据;truncate彻底删除数据;
5.delete会产生碎片,truncate不会;
如果碎片太多需要整理碎片a.alter table 表名 move;b.导出导入
48.修改update
update 表名 set 字段名1 = 字段名1 , 字段名2 = 字段名2… where ename = ‘’…
49.创建表:

扫描二维码关注公众号,回复: 7591293 查看本文章
create table mytab4
(
id number,
name varchar,
age number
);
注意事项:1.权限和空间问题2.表名必须以字母开头,包含大小写字母,数字,下划线,¥,#;长度是1--30个字符,不能重名;

50.查看保留字:DBA账户:sqlplus/as sysdba登录后:select * from v$reserved words order by keyword asc;
51.设置每个字段的长度
字符:col KEYWORD for a10;
数字:col length for 9999;
52.a.追加新列

 alter table mytab3 add other varchar2(20);

b.修改列

修改列的长度
alter table mytab3 modify other varchar2(30);
修改列的类型
alter table mytab3 modify other number;

注意:blob/clob不能修改;
c.删除列

alter table mytab3 drop column other;

d.重命名列

alter table mytab3 rename column other to myother;

53.删除表
select * from tab ;查看表和回收站里面的表
drop table mytab3; -->放在了回收站里;
查看回收站:show recyclebin;
清空回收站:purge recycle;
还原回收站:闪回技术;
删除表并清空:drop table text01 purge;
54.序列多表连接查询:
a.交叉连接(笛卡尔积),所有情况都组合//不推荐使用
b.内连接:多张表通过相同字段进行匹配 只显示匹配成功的字段;
select * from emp e ,dept d where e.deptno = d.deptno;

 select * from emp e inner join dept d on e.deptno = d.deptno;

c.外连接:
左外连接:以左表为基准,去匹配右表数据,若匹配成功,则显示;若匹配不成功,显示部分(无数据部分用null填充)
(oracle独有的)select * from emp e,dept d where e.deptno = d.deptno(+);

select * from emp e left outer join dept d on e.deptno = d.deptno;

右外连接:以右表为基准,去匹配左表数据,若匹配成功,则显示;若匹配不成功,显示部分(无数据部分用null填充)
select * from emp e,dept d,where e.deptno(+) = d.deptno;
select * from emp e right outer join d on e.deptno = d.deptno;

全外连接:=左外连接+右外连接-去重;
自连接:将一张表通过别名,视为不同的表;
*例:查询 员工姓名,以及该员工领导的姓名;

    select e.ename,b.ename from emp e,emp b
    where e.mgr = b.empno;

//员工表的领导编号MGR = 领导表的员工编号 empno

层次链接(优化自连接):

select level,empno,ename,mgr from emp
connect by prior empno = mgr
start with mgr = 7698;
order by level;

子查询:
*例:查询比Scott工资高的员工信息;
1.求scott得工资;2.>scott工资的员工信息;

select sal from emp where ename = 'SCOTT';
select * from emp where sal > 3000;

合二为一:

select * from emp where sal >(select sal from emp where ename = 'SCOTT');

①子查询可以出现的位置:where,select,having,from;不能写在group by 后面;
*例:查询最低工资比10号部门的最低工资高的部门编号;//筛选组用having;
分组:

select deptno,min(sal) from emp
  group by deptno
  having min(sal) >(select min(sal) from emp where deptno = 10);

②主查询和子查询可以不是同一张表;
*例:查询销售部的员工信息;
1.查询销售部的部门编号
2.根据部门编号查询员工信息

select deptno from dept where dname = 'DNAME';
select * from emp where deptno = (select deptno from dept where dname = 'SALES');

③子查询可以使用 单行操作符,多行操作符(in);
查询销售部,财务部的员工信息;

select * from emp where deptno in (select deptno from dept where dname = 'SALES' or dname = 'ACCOUNTING');

*例:查询工资比30号部门中任意一个人的工资高的员工信息;“只要满足一个就可以,存在一个就可以用any”

select * from emp where sal>(select min(sal) from emp);
sekect * from emp where sal >any(select sal from emp);

查询工资比30号部门中全部人的工资高的员工信息;

select * from emp where sal>all(select sal from emp);
select * from emp where sal>(select max(sal) from emp);

④子查询中的null;子查询的结果中不要有null;
in (7698,null);null查不出来;//in相当于=;换成is null才可以查出来;
not in (7698,null);所有都查不出来;
null的特性:如果!=null则无法查询出任何信息;null只能用is null,is not null 来操作;
*例:查询不是领导的员工信息(子查询时排除null)
不是领导:判断empno是否存在于mgr中

select * from emp
where empno not in (select mgr from emp where mgr is not null);

⑤一般不在子查询中排序。除非top-n;
55.伪列:不属于任何一张表,但是会被所有表共享;

rownum:逻辑序列;不同sql语句执行时,rownum的值不一致,相同sql语句执行时rownum值不变;
rowid:物理序列(18位);
*例:查询工资最高的前三名员工信息;top-n全部这样写;

select rownum,ename,sal from (select * from emp order by sal desc) where rownum <=3;

//要建立一个新表排好序后查询;
*例:删除重复的数据;

select rownum,s.*from mystudent s;
delete from mystudent where rownum = 1;
select rownum,s*from mystudent s;

物理伪列:18位,
前六位:数据对象编号;
依次往后数三位:数据文件编号;
依次往后数六位:数据块编号;
依次往后数三位:行号;
思路:根据编号分组(将重复的数据放到一组),然后在每组中保留一个

delete from mystudent where rowid not in (select min(rowid) from mystudent group bu stuno);

56.习题:
//查询所有员工的年工资,所在部门的名称,按年薪从低到高排序;

select  sal*12+nvl(comm,0) 年工资,dname 部门名称 from emp e,dept d e where d.deptno = d.deptno order by 年工资 asc;

//查询所有员工的编号姓名,及其上级领导的编号,姓名,显示结果按领导的年工资降序;

select e.empno,e.ename,b.empno,b.ename from emp e,emp b where e.mgr = b.empno(+) order by b.sal*12+nvl(b.comm,0) desc;

//查询非销售人员:工作名称,以及从事同一工作员工的工资之和。要求月工资之和大于5000,输出结果按月工资之和降序排列:

select job num(sal) from emp where job <> 'SALESMAN' group by job having sum(sal)>5000 order by sum(sal) desc; 

//查询所有领取奖金和不能领取奖金的员工人数,平均工资;

select count(* ),avg(sal)
from emp where comm is not null and comm>0
union
select count(* ),avg(sal)
from emp where comm is null or comm=0;

集合运算
△union:并集,返回各个查询的所有记录,不包括重复记录。
unionall:并集。返回各个查询的多有记录,包括重复记录。
intersect:交集。返回两个查询的所有记录。
mimus:补集。返回,包含在第一个查询中,但不包含在第二个查询中的记录。
细节:各个集合的列数,类型必须一致;
*例:查询总工资,各个部门的总工资,各个部门中的各个工作的总工资:
各个部门中各个工作:select deptno,job,sum(sal) from emp group by deptno,job;
各个部门的总工资:select sum(sal) from emp group by deptno;
总工资:select sum(sal) from emp;

增强group by:rollup();

select deptno,job,sum(sal) from emp group by rollup(deptno,job);
rollup(a,b)相当于:
group by a,b
group by a,
group by null;

//查询每种工作的最低工资,以及领取该工资的员工姓名;
概念:两张表连接条件:
1.一般推荐:外键=主键 -->emp.deptno = dept.deptno;
2.全值链接:

select t.minsal,t.job,e.ename from
emp e,
(select min(sal) minsal ,job from emp group by job) t
where t.minsal = e.sal and t.job = e.job;//先弄一个最低工资表然后和员工链接起来;

//查询出工资不超过2500的人数最多的部门名称;

select d.deptno,d.dname from dept d,emp e 
where d.deptno=e.deptno
and
e.sal<=25000
group by d.deptno,d.dname having count(*)=(select max (count(*)) from emp where sal <=2500 group by deptno);

//查询出管理员工人数最多的人的名字和他管理的人的名字;
1.先根据mgr分组,根据领导分组;

select b.ename,e.ename from emp e,emp b
where e.mgr = b.empno
and e.mgr = (
select mgr from emp group by mgr having count(MGR) = (select max(cn) from(
select count(MGR) cn from emp group by mgr)));

//统计各个年份的入职人数,以及总入职人数;

57.约束:对数据的限制条件:数据类型
常见约束:
检查约束(check)
唯一约束(Unique),可以为null、
主键约束(Primary key),不可以为null、
外键约束(Foreign key),两张表、
非空约束(Not null)
默认约束(Default)
主键和唯一的区别:a.主键不能为null;b.主键可以是复合主键,也可以是单值主键(id);c.一张表中,只能设置一次主键(复合主键),但唯一的键可以设置多次;
列级约束:作用于一个列,列的后面、可以有多个约束(空格)、全部的六个
表级约束:作用于一个列/多列、表的后面、多个约束(逗号)、四个(主键 外键 唯一 检查)
约束命名:
规范:约束类型_字段名
主键:PK_stuno
检查约束:CK_字段名
唯一约束:UQ_字段名
非空约束:NN_字段名
外键约束:FK_子表_父表
默认约束:一般不需要命名
加约束名:constraint 约束名

猜你喜欢

转载自blog.csdn.net/qq_42177478/article/details/99447739