美文网首页java学习
NO.45 SQL(基础查询)、SQL(关联查询)

NO.45 SQL(基础查询)、SQL(关联查询)

作者: smallnumber | 来源:发表于2017-08-15 22:24 被阅读0次

    为方便测试,创建表emp和表dept。

    表emp 表dept

    列别名

    当SELECT子句中一个字段是函数或者表达式,那么在结果集中该字段的名字就是这个函数或表达式,可读性差,为此可以为列提供一个别名,这样在结果集中会使用该别名作为该

    字段的名字。应当养成一个好习惯,即:凡是表达式或函数都指定一个别名。

    别名本身不区分大小写,若希望别名区分大小写或者别名中包含空格,那么需要使用双引号

    将其括起来。

    SELECT ename,sal+NVL(comm,0)"sal" FROM emp

    OR,AND用于连接多个条件使用

    OR的优先级低于AND,所以若希望提高OR的优先级,可以使用括号。

    查看工资高于1000,并且职位是CLERK或者SALESMAN的员工?

    SELECT ename,job,sal FROM emp WHEREsal>1000 AND (job='SALESMAN' OR job='CLERK')

    LIKE用于模糊匹配字符串支持两个通配符:

    %:0-多个字符(任意个字符)

    _:单一的一个字符

    查看名字第二个字母是A的员工?

    SELECT ename,sal,deptno FROM emp WHEREename LIKE '_A%'

    IN(list)和NOT IN(list)

    判断在列表中和不在列表中

    IN,NOT IN常被用在子查询上使用。

    查看职位是CLERK和SALESMAN的员工?

    SELECT ename,job,sal FROM emp WHERE jobIN('CLERK','SALESMAN')

    BETWEEN...AND...

    判断在一个区间范围内

    查看工资在1500到3000之间的员工?

    SELECT ename,sal FROM emp WHERE sal BETWEEN1500 AND 3000

    查看工资在1000-3000之间,20和30号部门名字中含有A的员工?

    SELECT ename,sal,deptno,job FROM emp WHEREsal BETWEEN 1000 AND 3000 AND deptno IN (20,30) AND ename LIKE '%A%'

    ANY(list),ALL(list)

    ANY,ALL是配合>,>=,<,<=使用的

    >ANY(list):大于列表之一,大于最小

    >ALL(list):大于列表所有,大于最大

    ANY,ALL的列表中不会给定固定值,没有实际意义,它们通常配合子查询使用。

    SELECT empno, ename, job, sal, deptno FROMemp WHERE sal>ANY(3500,4000,4500)

    DISTINCT关键字

    DISTINCT可以将结果集中指定字段值一样的记录去重。

    查看公司有哪些职位?

    SELECT DISTINCT job FROM emp

    可以按照多字段去重,那么这些字段值的组合没有重复记录出现在结果集中。

    SELECT DISTINCT deptno,job FROM emp

    ORDER BY子句

    ORDER BY用于对查询的结果集按照指定字段的值进行排序。

    排序分为:升序(ASC),降序(DESC).默认为升序

    ORDER BY子句必须定义在SELECT语句中的最后一个子句上。

    查看公司中工资的排名?

    SELECT ename,sal,job FROM emp ORDER BY salDESC

    查看20号部门的工资排名?

    SELECT ename,sal,deptno FROM emp WHEREdeptno=20 ORDER BY sal DESC

    多字段排序时,ORDER BY是有排序的优先级的,首先按照第一个字段先进行排序,当该字段中有记录值重复时,再将这些记录按照第二个字段排序。依此类推。

    SELECT ename,deptno,sal FROM emp ORDER BYdeptno DESC,sal DESC

    若排序的字段中含有NULL值,NULL被认定为最大值。

    SELECT ename,comm FROM emp ORDER BY comm


    聚合函数

    聚合函数又称为分组函数,多行函数。

    聚合函数的作用是对结果集指定字段的值进行统计工作的。

    MAX(),MIN(),SUM(),AVG()

    求最大值,最小值,总和,平均值

    还有一个是对记录数的统计COUNT()

    查看公司的最高工资是多少?

    SELECT MAX(sal) FROM emp

    SELECT MAX(sal),MIN(sal),SUM(sal),AVG(sal) FROMemp

    查看公司共多少人?

    SELECT COUNT(ename) FROM emp

    SELECT COUNT(*) FROM emp

    SELECT COUNT(1) FROM emp

    聚合函数忽略NULL值。

    SELECT SUM(comm),AVG(comm) FROM emp

    SELECT AVG(NVL(comm,0)) FROM emp

    GROUP BY子句

    GROUP BY子句可以将结果集按照给定的字段值一样的记录进行分组。配合聚合函数使用可以完成分组统计工作。

    查看每个部门的平均工资?

    SELECT AVG(sal),deptno FROM emp GROUP BYdeptno

    当SELECT中含有聚合函数时,那么凡不在聚合函数中的单独字段,都需要出现在GROUP BY

    子句中。

    查看每种职位的最高工资与最低工资是多少?

    SELECT MAX(sal),MIN(sal),job FROM emp GROUPBY job

    GROUP BY按照多字段分组时,是将这些字段值组合一样的记录看做一组。

    统计同部门同职位的员工的各多少人?

    SELECT COUNT(*),deptno,job FROM emp GROUPBY deptno,job

    查看部门的平均工资,前提是该部门的平均工资高于2000

    SELECT AVG(sal),deptno FROM emp WHEREAVG(sal)>2000 GROUP BY deptno

    上面的SQL语句会抛出异常,WHERE子句中是不能使用聚合函数做为过滤条件的,原因在于过滤的时机不对。

    WHERE是伴随查询表中数据逐行进行过滤使用的,用来确定结果集中可以查询出的条目数。而聚合函数是建立在查询出来的数据基础上进行统计才能得到结果,所以使用聚合函数过滤应当是在WHERE之后进行的。

    HAVING子句可以根据聚合函数进行过滤,并且是用来根据条件过滤GROUP BY的分组

    HAVING不能单独出现,不定义GROUP BY子句不能单独出现HAVING子句。

    查看部门的平均工资,前提是该部门的平均工资高于2000

    SELECT AVG(sal),deptno FROM emp GROUP BYdeptno HAVING AVG(sal)>2000

    查看平均工资高于2000的那些部门的最高工资是多少?

    SELECT MAX(sal),deptno FROM emp GROUP BYdeptno HAVING AVG(sal)>2000


    关联查询

    关联查询的结果集中的字段来自多张表。这就需要在查询的时候联合多张表进行查询,根据给定的连接条件将表与表的数据建立对应关系,再分别从这些记录中提取要查询的字段来形成结果集中的每条记录。

    查看每个员工的名字以及其所在部门的名字?

    SELECT ename,dname FROM emp,dept WHEREemp.deptno=dept.deptno

    当在关联查询中要查询的字段在这些表中都出现时,需要使用表名来明确字段所属表。可以为表名取一个别名来简化复杂度。

    SELECT e.ename,e.deptno,d.dname FROM empe,dept d WHERE e.deptno=d.deptno

    在进行关联查询时若有过滤要求,那么过滤条件必须与连接条件同时成立。

    查看在NEW YORK工作的员工都有谁?

    SELECT e.ename,e.deptno,d.dname,d.loc FROMemp e,dept d WHERE e.deptno=d.deptno AND d.loc='NEW YORK'

    关联查询中不指定连接条件或者连接条件无效时,会产生笛卡尔积,这通常是一个无意义的结果集。

    SELECT e.ename,d.dname FROM emp e, dept d

    N表查询至少要有N-1个连接条件。

    内连接

    内连接也是用来完成关联查询的。采用JOIN...ON...的形式关联多表。

    查看每个员工的名字以及其所在部门名称?

    SELECT e.ename,d.dname FROM emp e,dept d WHEREe.deptno=d.deptno

    内连接写法:

    SELECT e.ename,d.dname FROM emp e JOIN deptd ON e.deptno = d.deptno

    不满足关联条件的记录不会被查询出来。

    外连接

    外连接在关联查询中除了可以将满足连接条件的记录查询出来之外,还可以将不满足连接条

    件的记录也列出来。

    外连接分为:

    左外连接(LEFT),右外连接(RIGHT),全外连接(FULL)

    左外连接:以JOIN左侧表做为驱动表,该表记录都要查询出来,当某条记录不满足连接条件时,那么在结果集中该条记录来自JOIN右侧表的字段的值全部为NULL。

    SELECT e.ename,e.job,e.sal,d.dname,d.loc FROMemp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno

    SELECT e.ename,d.dnameFROM emp e,dept d WHERE

    e.deptno(+)=d.deptno------右外连接

    自连接

    自连接指的是当前表的一条数据可以对应当前表自己的多条数据。

    自连接是为了解决数据的属性相同,但是本身又存在上下级关系的树状结构数据。

    查看每个员工以及其领导的名字?

    SELECT e.ename,m.ename FROM emp e,emp m WHEREe.mgr=m.empno(+)

    SELECT e.ename,m.ename FROM emp e LEFTOUTER JOIN emp m ON e.mgr=m.empno

    相关文章

      网友评论

        本文标题:NO.45 SQL(基础查询)、SQL(关联查询)

        本文链接:https://www.haomeiwen.com/subject/qjtbrxtx.html