您的位置:首页 > 数据库 > Oracle

Oracle笔记(三)

2015-11-18 12:48 330 查看

SELECT语句(11/16)

列的别名

当我们使用SELECT子句中查询内容不是直接使用字段的名字,而是表达式或者一个函数。这时候在查询出来的结果集中该列的名字就是这个函数或者表达式,可读性差,为此我们为当前列添加别名,这样结果集中当前列的名字就是该别名。

别名中若希望区分大小写或者有空格时可以使用双引号扩起来。

在使用子查询时,通常要求含有表达式,函数的字段必须加别名。

SELECT ename,SAL,job FROM emp_tzm WHERE SAL >1000 AND job='SALESMAN'

SELECT ename,sal,job FROM emp_tzm WHERE sal between 1000 and 1500

SELECT ename,sal,job FROM emp_tzm WHERE sal <> 1250

SELECT ename,sal,job FROM emp_tzm WHERE (sal>1250) AND (job = 'CLERK' OR JOB = 'SALESMAN')

OR的优先级低于AND,所以若需要提高优先级,可以使用括号来提高

模糊查询 LIKE

LIKE:用于对字符串进行模糊匹配。

支持两个通配符

% :任意一个字符

_ :一个字符

姓名的第二个字符为A

SELECT ename,sal,job FROM emp_tzm WHERE ename LIKE '_A%'

SELECT floor (AVG(sal),2) AVG,SUM(sal) SUM FROM emp_tzm

IN 只要包含任意一个

SELECT ename,sal,job FROM emp_tzm WHERE JOB IN ('MANAGER','CLERK')

IN (list):判断等于列表中任何一项即可常用与判断子查询的结果,这种情况下是不能用OR代替的

NOT IN 则是判断不在列表中

ANY(list) 与 ALL(list)

当需要判断诸如>,>=,<,<=多个值时,要配合ANY和ALL使用。

>ANY:大于列表中最小的即可

>ALL:大于列表中最大的

<ANY小于列表中最大的

<ALL 小于列表中最小的

通常是为判断子查询结果使用,列表很少直接给定几个固定值

WHERE子句可以使用函数或者表达式的结果作为过滤条件。

SELECT ename ,sal,job FROM emp WHERE ename = UPPER('rose');

DISTINCT 关键字必须紧跟在SELECT关键字之后。

查看公司总共有多少种职位

SELECT DISTINCT job FROM emp_tzm

DISTINCT对多个字段去重,不能保证结果集中某一个字段没有重复值。作用是保证这几个字段值的组合没有重复的

SELECT DISTINCT job,deptno FROM emp

ODER BY 排序结果集,可以按照给定的字段的值进行“升序或者降序排列。

ODER BY 执行的顺序是先进行SELECT 查询数据,然后再对查询出来的结果集按照给定的字段进行的排序。

所以oder by 子句必须写在SELECT语句的最后

DESC:降序

ASC:升序,默认就是升序,所以asc不写

ODER BY 也可以按照多个字段排序

每个字段都可以分别指定升降序。

排序存在优先级,先按照第一个字段的排序规则进行排序,当第一个字段的值一样的记录,才会按照第二个字段的排序规则进行排序,依次类推。

聚合函数:忽略null值

又名多行函数,分组函数

MIN MAX (最小 最大)

AVG(平均) SUM

SELECT CEIL(AVG(nvl(COMM,0))) AVG,SUM(COMM) SUM FROM emp_tzm

COUNT() 函数

用来统计指定字段非NULL的记录总共多少条,并不关心字段具体取值。

查看公司总共多少人

SELECT COUNT(ename) FROM emp_tzm(忽略null值)

通常做法是

SELECT COUNT(*) FROM emp_tzm

GROUP BY 子句

GROUP BY 子句可以根据指定的字段值相同的记录进行分组,然后然后配合组函数进行更新至的统计工作

查看每个部门的最高最低工资?

