直接写例子
--列的别名
--当一个SELECT子句中的字段是一个函数或者表达式时,那么结果集中对应的该字段的名字就是这个函数或者表达式,可读性差这时可以为该字段指定段名。
	SELECT ename,sal*12 sal,TO_CHAR(hiredate,'YYYY-MM-DD') hiredate FROM emp
--别名可以使用双引号括起来区分大小写和添加空格
	SELECT ename,sal*12 "sal" FROM emp
	
--WHERE在查询中是用来添加过滤条件的,它的过滤实际是在查询表的过程中进行的,每当遍历表中一条数据时就会检查其是否满足WHERE条件,满足则会被查询出来,不满足则被忽略。
--不等于!=(不常用,不建议),不等于<>(常用,基本所有数据库都支持)
--查询入职时间在1982-01-01之后的
	SELECT ename,sal,hiredate FROM emp WHERE hiredate>TO_DATE('1982-01-01','YYYY-MM-DD')
--AND 的使用,同时满足条件
	SELECT ename,sal,job FROM emp WHERE sal>1000 AND job='CLERK'
--OR 的使用,满足其中某个条件
	SELECT ename,sal,job FROM emp WHERE sal>1000 OR job='CLERK'
--查看工资高于1000的职位是CLERK和SALESMAN的员工信息
--AND和OR是用来连接多个过滤条件的,并且AND的优先级是高于OR的,下面语句有括号和没括号结果不一样
	SELECT * FROM emp WHERE sal>1000 AND (job='SALESMAN' OR job='CLERK')

--LIKE用于模糊匹配字符串,支持两个通配符: %表示任意个字符;   _表示单个字符
--查看名字第三个字母是L的员工
	SELECT ename,sal,deptno FROM emp WHERE ename LIKE '__L%'

--IN和NOT IN判断是否在列表中或者不在列表中,IN和NOT IN通常用作子查询
	SELECT ename,job FROM emp WHERE job IN('MANAGER','CLERK')
	SELECT ename,job,deptno FROM emp WHERE deptno NOT IN(10,20)
	
--BETWEEN...AND...判断是否在一个范围内
	SELECT ename,sal FROM emp WHERE sal BETWEEN 1500 AND 3000

--ANY与ALL是用做判断一个值是否>,>=,<,<=列表中的内容
--  >ALL(list):大于列表中最大的
--  <ALL(list):小于列表中最小的
--  >ANY(list):大于列表中最小的
--  <ANY(list):小于列表中最大的	
--  ANY和ALL的列表通常不会给定确定的值,都是配合一个子查询使用
	SELECT empno,ename,job,sal FROM emp WHERE sal<ANY(3500,4000,4500)
	SELECT empno,ename,job,sal FROM emp WHERE sal>ALL(3500,4000,4500)
	
--DISTINCT关键字,用于将结果指定的字段的重复记录去掉,DISTINCT应当紧跟在SELECT关键字之后,可以对单列去重可以对多列去重。
--查看公司的职位有哪些(单字段去重)
	SELECT DISTINCT job FROM emp
--多字段去重,不保证每个字段没有重复值,结果集中这些字段值的组合没有重复记录
	SELECT DISTINCT job,deptno FROM emp
	
--排序结果集,ORDER BY 子句可以将当前结果集按照给定的字段的值进行升序或者降序排序,ORDER BY子句只能写在DQL语句的最后子句上。
--ASC:升序(默认就是升序,通常不写)			DESC:降序
--排序的字段中若含有NULL值,那么NULL被视为最大值。
	SELECT ename,sal,comm FROM emp ORDER BY comm DESC
--查看公司中工资的的排名
	SELECT ename,deptno,sal FROM emp ORDER BY sal ASC		--升序
	SELECT ename,deptno,sal FROM emp ORDER BY sal DESC		--降序
--多字段排序。排序存在优先级,先按照第一个字段排序结果集,当第一个字段的值有重复的时候才会将这些记录按照第二个字段的排序规则进行排序,以此类推,每个字段可以单独指定排序方式
	SELECT ename,deptno,sal FROM emp ORDER BY deptno DESC,sal ASC
	
--聚合函数,又称为多行函数,分组函数,聚合函数是用来统计的,可以将多条记录中指定的字段进行统计,然后得到一个结果。
--MAX(),MIN() 统计最大值与最小值
	SELECT MAX(sal),MIN(sal) FROM emp
	
--AVG()求平均值,SUM()求总和
	select ROUND(avg(sal),2),sum(sal) from emp
	
--COUNT() 统计记录数
	SELECT COUNT(ename) FROM emp
