关闭

Oracle笔记(三)

163人阅读 评论(0) 收藏 举报


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'

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2726次
    • 积分:127
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论