简单查询
(1)between and只限于数值型数据和日期型数据。
Select * from emp where birth between ‘1-1月-1990’and ’31-12月-1993’;
(2)去重distinct;
select distinct job,deptno from emp where sal>1500;
(3) 起别名,查询语句中使用运算符;
Select sal*12 年薪 from emp;
(4) nvl()函数对空值的处理;
Select sal+nvl(comm,0) 月薪 from emp;
(5)拼接字符串;
Select ‘姓名:’||ename||’工资:’||sal from emp where empno=5555;
(6)模糊查询;
like操作符的使用(%表示任意的多个字符, _表示的任意的单个字符);
select deptno,ename from emp where ename like ’%S%’;
select deptno ,ename from emp where ename like ’_S%’;
(7)in not in
select * from emp where empno in(7369,7499,7521);
select * from emp where empno not in(7369,7499,7521);
select * from emp where empno!=7369 and empno!=7499 and empno!=7521;
select * from emp where empno<>7369 and empno<>7499 and empno<>7521;
(8)is null操作:
Select ename,sal from emp where comm is null;
Select ename, sal from emp where comm is not null;
(9)对查询结果进行排序
select * from emp order by ename asc;———-升序;
select * from emp order by sal desc;———–降序;
select * from emp order by deptno desc,sal asc;———先按deptno降序后再按sal升序;
分组查询
常见的分组函数:(在分组之后使用的)
1.max():获取最大值
2.min():获取最小值
3.avg():获取平均值
4.count():获取总个数
5.sum():获取总和
分组函数只能用在select列中,having子句中,order by子句中。
经典例子:
–查询所有员工的最大工资(将所有员工视为一组,再在一组的所有员工中获取sal字段的最大值)
select max(sal) from emp;
select min(sal) from emp;
select avg(sal) from emp;
–获取sal列的总个数(具有sal列值的行的sal列出现的总个数)
select count(sal) from emp;–14
select count(comm) from emp;–3
–获取员工总数(获取总行数)
select count(*) from emp;–(固定语法)
–获取所有员工的工资共和(所有行具有的sal的值的总和)
select sum(sal) from emp;–29025
–获取30号部门的平均工资(先筛选出30号部门的行,再将这些行视为一组,再获取这一组中所有员工的sal列的平均值)
select avg(sal) from emp where deptno=30;
–查询工资最大的员工的姓名 和工资
–1.查询所有员工的最大工资
select max(sal) from emp;
–2.以查询出的最大的员工工资作为条件,去筛选最大工资员工
select ename,sal from emp where sal=(select max(sal) from emp);
-把工资低于平均工资的员工的工资加上100
–1.查询出所有员工的平局工资
select avg(sal) from emp;
–2.使用查询出的平均工资作为update语句的条件
update emp set sal=sal+100 where sal<(select avg(sal) from emp);
对分组后的结果进行查询,在查询结果中一行就是一组,
所以只能查询每组共有的数据,否则就出错了。
总结:
一个完整的select语句,各个子句的顺序:
select 列 from 表名 where子句 group by子句 having子句 order by子句;
完整的select语句的执行顺序:
1>from 数据源:从指定的物理表 虚拟表 视图中组成数据
2>where子句:筛选符合条件的结果(一般筛选符合条件的行)
3>group by子句:对where子句筛选的结果分组
4>分组函数: 1)分了组就可以执行分组函数了 2)在having子句中可能用到分组函数的结果
5>having子句:对group by子句分组的结果再进行筛选,拿到符合条件的组
6>表达式: 在order by子句中可能用到表达式
7>order by子句:对最终的结果进行排序
8>select列:在最终的结果中获取所需数据,所查询的数据必须在最终结果中,
否则报错。
Order by 之前执行表达式;
select ename 姓名,(sal+nvl(comm,0))*12 年薪 from emp order by 年薪 desc;
子查询
**子查询(嵌套查询):一个select语句中嵌套另一个select语句,
被嵌套的select语句称为子查询语句**。
1>子查询语句作为另一个select语句的where条件
1)单行单列子查询:用‘=’号;
作为where条件的子查询语句查询到的数据是单行单列(一个值)
–查询和Smith在同一个部门的所有员工的姓名和部门编号;
select ename,deptno from emp where deptno=(select deptno from emp where ename=’Smith’) and ename<>’Smith’; —–单行单列;
2)单行多列子查询:
作为where条件的子查询语句所查询的数据是单行多列(一条或半条记录
3**)多行单列子查询**: 用‘in’
作为where条件的子查询所查询的数据是一列多行()
–查询和10号部门的员工岗位相同的员工的姓名 职位 工资和所在部门编号;
select ename,sal,job,deptno from emp where job in (select distinct job from emp where deptno=10) and deptno<>10; ———一列多行;
all:表示查询到的结果的所有值
–2>使用all关键字,查询工资大于查询到的30号部门的所有工资的员工
select ename,sal,deptno from emp where sal> all(select sal from emp where deptno=30);
any:表示查询到的结果的任意值;
–2**>使用关键字any,查询工资大于30号部门的任意工资的员工**
select ename,sal,deptno from emp where sal>any(select sal from emp where deptno = 30)and deptno<>30;
–1.使用多个单行单列子查询
–查询和Smith所在部门和岗位都相同的员工的姓名 岗位 和所在部门编号;
select ename,job,deptno from emp where
(job,deptno) = (select job,deptno from emp where ename=’Smith’)
and ename<>’Smith’;
执行顺序;
内外select,先执行内后执行外;
并列select,先执行后再执行前。
–set列的顺序必须和子查询的列的顺序一致(用于update用于修改数据)
update emp set (job,comm) =(select job,comm from emp where ename=’Smith’) where deptno=(select deptno from emp where ename=’Smith’);
子查询语句的用途:数据备份,添加数据;
Create table emp2 as
Select * from emp where sal>2000;
Create table emp3 (ename1,dno) as———–顺序一致;
Select ename,deptno from emp where sal>2000;
Insert into emp2 select * from emp;
合并查询
就是将多个查询语句的结果进行合并。
1>并集:union all
2>并集并自动去重:union
3>交集:intersect
4>差集:minus
select ename,sal from emp where sal>1500
union all
select ename,sal from emp where job=’经理’ union all select ename,sal from emp where sal>1500
union
select ename,sal from emp where job=’经理’ union select ename,sal from emp where sal>1500;
intersect
select ename,sal from emp where job=’经理’ intersect select ename,sal from emp where sal>1500;
minus
select ename,sal from emp where job=’经理’ minus select ename,sal from emp where sal>1500;
oracle查询(简单查询(单表))
最新推荐文章于 2024-07-02 09:02:57 发布