SELECT MAX(sal),MIN(sal) FROM emp_tzm GROUP BY(deptno)

当SELECT子句中出现了聚合函数,那么凡不再聚合函数中的其他字段必须出现在GROUP BY 子句中,反之则不是必须的。

根据多个字段分组,则是按照这几个字段值组合一样的看作一组:

列出同部门同职位的员工的最高工资

***** ** ** ** ********************************************************

SELECT round(AVG(sal),2) FROM emp_tzm GROUP BY deptno HAVING AVG(sal)>2000

HAVING AVG(sal)>2000

HAVING 不能独立存在,必须跟在GROUP BY 子句之后

用于进行分组统计后进行过滤使用

与WHERE的区别:

WHERE是第一次差表的时候进行过滤,只有满足WHERE要求的记录才会被查询出来,

而HAVING是在查询出的数据基础上进行了分组统计后得到的结果进行过滤。所以WHERE先进行的过滤,HAVING 后进行

HAVING 中并非SELECT中查询什么,才可以用于过滤

查看平均工资高于2000的部门的最高工资与最低工资

SELECT MAX(sal),MIN(sal),deptno FROM emp_tzm GROUP BY deptno HAVING AVG(sal)>2000;

CREATE TABLE emp_tzm AS SELECT * FROM emp

多表关联查询

多表关联查询中连接条件是十分重要的,他能告知数据库在表与表的数据之间如何进行连线找到对应关系,从而查询数据

查看sales部门员工的姓名?

SELECT ename FROM emp_tzm,dept_tzm

WHERE (emp_tzm.deptno = dept_tzm.deptno )

AND dept_tzm.dname = 'SALES';

当查询的字段在联合查询的表中均有出现,那么必须明确指定从那张表上取该字段的值。

可以为表添加别名,然后使用别名来代替表名指定字段。

N张表查询至少要有N-1个连接条件,否则会出现笛卡尔积

笛卡尔积,结果集的条数是参与表的记录总数乘机的结果。是个无用的结果集,消耗资源巨大,要避免出现。

在达拉斯工作的人都有谁,工资多少

SELECT e.ename,e.sal,d.loc FROM emp_tzm e,dept_tzm d WHERE (e.deptno = d.deptno )

AND d.loc = 'DALLAS';

使用内连接实现关联查询:

内连接使用JOIN来连接表,在ON子句中填写连接条件,相对传统的关联查询语句而言,是将连接条件与过滤条件分开在不同的地方书写,语句表达更清晰

SELECT e.ename ,d.dname,e.sal FROM emp_tzm e JOIN dept_tzm d on e.deptno = d.deptno WHERE d.dname = 'SALES'

scott没有被查询出来,原因是scott不满足连接条件,其部门编号是50,dept表中没有部门号是50的记录。

SELECT e.ename ,e.job,e.sal,e.deptno ,d.dname FROM emp_tzm e JOIN dept_tzm d on e.deptno = d.deptno

外连接

当需要满足不同条件的记录也在关联查询中显示出来时,需要使用外连接。

外连接分为左外连接,右外连接,全外连接。

左外连接:以JOIN左侧的表为驱动表(显示所有数据的表),来自右面表中的字段当不满足连接条件时,全部为null

SELECT e.ename ,e.job,e.sal,e.deptno ,d.dname FROM emp_tzm e RIGHT|LEFT|FULL OUTER JOIN dept_tzm d ON e.deptno = d.deptno

自连接:

自连接的设计是指自己表与自己表有一个关联关系,意思是:自己表的一条记录可以对应子集表的多条记录。这样的设计往往是用于保存同样类型的数据。但是又存在父子级(上下级)关系的树状结构

员工和上司

SELECT e.ename ,m.ename FROM emp_tzm e ,emp_tzm m where e.mgr = m.empno(+)

king的下属都有谁

SELECT e.ename FROM emp_tzm e ,emp_tzm m where (e.mgr = m.empno(+)) and m.ename = 'KING'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: