Oracle篇--03 Oracle SQL(基础查询)、SQL关联查询


1.SELECT子句

SELECT子句中可以使用函数或表达式,那么结果集中对应的该字段名就是这个函数或表达式,可读性较差,

为此可以为这样的字段添加别名,那么结果集会以这个别名作为该字段的名字。

SELECT name,salary*12 sal FROM employ_lcz;

2.WHERE子句

SELECT *FROM employ_lcz WHERE DEPTNO=10;

SELECT name,salary from employ_lcz where salary<2000;

3.AND、OR关键字

查询薪水大于1000并且职位是‘CLERK’的职员信息

SELECT name,salary,job FROM employ_lcz WHERE salary>1000 AND job='CLERK'; 

查询薪水大于1000或职位是‘CLERK’的职员信息

SELECT name,salary,job FROM employ_lcz WHERE salary>1000 OR job='CLERK'; 

AND的优先级高于OR,可以通过括号来提高OR的优先级

4.LIKE条件

比较操作符LIKE用来做模糊查询

LIKE 需要借助通配符:%:表示0到多个字符 _:单个字符

查询第二个名字是A的员工

SELECT name FROM employ_lcz WHERE name LIKE '_A%';

5.使用IN和NOT IN

比较操作符IN用来取出符合列表范围中的数据

SELECT name,salary from employ_lcz where job in('CLERK');

6.BETWEEN...AND...

操作符用来查询符合某个值域范围条件内的数据

SELECT name,salary from employ_lcz where salary between  3500 and 5000;

7.使用 IS NULL和IS NOT NULL

空值NULL是一个特殊的值,比较的时候不能使用“=”,必须使用IS NULL,否则不能得到正确的结果。

查询哪些职员的奖学金数据为NULL

SELECT name,salary,comm from employ_lcz where comm IS NULL;

8.使用ANY和ALL条件

ALL和ANY不能单独使用,需要配合单行比较操作符>、>=、<、<=

9.使用DISTINCT过滤重复

数据表中有可能存储相同数据的行,当执行查询操作时,默认情况会显示所有行,不管查询结果是否有重复数据。当重复数据没有实际意义,经常会需要去掉重复值,使用DISTINCT实现。

查看有哪些职位

select job from employ_lcz;

select distinct job from employ_lcz;

10.使用ORDER BY 子句

对数据按一定规则进行排序操作,使用ORDER BY 子句,必须出现在SELECT中的最后一个子句

ASC:升序,不写默认就是升序

DESC:降序

select name,salary from emplop_lcz order by deptno;

11.聚合函数

聚合函数又叫多行函数,分组函数。聚合函数是对结果集某些字段的值进行统计的。

MAX,MIN:求给定字段的最大值和最小值

select MAX(salary) from employ_lcz;

select MIN(salary) from employ_lcz;

AVG,SUM:求平均值和总和

select MAX(salary) from employ_lcz;

select MIN(salary) from employ_lcz; 

COUNT函数:不是对给定的字段的值进行统计的,而是对给定字段不为NULL的记录数进行统计的。实际上所有聚合函数都忽略NULL值。

通常查看表的记录可以使用COUNT(*)

select count(*) from employ_lcz;

12.分组 GROUP BY子句

GROUP BY子句可以将结果集按照其后指定的字段值相同的记录看做一组,然后配合聚合函数进行更细分的统计工作。

查看每个部门的平均工资

SELECT AVG(sal),deptno from emplpy_lcz groud by deptno

查看每个职位的最高工资

SELECT MAX(salary),job from employ_lcz group by job

GROUP BY也可以根据多个字段分组,分组原则为这几个字段值都相同的记录看做一组。

查看同部门,同职位的平均工资

select avg(salary),job,deptno from employ_lcz group by job,deptno

SELECT 子句中含有聚合函数时,那么凡不在聚合函数中的其他单独字段都必须出现在GROUP BY 子句中,反过来则不是必须的。

WHERE中不能使用聚合函数作为过滤条件,原因是过滤时机不对,WHERE是在数据库检索表中数据时,对数据逐条过滤以决定是否查询出该数据时使用的,所以WHERE用来确定结果集中的数据。

使用聚合函数的结果作为过滤条件,那么一定是数据从表中查询完毕(WHERE在查询过程中发挥作用)得到结果集,并且分组完毕才进行聚合函数统计结果,得到后才可以对分组进行过滤,由此可见,这个过滤时机是在WHERE之后进行的。

聚合函数的过滤条件要在HAVING子句中使用HAVING必须跟在GROUP BY 子句之后。HAVING是用来过滤分组的。

13.查询语句执行顺序

1)from子句:执行顺序为从后往前、从右到左

数据量较少的表尽量放在后面

2)where子句:执行顺序为自下而上、从右到左

将能过滤掉最大数量记录的条件写在Where子句的最右

3)group-by执行顺序从左往右分组

最好在GROUP BY前使用WHERE将不需要的记录在GROUP BY之前过滤掉

4)having子句:消耗资源

尽量避免使用,HHAVING会在检索出所有记录之后才对结果集进行过滤,需要排序等操作。

5)select子句:少用*号,尽量取字段名称

OORACLE在解析过程中,通过查询数据字典将*号依次转换成所有的列名,消耗时间。

6)order by子句:执行顺序为从左到右排序,消耗资源

14.关联查询

从多张表中查询对应记录的信息,关联查询的重点在于这些表中的记录的对应关系,这个关系也被称为连接条件。

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

select emp.ename,emp.dname from emp,dept  where emp.deptno=dept.deptno

当两张表有同名字段时,SELECT子句中必须明确指定该字段来自哪张表。在关联查询中,表明也可以添加别名,这样可以简化SELECT语句的复杂度。

关联查询要添加连接条件,否则会产生笛卡尔积。笛卡尔积通常是一个无意义的结果集,它的记录数是所有参与查询的表的记录数乘积的结果。要避免出现,数据量大时极易出现内存溢出等现象。

select e.ename e.dname from emp e,dept d where e.deptno=d.deptno


15.内连接

内连接也是用来完成查询操作的。

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

select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno and d.dname=’SALES’

内连接

select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno where d.dname=’SALES’

16.外链接

外链接除了会将满足链接条件的记录查询出来之外,还会将不满足链接条件的记录也查询出来。

外链接分为:

左外链接:以JOIN左侧作为驱动表(所有数据都会被查询出来),那么当该表中的某条记录满足链接条件时来自右侧表中的字段全部填NULL

select e.ename,d.dname from emp e left outer join dept d on e.deptno=d.deptno 

右外链接:以JOIN右侧作为驱动表(所有数据都会被查询出来),那么当该表中的某条记录满足链接条件时来自右侧表中的字段全部填NULL

select e.ename,d.dname from emp e right outer join dept d on e.deptno=d.deptno

全连接:

select e.ename,d.dname from emp e full outer join dept d on e.deptno=d.deptno

17.自连接:

自连接即:当前表的一条记录可以对应当前表自己的多条记录,自连接是为了解决同类型数据但是又存在上下级关系的树状结构数据时使用的。

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

select e.ename,m.ename from emp e,emp m where e.mgr=m.empno

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mind_programmonkey

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值