oracel总结
从一个用户转到令一个用户:conn 请输入用户名:scott/tiger
给scott用户解锁:alter user scott account unlock;
sqlplus sys/bjsxt as sysdba 系统管理员的密码是:bjsxt
一、oracle需要记住的:分页用:rownum
修改表结构和添加约束条件用:alter table
索引:是为了加快对数据得搜索速度。但索引是占空间的,如果太多
会影响插入数据,修改数据,删除数据的速度。(create index idx_stu_email on stu(email))
视图:实际上就是给复杂的子查询起了一个别名。缺点:如果表结构变了
跟这个表有关的视图都得改,所以视图适量最好!(create view v$_temp as ..)
序列:用来解决主键递增的问题,和mysql的Auto差不多。(create sequence seq_article_id start with 1 increment by 1)
主键:string类型的作主键,没有int类型的作主键检索速度快。一、单条的select语句
1、having 对分组进行限制
eg:把平均薪水大于1000的组,从emp这张表中取出来。
select avg(sal) from emp group by deptno having avg(sal)>1000;
2、where语句是对单条记录进行过滤。
执行的前后顺序:where group by having order by
这个顺序不能颠倒,只能这么限制。
3、 select * from emp
2 where sal > 1000 对取出来的每条数据进行过滤
3 group by deptno 对过滤后的数据进行分组
4 having 对分组之后产生的结果进行限制
5 order by 对取出来的最后的数据进行排序
4、薪水大于1200的雇员,按照部门编号进行分组,这些人分组之后的平均薪水必须大于1500,
查询分组之内的平均工职,按照平均薪水的倒顺进行排列。
select avg(sal) from emp where sal>1200 group by deptno having avg(sal)>1500 order by avg(sal) desc;二、组函数:定义:多行的输入产生一个输出。
1、avg 求平均值
max 求最大值
min 求最小值
sum 求总和
count 求记录的数量
distinct 唯一(去掉重复的)
2、eg:求薪水的总和、最大值、最小值、平均值。
select sum(sal),max(sal),min(sal),avg(sal) from emp;
eg:求emp表的记录数量
select count(*) from emp;
eg:把emp表里的部门编号取出来,去掉重复的。
select count(distinct deptno) from emp;三、多表连接
1、eg:取出这个人的名字,和这个人所在部门的名字。(从两张表里取数据)
select ename,dname from emp,dept where emp.deptno=dept.deptno; 笛卡尔乘积(不写连接条件时):eg(两张表):一张表的每一条记录和另一张的每一条记录都组合一次,作为一个结果被取出来。
解释:select count(*) from emp; 14
select count(*) from dept; 4
select ename dname from emp,dept; 56 (前两者的乘积,一张表的每一条记录和另一张的每一条记录都组合一次。)
2、如果想取两张表里重复的字段,得明确是从哪张表里往外取。方法:表名.字段(见例子)
select ename,dname,deptno from emp,dept where emp.deptno=dept.deptno;
报的错误:未明确定义列。
select ename,dname,emp.deptno from emp,dept where emp.deptno=dept.deptno;
注:deptno在两张表里都有,但在不同的表中取的效率不见的相同。(有一个效率的问题)
从dept这张表中,取deptno速度应该快些。
3、从emp表和salgrade表中,取出ename、sal、grade
select ename,sal,grade from emp,salgrade where sal between losal and hisal;
注:这个就是看grade这个记录怎么取出来,和这两张表连接条件怎么写,是用between and 写的
是用一个区间来表示这两张表的连接条件的。
4、从emp表、dname表、salgrade三张表中,求出ename、deptno、grade三个字段,和job不是PRESIDENT的。
select ename,dname,grade from emp e,dept d,salgrade s where e.deptno=d.deptno and
e.sal>=s.losal and e.sal<=s.hisal and job<>’PRESIDENT’;
连接条件:e.deptno=d.deptno and e.sal>=s.losal and e.sal<=s.hisal
数据过滤条件:job=’PRESIDENT’
表起别名:emp e
字段起别名:ename e
不是的写法:<> 和 != 是一样的。四、子查询(关键:把子查询的结果当成一张表!!!)
1、eg:谁赚的钱最多
select ename,max(sal) from emp; 报错:不是单组分组函数。
select ename,sal from emp where sal = (select max(sal) from emp);
注:子句是对主句的限制,主句是把ename,sal从emp表里取出来,子句对主句做了限制,把sal=最大值
的ename,sal取出来。
我的错误:where子句放在from emp 前面了,低级错误。
错误句子:select ename,sal where sal = (select max(sal) from emp) from emp;
2、这个子查询可以出现在where语句里面,也可以出现在from语句里面。
3、eg:求出哪些人的工职位于所有人的平均工职之上。
select ename,sal from emp where sal > (select avg(sal) from emp);
eg:按照部门进行分组之后,每个部门赚钱最多的那个人。
select ename,sal from emp where sal = (select max(sal) from emp group by deptno);
错误:sal=一个值,所以说子句select max(sal) from emp group by deptno 取出来的应该是一个值,而不是多个值。 select ename,sal,deptno from emp where sal in (select max(sal) from emp group by deptno);(结果如下:)
ENAME SAL DEPTNO
BLAKE 2850 30
FORD 3000 20
SCOTT 3000 20
KING 5000 10 解释:子句是对主句的限制,select max(sal) from emp group by deptno 它从emp取出来的是3000、2850、5000
而in的意思是:是这三个值的其中的一个就行,所以说10部门的3000这条记录就能被取出来。需要注意的是:
子句取出的结果只是对主句的限制,而不是主句从子句的结果中取数据,主句还是从emp这张表中取数据