--聚合函数都是忽略NULL值的。
	SELECT COUNT(comm) FROM emp
--通常统计表中记录数可以使用
	SELECT COUNT(*) FROM emp
--奖金平均值,先修改NULL的个数	
	SELECT SUM(comm),AVG(comm) FROM emp

--GROUP BY子句,GROUP BY可以将当前查询的结果集按照GROUP	BY子句给定的字段的值相同的记录划分为一个组,配合聚合函数可以进行更细分的统计工作。
--当SELECT子句中出现聚合函数,那么凡不在聚合函数中的其他字段必须在GROUP BY子句中,反过来则不是必须的。通常不使用聚合函数就没必要使用GROUP BY
--查看每个部门的平均工资
	SELECT AVG(sal),deptno FROM emp GROUP BY deptno
--每种职位的最高工资
	SELECT MAX(sal),job FROM emp GROUP BY job

--group by根据多字段分组,分组原则将结果集中,group by指定的这些字段的值的组合相同的记录看做一组
--同个部门同个职位为一组
	SELECT count(*),JOB,deptno FROM emp GROUP BY JOB,deptno
--where中不允许有聚合函数,原因在于过滤的时机并不对。聚合函数的统计是建立在结果集的基础之上的,这就说明在统计之前,
--数据应当已经查询出来并生成类结果集,而where的过滤就是在查询生成结果集的过程中进行的,
--所以where在前,统计在后,所以不能在where中使用聚合函数进行过滤
	SELECT AVG(sal),deptno FROM emp WHERE AVG(sal)>2000 GROUP BY deptno --报错
		
--having子句可以使用聚合函数的结果进行过滤。having是配合group by分组的,目的是根据过滤条件取舍某些分组的记录。having必须跟在group by之后。不能单独使用
	SELECT AVG(sal),deptno FROM emp GROUP BY deptno HAVING AVG(sal)>2000
--查看平均工资高于2000的那些部门的最高工资和最低工资都分别是多少?
	SELECT MAX(sal),MIN(sal),deptno FROM emp GROUP BY deptno HAVING avg(sal)>2000
--面试题:where和having的区别,1.where在前,having在后;2.where不能使用聚合函数,having可以;3.having不能单独使用,必须跟在group by之后
	
	SELECT ename,hiredate,sal,comm FROM emp

	
--关联查询。联合多张表进行查询,结果集中的字段可能来自多个表。关联查询要添加连接条件,数据库根据连接条件将满足的记录进行连线,
--从而提取这些记录中对应查询的字段值构成结果集。若不添加连接条件会产生笛卡尔积,这通常是一个无意义的结果集
--查看每个员工以及部门信息--不满足连接条件的记录是不会出现在结果集中的
	SELECT e.ename,e.JOB,d.dname,e.deptno FROM emp e,dept d WHERE e.deptno=d.deptno
--不添加连接条件会产生笛卡尔积,笛卡尔积的记录数
	SELECT e.ename,e.JOB,e.deptno,d.dname FROM emp e,dept d 
--通常N张表关联查询就要有至少N-1个连接条件

--查看在NEW YORK工作的员工
	SELECT e.ename,e.job,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno AND d.loc='NEW YORK'
	
--内连接,也是关联查询的一种
	SELECT e.ename,e.JOB,d.dname,d.loc FROM emp e JOIN dept d ON e.deptno=d.deptno WHERE d.loc='NEW YORK'

--外连接,在进行关联查询时除了满足连接条件的记录列出来,也会将不满足连接条件的记录列出来。外连接分为:
--左外连接:以join左侧表作为驱动表(主要显示记录的表)该表中的所有记录都要显示出来,当某条记录不满足连接条件时,该条记录中来自join右侧表中的字段全部以NULL作为值。
--右外连接:全外连接
	SELECT e.ename,e.JOB,d.dname FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno		--左外连接
	SELECT e.ename,e.JOB,d.dname FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno	--右外连接
	SELECT e.ename,e.JOB,d.dname FROM emp e FULL OUTER JOIN dept d ON e.deptno=d.deptno		--全外连接
	
--自连接,存的数据是当前表的一条记录,可以对应当前表的多条记录,这种设计用于解决记录属性相同但记录间又存在上下级关系的树状结构时使用
--查看每个员工以及其上司的名字?
	SELECT e.ename 下属,m.ename 上司 FROM emp e JOIN emp m ON e.mgr=m.empno
--SMITH的上司在哪个城市
	select e.ename 下属,m.ename 上司,d.loc 工作地址 from emp e join emp m on e.mgr=m.empno join dept d on m.deptno=d.deptno where e.ename='SMITH'




如有问题欢迎留言!