9. Sql培训 三、常见的sql命令的使用
i.select
Select的功能是从数据库的表中提取数据。
Select语句是sql中涉及到的知识点最多也最富变化的一个语句。
基本的select语句
select col1,col2 ..
from table1 , table2
where 连接 + 条件
order by …
一些技巧可能会提高效率:如表的连接顺序,变量绑定等。
10. Sql培训 1.1sql的嵌套
两种方式
1.select a.*,b.dwmc
from (
select * from ys_dba01
where rq=? and dwdm=?
) a,ys_daa01 b
where a.jh=b.jh
2.select a.*, (select dwmc
from ys_daa01
where jh=a.jh)dwmc
from ys_dba01 a
Where rq=? and dwdm=?
11. Sql培训 1.2一些常用的语法
标准sql关键字
not,and, or, between and,>,<,>=,<=,<>,!=, in,is null,is not null,exists,nvl
日期函数
to_char,to_date,sysdate,trunc,round,last_day,month_between,add_months,+,-
常见的日期格式 yyyy,mm,d,dd,ddd,hh,hh24,mi,ss,month,day,cc
字符串函数
Substr,instr,length,to_number(强制类型转换)
数字函数
Round,trunc,to_char
控制函数
Decode,case when
12. Sql培训 1.3表连接
表连接是用来在进行多表查询时,指定各表之间的关系。
表连接大体分为以下几种
交叉连接,内连接和外连接
其中外连接又分为左连接,右连接和全连接
写法
select *
from a cross join b交叉连接
select *
from a inner join b on a.id=b.id 内连接
select * from a left outer join b on a.id=b.id 左连接
select * from a right outer join b on a.id=b.id 右连接
select * from a full outer join b on a.id=b.id 全连接
(Hash Join,sort merge join)
13. Sql培训 oracle过去的写法
select * from a,b交叉连接
select * from a,b where a.id=b.id 内连接
select * from a,b where a.id=b.id(+)左连接
select * from a,b where a.id(+)=b.id右连接
oracle原先的写法不支持全连接
15. Sql培训 1.5 oracle的sql分组(group by)
分组函数,顾名思义就是对已有结果即进行分组后进行相应运算后得出结果。
因为要按照某一字段进行分组,因此结果记得数量一般会减少。
select dwdm,count(distinct jh),sum(rcyl1)
from ys_dba01
where rq>sysdate-1
group by dwdm
分组后对选取字段的要求:只有group by后出现的字段才能够被直接查询,其他的字段必须通过汇总函数进行查询。
18. Sql培训 group by的一些特殊写法
1.对group by的强化
cube,rollup和grouping sets
select a,b,c,count(*)
from table1
group by cube(a,b,c)
可以领过结合这些写法,得到任意复杂的结果集
另外可以借助函数grouping_id获得具体某一行的分组方式。
2.Having子句
20. Sql培训 1.7 oracle中的递归connect by
select res_id,level lvl,
lpad(‘ ’,(level-1)*4)||res_desc
from u_resource
connect by prior res_id=parent_d
start with parent_id=0
order siblings by res_order
注意level伪列的使用
另外oracle10g中增加了伪列connect_by_isleaf,用于判断是不是叶子节点,并且加入了对递归循环的处理,并且可以通过伪列connect_by_iscycle来判断是否存在环。
21. Sql培训 1.8 几个sql的写作技巧
1.使用decode(或case when)实现行转制列
select dwdm, count(decode(rq, trunc(sysdate-3),jh))js1,
count(decode(rq, trunc(sysdate-2),jh))js2,
count(decode(rq, trunc(sysdate-1),jh))js3
from ys_dba01
where rq between trunc(sysdate-3) and trunc(sysdate-1)
group by dwdm
2.使用decode(或case when)实现一条sql多种条件的汇总结果
select rq,
sum(case when 正常井 then 1 end)zjs,
sum(case when 正常开井 then 1 end)kjs
from ys_dba01,ys_daa01
where ys_dba01.jh=ys_daa01.jh and rq=?
group by rq
22. Sql培训ii Insert
Insert是往数据库中插入记录的语句。
主要有两种写法
insert into table(col1,col2,col3…)
values(val1,val2,val3…)
insert into table(col1,col2,col3…)
select col1,col2,col3…
from table
where ..
注意 1.Table后的参数列表如果不写,oracle会按照数据字典中表中字段的顺序进行排列,由于表结构可能发生变化,所以建议不要省去这部分。
2.insert语句会锁定更新的表,产生行锁或表锁,因此执行完后要及时提交或回滚,避免出现表竞争甚至死锁。
23. Sql培训iii update
update table set col1=val1,col2=val2,col3=val3…
where …
使用update实现多行更新的写做技巧
由于oracle不支持关联后的结果集的直接更新,因此使多表之间的关联赋值编的比较复杂。
update customers a -- 使用别名set (city_name,customer_type)=(
select b.city_name,b.customer_type
from tmp_cust_city b
where b.customer_id=a.customer_id
)where exists (
select 1 from tmp_cust_city b
where b.customer_id=a.customer_id)对表b进行了两次全表扫描
24. Sql培训Merge语句的使用
merge into table_name table_aliasusing table on (join cnodition)when matched then update set col1 =col_val1, col2 = col_val2when not matched theninsert (column_list) values (column_values);