之前学习oracle数据库没有一个很深入的学习,如今工作中再次用到oracle数据库,并且常用的都是一些关联查询,在此对SQL查询做一个总结(以 表d,表c为例):
create dempt (dempt_id number ,dempt_name varchar2(20),dempt_arae varchar2(20)); create constans (c_id number , c_name varchar2(20), dempt_id number ,c_sales number ); insert into dempt values(1,'d_a','d_1'); insert into dempt values(2,'d_b','d_2'); insert into dempt values(3,'d_c','d_3'); insert into dempt values(4,'d_d','d_4'); insert into dempt values(5,'d_e','d_5'); select * from dempt ; insert into constans values(1,'y_a',1,20); insert into constans values(2,'y_b',2,30); insert into constans values(3,'y_c',3,40); insert into constans values(4,'y_d',2,50); insert into constans values(5,'y_e',4,60); insert into constans values(6,'y_f',1,70); select * from constans;
迪卡尔积关联:
select * from dempt d , constans c; 返回的结果集为表c记录数*表d记录数
笛卡尔积特点:
--代表from后面表中所有列 --返回结果数量是各个表记录的乘积 --结果是d每条记录与c每条记录结合形成
注意:
数据重复是笛卡尔积给我们在工作中带来常见的困扰,就是要对数据进行去重 (增加where 条件对结果集进行过滤)
where 条件即为 满足:n-1个,n为所要查询表的数量 。
内关联查询:join.... on.....
---内连接 (inner) join .....on... (inner可省略) ------>等值连接查询 所谓的内连接查询就是等值条件查询,
结果 集只返回满足条件等值 =
即为 where 等值查询, inner join....... on.....
--等值连接 = join....on..... (内连接查询) ---where 等值关联 与 join.....on.... 同义(结果集一样)join...on...为内连接标准写法,
where 条件 <====> join.....on... 可以互相转换
where 条件:
select c.c_id, d.dempt_id,c.dempt_id,c.c_name,d.dempt_name,d.dempt_arae ,c.c_sales
from constans c, dempt d where c.dempt_id =d.dempt_id;
inner join...on...:
select c.c_id,c.c_name,d.dempt_name,d.dempt_arae ,c.c_sales
from constans c join dempt d on c.dempt_id =d.dempt_id;
join......using.....
select c.c_id,c.c_name,d.dempt_name,d.dempt_arae ,c.c_sales
from constans c join dempt d using(dempt_id);
join...using...使用注意事项:
--关联的两个表中需要有相同的字段.(名字和类型相同) --关联的字段在使用时不能加别名
外连接查询 (outer) join.....on...
(1)左连接查询 left (outer) join......on....
--就是将左表(主表)中所有数据分别与右表每条数据进行连接组合,除了内连接查询外的数据,
还有左表中不符合条件的数据,并在右表的相应列中填上null值
select c.c_id,c.c_name,d.dempt_name,d.dempt_arae ,c.c_sales from constans c left join dempt d
on c.dempt_id =d.dempt_id;
--转换成where (+)表示为补充表,另外一个表即为主表
select c.c_id,c.c_name,d.dempt_name,d.dempt_arae ,c.c_sales from constans c,dempt d
where c.dempt_id =d.dempt_id(+);
(2)右连接查询 right (outer) join ....on.....
--就是将右表(主表)中所有数据分别与左表每条数据进行连接组合,除了内连接查询外的数据,
还有右表中不符合条件的数据,并在左表的相应列中填上null值
select c.c_id,c.c_name,d.dempt_name,d.dempt_arae ,c.c_sales from constans c right join dempt d
on c.dempt_id =d.dempt_id; --转换成where (+)表示为补充表,另外一个表即为主表 select c.c_id,c.c_name,d.dempt_name,d.dempt_arae ,c.c_sales from constans c,dempt d
where c.dempt_id(+)=d.dempt_id;
(3)全查询 full (outer) join ....on...
--全外连接就是将左表的所有数据分别与右表的每条数据进行连接组合,返回的结果除了内连接的数据外,
还有两个表中不符合条件的数据,并在左表或者右表的相应列中填上null值 select c.c_id,c.c_name,d.dempt_name,d.dempt_arae ,c.c_sales from constans c full join dempt d
on c.dempt_id =d.dempt_id;
group by 分组查询(聚合函数结果集汇总)having 限制返回结果集(条件限制)order by 排序
在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数。
select c.c_id ,count(c.c_sales), c.c_name from constans c, dempt d
where c.dempt_id =d.dempt_id
group by c.c_name,c.c_id;
常用聚合函数:
count()与count(*) 计数
count(): 括号中可以指定字段进行计数
count(*):精确返回表行数
注意:
COUNT(*)函数将准确地返回表中的总行数,而仅当COUNT()函数的参数列没有NULL值时,才返回表中正确的行计数,
所以仅当受NOT NULL限制的列作为参数时,才可使用COUNT( )函数代替COUNT(*)函数。
sum()求和
数据类型必须为数值类型
AVG() 平均值
AVG()函数在计算一列的平均值时,忽略NULL值。但是,如果在该列中,所有行的值都是NULL,则AVG()函数将返回NULL值。
MAX() ,MIN()最大值与最小值
确定列中的最大值(最小值)时,MAX( )(MIN( ))函数忽略NULL值。但是,如果在该列中,所有行的值都是NULL,
则MAX( )/MIN( )函数将返回NULL值。
having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。
当在gropu by 子句中使用having 子句时,查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having 与where 子句类似,均用于设置限定条件 where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚合函数,使用where条件显示特定的行。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚合函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
使用order by排序时order by子句置于group by 之后 并且 order by 子句的排序标准不能出现在select查询之外的列。