SQL基础查询--Oracle(三)

DQL查询语句

使用别名

SELECT子句中可以使用函数或表达式,那么结果集中对应的该字段名就是这个函数或表达式,可读性差,为此可为这样的字段添加别名。中间可加或者不加AS关键字。
别名本身不区分大小写,而且不能含有空格。如果希望别名区分大小写或含有空格,可以使用双引号。

SELECT name,salary*12  AS "annual salary"
FROM myemp;

查询条件

使用<,>,>=,<=,<>,!=,=
查询职员表中不属于部门10的员工信息(<>等价于!=)

SELECT name,salary,job
FROM myemp
WHERE deptno<>10;

查询职员表中在2002年一月一日以后入职的职员信息,比较日期类型数据

SELECT name,salary,hiredate 
FROM myemp
WHERE hiredate>to_date('1982-1-1','YYYY-MM-DD');

使用AND,OR关键字

在SQL操作中,如果希望返回的结果必须满足多个条件,应该使用AND逻辑操作符连接这些条件;如果希望满足若干条件之一即可可以使用OR逻辑操作符连接这些条件。
查询薪水大于1000并且职位为‘clerk’的职员信息

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

查询薪水大于1000或者职位为‘clerk’的职员信息

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

查看工资高于1000的职位是clerk或salesman
AND的优先级高于OR,可以通过括号来提高OR的优先级

SELECT name,salary,job
FROM myemp
WHERE sallary>1000
AND (job='salesman' OR job='clerk');

使用LIKE条件(模糊查询)

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

SELECT name,job
FROM myemp
WHERE name LIKE '_A%N';

IN(list)和 NOT IN(list)

判断是否在列表中或不在列表中
常用来判断子查询的结果

SELECT name,job 
FROM myemp
WHERE job IN('manager','clerk');
SELECT name,job 
FROM myemp
WHERE deptno
 NOT IN(10,20);

BETWEEN… AND…

判断在一个区间内
工资在1500到3000之间的员工

 SELECT name,salary
 FROM myemp;

IS NULL和 IS NOT NULL

空值NULL是一个特殊的值,比较的时候不能用“=”

SELECT name,salary,comm
FROM myemp
WHERE comm IS NULL;

ANY和ALL条件

需配合>,<一起使用
ANY和ALL条件常用于子查询。

<ANY:小于最大 > ANY:大于最小 <ALL:小于最小>ALL:大于最大

 SELECT empno,name,job,salary,deptno
  FROM  myemp
 WHERE  > ANY(3500,5000,4500); 

使用函数或者表达式作为过滤条件

 SELECT  name,salary,job
 FROM myemp
 WHERE name=UPPER('scott');
  SELECT  name,salary,job
 FROM myemp;

DISTINCT关键字

对结果集中指定字段值重复的记录进行去重
查看公司有哪些职位?

SELECT DISTINNCT job
FROM myemp;

多字段去重是对这些字段值的组合去重

SELECT DISTINCT job,deptno
FROM myemp;

ORDER BY子句

对数据按一定规则进行排序操作
ASC:升序,不写默认升序
DESC:降序
若排序的字段中含有NULL值,NULL被认为是最大值。

SELECT name,salary
FROM myemp
ORDER BY salary ASC;

多个字段排序:按照第一个字段排序,当第一个字段有重复值时才会按照第二个字段排序,以此类推。每个字段都可指定排序方式。

SELECT name,salary,deptno
FROM myemp
ORDER BY deptno ASC ,salary DESC;

聚合函数

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

MAX,MIN

求给定字段的最大值与最小值
查看公司的最高工资与最低工资

SELECT MAX(salary),MIN(salary)
FROM emp;

AVG,SUM

求平均值和总和

SELECT AVG(sal),SUM(sal)
FROM emp;

COUNT函数

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

SELECT COUNT(comm)
FROM myemp
SELECT COUNT(NVL(comm,0))
FROM myemp;

查看表的记录数

SELECT COUNT(*)
FROM myemp;

查看平均绩效,不忽略null

SELECT AVG(NVL(comm,0)),SUM(comm)
FROM myemp;

GROUP BY 子句

可将结果集按照其后指定的字段值相同的记录看做一组,然后配合聚合函数进行更细分的统计工作。
查看每个部门的平均工资

SELECT AVG(sal),deptno
FROM myemp
GROUP BY deptno;

GROUP BY也可以根据多个字段分组,
分组原则为这几个字段都相同的记录看做一组。
当SELECT字句中含有聚合函数时,那么凡不 在聚合函数中的其他单独字段必须出现在GROUP BY 字句中,反过来则不是必须的。
查看同部门同职位的平均工资

SELECT AVG(salary),job,deptno
FROM myemp
ORDER BY job ,deptno;

WHERE不能使用聚合函数作为过滤条件,原因是过滤时机不对。
WHERE是在数据库检索表中数据时,对数据逐条过滤以决定是否查询出该数据时使用的,所以WHERE用来确定结果集的数据。
使用聚合函数的结果作为过滤条件,那么一定是数据从表中查询完毕(WHERE在查询中发挥作用)得到结果集,并且分组完毕才进行聚合函数统计结果,得到后才可以对分组进行过滤,由此可见,这个过滤时机是在WHERE之后进行的。
聚合函数的过滤条件要在HAVING字句中使用,HAVING必须跟在GROUP BY子句之后。HAVING是用来过滤分组的。
查看平均工资高于2000的部门的平均工资

SELECT AVG(salary),deptno
FROM myemp
GROUP BY deptno
HAVING AVG(salary)>2000;

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

SELECT MAX(salary),MIN(salary),deptno
FROM myemp
GROUP BY deptno
HAVING AVG(salary)>2000;

查询语句的执行顺序

1、from子句
数据量较少的表尽量放在后面
2、where子句
将能过滤掉最大数量记录的条件写在where子句的最右
3、group by子句
最好在group by 前使用where将不需要的记录在group by之前过滤掉
4、having子句
having消耗资源,尽量避免使用。having会在检索出所有记录之后才对结果集进行过滤,需要排序等操作
5、select子句
少用*,尽量取字段名称
oracle在解析的过程中会现将*转换为列名,消耗时间
6、order by

猜你喜欢

转载自blog.csdn.net/coder_16/article/details/81475733