您的位置:首页 > 数据库 > Oracle

Oracle之SQL基础--基本查询

2010-10-10 12:18 549 查看
作为DQL语句的最为关键的部分,select语句的用法非常的广泛,这里呢,采用scott用户下的emp表作为演示,该表由oracle数据库自带。以下的语句均在Oracle 9i当中调试过了,不会有问题,希望可以对大家有帮助,如果大家有什么好的高效的查询语句请告诉我。

语法:

SELECT [ALL|DISTINCT] column_name [expression...] FROM table1_name [,table2_name,view_name,...]

WHERE [condition]

[GROUP BY column_name1[,column_name2,...]] [HAVING group_condition]

[ORDER BY column_name2 [ASC|DESC] [,column_name2,...]]

1,无条件查询

查询所有 select * from emp;

查询指定列 select ename,sal from emp;

使用算术表达式 select ename,sal*0.8 from emp;

使用字符常量 select empno,'Name is: ',ename from emp;(这里它能够自动生成列,并且所有的值均为'Name is: ')

使用函数 select empno,UPPER(ename) from emp;

别名:select ename employeename,sal salary from emp;

使用连接字符串:select '员工号:'||empno||'员工名:'||ename from emp;

消除重复行:select distinct deptno from emp;

2,有条件查询

常用查询字符

运算符 说明 例子
= 等于 col=100
!=
<>
^= 不等于 col!=100
>= 大于等于 col>=100
<= 小于等于 col<=100
> 大于 col>100
< 小于 col<100
BETWEEN a AND b 从a到b的范围之内(包括a和b) col BETWEEN 100 AND 200
NOT BETWEEN a AND b 从a到b的范围之外(不包括a和b) col NOT BETWEEN 100 AND 200
IN (list) 和列表中的任何一个相等 col IN (100,200)
NOT IN (list) 和列表中的任何一个都不相等 col NOT IN (100,200)
IS NULL 等于null col IS NULL
IS NOT NULL 不等于null col IS NOT NULL
LIKE 和pattern相匹配 col LIKE 'A%'
NOT LIKE 和pattern不匹配 col NOT LIKE 'A%'

在这里呢,其实和基本的查询一样,只不过多了一些判断条件而已
select upper(ename) from emp where mgr is null;
在这里呢,查询条件使用not in 或者in 的时候里面的字符串就不能忽视大小写。
select ename from emp where ename not in('SMITH','alen');
以字母S结尾的名字
select * from emp where ename like '%S';
当然了多重条件就用and连接了
select * from emp where comm is not null and ename like '%A%';
但是在这里要考虑一下,比如三重条件,来看题目:
查找工资大于500或者职位是MANAGER并且名字以大写字母J开头的员工。
select * from emp where (sal>500 or job='MANAGER') and ename like 'J%';
在这里不能少了括号,所以要依据正确的逻辑判断条件来决定这些内容
3,查询排序
默认asc增序所以一般都不写
select empno,ename,sal from emp order by sal;
多列排序
select * from emp order by deptno asc,sal desc;
表达式排列
select * from emp order by sal*3;
这里呢,有一个很酷的功能也许用不上,它比较适合长字段
1其实就代表了empno
select empno,sal*12 yearsal from emp order by 1;
4,查询统计--
SELECT column,group_function,...

From table

[WHERE condition]

[GROUP [BY ROOLUP|CUBE|GROUPING SETS] group_by_expression ]

[HAVING group_condition]

[ORDER BY column[ASC|DESC]]

1),单列分组查询

查询每个部门的部门号人数和平均工资

SELECT deptno,count(*),avg(sal) FROM emp GROUP BY deptno;

2),多列分组查询

这里请小心,因为在select参数当中不能够出现非分组的列或者非聚集函数

SELECT deptno,job,count(*),avg(sal) FROM emp GROUP BY deptno,job;

下面将出现错误

SELECT ename,deptno,job,count(*),avg(sal) FROM emp GROUP BY deptno,job;

3),使用Having子句限制

select deptno,count(*),avg(sal) FROM emp Group BY deptno HAVING AVG(sal)>1800;

4),使用ROLLUP和CUBE选项

ROLLUP:生成横向统计和不分组统计

CUBE:生成横向统计、纵向统计和不分组统计

例如:查询各个工种的平均工资、每个部门的平均工资和所有员工的平均工资。

select deptno,job,avg(sal) from emp group by rollup (deptno,job);

查询各个部门各个工种的平均工资、各个工种的平均工资、每个部门的平均工资和所有员工的平均工资

select deptno,job,avg(sal) from emp group by cube (deptno,job);

5)合并分组查询

查询各个部门和各个工种的平均工资。

select deptno,job,avg(sal) from emp group by grouping sets (deptno,job);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: