oracle基本语法(4)
1>多表联合查询
2>分组查询
3>子查询
————————————————————
一、多表联合查询
总结:
1.多表联合查询;你想要的要的数据,分布在多个表中,得从多个表中查询才能获取;但是必须加连接条件,如果不加,会出现大量的错误数据;
2.连接条件:分析表盒表之间的关系,分析清楚数据和数据之间的关系==》用表达式写出来即可;
3.一个连接条件可以连接2个表(只能连2个);如果需要连接N个表,至少需要N-1个条件;
注意:“未明确定义列”是指未说明该列是哪个表的。
多表联合查询语法:
select 列名1,列名2,列名3,…… from 表名1,表名2,表名3,... where 1个或者多个连接条件 [and 查询条件];
补充知识点:
多表联合查询时,查询项是某表的全部列 可使用 表名.*
为了结果清晰,可以使用ordery by 来选择按照某一列排序
————————————————————
二、分组查询
分组查询主要是用来统计的,一般根据某个列或者几个列来统计;
统计类型:求和、求平均值、最大、最小等等;
分组查询需要结合分组函数一起使用,实现查询结果;
常用分组函数:
count(参数):统计查询语句返回的行数;
max(参数):最大
min(参数):最小
avg(参数):平均值
sum(参数):求和
注意:参数一般是列名
总结:分组查询用于统计
关键词:group by 视情况使用
语法:
select 分组函数,列名(被分组) from 表名 group by 列名1,列名2,... order by 列名;
select 分组函数,列名(被分组) from 表名 group by 列名1,列名2,... having 条件;
order by 作用:排序,使结果更清晰
having 作用:分组后进行过滤数据使用
备注:
查询内容可以是分组函数,或者被分组列名,而且被分组的列名可加可不加,视情况而定,一般都加上。
group by 后面跟的是参与分组的列名,而且是用逗号,分隔的
________________________________________________
分组函数故障分析及解决:
一、
报错:不是单组分组函数
如果语句中使用了分组函数,则有两种情况可以使用:
1 使用group by:语句中存在group by即存在分组子句,并指定了分组条件,这样可以将分组条件一起查询出来
2 不使用group by:如果不使用分组的话,则只能单独使用分组函数,在使用分组函数的时候,不能出现分组条件之外的字段
如下不会报错:select ename,deptno,avg(sal) from emp group by ename,deptno;
如下会报错: select ename,deptno,avg(sal) from emp; 提示不是单组分组函数。
二、
当使用分组函数时,分组函数只能出现在选择列表、order by 和 having 子句中,而不能出现在 where 和 group by 子句中。另外,使用分组函数还有以下一些注意事项:
1、 当使用分组函数时,除了函数 count(*) 之外,其他分组函数都会忽略 null 行,当然 count(列名) 也会忽略 null 行。
2、 当执行 select 语句时,如果选择列表时包含列、表达式和分组函数,那么这些列和表达式必须出现在 group by 子句中。
3、 当使用分组函数时,在分组函数中可以指定 all 和 distinct 选项。其中 all 是默认选项,该选项表示统计所有行数据(包括重复行);如果指定 distinct,则只会统计不同行值。
4、 Having 是在 group by 语句之后。
三、
group by 用于对查询结果进行分组统计,而 having 子句则用于限制分组显示结果。注意,如果在选择列表中同时包含列、表达式和分组函数,那么这些列和表达式必须出现在 group by 子句中。
四、
使用 group by 子句、where 子句和分组函数有以下一些注意事项:
1、分组函数只能出现在选择列表、having 子句和 order by 子句中
2、如果在select 语句中同时包含 group by 、having 以及 order by 子句,则必须将 order by 子句放在最后。默认情况下,当使用 group by 子句统计数组时,会自动按照分组列的升序显示统计结果。通过使用 order by 子句,可以改变数据分组的排序方式。
3、如果选择列表包含有列、表达式和分组函数,那么这些列和表达式必须出现在 group by 子句中,否则会显示错误消息。
4、当限制分组显示结果时,必须要使用 having 子句,而不能在 where 子句中使用分组函数限制显示结果,否则会显示错误信息。
————————————————————
三、子查询
子查询:又叫嵌套查询;一个查询语句中又包含了查询语句;
目的:查询的过程中,想要的数据不是直接可以查询出来,需要拐个弯(借助别的查询语句)
常见2种用法:
1.子查询用在查询条件中;(重点)
2.子查询代替一个表;
子查询语法
select * from 表名 where 列名 运算符 (子查询语句);
delete from 表名 where 列名 运算符 (子查询语句);
子查询的使用原则
1.子查询一定要放在小括号:小括号优先级最高,保证子查询先执行==》搜索值
2.子查询语句放在查询条件的右侧,替换的是搜索值.where 列名 运算符 (子查询语句)
3.子查询分为单行子查询,多行子查询
单行子查询:子查询语句返回的查询结果是一个行,一个值(一个列);
多行子查询:子查询语句返回查询结果是多个行;多个值
单行子查询的运算符:=,!=,<,>,<=,>=
多行子查询的运算符:in all any
一个列对应多个值, 同一列名 in (搜索值1,值2,...),等价于:列名=值1 or 列名=值2 Or....
总结:all、any 需要结合>,<,>=,<=等一起使用;
all:跟子查询结果中所有的值进行比较,比赢所有的;>all(子查询):大于最大的 ;<all(子查询):小于最小的
any:跟子查询结果中所有返回值比较,比赢其中一个即可;>any(子查询):大于最小的;<any(子查询):小于最大的