MySQL--执⾏mysql脚本及其脚本编写
⾸要步骤(⼀般可省略):
开启mysql服务(默认是开机时就⾃动运⾏了):
控制⾯板-->管理⼯具-->服务,在⾥⾯到名称为mysql的项,双击就可看它的服务状态是启动还是停⽌,把它设为启动
连接mysql:
在命令⾏下输⼊ mysql -h localhost -u root -p回车,然后输⼊密码即可;或直接运⾏mysql⾃带的连接⼯具,然后输⼊密码即可.
1.编写sql脚本,假设内容如下:
create database dearabao;
use dearabao;
create table niuzi (name varchar(20));
保存脚本⽂件,假设我把它保存在F盘的hello world⽬录下,于是该⽂件的路径为:F:/hello world/niuzi.sql
2.执⾏sql脚本,可以有2种⽅法:
第⼀种⽅法:
在命令⾏下(未连接数据库),输⼊ mysql -h localhost -u root -p123456 < F:/hello world/niuzi.sql (注意路径不⽤加引号的!!) 回车即可. 第⼆种⽅法:
在命令⾏下(已连接数据库,此时的提⽰符为 mysql> ),输⼊ source F:/hello world/niuzi.sql (注意路径不⽤加引号的) 或者 /. F:/hello world/niuzi.sql (注意路径不⽤加引号的) 回车即可
SQL编写规范
1.书写格式
⽰例代码:
存储过程SQL⽂书写格式例
select
c.dealerCode,
round(sum(c.submitSubletAmountDLR + c.submitPartsAmountDLR + c.submitLaborAmountDLR) / count(*), 2) as avg, decode(null, 'x', 'xx', 'CNY')
from (
select
a.dealerCode,
a.submitSubletAmountDLR,
a.submitPartsAmountDLR,
a.submitLaborAmountDLR
from SRV_TWC_F a
where (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, '0') <> '1')
union all
select
b.dealerCode,
b.submitSubletAmountDLR,c语言双引号iostream
b.submitPartsAmountDLR,
b.submitLaborAmountDLR
from SRV_TWCHistory_F b
where (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,'0') <> '1')
) c
group by c.dealerCode
order by avg desc;
Java source⾥的SQL字符串书写格式例
strSQL = "insert into Snd_FinanceHistory_Tb "
+ "(DEALERCODE, "
+ "REQUESTSEQUECE, "
+ "HANDLETIME, "五线谱入门基础知识
+ "JOBFLAG, "
+ "FRAMENO, "
+ "INMONEY, "
+ "REMAINMONEY, "
+ "DELETEFLAG, "
+ "UPDATECOUNT, "
+ "CREUSER, "
+ "CREDATE, "
+ "HONORCHECKNO, "
+ "SEQ) "
+ "values ('" + draftInputDetail.dealerCode + "', "
+ "'" + questsequece + "', "
+ "sysdate, "
+ "'07', "
+ "'" + frameNO + "', "
+ requestMoney + ", "
+ remainMoney + ", "
+ "'0', "
+ "0, "
+ "'" + ployeeCode + "', "
+ "sysdate, "
+ "'" + draftInputDetail.honorCheckNo + "', "
+ index + ")";
1).缩进
基于jsp的图书管理系统对于存储过程⽂件,缩进为8个空格
对于Java source⾥的SQL字符串,不可有缩进,即每⼀⾏字符串不可以空格开头
2).换⾏
1>.Select/From/Where/Order by/Group by等⼦句必须另其⼀⾏写
financial flexibility2>.Select⼦句内容如果只有⼀项,与Select同⾏写
3>.Select⼦句内容如果多于⼀项,每⼀项单独占⼀⾏,在对应Select的基础上向右缩进8个空格(Java source⽆缩进)
4>.From⼦句内容如果只有⼀项,与From同⾏写
5>.From⼦句内容如果多于⼀项,每⼀项单独占⼀⾏,在对应From的基础上向右缩进8个空格(Java source⽆缩进)
6>.Where⼦句的条件如果有多项,每⼀个条件占⼀⾏,以AND开头,且⽆缩进
7>.(Update)Set⼦句内容每⼀项单独占⼀⾏,⽆缩进
8>.Insert⼦句内容每个表字段单独占⼀⾏,⽆缩进;values每⼀项单独占⼀⾏,⽆缩进
9>.SQL⽂中间不允许出现空⾏
10>.Java source⾥单引号必须跟所属的SQL⼦句处在同⼀⾏,连接符("+")必须在⾏⾸
3).空格
1>.SQL内算数运算符、逻辑运算符连接的两个元素之间必须⽤空格分隔
2>.逗号之后必须接⼀个空格
3>.关键字、保留字和左括号之间必须有⼀个空格
2.不等于统⼀使⽤"<>"
Oracle认为"!="和"<>"是等价的,都代表不等于的意义。为了统⼀,不等于⼀律使⽤"<>"表⽰
3.使⽤表的别名
数据库查询,必须使⽤表的别名
4.SQL⽂对表字段扩展的兼容性
在Java source⾥使⽤Select *时,严禁通过getString(1)的形式得到查询结果,必须使⽤getString("字段名")的形式
使⽤Insert时,必须指定插⼊的字段名,严禁不指定字段名直接插⼊values
5.减少⼦查询的使⽤
⼦查询除了可读性差之外,还在⼀定程度上影响了SQL运⾏效率
请尽量减少使⽤⼦查询的使⽤,⽤其他效率更⾼、可读性更好的⽅式替代
6.适当添加索引以提⾼查询效率
适当添加索引可以⼤幅度的提⾼检索速度
请参看ORACLE SQL性能优化系列
7.对数据库表操作的特殊要求
本项⽬对数据库表的操作还有以下特殊要求:
1).以逻辑删除替代物理删除
注意:现在数据库表中数据没有物理删除,只有逻辑删除
mysql语句转oracle以deleteflag字段作为删除标志,deleteflag='1'代表此记录被逻辑删除,因此在查询数据时必须考虑deleteflag的因素
deleteflag的标准查询条件:NVL(deleteflag, '0') <> '1'
2).增加记录状态字段
数据库中的每张表基本都有以下字段:DELETEFLAG、UPDATECOUNT、CREDATE、CREUSER、UPDATETIME、UPDATEUSER 要注意在对标进⾏操作时必须考虑以下字段
插⼊⼀条记录时要置DELETEFLAG='0', UPDATECOUNT=0, CREDATE=sysdate, CREUSER=登录User
查询⼀条记录时要考虑DELETEFLAG,如果有可能对此记录作更新时还要取得UPDATECOUNT作同步检查
修改⼀条记录时要置UPDATETIME=sysdate, UPDATEUSER=登录User, UPDATECOUNT=(UPDATECOUNT+1) mod 1000,
删除⼀条记录时要置DELETEFLAG='1'
3).历史表
数据库⾥部分表还存在相应的历史表,⽐如srv_twc_f和srv_twchistory_f
在查询数据时除了检索所在表之外,还必须检索相应的历史表,对⼆者的结果做Union(或Union All)
8.⽤执⾏计划分析SQL性能
EXPLAIN PLAN是⼀个很好的分析SQL语句的⼯具,它可以在不执⾏SQL的情况下分析语句
c语言字母转换ascii码通过分析,我们就可以知道ORACLE是怎样连接表,使⽤什么⽅式扫描表(索引扫描或全表扫描),以及使⽤到的索引名称
按照从⾥到外,从上到下的次序解读分析的结果
EXPLAIN PLAN的分析结果是⽤缩进的格式排列的,最内部的操作将最先被解读,如果两个操作处于
同⼀层中,带有最⼩操作号的将⾸先被执⾏
⽬前许多第三⽅的⼯具如PLSQL Developer和TOAD等都提供了极其⽅便的EXPLAIN PLAN⼯具
PG需要将⾃⼰添加的查询SQL⽂记⼊log,然后在EXPLAIN PLAN中进⾏分析,尽量减少全表扫描
ORACLE SQL性能优化系列
1.选择最有效率的表名顺序(只在基于规则的优化器中有效)
ORACLE的解析器按照从右到左的顺序处理FROM⼦句中的表名,因此FROM⼦句中写在最后的表(基础表driving table)将被最先处理
在FROM⼦句中包含多个表的情况下,必须选择记录条数最少的表作为基础表
当ORACLE处理多个表时,会运⽤排序及合并的⽅式连接它们
⾸先,扫描第⼀个表(FROM⼦句中最后的那个表)并对记录进⾏排序;
然后扫描第⼆个表(FROM⼦句中最后第⼆个表);
最后将所有从第⼆个表中检索出的记录与第⼀个表中合适记录进⾏合并
例如:
表 TAB1 16,384 条记录
表 TAB2 5 条记录
选择TAB2作为基础表 (最好的⽅法)
select count(*) from tab1,tab2 执⾏时间0.96秒
选择TAB2作为基础表 (不佳的⽅法)
select count(*) from tab2,tab1 执⾏时间26.09秒
如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引⽤的表
例如:
EMP表描述了LOCATION表和CATEGORY表的交集
SELECT *
FROM LOCATION L,
CATEGORY C,
EMP E
WHERE E.EMP_NO BETWEEN 1000 AND 2000
AND E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
将⽐下列SQL更有效率
SELECT *
FROM EMP E ,
LOCATION L ,
CATEGORY C
WHERE E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
AND E.EMP_NO BETWEEN 1000 AND 2000
2.WHERE⼦句中的连接顺序
ORACLE采⽤⾃下⽽上的顺序解析WHERE⼦句
根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最⼤数量记录的条件必须写在WHERE⼦句的末尾
例如:
(低效,执⾏时间156.3秒)
SELECT *
FROM EMP E
WHERE SAL > 50000
AND JOB = 'MANAGER'
AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);
(⾼效,执⾏时间10.6秒)
SELECT *
FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO)
AND SAL > 50000
AND JOB = 'MANAGER';
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论