JOB中不包含'MANAGER'和'CLERK'的所有员工信息 SELECT ENAME,JOB,SAL FROM EMP_GH WHERE JOB NOT IN('MANAGER','CLERK')
***BETWEEN AND 在两者之间,小的在前,大的在后(包含上下线的一个范围 [1500,3000],如果
大的在前,就会出现无结果) SELECT ENAME,SAL,JOB FROM EMP_GH
WHERE sal BETWEEN 1500 AND 3000--[1500,3000] ***IS NULL IS NOT NULL
***ANY 和 ALL条件
ANY(LIST):大于列表其中之一即可 ALL(LIST):大于列表所有
不能单独使用,要配合>,<,=等使用,一般在子查询中使用 SELECT ENAME,SAL FROM EMP_GH
WHERE SAL>ANY(800,900,1500)--后期再列表中是,表达式,不是直接写结果. ***函数,表达式条件
SELECT ENAME,JOB,SAL FROM EMP_GH WHERE SAL*12>50000
SELECT ENAME,SAL,JOB FROM EMP_GH WHERE UPPER(ENAME) = UPPER('SCOTT') ***DISTINCT 去除重复
查看公司中有哪些职位,单字段去重 SELECT DISTINCT JOB FROM EMP_GH
多字段去重,保证,多字段的组合没有重复的 SELECT DISTINCT JOB,DEPTNO FROM EMP_GH *******排序 ORDER BY 语句
排序,ASC为升序,默认的,可以省略 DESC降序 ORDER BY语句只能出现在最后, 分为单字段排序和多字段排序,
**多字段排序是先按照第一个字段排序,如果出现相同情况下按照第二个字段进行排序,以此类推
*** null在排序的时候被认为最大值 工资按照升序排列
SELECT ENAME,SAL FROM EMP_GH ORDER BY SAL 工资按照降序排列
SELECT ENAME,SAL FROM EMP_GH ORDER BY SAL DESC 多字段排序
SELECT ENAME,DEPTNO,SAL FROM EMP_GH
ORDER BY DEPTNO DESC,SAL ASC --DEPTNO按照倒序先排,重复的在按SAL正序排列 NULL在排序中被认为最大
SELECT ENAME,COMM FROM EMP_GH ORDER BY COMM
******聚合函数/多行函数/分组函数 忽略null值
将结果集按照指定的字段进行统计然后得到一条记录 *** MAX(),MIN()指定字段的最大值,最小值 SELECT MAX(SAL),MIN(SAL) FROM EMP_GH
*** AVG() 和 SUM()
统计指定字段的平均值和总和
SELECT TRUNC(AVG(SAL),2) SAL,SUM(SAL) FROM EMP_GH
忽略null值,集合函数忽略null,在进行总体的统计时,需要将null值转化为0 SELECT AVG(NVL(COMM,0)) FROM EMP_GH *** COUNT()
统计指定字段不为NULL的记录的总数
忽略null就只统计不为null值得字段总数 SELECT COUNT(COMM) FROM EMP_GH
**查看一张表中的记录数常数:count(*) SELECT COUNT(*) FROM EMP_GH ***分组函数 GROUP BY
在集合函数中出现了其他字段,那么其他字段必须出现在GROUP BY 中,表示以该字段分组来进行统计
查看每个部门的平均工资 SELECT AVG(SAL),DEPTNO FROM EMP_GH GROUP BY DEPTNO
SELECT DEPTNO FROM EMP_GH GROUP BY DEPTNO
每个职位的工资总和
SELECT SUM(SAL),JOB FROM EMP_GH GROUP BY JOB
**多字段分组原则 GROUP BY
将这些字段值得组合相同的看做成成一组,
查看每个部门中每个职位的平均工资 SELECT AVG(SAL),DEPTNO,JOB FROM EMP_GH
GROUP BY DEPTNO,JOB
***WHERE 中不允许使用集合函数进行过滤条件 原因:时机不对
WHERE 是在查询表中每条数据时就进行过滤的,所以,where决定着那条数据被查
询出来
二分组统计是在表中数据查询出来后基于结果集进行的,所以根据分组统计的结果作为过滤条
件是不能再where中使用的 ***HAVING 字句
HAVING字句不能独立存在,必须跟在group BY 字句之后,HAVING 可以使用集合函数作为过滤
条件,它是用来根据统计结果决定保留哪些分组的 查看部门高于仨个人的部门平均工资 SELECT AVG(SAL),DEPTNO FROM EMP_GH GROUP BY DEPTNO HAVING COUNT(*)>3
最低工资高于1000的每种职位的人数,
SELECT COUNT(*) ,JOB FROM EMP_GH GROUP BY JOB
HAVING AVG(SAL)>1000 查询语句的语句,
***************************关联查询 where中写关联条件
SELECT EMP_GH.ENAME,DEPT_GH.DNAME FROM EMP_GH,DEPT_GH
WHERE EMP_GH.DEPTNO = DEPT_GH.DEPTNO
表名也可以使用别名 SELECT E.ENAME,D.DNAME
FROM EMP_GH E,DEPT_GH D WHERE E.DEPTNO = D.DEPTNO
查看sales部门的员工信息,可以将查询条件和关联条件放在一起
SELECT E.ENAME,E.SAL,D.DNAME FROM EMP_GH E,DEPT_GH D
WHERE E.DEPTNO = D.DEPTNO AND D.DNAME = 'SALES'
查看在new yourk工作的都有谁 SELECT E.ENAME
FROM EMP_GH E,DEPT_GH D
WHERE E.DEPTNO = D.DEPTNO AND D.LOC ='NEW YOUK'
查看每个地区工作的人数 SELECT COUNT(*),D.LOC FROM EMP_GH E,DEPT_GH D WHERE E.DEPTNO = D.DEPTNO
GROUP BY D.LOC
如果不进行关联条件,则进行笛卡尔积,
在关联查询中,若不指定连接条件,则会产生笛卡尔积,该结果集 会将每张表中的每条记录分别连接一次,
组成一条记录,开销巨大,通常是一个没有意义的结果集,结果集是表中数据的乘积, 有N张表就应当有N-1个连接条件
******************内部连接****************************** ***JOIN内关联的
SELECT E.ENAME,D.DNAME
FROM EMP_GH E JOIN DEPT_GH D ON E.DEPTNO = D.DEPTNO WHERE D.DNAME='SALES'
***无论关联查询还是内部查询,都忽略不满足连接条件的记录
*******************外链接
外链接可以在关联条件不满足的数据进行查询,分为: 左外连接:LEST OUTER JOIN 以join左侧的表作为驱动表(主要显示数据的表),该表中的数据全部进行查询,当不满足条件
的数据,在右侧表中都会补充NULL值 右外链接:RIGHT OUTER JOIN 全外链接:FULL OUTER JOIN
SELECT E.ENAME,D.DNAME
FROM EMP_GH E LEFT OUTER JOIN DEPT_GH D ON E.DEPTNO = D.DEPTNO
SELECT E.ENAME ,D.DNAME
FROM EMP_GH E RIGHT OUTER JOIN DEPT_GH D ON E.DEPTNO = D.DEPTNO
SELECT E.ENAME,D.DNAME
FROM EMP_GH E FULL OUTER JOIN DEPT_GH D ON E.DEPTNO = D.DEPTNO
***普通的外链接可以用以下 +号在那边,那边补null 右外链接,
SELECT E.ENAME,D.DNAME FROM EMP_GH E,DEPT_GH D
WHERE E.DEPTNO(+) = D.DEPTNO 做外链接
SELECT E.ENAME,D.DNAME FROM EMP_GH E,DEPT_GH D
WHERE E.DEPTNO = D.DEPTNO(+) ************自连接
用于解决相同类型数据,但是又存在上下级关系的树状结构的储存,
自连接,当前表的记录与当前表的其他记录有对应的关系
查看员工的名字及领导的名字 SELECT E.ENAME,M.ENAME FROM EMP_GH E,EMP_GH M WHERE E.MGR=M.EMPNO(+)
查看每个员工的领导在哪儿工作
分析,员工,领导,工作地三张表进行关联查询 SELECT E.ENAME,M.ENAME,D.LOC FROM EMP_GH E JOIN EMP_GH M ON E.MGR=M.EMPNO0 JOIN DEPT_GH D
ON M.DEPTNO = D.DEPTNO 或
SELECT E.ENAME,M.ENAME,D.LOC FROM EMP_GH E,EMP_GH M,DEPT_GH D
WHERE E.MGR=M.EMPNO AND M.DEPTNO=D.DEPTNO
*****************************TEST************************* 1:查看工资高于2000的员工 SELECT ENAME FROM EMP_GH WHERE SAL>2000
2:查看不是\职位的员工 SELECT ENAME FROM EMP_GH WHERE JOB<>'CLERK'
3:查看工资在1000-2500之间的员工 SELECT ENAME FROM EMP_GH
WHERE SAL BETWEEN 1000 AND 2500 4:查看名字是以K结尾的员工 SELECT ENAME FROM EMP_GH WHERE ENAME LIKE '%K' 5:查看20,30号部门的员工
SELECT ENAME,DEPTNO FROM EMP_GH WHERE DEPTNO=20 OR DEPTNO=30 6:查看奖金为NULL的员工
SELECT ENAME,COMM FROM EMP_GH
WHERE COMM IS NULL--NULL不能用=号,要用is null 7:查看年薪高于20000的员工 SELECT
ENAME,SAL*12