1.oracle数据库如何更改用户?
grant connect,resource to scott;(给用户授权)
alter user scott account unlock;
connect scott/tiger
2.host cls (清屏)
distinct(去重复)作用于后面所有的列
order by 后面+列 表达式 别名 序号(作用于后面所有的列,先按照第一列排序,再后面的列,desc作用于最近的列)
3.查询平均工资大于2000
select deptno avg(sal) from emp
group by deptno
having avg(sal)>2000;
where 后面不可以使用多行函数(where和having的区别)
左外连接
写法:where e.deptno=d.deptno(+) where e.deptno(+)=d.deptno(右外连接)
自连接:通过表的别名,将同一张表视为多张表(自连接不适合操作大表)
子查询注意的问题:
1.括号
2.合理的书写风格
3.可以在主查询的where select having from 后面使用子查询
(1)查询工资比scott高的员工信息
select * from emp where
sal >(select sal from emp where ename='scott')
(2)查询部门名称是SALES和Account 的员工
select * from emp where deptno in
(select deptno from dept where dname='SALES'
or dname='Account ' )
(3)查询工资比30 号部门任意一个员工高的员工信息
select * from emp where sal>any
(select sal from emp where deptno=30)
(4)查询不是老板的员工信息
select * from emp where emptno not in
(select mgr from emp where mgr is not null)
4.不可以在order by 后面使用 子查询
5.主查询和子查询可以不是一张表,只有子查询返回的结果,主查询可以使用即可。
6.一般先执行子查询,再 执行主查询。但相关的子查询例外
7.单行子查询只能使用单行操作符,多行子查询只能使用多行操作符。
rownum 行号 永远按照默认的顺序生成,只能使用 < ,<=
(1)找到员工表中最高 的前三名
select rownum,sal from (select * from emp order by desc )
where rownum >3;
(2)找到员工表中薪水大于本部门平均薪水的员工
select e.empno,e.ename,e.sal,d.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
修改表
alter table user add photo blob,modify tname varchar2(33),drop column photo,rename column tname to username,rename user to user2(新增列,修改列,删除列,重名列,重名表)
on delete set null 将子表的相关依赖记录的外键值为null
视图 ##(grant授权)
是虚表,封装了一条复杂的查询语句,简化复杂的查询。
(create view viewqq
as
select * from where deptno =10;
)
序列(数组—》内存中) 可以提高访问的效率
索引 是由于加速数据存取的数据对象(经常被访问的而且数据量很大)
)(rowid行地址(目录))
单列索引
复合索引
create index myindex on emp(deptno);
PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算。PL/SQL 只有 Oracle 数据库有。
存储过程和存储函数
指存储在数据库中提供所有用户程序调用的子程序叫存储过程,存储函数。
过程和函数的区别是函数有一个返回值,过程没有返回值
但函数和过程都可以通过out指定一个或多个输出参数。我们可以利用out 参数,在过程和函数中实现多个返回值。
(1) 无参数
create or replace procedure hello
as
--说明部分
begin
dbms_output.put_line('ass');
end;
(2) 输入参数(指定员工涨100 ,并且打印涨前和涨后的工资)
create or replace procedure hello(eno in number)
is
psal emp.sal%type;
begin
--涨前的工资
select sal into psal from emp where empno=eno;
--涨后的工资
update emp set sal=sal+100 where empno=eno;
dbms_output.put_line('涨前:'|| psal || '涨后:' ||(psal+100);
end;
调用存储过程的方法
1. exec hello(7839);
2. begin
hello(7839);
end;
如果只有一个返回值,就用存储函数,否则就用存储过程。