去掉重复的:select distinct job from emp;--distinct 作用于后面所有的列
--dual表:伪表
--字符串大小写敏感
SQL> alter session set NLS_DATE_FORMAT='yyyy-mm-dd';
会话已更改。
SQL> select *
2 from emp
3 where hiredate='1981-11-17';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------- --------- ---------- ---------- ----- ---------- ----------
7839 KING PRESIDENT 1981-11-17 5000 10
SQL> --between and 在。。。。之间
SQL> --查询薪水1000~2000之间的员工
SQL> --查询部门号不是10和20的员工
1 select *
2 from emp
3* where deptno not in (10,20)
--null值 3. 如果集合中含有null,不能使用not in;但可以使用in
SQL> select *
2 from emp
3 where ename like 'S%';
--查询名字中含有下划线的员工 --转意字符
1 select *
2 from emp
3* where ename like '%\_%' escape '\'
--SQL 优化 2. where解析的顺序: 右--》 左
--order by作用于后面所有的列;desc只作用于离他最近的列
--substr(a,b) 从a中,第b位开始取
--substr(a,b,c) 从a中,第b位开始取,取c位
SQL> select e.empno,e.ename,e.sal,d.dname
2 from emp e,dept d
3 where e.deptno=d.deptno;
SQL> 左外连接:当where e.deptno=d.deptno不成立的时候,等号左边的表任然被包含在最后的结果中
SQL> 写法:where e.deptno=d.deptno(+)
SQL> 右外连接:当where e.deptno=d.deptno不成立的时候,等号右边的表任然被包含在最后的结果中
SQL> 写法: where e.deptno(+)=d.deptno
SQL> */
SQL> select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
2 from emp e,dept d
3 where e.deptno(+)=d.deptno
4 group by d.deptno,d.dname;
部门号 部门名称 人数
---------- -------------- ----------
10 ACCOUNTING 3
40 OPERATIONS 0
20 RESEARCH 5
30 SALES 6
SQL> --平均工资
SQL> select sum(sal)/count(*) 一,avg(sal) 二 from emp;
备注:在select列表中所有未包含在组函数中的列都应该包含在group by 子句中
select a,b,c,组函数(d)
from emp
group by a,b,c;
如果这里没有group by这一行内容,则是错误的;当然,by后面只写了a或者a,b也都不对,而必须把a,b,c都写上
相反:包含在group by子句中的列不必包含在select列表中,也就是上面的group by后面除了写a,b,c之外,还可以写e,f等列
SQL> --多个列的分组
SQL> select deptno,job,sum(sal)
from emp
group by deptno,job
order by 1;
SQL> select deptno,avg(sal)
2 from emp
3 group by deptno
4 having avg(sal) > 2000;
DEPTNO AVG(SAL)
---------- ----------
20 2175
10 2916.66667
SQL> --where和having的区别:where后面不能使用多行函数(组函数)
SQL> --SQL优化 原则:3. 尽量使用where (因为where是先过滤再分组,数据量降低了,而having是先分组再过滤,数据量大)
insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno);
SQL> delete和truncate的区别:
SQL> 1. delete逐条删除;truncate先摧毁表 再重建
SQL> 2. (*)delete是DML(可以回滚) truncate是DDL(不可以回滚)
SQL> 3. delete不会释放空间 truncate会
SQL> 4. delete可以闪回(flashback) truncate不可以
SQL> 5. delete会产生碎片 truncate不会
注意:mysql中truncate的效率比delete高
oracle中delete的效率比truncate高,因为oracle的delete不是真正的删除