Oracle之-查询(二)

本文主要讲解一下几个方面:
1.分组(group by)

  1. 分组之后的条件判断 having
    3.SQL语句中的语法关键字
    4.子查询
    5.伪列
    6.多表操作

1.分组(group by)

select department_id,count(*) from employees group by department_id

eg:查询每个部门中员工的平均工资

select department_id,avg(salary) from employees group by department_id

eg:查询每个部门中的每个工种的最大工资

select department_id,max(salary) from employees group by department_id,job_id

eg:查询1997年每个月份入职的员工人数

select to_char(hire_date,'mm'),count(*) from employees where to_char(hire_date,'yyyy')='1997' group by to_char(hire_date,'mm')
  1. 只有出现在group by中的列名,才可以书写在select字句中。

  2. 如果列名出现在组函数中,也可以书写在select字句中。

  3. 普通的内置函数,如果应用在了group by子句中,可以书写在select字句中。

  4. 分组之后的条件判断 having
    eg: 平均工资大于5000 这些部门?

select department_id,avg(salary) from employees group by department_id having avg(salary)>5000

having的使用依据: 如果你的条件判断中,涉及到应用组函数的条件判断,则需要使用having,其他条件判断 需使用 where
eg:查询1997 12年个月中 大于2人 入职的这些月份及其员工

select count(*),to_char(hire_date,'mm')from employees where to_char(hire_date,'yyyy')=1997 group by to_char(hire_date,'mm') having count(*)>2

3.SQL语句中的语法关键字
语法关键字的顺序:
select from [where group by having order by]

4.子查询
查询效率偏低,尽量避免使用。
在一个SQL语句中,嵌套另一个SQL语句
1.单值where子查询
where子句中,嵌套的SQL语句的返回值是一个结果。= > <操作处理。
2.多值where子查询
嵌套的SQL语句的返回值是一个结果 in 关键字处理
3.from 子查询
注意:from 表名
from (sql 语句)
结论:让sql语句的查询结果,充当表概念。
绝大多数情况下 from子查询 很少使用,对查询内容 做一些预处理工作。
5.伪列
特殊列:不需要程序员手工创建的列,oracle自动创建。
1.rowid
行数据,再数据库中唯一标识,代表行数据所对应的物理存储空间
2.rownum 分页操作
对本次查询结果,符合要求的数据进行标号
Oracle的分页sql的书写

select * from(select e.*,rownum r from employees e) where r>=11 and r<=20

select e.*,rownum r from employees e 在查询时为rownun进行预处理编号 使用别人为了防止内层和外层冲突。

6.多表操作
多张表的关系(联系)体现 外键(foreign key)
1.外键:一张表的主键作为另一张表的外键进行存储
外键要保证参照完整性,外键存储的内容一定要来源于另一张表以及存在的主键内容
外键多建立在字表
2.多表连接的语法
为什么要做多表连接呢?
在操作中可能需要涉及到两张 或者 多张表数据的同时展示。
a.内连接 (innner join)
eg:

select e.*,d.* from employees e inner join departments d on e.department_id = d.department_id

inner join 只会链接2张表中可以连接的数据,不能连接的数据不连接
b.左外连接 (left outer join)
eg:

select e.*,d.* from employees e left outer join departments d on e.department_id = d.department_id

left outer join 左边的表全部查询出来,右边表能够连接的连接出来,不能连接的补null。
3.右外连接 (right outer join)

select e.*,d.* from employees e right outer join departments d on e.department_id = d.department_id

right outer join 右边的表全部查询出来,左边表能够连接的连接出来,不能连接的补null。
4.多表连接
eg:A,B,V 三个表连接
可以先把ab连接成一个表,再与c进行连接。

select a.*,b.*,c.* from A a inner join B b on xxx jnner join C c on xxx

你可能感兴趣的:(Oracle之-查询(二))