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'
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'
相关文章推荐
- Oracle笔记(一)
- Oracle笔记(二)
- ORACLE学习笔记(一)
- Oracle SQL优化文章不必再看
- Oracle建立表空间、用户、授权
- oracle创建表
- [置顶] Oracle PL/SQL中编写空操作的存储过程
- ASP.NET MVC - Entity Framework - Oracle - ORA-00942: table or view does not exist
- oracle常见错误
- Oracle的行转列的函数wm_concat的db2实现
- powerdesigner逆向导出oracle数据库结构显示备注
- 将来发运导致库存事务处理问题
- Oracle数据库错误码大全
- Oracle查询重复数据并删除,只保留一条记录
- oracle数据获取当前自然周,当前周的起始和结束时间
- Oracle 解决'PLAN_TABLE' is old version问题
- Oracle ADF获取AM及VO的方法
- oracle索引浅谈
- ORACLE PL/SQL编程之四: 把游标说透
- ORACLE游标概念讲解