ORACLE
SQL(Structured Query Language)结构化查询语言
DML 数据操纵语言
SQL DCL 数据控制语言,控制权限
DDL 数据定义语言 例如:CREATE,DROP,ALTER,DELETE
ORACLE安装
Sys 超级管理员
System system
Scott tiger
Oracle端口号:1521
Oracle只有一个database,通过不同的用户给表分类。
sqlplus
Select * from tab;查询当前用户有哪些表。
set linesize 300;显示一行显示300个字符。
Set pagesize 50;显示一页50行
简单查询语句:
Select [distinct] <列名> [[as] 别名] from <表名> [[as] 别名]
[where <查询条件>]
[order by <排序列名> [asc | desc]]
distinct 去掉查询结果中重复列 字段名不能加’ ’(引号)
select ‘name:’ || ename form emp
字符串连接
Between 1500 and 3000 结果包含了1500和3000
Between ….and….也可用于日期
In:
Select empno,ename from emp where empno in(2011,2001,2300)
通配符:’ -’代表一个字符,‘%’代表0到多个字符。
在sqlplus 中,ed d:/a 表示打开或创建一个sql文件,
@ d:/a 表示执行此文件
单行函数
字符函数:接收字符输入并输出。
upper: 将小写字符转换成大写
select upper(‘jack’) from dual;
oracle有一张特殊的表:dual,完成一项功能使用
initcap:将单词第一个字母转换成大写
select initcap(lower(ename)) from emp; 嵌套使用函数。
Concat:字符串连接
Select concat(‘name:’,ename) from emp; 相当于使用‘ ||’
length: 求长度
select length(‘hello’) from dual;
substr: 截取字符串
substr(‘word’,3) 从第三个开始截取
substr(‘helloword’,1,3) :其中1 为索引,3为长度
索引可从0开始,也可从1开始
Substr(‘helloword’,-3) 从后向前数截取3个
Replace:替换
Select replace(ename,’s’,’9’) from emp;
数字函数:
round:四舍五入
select round(2473.125) from dual; 无小数保留
round(2736.3567,2) 保留两位小数
round(2173.34,-2) 精确到两小点前两位
trunc(2649.34,2)保留两位小数,其余位截去
日期函数:
日期-数字=日期 日期+数字=日期 日期-日期=数字
round((sysdate-hiredate)/7) 求员工入职大约有几个星期
month_betweed(sysdate,hiredate) 求员工入职有几个月
add_months(sysdate,1) 加一个月
next_day(sysdate,’星期一’) 求出给定日期的下星期一是号
last_day(sysdate) 这个月的最后一天是几号
转换函数:
to_char(hiredate) 转换成字符串
to_char(hiredate,’yy-mm-dd’) 转换成日期形式
to_char(hiredate,’fmyyyy-mm-dd’) 其中fm:format去掉前导0
to_char(sal,’$99.999,99’)
to_number(‘34235’)
to_date(’12-28-2012’,’mm-dd-yyyy’) 转换成日期
通用函数:
Oracle中空值参加四则运算,结果为null
select ename,sal*12+nvl(comm,0) from emp;
多表查询:
找关联字段作关联条件
(1) 找出几张表 (2)消除迪卡尔积 (3)确定查询内容
一张表当两张表用时不是一回事
“什么的什么“用时需消除迪卡尔积
表连接:
(1) oracle特有的方式
“+“号在”=“号左边是右连接,在“=”号右边是右连接
以哪张表为基准就是
硬件:笔记本联想G450
CPU:Intel Pentium T4300(2.1GHz)
内存:2G
IDE:NetBeans 7.2.1
数据库:SQL Server 2000
表:
create table test_xueshng(
id bigint primary key,
name varchar(16),
sex varchar(2),
birthday datetime,
address varchar(80)
);
JDBC驱动程序:sqljdbc4.jar
以下是插入10万条记录的运行结果:
/*
run:
测试时间:2013-03-19 05:05:07
插入记录数:100000 ;用时:28609毫秒。
成功构建 (总时间: 28 秒)
*/
/* * ProcessVO测试 */ package cn.test; import cn.jadepool.sql.Jade; import cn.jadepool.sql.ProcessVO; import cn.jadepool.util.DateTool; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * @author hkm */ public class ProcessVO_InsertTest { public static void main(String[] args) throws SQLException { ProcessVO_InsertTest test = new ProcessVO_InsertTest(); test.insert(); /* run: 测试时间:2013-03-19 05:05:07 插入记录数:100000 ;用时:28609毫秒。 成功构建 (总时间: 28 秒) */ } /** * 插入10万条记录测试 */ public long insert() throws SQLException { /* * create table test_xueshng( * id bigint primary key, * name varchar(16), * sex varchar(2), * birthday datetime, * address varchar(80) * ); */ DateTool dt = new DateTool(); long t0 = System.currentTimeMillis(); System.out.println("测试时间:" + dt.dateTime()); int length = 100000; List v = new ArrayList(); for (int i = 0; i < length; i++) { int k = i % 2; String sex = "男"; if (k == 0) { sex = "男"; } if (k == 1) { sex = "女"; } String s = "" + (length * 10 + i); s = s.substring(1); Map m = new HashMap(); m.put("id", i); m.put("name", ("name" + s)); m.put("sex", sex); m.put("age", 16);//无效字段将被自动删除 m.put("memo", "备注");//无效字段将被自动删除 m.put("birthday", dt.dateTime(-12 * 365));//12年前出生 v.add(m); } ProcessVO pvo = new ProcessVO(getCon()); try { pvo.setAutoCommit(false); pvo.delete("delete from test_xueshng"); pvo.insert("test_xueshng", v); pvo.commit(); } catch (SQLException ex) { ex.printStackTrace(); pvo.rollback(); } finally { pvo.closeCon(); } //以下是使用Jade时的等效代码 /* Jade j = new Jade(getCon()); j.delete("delete from test_xueshng"); j.insert("test_xueshng", v); j.commit(); */ long t1 = System.currentTimeMillis(); long t = t1 - t0; System.out.println("插入记录数:" + v.size() + " ;用时:" + t + "毫秒。"); return t; } /** * sqljdbc4.jar */ public static synchronized Connection getCon() { Connection con = null; String url = "jdbc:sqlserver://127.0.0.1\\dba:1436;databaseName=jadepool_test"; String userName = "jadepool_test"; String password = "123"; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); con = DriverManager.getConnection(url, userName, password); } catch (SQLException ex1) { ex1.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } return con; } }
在此,我们可以对比以下Hibernate的情况,JadePool的性能还是相当出色的。
以下来自
Hibernate入门:批量插入数据 http://blog.csdn.net/xiazdong/article/details/7709068
Hibernate 与 原生 Jdbc 批量插入时的差距 http://liu-anxin.iteye.com/blog/1026777
Hibernate批量插入的测试 http://www.360doc.com/content/10/0910/09/1542811_52551961.shtml
create index和rebuild index时都会对原表加4号锁,对obj$加3号锁,阻止对原表的DML操作。
create index online 和 rebuild index online 采用新增一张临时表来处理创建或者重建索引时对原表索引列的修改,这样就可以不用锁表,保证原表的dml操作在过程中可以正常执行。
rebuild的过程用户仍然可以走旧的索引来查询,索引重建索引需要原来索引两倍的空间。
测试1:create表加锁
conn scott/tigerselect sid,username from v$session;
create index test_index on test(name);
SID USERNAME
------- -------------
139
143 SCOTT
OBJECT_NAME LMODE
------------------------------ ----------
OBJ$ 3
TEST 4
alter index test_index rebuild online;
OBJECT_NAME LMODE
------------------------------ ----------
SYS_JOURNAL_10499 4
TEST 2
附锁类型
0, 'None',
1, 'Null',
2, 'Row-S (SS)',
3, 'Row-X (SX)',
4, 'Share',
5, 'S/Row-X (SSX)',
6, 'Exclusive',
测试3:在online重建过程中,数据库是如何记录的。
首先创建一张大表,保证有足够的时间观察索引重建过程的细节。
Table created.
SQL> insert into test_rebuild select * from test_rebuild;
6398 rows created.
409472 rows created.
SQL> commit;
Commit complete.
Name Null? Type
----------------------------------------- -------- ---------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(18)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
SQL> create index idx_rebuild on test_rebuild(object_name) ;
Index created.
开三个session
15:13:09 session1>alter index idx_rebuild rebuild online;
ROWID OBJECT_NAME
------------------ ---------------------------------------------------------
AAABoLAAFAAAAI0AAA old
1 row updated.
15:13:54 SQL> commit;
Commit complete.
C0 O PTODE PARTNO RID
-------- - ---------- ---------------------------------
old D 0 AAAAABAAFAAAAI0AAAnew I 0 AAAAABAAFAAAAI0AAA
C0 C1 O PARTNO RID
------------------------------ ------- - ---------- ------------------
new invalid I 0 BAEAAAAAFAAAAI0AAA
old invalid D 0 BAEAAAAAFAAAAI0AAA
建了两个列的组合索引,就会在临时创建表里有2个C开头的列