一、简介:(x)
hsql数据库是一ƄJava~写的免Ҏ(gu)据库Q许可是BSD-style的协议,如果你是使用Java~程的话Q不凡考虑一
下用它Q相对其他数据库来说Q其体积,?63kb。仅一个hsqldb.jar文g包括了(jin)数据库引擎,数据库驱动,q有其他用户界面操作{内宏V?
在Java开源世界里Qhsql是极为受Ƣ迎的(Java本n来说Q,JBoss应用E序服务器默认也提供?jin)这个数据库引擎。由于其体积的原因Q又?
UJava设计Q又支持SQL99QSQL2003大部分的标准Q所以也是作为商业应用程序展C的一U选择。请C下地址下蝲hsqlQ?http://prdownloads.sourceforge.net/hsqldb/hsqldb_1_7_3_3.zip?download
二、用hsql数据库:(x)
1、hsql数据库引擎有几种服务器模式:(x)常用的Server模式、WebServer模式、Servlet模式、Standlone模式、Memory-Only数据库?br />2、最为常用的Server模式Q?br />1)首先却换到l(f)ib文g夹下Q运行java -cp hsqldb.jar org.hsqldb.Server -database.0 db/mydb -dbname.0 xdb
执行命o(h)后,会(x)在db文g夹下创徏一个数据库mydbQ别名(用于讉K数据库)(j)是xdbQ如果存在mydb数据库,会(x)打开它?br />2)q行数据库界面操作工P(x)java -cp hsqldb.jar org.hsqldb.util.DatabaseManager
在Type
选项里选上相应的服务器模式Q这里选择HSQL Database Engine
Server模式QDriver不用修改QURL修改为jdbc:hsqldb:hsql://localhost/xdb
Q主要这里xdb是上面我们讄的别名)(j);user里设|用户名Q第一ơ登录时Q设|的是管理员的用户名Qpassword讄密码。然后点击Ok?br />3)W一ơ运行数据库引擎Q创建数据库完毕。好?jin),你可以打开db文g夹,?x)发现里面多了(jin)几个文件?br />mydb.properties文gQ是关于数据库的属性文件?br />mydb.scriptQhsql主要保存的表Q这里按hsql的说法是Memory表,是最为常用的Q,里面的格式都是文本格式,可以用文本查看,里面的语句都是sql语句Q熟(zhn)sql语句的话Q你也可以手动修改它。每ơ运行数据库引擎的话都是从这里加载进内存的?br />mydb.lck表示数据库处于打开状态?br />其他的请参看hsqldb包里的手册?/p>
3、WebServer模式和Serverq行模式基本一P只是支持?jin)Http{协议,主要用于防火墙,默认端口?001。启动ServerQjava -cp hsqldb.jar org.hsqldb.WebServer ...剩余的和上面的一致?/p>
4、Servlet模式可以允许你通过Servlet容器来访问数据库Q请查看hsqlServlet.java的源代码Q和W(xu)ebServercM?/p>
5?
另一个值得思考的模式是Standalone模式Q不能通过|络来访问数据库Q主要是在一个JVM中用,那样的话Q访问的速度?x)更加快。虽然文档里面提
C要是用于开发时使用Q但是我们可以假设一下,该方法不需要一个引擎类的东西,而类g打开文g的方式,q回一个Connection对象Q?br />Connection c = DriverManager.getConnection("jdbc:hsqldb:file:mydb", "sa", "");
?
?x)在当前目录扑ֈmydb数据库相xӞ打开q返回一个Connection对象。该方式有点好处是可以不用引擎,在需要的时候操作数据。所以那?
Ҏ(gu)据库不是特别有要求的Q但又需要一个操作数据库的方式的话,可以使用q种Ҏ(gu)。对于那些不想额外在数据库引擎花贚wq话,可以使用q种Ҏ(gu)。但是不
推荐使用该方法。记得Hibernate里SessionFactory可以使用openSession(Connecttion
c)来获得一个Session对象的,因此Q在试或者实际应用的话都可以q样使用?/p>
6、Memory-Only 数据库:(x)思义Q主要是内存中用,不用于保存数据。可以用于在内存中交换数据?/p>
三、具体的链接与操作的话,和一般的JDBC操作一栗而相应的Server模式的话Q连接地址主要你运行数据库界面操作工具Ӟ在URL一栏时默认已经讑֥?jin),自己实?fn)一下,Ҏ(gu)其中参数?/p>
q篇文章介绍大致内容很详l,不过也大都是从Hsql的帮助上译的,我有必要加入Ҏ(gu)鲜的血涌Ӏ?br />q篇文章中不的是~少实战性,往往初学者第一步都C出来Q比如我?br />我在实践中遇到的问题是打开数据库管理器怎么也连接不上数据库QL?br />java.sql.sqlException Socket create error
搞了(jin)一个晚上,到第二天早上清醒一下,惌v来这个数据库应该在创建库之后Q保持那个cmdH口Q在此过E中q接?br />果然好用Q也q出?jin)开拓Hsql的第一步?/p>
另外不用在互联网上搜索别的介l,Hsql自带的guide已l很详细?jin)?/p>
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID String user="test"; String password="test"; Connection conn= DriverManager.getConnection(url,user,password); |
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); String url="jdbc:db2://localhost:5000/sample"; //sampleZ的数据库? String user="admin"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); |
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; //mydb为数据库 String user="sa"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); |
Class.forName("com.sybase.jdbc.SybDriver").newInstance(); String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDBZ的数据库? Properties sysProps = System.getProperties(); SysProps.put("user","userid"); SysProps.put("password","user_password"); Connection conn= DriverManager.getConnection(url, SysProps); |
Class.forName("com.informix.jdbc.IfxDriver").newInstance(); String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver; user=testuser;password=testpassword"; //myDB为数据库? Connection conn= DriverManager.getConnection(url); |
Class.forName("org.gjt.mm.mysql.Driver").newInstance(); String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" //myDB为数据库? Connection conn= DriverManager.getConnection(url); |
Class.forName("org.postgresql.Driver").newInstance(); String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库? String user="myuser"; String password="mypassword"; Connection conn= DriverManager.getConnection(url,user,password); |
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ; String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb"); Connection conn = DriverManager.getConnection(url,"",""); Statement stmtNew=conn.createStatement() ; |
try{ Class.forName(com.mysql.jdbc.Driver); System.out.println(Success loading Mysql Driver!); }catch(Exception e) { System.out.println(Error loading Mysql Driver!); e.printStackTrace(); } |
jdbcQmysqlQ?/localhost/databasename[?pa=va][Qpa=va] |
PreparedStatement pstmt3D null; try { ((OraclePreparedStatement)pstmt).setExecuteBatch(30); ... pstmt.executeUpdate(); } |
单行函数Q?/FONT>
单行函数 | |||
分类 | 函数 | 功能 | CZ |
字符函数 | LPAD(<c1>,<i>[,<c2>]) | 在字W串c1的左Ҏ(gu)加字W串c2直到c1字符串的长度{于i?/SPAN> |
SELECT LPAD(‘Hello!?8,?? leftpad,RPAD(‘Hello!?8,?? rightpad FROM DUAL;
|
RPAD(<c1>,<i>[,<c2>]) | 在字W串c1的右Ҏ(gu)加字W串c2直到c1字符串的长度{于i?/SPAN> | ||
LOWER(<c1>) | 把字W串c1转换为小?/SPAN> | SELECT LOWER(ename) one,UPPER(ename) two, INITCAP(ename) FROM EMP; | |
UPPER(<c1>) | 把字W串c1转换为大?/SPAN> | ||
INITCAP(<c1>) | ?/SPAN>c1字符串的每一个单词的W一个字母{换成大写字母 | ||
LENGTH(<c1>) | q回字符?/SPAN>c1的长?/SPAN> | SELECT LENGTH(‘How are you? FROM DUAL; | |
SUBSTR(<c1>,<i>[,<j>]) | q回字符?/SPAN>c1中从W?/SPAN>i个位|开始的j个字W(向右Q。如果省?/SPAN>jQ则q回c1中从W?/SPAN>i个位|开始的所有字W。如?/SPAN>jQ则q回字符?/SPAN>c1中从W?/SPAN>i个位|开始的j个字W(向左Q?/SPAN> | SELECT SUBSTR(‘Hello,World?1,5) FROM DUAL; | |
INSTR(<c1>,<c2>[,<i>[,<j>]]) | ?/SPAN>c1中从位置i开始查?/SPAN>c2?/SPAN>c1中出W?/SPAN>jơ的位置Q?/SPAN>i可以(此时Q从c1的尾部开?/SPAN>)?/SPAN> |
SELECT INSTR(‘Mississippi?’i?3,3) FROM DUAL; q回l果11?/SPAN> SELECT INSTR(‘Mississippi?’i?-2,3) FROM DUAL; q回l果2?/SPAN>
| |
LTRIM(<c1>,<c2>) | ?/SPAN>c1前面开始去掉出现在c2的中M前导字符集?/SPAN> | SELECT LTRIM(‘Mississippi?’Mis? FROM DUAL; q回l果’ppi’?BR> SELECT RTRIM(‘Mississippi?’ip? FROM DUAL; q回l果’Mississ’?BR> | |
RTRIM(<c1>,<c2>) | ?/SPAN>c1后面开始去掉出现在c2的中M前导字符集?/SPAN> | ||
数学函数 | ABS(<n>) | q回n的绝对?/SPAN> | SELECT ABC(-2),ABS(2) FROM DUAL; |
ROUND(<n1>,<n2>) | ?/SPAN>n1的小数点后保?/SPAN>n2位(四舍五入Qƈq回。如?/SPAN>n2于Ӟn1舍入到小数点左边?/SPAN> |
SELECT ROUND(12345.678,-2), ROUND(12345.678,2) FROM DUAL; 分别q回l果Q?/SPAN>12300Q?/SPAN>12345.68?/SPAN>
| |
CEIL(<n>) | ?/SPAN>n 向上取整Qƈq回?/SPAN> |
SELECT CEIL(5.1),CEIL(-21.4) FROM DUAL; 分别q回Q?/SPAN>6, -21?/SPAN>
| |
FLOOR(<n>) | ?/SPAN>n 向下取整Qƈq回?/SPAN> |
SELECT FLOOR(5.1),FLOOR(-21.4) FROM DUAL; 分别q回Q?/SPAN>5, -22?/SPAN>
| |
MOD(<n1>,<n2>) | q回n1?/SPAN>n2后的余数?/SPAN> |
SELECT MOD(14,5),MOD(8,25),MOD(-64,7) FROM DUAL; 分别q回l果Q?/SPAN>4Q?/SPAN>0.5Q?/SPAN>-1?/SPAN>
| |
SIGN(<n>) |
W号函数Q?/SPAN>n>0Q返?/SPAN>1?/SPAN> n<0Q返?/SPAN>-1?/SPAN> n=0Q返?/SPAN>0?/SPAN>
|
SELECT SIGN(-2.3),SIGN(2.3),SIGN(0) FROM DUAL; | |
SQRT(<n>) | q回n的^Ҏ(gu) | SELECT SQRT(9) FROM DUAL; | |
TRUNC(<n1>,<n2>) | 功能cMROUND函数。但不做四舍五入?/SPAN> |
SELECT TRUNC(123.456,2),TRUNC(123.456,-1) FROM DUAL; 分别q回l果Q?/SPAN>123.45?/SPAN>120?/SPAN>
| |
VSIZE(n) | q回数字n的存储字?/SPAN> | SELECT VSIZE(123) FROM DUAL; | |
日期函数(日期可以q行术q算) | SYSDATE | q回相同日期 | SELECT SYSDATE FROM DUAL; |
ADD_MONTHS(<d>,<i>) | q回日期d 加上i个月后的新日?/SPAN>(i正可?/SPAN>)?/SPAN> |
SELECT SYSDATE, ADD_MONTHS(SYSDATE,2), ADD_MONTHS(SYSDATE,-2) FROM DUAL;
| |
LAST_DAY(<d>) | q回日期d所在的月的最后一天?/SPAN> | SELECT SYSDATE,LAST_DAY(SYSDATE) FROM DUAL | |
MONTHS_BETWEEN(<d1>,<d2>) | q回日期d1?/SPAN>d2大多月数?/SPAN> | SELECT MONTHS_BETWEEN(?9-Dec-1999??9-Mar-2000?FROM DUAL; | |
NEW_TIME(<d>,<tz1>,<tz2>) | 时?/SPAN>tz1的时?/SPAN>dQ{换ؓ(f)时区tz2里的旉?/SPAN> | SELECT SYSDATE,NEW_TIME(SYSDATE,’C(j)DT?’PDT? FROM DUAL; | |
NEXT_DAY(<d>,<dow>) | q回日期d后的W一?/SPAN>dow?/SPAN>(dowQ?/SPAN>day of week) | SELECT NEXT_DAY(SYSDATE,’Monday? FROM DUAL; | |
常用转换函数 | TO_CHAR(<x>[,<fmt>[,<nlsparm>]]) | ?/SPAN>x转换成字W串。(参数含义L(fng)ORACLE的联机帮助)(j) | SELECT TO_CHAR(SYSDATE,’YYYY-MM-DD? FROM DUAL; |
TO_NUMBER(<c>[,<fmt>[,<nlsparm>]]) | 字W串c转换成数字。(参数含义L(fng)ORACLE的联机帮助)(j) | SELECT TO_NUMBER(?23? FROM DUAL; | |
TO_DATE(<c>[,<fmt>[,<nlsparm>]]) (常见的日期格式请查联机帮助?/SPAN>) |
字W串c转换成日期?/SPAN> | SELECT TO_DATE(?9-Mar-99?’DD-Mon-YYYY? FROM DUAL; | |
两个重要函数 |
DECODE(<x>,<m1>,<r1>[,<m2>, <r2?gt;][,<d>]) (DECODE函数功能非常强大Q请仔细玩味?/SPAN>)
|
一个功能非常强大的函数Q它使得SQL非常高效。它的功能类g一pd?/SPAN>if…then…else语句?/SPAN> |
SELECT sid,serial#,username, DECODE(command ,0,’None?/FONT> ,2,’Insert?/FONT> ,3,’Select?/FONT> ,6,’Update?/FONT> ,7,’Delete?/FONT> ,8,’Drop ,’Other? cmd FROM V$SESSION WHERE type<>’BACKGROUND?
|
NVL(x1,x2) 注意ORACLE中的NULL|注意该函C?/SPAN>
|
如果x1为空q回x2Q否则返?/SPAN>x1?/SPAN> | SELECT NVL(ename,?/SPAN>无姓?/SPAN>? FROM EMP; | |
分组函数 | |||
AVG([{DISTINCT|ALL}]<n>) | 求返回行的指定列的^均?/FONT> |
SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM SCOTT.EMP;
| |
COUNT({*|[DISTINCT|ALL]}<x>) | l计q回的行?/FONT> |
SELECT COUNT (*), COUNT(DISTINCT mgr),COUNT(mgr) FROM SCOTT.EMP
| |
MAX([{DISTINCT|ALL}]<x>) | 求返回行的指定列的最大?/FONT> | SELECT MAX(sal),MAX(DISTINCT sal) FROM EMP; | |
MIN([{DISTINCT|ALL}]<x>) | 求返回行的指定列的最?/FONT> | SELECT MIN(sal),MIN(DISTINCT sal) FROM EMP; | |
STDDEV([{DISTINCT|ALL}]<x>) | 求返回行的指定列的标准方?/FONT> | SELECT STDDEV(sal),STDDEV(DISTINCT sal) FROM EMP; | |
SUM() | 求返回行的指定列的和 | SELECT SUM(sal) FROM EMP; | |
VARIANCE() | 求返回行的指定列的差异?/FONT> |
注意Q?/FONT>
A?SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 9pt; FONT-STYLE: normal; FONT-FAMILY: Times New Roman; FONT-VARIANT: normal"> 分组函数不会(x)处理I|也不?x)返回空?/SPAN>Q?/FONT>
B?FONT size=2> 所有的分组函数既可以作用于指定列的所有gQ也可以只作用于指定列的差异列gQ?/FONT>
C?SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 9pt; FONT-STYLE: normal; FONT-FAMILY: Times New Roman; FONT-VARIANT: normal"> 当指?/SPAN>ALL选项Ӟ分组函数作用于所有非I列D上。当指定DISTINCT选项Ӟ分组函数只作用于非空的且h不同列值的行上Q即Q重复列值的行只计算一行)(j)Q?/SPAN>
1. ORACLE
SELECT * FROM TABLE1 WHERE ROWNUM<=N
2. INFORMIX
SELECT FIRST N * FROM TABLE1 where 1=1
3. DB2
SELECT * ROW_NUMBER() OVER(ORDER BY COL1 DESC) AS ROWNUM WHERE ROWNUM<=N
或?br />SELECT COLUMN FROM TABLE where 1=1 FETCH FIRST N ROWS ONLY
4. SQL SERVER
SELECT TOP N * FROM TABLE1 where 1=1
or
SET ROWCOUNT N SELECT * FROM TABLE1 where 1=1 SET ROWCOUNT N1
5. SYBASE
SET ROWCOUNT N SELECT * FROM TABLE1 where 1=1 SET ROWCOUNT N1
6. MYSQL
SELECT * FROM TABLE1 where 1=1 LIMIT N
7. FOXPRO
SELECT * TOP N FROM TABLE ORDER BY COLUMN
8. ACCESS
SELECT TOP N * FROM TABLE1 where 1=1