书写格式 示例代码 存储过程SQL文书写格式例selectc dealerCode round(sum(c submitSubletAmountDLR + c submitPartsAmountDLR + c submitLaborAmountDLR) / count(*) ) as avg decode(null x xx CNY )from (selecta dealerCode a submitSubletAmountDLR a submitPartsAmountDLR a submitLaborAmountDLRfrom SRV_C_F awhere (to_char(a ORIGSUBMITTIME yyyy/mm/dd ) >= Date Range(start) and to_char(a ORIGSUBMITTIME yyyy/mm/dd ) <= Date Range(end) and nvl(a deleteflag ) <>)union allselectb dealerCode b submitSubletAmountDLR b submitPartsAmountDLR b submitLaborAmountDLRfrom SRV_CHistory_F bwhere (to_char(b ORIGSUBMITTIME yyyy/mm/dd ) >= Date Range(start) and to_char(b ORIGSUBMITTIME yyyy/mm/dd ) <= Date Range(end) and nvl(b deleteflag ) <>)) cgroup by c dealerCodeorder by avg descJava source里的SQL字符串书写格式例strSQL = insert into Snd_FinanceHistory_Tb + (DEALERCODE + REQUESTSEQUECE + HANDLETIME + JOBFLAG + FRAMENO + INMONEY + REMAINMONEY + DELETEFLAG + UPDATECOUNT + CREUSER + CREDATE + HONORCHECKNO + SEQ) + values ( + draftInputDetail dealerCode + + + draftInputDetail requestsequece + + sysdate + + + frameNO + + requestMoney + + remainMoney + + + + + draftStruct employeeCode + + sysdate + + draftInputDetail honorCheckNo + + index + ) ) 缩进对于存储过程文件 缩进为 个
空格对于Java source里的SQL字符串 不可有缩进 即每一行字符串不可以空格开头 ) 换行 >Select/From/Where/Order by/Group by等
子句必须另其一行写 >Select子句内容如果只有一项 与Select同行写 >Select子句内容如果多于一项 每一项单独占一行 在对应Select的基础上向右缩进 个空格(Java source无缩进) >From子句内容如果只有一项 与From同行写 >From子句内容如果多于一项 每一项单独占一行 在对应From的基础上向右缩进 个空格(Java source无缩进) >Where子句的条件如果有多项 每一个条件占一行 以AND开头 且无缩进 >(Update)Set子句内容每一项单独占一行 无缩进 >Insert子句内容每个表字段单独占一行 无缩进 values每一项单独占一行 无缩进 >SQL文中间不允许出现空行 >Java source里单引号必须跟所属的SQL子句处在同一行 连接符( + )必须在行首 ) 空格 >SQL内算数运算符 逻辑运算符连接的两个元素之间必须用空格分隔 >逗号之后必须接一个空格 >关键字 保留字和左括号之间必须有一个空格 不等于统一使用 <> Oracle认为 != 和 <>是等价的 都代表不等于的意义 为了统一 不等于一律使用 <>表示 使用表的别名
数据库查询 必须使用表的别名 SQL文对表字段扩展的兼容性 在Java source里使用Select *时 严禁通过getString( )的形式得到查询结果 必须使用getString( 字段名 )的形式使用Insert时 必须指定插入的字段名 严禁不指定字段名直接插入values 减少子查询的使用 子查询除了可读性差之外 还在一定程度上影响了SQL运行效率请尽量减少使用子查询的使用 用其他效率更高 可读性更好的方式替代 适当添加索引以提高查询效率 适当添加索引可以大幅度的提高检索速度请参看ORACLE SQL性能优化系列 对数据库表 *** 作的特殊要求 本项目对数据库表的 *** 作还有以下特殊要求 ) 以逻辑删除替代物理删除注意 现在数据库表中数据没有物理删除 只有逻辑删除以deleteflag字段作为删除标志 deleteflag= 代表此记录被逻辑删除 因此在查询数据时必须考虑deleteflag的因素deleteflag的标准查询条件 NVL(deleteflag ) <> ) 增加记录状态字段数据库中的每张表基本都有以下字段 DELETEFLAG UPDATECOUNT CREDATE CREUSER UPDATETIME UPDATEUSER要注意在对标进行 *** 作时必须考虑以下字段插入一条记录时要置DELETEFLAG= UPDATECOUNT= CREDATE=sysdate CREUSER=登录User查询一条记录时要考虑DELETEFLAG 如果有可能对此记录作更新时还要取得UPDATECOUNT作同步检查修改一条记录时要置UPDATETIME=sysdate UPDATEUSER=登录User UPDATECOUNT=(UPDATECOUNT+ ) mod 删除一条记录时要置DELETEFLAG= ) 历史表数据库里部分表还存在相应的历史表 比如srv_c_f和srv_chistory_f在查询数据时除了检索所在表之外 还必须检索相应的历史表 对二者的结果做Union(或Union All) 用执行计划分析SQL性能 EXPLAIN PLAN是一个很好的分析SQL语句的工具 它可以在不执行SQL的情况下分析语句通过分析 我们就可以知道ORACLE是怎样连接表 使用什么方式扫描表(索引扫描或全表扫描) 以及使用到的索引名称按照从里到外 从上到下的次序解读分析的结果EXPLAIN PLAN的分析结果是用缩进的格式排列的 最内部的 *** 作将最先被解读 如果两个 *** 作处于同一层中 带有最小 *** 作号的将首先被执行目前许多第三方的工具如PLSQL Developer和TOAD等都提供了极其方便的EXPLAIN PLAN工具PG需要将自己添加的查询SQL文记入log 然后在EXPLAIN PLAN中进行分析 尽量减少全表扫描 ORACLE SQL性能优化系列选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名 因此FROM子句中写在最后的表(基础表driving table)将被最先处理在FROM子句中包含多个表的情况下 必须选择记录条数最少的表作为基础表当ORACLE处理多个表时 会运用排序及合并的方式连接它们首先 扫描第一个表(FROM子句中最后的那个表)并对记录进行排序 然后扫描第二个表(FROM子句中最后第二个表) 最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并例如:表 TAB 条记录表 TAB 条记录选择TAB 作为基础表 (最好的方法)select count(*) from tab tab 执行时间 秒选择TAB 作为基础表 (不佳的方法)select count(*) from tab tab 执行时间 秒如果有 个以上的表连接查询 那就需要选择交叉表(intersection table)作为基础表 交叉表是指那个被其他表所引用的表例如:EMP表描述了LOCATION表和CATEGORY表的交集SELECT *FROM LOCATION L CATEGORY C EMP EWHERE E EMP_NO BEEEN AND AND E CAT_NO = C CAT_NOAND E LOCN = L LOCN将比下列SQL更有效率SELECT *FROM EMP E LOCATION L CATEGORY CWHERE E CAT_NO = C CAT_NOAND E LOCN = L LOCNAND E EMP_NO BEEEN ANDWHERE子句中的连接顺序 ORACLE采用自下而上的顺序解析WHERE子句根据这个原理 表之间的连接必须写在其他WHERE条件之前 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾例如 (低效 执行时间 秒)SELECT *FROM EMP EWHERE SAL >AND JOB = MANAGER AND <(SELECT COUNT(*) FROM EMP WHERE MGR=E EMPNO)(高效 执行时间 秒)SELECT *FROM EMP EWHERE <(SELECT COUNT(*) FROM EMP WHERE MGR=E EMPNO)AND SAL >AND JOB = MANAGER SELECT子句中避免使用 * 当你想在SELECT子句中列出所有的COLUMN时 使用动态SQL列引用 * 是一个方便的方法 不幸的是 这是一个非常低效的方法实际上 ORACLE在解析的过程中 会将 * 依次转换成所有的列名这个工作是通过查询数据字典完 lishixinzhi/Article/program/Oracle/201311/18246
一、增(INSERT向数据库插入一条记录)
INSERT INTO 表名(列名1,列名2,列名3……)VALUES('值1,'值2','值3'……)
例子:
INSERT INTO muser(id,name,pwd)
VALUES('1','admin','admin')
注意:列的个数必须和VALUES子句中给出的值的个数相同;数据类型必须和类的数据类型对应。
二、删(DELETE从表中删除数据)
DELETE语句用来删除数据,可以一次删除一行,也可以删除多行。
DELETE语句的基本语法:
DELETE FROM 表名 WHERE 条件
例子:
DELETE FROM muser WHERE id='1' and pwd='admin'
三、改(UPDATE修改表中的数据)
UPDATE语句用来修改已经存在的数据,UPDATE可影响一行也可以影响多行,甚至可以修改全部的数据。
UPDATE语句的基本语法:
UPDATE 表名 SET
列名='需要修改成为的数据'
WHERE 修改条件
例子:
UPDATE muser SET
pwd='admin888'
WHERE name='admin' AND pwd='admin'
四、查(使用SELECT查询数据库)
SELECT语句主要用来检索数据
SELECT语句的基本语法:
SELECT 列名
FROM 表名
WHERE 检索的条件
例子:
SELECT * FROM news WHERE class='国内新闻'
在列名中使用(*)表示从FROM表中指定的返回所有列。
你好!
这个根据数据有关,我给你一下oracle 的写法:
WITH t AS (
SELECT '李丽' names, 'asdaa@neusoft.com' mail FROM dual UNION ALL
SELECT '李丽' names, 'bbbbb@neusoft.com' FROM dual UNION ALL
SELECT '大军' names, 'ccccc@neusoft.com' FROM dual UNION ALL
SELECT '李丽' names, 'ddddd@neusoft.com' FROM dual
)
SELECT names,to_char(wm_concat(mail)) FROM t GROUP BY names
你可以尝试使用list agg 的语法!
望采纳!
评论列表(0条)