sql操作基础学习笔记

来源:互联网 发布:优化最好的安卓系统 编辑:程序博客网 时间:2024/05/19 10:10

//连接符的使用,同时为列定义别名
select count(0)from (select yhnc||'('|| face||')' as line,zcyhid,face from lt_jswz_zcyhzb info)

select yhnc||'('|| inspect||')' as line,zcyhid,face from lt_jswz_zcyhzb

select yhnc ||cast(dj as varchar(10)) as line,zcyhid,face from lt_jswz_zcyhzb

//转译表达式还有一个很好的作用是截取部分某个字段长度的字符,这在对想只显示部分数据的查询时非常的有用
select face,cast(qm as varchar(8)) as line from lt_jswz_zcyhzb

//使用case表达式进行条件查询
select zcyhid,tt=
case
    when totle <10 then 100
    when 50>totle=>10 then 200
    else 0
end
from lt_jswz_zcyhzb

//函数的应用,截取部分的字符串函数,从开始的位置截取多少个字符的内容
select substr(QM,0,3) as line from lt_jswz_zcyhzb

//聚合函数的应用,sum数值列的和
select sum(dj) from lt_jswz_zcyhzb

//max函数,min
select max(dj) from lt_jswz_zcyhzb
select min(dj) from lt_jswz_zcyhzb

//使用count统计多列数据
select count(zcyhid) as a1,count(distinct dj) as a2,count(inspect) as a3 from lt_jswz_zcyhzb  where dj>'0'

//使用avg函数求平均值
select avg(dj) as line from lt_jswz_zcyhzb

//使用group by
select * from lt_jswz_zcyhzb  group by dj

//group by与having的区别
通常group by于having同时的使用,在having子句中同样的可以使用连接符、通配符、函数等
group by对查询的结果分组
having对查询的结果做更细的筛选,
如果指定了group by则作用于group by分组的结果
如果指定了where子句而没有制指定group by子句则作用于where的结果分组
如果既没有group by子句也没有where子句,则作用于select查询的结果
在数据的聚合分析中having和where子句可以共存,但是where子句早分组之前过滤数据,而having则过滤分组后的数据
//使用inner join内连接查询
select user_id,f.msg_title
from lt_jswz_ft f
inner join lt_jswz_zcyhzb y
on f.user_id = y.zcyhid
inner join lt_jswz_ht h
on f.user_id = h.user_id

//使用union运算符集合查询
select  user_id
from lt_jswz_ft
union (all)//加上all表示不去调重复的记录行,没有则相反
select user_id
from lt_jswz_ht

实际操作中的例子:

删除中的一个多表关联查询问题:
表a一对多表b;再由表b的多条件查出表c的多条行;最后删除查出的表c的多行
select * from lt_jswz_ht c where  c.msg_id in (select b.msg_id from lt_jswz_ft b where b.board_id ='002')

//这里要说一个in的用法;操作返回多行的条件也就是说in后可以跟着select子查询语句;
//说明,当子条件中只是在查询一行值时,将in换成“=”、*换成需查询的字段名即可
select * from lt_jswz_ht c where  c.msg_id =  (select b.msg_id from lt_jswz_ft b where b.board_id ='002')


 //一个简单的统计表中记录行数的查询语句
 select count(*) from lt_jswz_zcyhzb
 如果查询含有多列可以使用如下区别
 select count(*) as,avg(*) as a2 a1 from lt_jswz_zcyhzb

 //统计及日发贴的一个经典例子
 select count(*) from LT_JSWZ_FT where to_char(msg_posttime,'yyyy-mm-dd') = '2007-06-06'
 由于数据库子段存的长时间格式与当前取得时间条件无法比较,所以这样做:首先将当前时间的年月日取出
 String strtime=ds.getDateTime();
 String strdate=strtime.substring(0,10);
  得到的结果也就是2007-06-06作为查询的条件,而数据库中的字段也必须转换成短格式的字符串型,所以使用to_char(msg_posttime,'yyyy-mm-dd');由于sql中不能使用java的方法;

  //sql中模糊查询和精确查询格式上的区别
 select * from LT_JSWZ_ZCYHZB a wherea.zcyhid in (select b.zcyhid from zc_jswz_zcyhxx b  where b.yhmc like'%税务菜鸟%' ) order by a.dj desc
 子条件中的格式用于模糊查询,精确查询需要将(like '%税务菜鸟%')改成(= '税务菜鸟')

 //oracle的sql中取得最新纪录的最优化语句
 SELECT * FROM LT_JSWZ_ZCYHZB a WHEREa.zcyhid = (select zcyhid from(select * FROM ZC_JSWZ_ZCYHXX b order byzcsj desc) where rownum<=1)
 我举此例涉及到两个表条件涉及到两个字段
 其中selectzcyhid from(select * FROM ZC_JSWZ_ZCYHXX b order by zcsj desc)whererownum<=1;就是取到最新一位注册用户的id号语句,oracle不同于sql server不支持topn语法;而是使用select * FROM ZC_JSWZ_ZCYHXX b order by zcsjdesc排列记录集,然后使用select * from(...)where rownum<=n来检索你需要的数据;
select * from(select * FROM ZC_JSWZ_ZCYHXX b order by zcsj desc)where rownum<=n

  //更新一个表中的某个字段的所有值为一个特定值
  update lt_jswz_ft set [字段]='values'

原创粉丝点击