设为首页 收藏本站
查看: 609|回复: 0

[经验分享] Oracle 笔记之高级查询

[复制链接]

尚未签到

发表于 2018-9-9 09:26:38 | 显示全部楼层 |阅读模式
  为列起别名
  目的 我们进行查询时 经常查询某一列时使用的是表达式 SELECT enamme,sal*12 FROM emp
  这样不好的地方是第二列在查询后列用使用的就是sal*12.这样的可读性比较差为此我们会为列起别名,来增加可读性
  别名本身不区分大小写,若希望区分,则别名需要使用双引号,当别名中含有空格,也应使用双引号
  SELECT ename,sal*12 "Annual Salary" FROM emp;
  WHERE子句
  用于在查询数据的过程中过滤记录的,只有满足WHERE子句中的条件的记录才会被查询出来, 数据库在查询表的时候,每一条记录都要经过一次WHERE的过滤
  查看工资小于2000的
  SELECT ename,sal FROM emp WHERE salTO_DATE('1980','YYYY');
  查询sal大于1000 且工作为clerk
  SELECT ename,sal,job FROM emp WHERE sal>1000 AND job='CLERK';
  查询工资大于1500的CLERK 或者是不限制工资的所有SALESMAN
  SELECT * FROM emp WHERE sal>1500 AND job='CLERK' OR job ='SALESMAN';
  提高优先级的意思是 查看工资大于1500的CLERK 和SALESMAN
  SELECT * FROM emp WHERE sal>1500 AND (job='CLERK' OR job ='SALESMAN');
  查看emp表中ename 第二个字母的是A的名字
  SELECT * FROM emp WHERE ename LIKE '_A%';
  IN 比较符 可以比较等于列别中的其中之一
  SELECT * FROM emp WHERE job IN('MANAGER','CLERK'); ==SELECT * FROM emp WHERE job='MANAGER' OR job='CLERK';
  查询不等于MANAGER 和CKERK的所有工作
  SELECT * FROM emp WHERE job NOT IN('MANAGER','CLERK');
  SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000;
  SELECT * FROM emp WHERE sal>ANY(3000,2000,4000);
  SELECT * FROM emp WHERE sal*12>50000;
  SELECT ename,sal FROM emp WHERE UPPER(ename) = upper('rose');
  DISTINCT关键字用于去除给定列的重复数据 查看公司都有哪些职位,重复的去除
  SELECT DISTINCT job FROM emp;
  当我们对多个列进行去重复时,表示这几个列的值的组合没有重复的
  SELECT DISTINCT deptno,job FROM emp;
  ORDER BY子句,用于对结果集进行排序
  ORDER BY子句只能出现在SELECT语句的最后。
  ORDER BY 后面可以指定若干字段,排序优先级为从左到右,
  ASC 表示升序,默认就是升序,所以可以不写
  DESC表示降序
  按照部门编号从小刀大进行排序结果集
  SELECT * FROM emp ORDER BY deptno
  查询emp表里部门为10的工资和姓名 并降序排列
  SELECT ename,sal FROM emp WHERE deptno =10 ORDER BY  sal DESC;
  在排序一个含有NULL值的字段时,NULL值被认为是无限大,所以在降序排序时,NULL值会出现在最前面
  -------------------------------------------------------------------------------------------
  聚合函数
  MAX和MIN
  SELECT MAX(sal) FROM emp;
  ***聚合函数都是忽略NULL值
  SELECT MAX(sal) as "最大",MIN(sal) as "最小" FROM emp;
  SELECT AVG(NVL(comm,0) ) as "平均值" FROM emp;
  SELECT AVG(sal),SUM(sal) FROM emp;
  SELECT COUNT(comm) FROM emp;--统计条数,不统计值
  SELECT COUNT(*) FROM emp;--统计整张表有多少条记录
  GROUP BY子句 用于将表里的数据进行 分组,分组原则为GROUP BY 后面给定的字段的值相同的记录看做一组
  查看每个部门的最大工资 最小工资等:
  SELECT MAX(sal),MIN(sal),AVG(sal),SUM(sal),deptno FROM emp GROUP BY deptno;
  聚合函数又称组函数
  SQL有一个要求
  在SELECT子句红若出现了组函数,那么不在组函数中的其他字段,必须出现GROUP BY 子句中,但是反过来则不是必须的
  若字段中每条疾苦的值都不重复,那么该字段通常不应该在GROUP BY子句中作为分组的参照。
  若指定了GROUP BY子句,那么SELECT子句中不在组函数中的其他字段且不在GROUP BY子句中则不能出现
  WHERE 与HAVING的区别
  相同点,都是用作过滤,只不过HAVING是用在第二次过滤的,WHERE是用在第一次查询表的时候过滤条件的。
  HAVING是在第一次查询后,得到结果的基础上再次进行过滤使用的。
  ---------------------------------------
  查询优先级
  from子句,执行顺序,从后往前,从右到左 数据量少的放后面
  where子句 执行顺序为自上而下,从右到左,将能过滤掉最大数量记录的条件卸载where子句的最右
  group by 执行顺序从左往右分组
  select子句,少用*号 尽量取字段名
  ----------------------------------------------------------------------------
  关联查询
  N张表联合查询,至少要有N-1个连接条件,否则会产生笛卡尔积:A表的记录总数*B表的记录总数,无意义的结果集
  两张表联合查询,要添加至少一个连接条件。因为查询时很难避免两张表出现相同名字的字段,为了解决这个问题,可以
  使用 表名.字段 来确认
  若别名比较长,柯表名叫上别名来简化
  SELECT e.ename,e.sal,d.dname,e.deptno FROM emp e,dept d WHERE e.deptno = d.pdeptno;
  SELECT e.ename,e.sal,d.dname,e.deptno FROM emp e JOIN dept d ON(d.deptno=e.deptno);
  SQL89标准时,弊端在于,连接条件与过滤条件都要写在where子句中,可读性相对较差,尤其多表查询加上过滤条件多的时候。
  SELECT e.ename,d.DNAME  FROM emp e,dept d WHERE d.DEPTNO=e.DEPTNO AND d.DNAME='SALES';
  SQL92建议多表连接用 用SELECT ... FROM JOIN...ON ...WHERE(只写条件)
  SELECT e.ename,d.dname FROM emp e JOIN dept d ON e.deptno = e.deptno WHERE d.dname ='SALES'
  SQL92标准建议我们在夺标连接时使用内连接形式
  这样会发现,连接条件单独定义在ON子句中,而过滤条件卸载WHERE子句中,可读性比较强
  SELECT e.ename,d.dname FROM emp e JOIN dept d ON e.deptno=d.deptno WHERE d.dname='SALES';
  外连接
  自连接
  当前表中的数据关联 表中的其他数据。就构成了自连接。通常表被设计成自连接是为了表示同类型数据有存在上下级关系(树状结构的数据通常设计为自连接。)
  例如:淘宝网的类别。就被设计为自连接。
  设计表的时候以及关联关系时通常有两个字段很重要,他们被称为:主键外键
  通常每张表的第一个字段就是主键,主键保存的数据一般与数据无关系,他只是用来标识每条数据的唯一性,所以主键的要求是
  存储的值非空且唯一。
  外键,用来保存关系表中记录的主键的值,例如
  部门表中有一个字段叫做dept,它用来保存dept表中某条记录主键的值那么emp表的dept就是外键
  在关联关系中,保存外键的表通常是“一对多”中“多”的一方


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-568531-1-1.html 上篇帖子: oracle之安装 下篇帖子: Oracle 笔记之子查询
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表