16
17
5 基本查询
5.1 简单查询语句
查询所有列:select * from dept;
查询指定列:desc emp(显示表结构) select empno,ename,sal from emp;
查询日期列:日期列是指date类型列,默认显示格式为dd-mon-yy,不同语言和地区的日期显示结果
有所不同。如果想以自己习惯的日期格式显示日期值,必须要用to_char函数进行转换。
Select ename,to_char(hiredate,?YYYY-MM-DD? from emp; 上述语句显示格式:1980-12-17
取消重复行:默认会显示所有行,但完全相同的查询结果没有实际意义,因此有时需要取消重复结果 Select distinct deptno,job from emp;(显示三列都不相同的记录集)
18
Select distinct deptno;(只显示deptno不同的记录集) 使用算术表达式:可在数字列上用算术表达式(+,-,*,/) Select ename,sal,sal*12 from emp;
使用列别名:默认情况下,列标题是大写格式的列名或表达式,如果使用列别名,列别名可跟在列名
后,并且在二者之间可以加AS关键字,若列别名区分大小写、包含特殊字符或空格,必须用双引号引住
Select ename as name,sal*12 “Annual Salary” from emp;
处理NULL:NULL表示未知值,既不是空格也不是0。若没为列提供数据且该列无默认值,则其数据
为NULL。当算术表达式包含NULL时,其结果也是NULL。
Select ename,sal,comm,sal+comm from emp;
Select ename,sal,comm,sal+nvl(comm,0) from emp; Nvl(comm,0)说明:如果comm存在数值,则函数返回其原有数值;如果comm列为NULL,
则函数返回0。
连接字符串:连接字符串是使用||操作符完成的。如果在字符串中要加入数字值,那么在||后可以直接指
定数字;如果在字符串中加入字符和日期值,则必须用单引号引住。
Select ename||?的岗位是?||job “Employee” from emp; 或Select ename||?的岗位是?||job AS Employee from emp;
[注释:dual是一个虚拟表,用来查那些不属于实际表里的内容,如:select sysdate from dual; select 3+3 from dual;]
限制数据(条件查询)
条件查询中条件表达式中需要使用各种比较操作符,如(=,<>(!=),>=,<=,>,<,BETWEEN…AND…,IN(list),LIKE,IS NULL)
使用数字值:select ename,sal from emp where sal>2000;
使用字符值:select ename,sal from emp where job=?MANAGER?;//字符值必须用单引号引住 需要注意:字符值区分大小写
使用日期值:在where条件中使用日期值时,必须用单引号引住,并且日期必须符合默认日期显示格
式和日期语言。如果不符合默认日期显示格式,必须使用to_date函数进行转换。
Select ename,sal,hiredate from emp where hiredate>?01-1月-82?; 使用BETWEEN…AND操作符:
select ename,sal,job from emp where sal between 2000 and 4000
使用LIKE操作符:执行模糊查询。%:通配0或多个字符 _:通配单个字符
Select ename,sal from emp where ename like ?S%?//显示首字符为S的所有雇员名及
其工资
Select ename,sal from emp where ename like ?__o%?;
当希望使用这两个字符(%,_)招行模糊查询时,必须使用ESCAPE选项和转义
符实现。当使用ESCAPE选项时,需要在%或_前加转义符,并且在ESCAPE选项中指定转义符的名称。例:
Select ename,sal from emp where ename like ?%a_%? ESCAPE ?a?; 使用IN操作符:select ename,sal,job from emp where job in(?CLERK?,?MANAGER?) 使用IS NULL操作符:select ename from emp where mgr IS (NOT) NULL; 使用AND,OR,NOT操作符:
Select ename,sal,job,deptno from emp where deptno=20 and job=?CLERK?; Select ename,sal,job,deptno from emp where sal>2500 or job=?MANAGER? Select ename,sal,comm,deptno from emp where comm is not null;
19
5.2 排序数据
执行查询操作时,默认情况下Oracle以无序方式显示数据。为了更直观地显示数据结果,在实际应用中经常对数据进行排序
升序排序:默认数据以升序方式排列,当以特定列执行升序排序时,如果排序列存在NULL行,那么
NULL行会显示在最后面。
Select ename,sal from emp order by sal;
降序排序:必须指定DESC关键字,如果排序列存在NULL行,那么NULL行会显示在最前面。 Select ename,sal from emp order by sal desc;
使用多列排序:当以多列进行排序时,首先按照第一列进行排序,当第一列存在相同数据时,然后以
第二列进行排序。
SELECT ename,deptno,sal FROM emp ORDER BY deptno ASC,sal DESC;
使用非选择列进行排序:执行排序操作时,多数情况下会在选择列表中包含排序列,但选择列表也可
以不包含任何排序列。
SELECT ename FROM emp ORDER BY sal DESC;
使用列别名排序:如果在选择列表中为列或表达式定义了别名,那么当执行排序操作时,既可以使用
列或表达式进行排序,也可以使用列别名进行排序。
SELECT ename,sal*12 年收入 FROM emp ORDER BY 年收入 DESC;
使用列位置排序:排序操作不仅可以指定列名、列别名,也可以按照列或表达式在选择列表中的位置
进行排序。另外当使用UNION、UNION ALL、INTERSECT、MINUS等集合操作符合并查询结果时,如果选择列表的列名不同,并且希望进行排序,必须使用列位置进行排序。
SELECT deptno,dname FROM dept
UNION
SELECT empno,ename FROM emp ORDER BY 1;
6 复杂查询
6.1 数据分组
实际应用中,经常需要对数据进行统计。当统计数据时,需要将表的数据划分成几个组,最终统计每个组的数据结果。
1) 数组函数
分组函数用于统计表的数据,与单行函数不同,分组函数作用于多行,并返回一个结果,所以有时也称为多行函数。一般情况下,分组函数要与GROUP BY子句结合使用。在使用分组函数时,如果忽略了GROUP BY子句,那么会汇总所有行,并产生一个结果。
? MAX和MIN:用于取得列或表达式的最大值和最小值。
SELECT max(sal) 最高工资,min(sal) 最低工资 FROM emp; ? AVG和SUM:用于取得表达式的平均值或总和
SELECT avg(sal) 平均工资,sum(sal) 总计工资 FROM emp; ? COUNT:用于取得总计行数
20