一些常用的内置程序包: DBMS_OUTPUT 包输出 PL/SQL 程序的调试信息 DBMS_LOB 包提供操作 LOB 数据的子程序 DBMS_XMLQUERY 将查询结果转换为 XML 格式 DBMS_RANDOM 提供随机数生成器 UTL_FILE 用于读写操作系统文本文件 =============================================================== 触发器 Create or REPLACE TRIGGER biu_emp_deptno BEFORE Insert or Update OF deptno ON emp FOR EACH ROW WHEN (New.deptno <> 40) BEGIN :New.comm := 0; END; / 触发器已创建 =============================================================== ----没有表还不能测试 Create VIEW ord_view AS Select order_master.orderno, order_master.ostatus, order_detail.qty_deld, order_detail.qty_ord FROM order_master, order_detail Where order_master.orderno = order_detail.orderno; Create or REPLACE TRIGGER order_mast_insert INSTEAD OF Insert ON ord_view REFERENCING NEW AS n FOR EACH ROW DECLARE CURSOR ecur IS Select * FROM order_master Where order_master.orderno = :n.orderno; CURSOR dcur IS Select * FROM order_detail Where order_detail.orderno = :n.orderno; a ecur%rowtype; b dcur%rowtype; BEGIN OPEN ecur; OPEN dcur; FETCH ecur into a; FETCH dcur into b; IF dcur%notfound THEN Insert INTO order_master(orderno,ostatus) VALUES(:n.orderno, :n.ostatus); ELSE Update order_master SET order_master.ostatus = :n.ostatus Where order_master.orderno = :n.orderno; END IF; IF ecur%notfound THEN Insert INTO order_detail(qty_ord,qty_deld,orderno) VALUES(:n.qty_ord, :n.qty_deld, :n.orderno); ELSE Update order_detail SET order_detail.qty_ord = :n.qty_ord, order_detail.qty_deld = :n.qty_deld Where order_detail.orderno = :n.orderno; END IF; CLOSE ecur; CLOSE dcur; END; / =============================================================== Create TABLE dropped_obj ( obj_name VARCHAR2(30), obj_type VARCHAR2(20), drop_date DATE ); Create or REPLACE TRIGGER log_drop_obj AFTER Drop ON SCHEMA BEGIN Insert INTO dropped_obj VALUES (ORA_DICT_OBJ_NAME, orA_DICT_OBJ_TYPE, SYSDATE); END; / Alter TRIGGER biu_emp_deptno DISABLE; Alter TRIGGER biu_emp_deptno ENABLE; Drop TRIGGER biu_emp_deptno; DESC USER_TRIGGERS; =============================================================== DECLARE l_num NUMBER; counter NUMBER; BEGIN counter:=1; WHILE counter <= 10 LOOP l_num := ABS((DBMS_RANDOM.RANDOM MOD 100)) + 1; DBMS_OUTPUT.PUT_LINE(l_num); counter := counter + 1; END LOOP; END; / 40 4 35 52 68 5 94 38 49 51 PL/SQL 过程已成功完成。 =============================================================== =============================================================== ---查询出表中数据转换为xml格式 -- 以 SYSTEM 用户登录执行命令 Create DIRECTORY TEST_DIR AS 'C:\DEVELOP'; GRANT READ, WRITE ON DIRECTORY TEST_DIR TO SCOTT; -- 以 SCOTT 用户登录 DECLARE src CLOB; xmlfile UTL_FILE.FILE_TYPE; length INTEGER; buffer VARCHAR2(16384); BEGIN src := DBMS_XMLQuery.getXml('select * from emp'); length := DBMS_LOB.GETLENGTH(src); DBMS_LOB.READ(src, length, 1, buffer); xmlfile := UTL_FILE.FOPEN('TEST_DIR', 'employees.xml', 'w'); UTL_FILE.PUT(xmlfile, buffer); UTL_FILE.FCLOSE(xmlfile); END; / =============================================================== -------读取xml格式的文件 UTL_FILE 包用于读写操作系统文本文件 操作文件的一般过程是打开、读或写、关闭 UTL_FILE 包指定文件路径依赖于 DIRECTORY 对象 1.Create DIRECTORY TEST_DIR AS 'C:\DEVELOP'; 2.GRANT READ, WRITE ON DIRECTORY TEST_DIR TO SCOTT SET SERVEROUT ON FORMAT WRAPPED DECLARE input_file UTL_FILE.FILE_TYPE; input_buffer VARCHAR2(4000); BEGIN input_file := UTL_FILE.FOPEN('TEST_DIR', 'employees.xml', 'r'); FOR I IN 1..11 LOOP UTL_FILE.GET_LINE(input_file, input_buffer); DBMS_OUTPUT.PUT_LINE(input_buffer); END LOOP; UTL_FILE.FCLOSE(input_file); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('------------------'); END; =============================================================== oracle 数据库重生$rman oracle 数据库备份两种类型:物理备份和逻辑备份 =============================================================== oracle 故障有4种类型 1.语句故障 在执行 SQL 语句过程中发生的逻辑故障可导致语句故障。如果用户编写的 SQL 语句无效,就会发生逻辑故障 2.用户进程故障 当用户程序出错而无法访问数据库时发生用户进程故障。导致用户进程故障的原因是异常断开连接或异常终止进程 3. 实例故障 当 oracle 的数据库实例由于硬件或软件问题而无法 继续运行时,就会发生实例故障 4.介质故障 在数据库无法正确读取或写入某个数据库文件时, 会发生介质故障 =============================================================== oracle 导出导入模式 1.完全数据库 导出和导入整个数据库中的所有对象 2.表 导出和导入一个或多个指定的表或表分区 3.用户 导出和导入一个用户模式中的所有对象 4.表空间 导出和导入一个或多个指定的表空间中的所有对象 =============================================================== 导出实用程序有以下常用命令参数 USERID 确定执行导出实用程序的用户名和口令 BUFFER 确定导出数据时所使用的缓冲区大小,其大小用字节表示 FILE 指定导出的二进制文件名称,默认的扩展名是.dmp FULL 指定是否以全部数据库方式导出,只有授权用户才可使用此参数 OWNER 要导出的数据库用户列表 HELP 指定是否显示帮助消息和参数说明 ROWS 确定是否要导出表中的数据 TABLES 按表方式导出时,指定需导出的表和分区的名称 PARFILE 指定传递给导出实用程序的参数文件名 TABLESPACES 按表空间方式导出时,指定要导出的表空间名 按用户方式导出数据 exp scott/tiger@tsinghua file=scott_back owner=scott 按表方式导出数据 exp scott/tiger@tsinghua tables=(emp, dept) file=scott_back_tab 按表空间方式导出数据 exp system/zl@tsinghua tablespaces=(users) file=tbs_users 使用参数文件导出数据 exp system/zl parfile='C:\parameters.txt' =============================================================== 导入实用程序有如下常用命令参数 USERID 指定执行导入的用户名和密码 BUFFER 指定用来读取数据的缓冲区大小,以字节为单位 COMMIT 指定是否在每个数组(其大小由BUFFER参数设置)插入后进行提交 FILE 指定要导入的二进制文件名 FROMUSER 指定要从导出转储文件中导入的用户模式 TOUSER 指定要将对象导入的用户名。FROMUSER与TOUSER可以不同 FULL 指定是否要导入整个导出转储文件 TABLES 指定要导入的表的列表 ROWS 指定是否要导入表中的行 PARFILE 指定传递给导入实用程序的参数文件名,此文件可以包含这里列出的所有参数 IGNORE 导入时是否忽略遇到的错误,默认为N TABLESPACES 按表空间方式导入,列出要导入的表空间名 将整个文件导入数据库 imp tsinghua/tsinghua@tsinghua file=item_back.dmp ignore=y full=y 将scott用户的表导入到martin用户 imp system/zl@tsinghua file=scott_back fromuser=scott touser=martin tables=(emp,dept) 使用参数文件导入数据 imp system/oracle parfile='C:\parameters.txt' =============================================================== 归档日志方式下的数据库:自动归档和手动归档 手动归档允许用户手动归档非活动日志文件文件的已填充组 自动归档对非活动日志文件文件进行自动归档 =============================================================== 数据库可在两种方式下运行:非归档日志方式和归档日志方式 非归档日志方式可以避免实例故障,但无法避免介质故障。在此方式下,数据库只能实施冷备份. 归档日志方式产生归档日志,用户可以使用归档日志完全恢复数据库. =============================================================== 导出和导入实用程序的特点有: 可以按时间保存表结构和数据 1.允许导出指定的表,并重新导入到新的数据库中 2.可以把数据库迁移到另外一台异构服务器上 3.在两个不同版本的Oracle数据库之间传输数据 4.在联机状态下进行备份和恢复 5.可以重新组织表的存储结构,减少链接及磁盘碎片 =============================================================== oracle表输格式为xml全过程.txt SQL> conn sys/sys as sysdba 已连接。 SQL> drop directory test_dir 2 / 目录已丢弃。 SQL> Create DIRECTORY TEST_DIR AS 'C:\'; 目录已创建。 SQL> GRANT READ, WRITE ON DIRECTORY TEST_DIR TO rbb; 授权成功。 SQL> conn rbb/rbb 已连接。 SQL> ed 已写入文件 afiedt.buf 1 DECLARE 2 src CLOB; 3 xmlfile UTL_FILE.FILE_TYPE; 4 length INTEGER; 5 buffer VARCHAR2(16384); 6 BEGIN 7 src := DBMS_XMLQuery.getXml('select * from liuxing'); 8 length := DBMS_LOB.GETLENGTH(src); 9 DBMS_LOB.READ(src, length, 1, buffer); 10 xmlfile := UTL_FILE.FOPEN('TEST_DIR', 'emp.xml', 'w'); 11 UTL_FILE.PUT(xmlfile, buffer); 12 UTL_FILE.FCLOSE(xmlfile); 13* END; SQL> / PL/SQL 过程已成功完成。 =============================================================== SQL> ed 已写入文件 afiedt.buf 1 declare 2 lname number; 3 counter number; 4 begin 5 counter:=1; 6 while counter<=10 7 loop 8 lname:=dbms_random.random; 9 dbms_output.put_line(lname); 10 counter:=counter+1; 11 end loop; 12* end; SQL> / 277652640 -479979827 -1049652647 -1006595853 1252280346 196435204 466478280 -85782435 -1489036577 -927786638 PL/SQL 过程已成功完成。 已用时间: 00: 00: 00.00 =============================================================== 修改表名 alter table old_table_name rename to new_table_name; =============================================================== 估算SQL执行的I/O数 SQL>SET AUTOTRACE ON ; SQL>Select * FROM TABLE; or SQL>Select * FROM v$filestat ; =============================================================== 如何查有多少个数据库实例 SQL>Select * FROM V$INSTANCE; =============================================================== 查询数据库有多少表 SQL>select * from all_tables; =============================================================== 显示测试SQL语句执行所用的时间 SQL>set timing on ; =============================================================== 监控事例的等待 select event,sum(decode(wait_Time,0,0,1)) "Prev", sum(decode(wait_Time,0,1,0)) "Curr",count(*) "Tot" from v$session_Wait group by event order by 4; =============================================================== 回滚段的争用情况 select name, waits, gets, waits/gets "Ratio" from v$rollstat C, v$rollname D where C.usn = D.usn; =============================================================== 监控表空间的 I/O 比例 select B.tablespace_name name,B.file_name "file",A.phyrds pyr, A.phyblkrd pbr,A.phywrts pyw, A.phyblkwrt pbw from v$filestat A, dba_data_files B where A.file# = B.file_id order by B.tablespace_name; =============================================================== 监控文件系统的 I/O 比例 select substr(C.file#,1,2) "#", substr(C.name,1,30) "Name", C.status, C.bytes, D.phyrds, D.phywrts from v$datafile C, v$filestat D where C.file# = D.file#; =============================================================== 在某个用户下找所有的索引 select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name from user_ind_columns, user_indexes where user_ind_columns.index_name = user_indexes.index_name and user_ind_columns.table_name = user_indexes.table_name order by user_indexes.table_type, user_indexes.table_name, user_indexes.index_name, column_position; =============================================================== 监控 SGA 的命中率 select a.value + b.value "logical_reads", c.value "phys_reads", round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO" from v$sysstat a, v$sysstat b, v$sysstat c where a.statistic# = 38 and b.statistic# = 39 and c.statistic# = 40; =============================================================== 监控 SGA 中字典缓冲区的命中率 select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio", (1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio" from v$rowcache where gets+getmisses <>0 group by parameter, gets, getmisses; =============================================================== 监控 SGA 中共享缓存区的命中率,应该小于1% select sum(pins) "Total Pins", sum(reloads) "Total Reloads", sum(reloads)/sum(pins) *100 libcache from v$librarycache; select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins) "reload percent" from v$librarycache; =============================================================== 显示所有数据库对象的类别和大小 select count(name) num_instances ,type ,sum(source_size) source_size , sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size) error_size, sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required from dba_object_size group by type order by 2; =============================================================== 监控 SGA 中重做日志缓存区的命中率,应该小于1% Select name, gets, misses, immediate_gets, immediate_misses, Decode(gets,0,0,misses/gets*100) ratio1, Decode(immediate_gets+immediate_misses,0,0, immediate_misses/(immediate_gets+immediate_misses)*100) ratio2 FROM v$latch Where name IN ('redo allocation', 'redo copy'); =============================================================== 监控内存和硬盘的排序比率,最好使它小于 .10,增加 sort_area_size Select name, value FROM v$sysstat Where name IN ('sorts (memory)', 'sorts (disk)'); =============================================================== 监控当前数据库谁在运行什么SQL语句 Select osuser, username, sql_text from v$session a, v$sqltext b where a.sql_address =b.address order by address, piece; =============================================================== 监控字典缓冲区 Select (SUM(PINS - RELOADS)) / SUM(PINS) "LIB CACHE" FROM V$LIBRARYCACHE; Select (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS) "ROW CACHE" FROM V$ROWCACHE; Select SUM(PINS) "EXECUTIONS", SUM(RELOADS) "CACHE MISSES WHILE EXECUTING" FROM V$LIBRARYCACHE; =============================================================== 后者除以前者,此比率小于1%,接近0%为好。 Select SUM(GETS) "DICTIONARY GETS",SUM(GETMISSES) "DICTIONARY CACHE GET MISSES" FROM V$ROWCACHE =============================================================== 监控 MTS select busy/(busy+idle) "shared servers busy" from v$dispatcher; 此值大于0.5时,参数需加大 select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where type='dispatcher'; select count(*) from v$dispatcher; select servers_highwater from v$mts; servers_highwater接近mts_max_servers时,参数需加大 =============================================================== 知道当前用户的ID号 SQL>SHOW USER; or SQL>select user from dual; =============================================================== 查看碎片程度高的表 Select segment_name table_name , COUNT(*) extents FROM dba_segments Where owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name HAVING COUNT(*) = (Select MAX( COUNT(*) ) FROM dba_segments GROUP BY segment_name); =============================================================== 知道表在表空间中的存储情况 select segment_name,sum(bytes),count(*) ext_quan from dba_extents where tablespace_name='&tablespace_name' and segment_type='TABLE' group by tablespace_name,segment_name; =============================================================== 知道索引在表空间中的存储情况 select segment_name,count(*) from dba_extents where segment_type='INDEX' and owner='&owner' group by segment_name; =============================================================== 知道使用CPU多的用户session 11是cpu used by this session select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value from v$session a,v$process b,v$sesstat c where c.statistic#=11 and c.sid=a.sid and a.paddr=b.addr order by value desc; =============================================================== **************************************************SQLServer语言基本语句*********************************************************** SQL分类: DDL—数据定义语言(Create,Alter,Drop,DECLARE) DML—数据操纵语言(Select,Delete,Update,Insert) DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 1、说明:创建数据库 Create DATABASE database-name create database database &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 2、说明:删除数据库 drop database database drop database dbname &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 3、说明:备份sql server --- 创建 备份数据的 device user pubs exec database 'disk' USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始 备份 backup database pubs to testback BACKUP DATABASE pubs TO testBack &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 4、说明:创建新表 create table tabname(name nvchar(20) primary key,password nvchar(16)) create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 5、说明: 删除新表:drop table tabname &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 6、说明: 增加一个列:Alter table tabname add column col type alter table tabanme add column col 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 7、说明: 添加主键:Alter table tabname add primary key(col) 说明: 删除主键:Alter table tabname drop primary key(col) &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 8、说明: 创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9、说明: 创建视图:create view viewname as select statement 删除视图:drop view viewname &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料! 排序:select * from table1 order by field1,field2 [desc] 总数:select count * as totalcount from table1 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 11、说明:几个高级查询运算词 下列语句创建 STAFF 表 中 20 部门的非经理人员视图,其中薪水和佣金不通过基表显示。 Create VIEW STAFF_ONLY AS Select ID, NAME, DEPT, JOB, YEARS FROM STAFF Where JOB <> 'Mgr' AND DEPT=20 在创建视图之后,下列语句显示视图的内容: Select * FROM STAFF_ONLY A: UNION union 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B: EXCEPT except运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 C: INTERSECT intersect运算符 INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 12、说明:使用外连接 A、left outer join: 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right outer join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 C:full outer join: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 其次,大家来看一些不错的sql语句 1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1<>1 法二:select top 0 * into b from a 2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) insert into b(a, b, c) select d,e,f from b; 3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件 例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. 4、说明:子查询(表名1:a 表名2:b) select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3) 5、说明:显示文章、提交人和最后回复时间 select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b 6、说明:外连接查询(表名1:a 表名2:b) select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 7、说明:在线视图查询(表名1:a ) select * from (Select a,b,c FROM a) T where t.a > 1; 8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 select * from table1 where time between time1 and time2 select a,b,c, from table1 where a not between 数值1 and 数值2 9、说明:in 的使用方法 select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 11、说明:四表联查问题: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... 12、说明:日程安排提前五分钟提醒 SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 13、说明:一条sql 语句搞定数据库分页 select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 14、说明:前10条记录 select top 10 * form table1 where 范围 15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) 16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 (select a from tableA ) except (select a from tableB) except (select a from tableC) 17、说明:随机取出10条数据 select top 10 * from tablename order by newid() 18、说明:随机选择记录 select newid() 19、说明:删除重复记录 Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) 20、说明:列出数据库里所有的表名 select name from sysobjects where type='U' 21、说明:列出表里的所有的 select name from syscolumns where id=object_id('TableName') 22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type 显示结果: type vender pcs 电脑 A 1 电脑 A 1 光盘 B 2 光盘 A 2 手机 B 3 手机 C 3 23、说明:初始化表table1 TRUNCATE TABLE table1 24、说明:选择从10到15的记录 select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc 随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现) 对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环: Randomize RNumber = Int(Rnd*499) +1 While Not objRec.EOF If objRec("ID") = RNumber THEN ... 这里是执行脚本 ... end if objRec.MoveNext Wend 这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了? 采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示: Randomize RNumber = Int(Rnd*499) + 1 SQL = "Select * FROM Customers Where ID = " & RNumber set objRec = ObjConn.Execute(SQL) Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email") 不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。 再谈随机数 现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。 为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录: SQL = "Select * FROM Customers Where ID = " & RNumber & " or ID = " & RNumber2 & " or ID = " & RNumber3 假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 Select 语句只显示一种可能(这里的ID 是自动生成的号码): SQL = "Select * FROM Customers Where ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9" 注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。 随机读取若干条记录,测试过 Access语法:Select top 10 * From 表名 orDER BY Rnd(id) Sql server:select top n * from 表名 order by newid() mysql select * From 表名 order By rand() Limit n Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查) 语法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ... 使用SQL语句 用...代替过长的字符串显示 语法: SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename Access数据库:Select iif(len(field)>2,left(field,2)+'...',field) FROM tablename; Conn.Execute说明 Execute方法 该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种: 1.执行SQL查询语句时,将返回查询得到的记录集。用法为: Set 对象变量名=连接对象.Execute("SQL 查询语言") Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。 2.执行SQL的操作性语言时,没有记录集的返回。此时用法为: 连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option] ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。 ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。 ·BeginTrans、RollbackTrans、CommitTrans方法 这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。 事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。 BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。 ***************************************各种数据库连接方法********************************************************************** ==================TestSQLServer.java连接SQLServer==================================== import java.sql.*; import java.util.*; public class TestSQLServer{ public static void main (String args[]){ try{ Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=testdb"; String user ="sa"; String password = "sa"; Connection conn = DriverManager.getConnection(url,user,password); Statement stat = conn.createStatement(); ResultSet result = stat.executeQuery("Select * FROM users"); result.next(); System.out.println(result.getString(1)); System.out.println(result.getString(2)); System.out.println(result.getString(3)); result.close(); stat.close(); conn.close(); }catch(ClassNotFoundException en){ System.out.println("数据库驱动找不到!"); en.printStackTrace(); }catch(SQLException ex) { while (ex != null) { ex.printStackTrace(); ex = ex.getNextException(); } }catch(Exception e){ System.out.println("其他未知异常!"); e.printStackTrace(); } } } =================TestMysql.java连接mysql数据库======================================= package org.binbo.dom; import java.sql.*; public class TestMysql{ public static void main (String args[]){ try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); String url = "jdbc:mysql://localhost:3306/binbo"; String user ="root"; String password = "binbo"; Connection conn = DriverManager.getConnection(url,user,password); Statement stat = conn.createStatement(); ResultSet result = stat.executeQuery("Select * FROM testxml"); result.next(); System.out.println(result.getString(1)); System.out.println(result.getString(2)); System.out.println(result.getString(3)); result.close(); stat.close(); conn.close(); }catch(ClassNotFoundException en){ System.out.println("数据库驱动找不到!"); en.printStackTrace(); }catch(SQLException ex) { while (ex != null) { ex.printStackTrace(); ex = ex.getNextException(); } }catch(Exception e){ System.out.println("其他未知异常!"); e.printStackTrace(); } } } =================TestOracle.java连接oracle数据库================================== package org.binbo.dom; import java.sql.*; public class TestOracle{ public static void main (String args[]){ try{ Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:binbo"; String user ="scott"; String password = "tiger"; Connection conn = DriverManager.getConnection(url,user,password); Statement stat = conn.createStatement(); ResultSet result = stat.executeQuery("Select * FROM test"); result.next(); System.out.println(result.getString(1)); System.out.println(result.getString(2)); System.out.println(result.getString(3)); result.close(); stat.close(); conn.close(); }catch(ClassNotFoundException en){ System.out.println("数据库驱动找不到!"); en.printStackTrace(); }catch(SQLException ex) { while (ex != null) { ex.printStackTrace(); ex = ex.getNextException(); } }catch(Exception e){ System.out.println("其他未知异常!"); e.printStackTrace(); } } } ===============XML连接数据库===================================================== da.xml <?xml version="1.0" encoding="UTF-8"?> <PEOPLE><!-- <PERSON PERSONID="E01"> <className>com.microsoft.jdbc.sqlserver.SQLServerDriver</className> <url>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=binbo</url> <user>sa</user> <password>sa</password> </PERSON> --><PERSON PERSONID="E02"> <className>com.mysql.jdbc.Driver</className> <url>jdbc:mysql://localhost:3306/binbo</url> <user>root</user> <password>binbo</password> </PERSON><!-- <PERSON PERSONID="E03"> <className>oracle.jdbc.driver.OracleDriver</className> <url>jdbc:oracle:thin:@localhost:1521:binbo</url> <user>scott</user> <password>tiger</password> </PERSON> --></PEOPLE> -------------------------------------------- content.java package org.binbo.dom; import java.sql.Connection; import java.sql.DriverManager; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class Content { public static Connection getConnection(){ Connection conn =null; try { DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document doc=builder.parse("da.xml"); NodeList nl=doc.getElementsByTagName("PERSON"); Element node=(Element) nl.item(0); String className =node.getElementsByTagName("className").item(0).getFirstChild().getNodeValue(); String url =node.getElementsByTagName("url").item(0).getFirstChild().getNodeValue(); String user =node.getElementsByTagName("user").item(0).getFirstChild().getNodeValue(); String pwd =node.getElementsByTagName("password").item(0).getFirstChild().getNodeValue(); Class.forName(className); conn =DriverManager.getConnection(url,user,pwd); } catch (Exception e) { e.printStackTrace(); } return conn; } } -------------------------------------------- Domtest.java package org.binbo.dom; import java.io.FileOutputStream; import java.sql.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; public class Domtest { public static void main(String[] args){ try{ Connection conn =Content.getConnection(); PreparedStatement ps=conn.prepareStatement("select * from testxml"); ResultSet rs =ps.executeQuery(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.newDocument(); Element Stu = doc.createElement("binboxml"); Element uname = doc.createElement("username"); Element nameid = doc.createElement("userid"); Element pass = doc.createElement("password"); while(rs.next()){ String id=rs.getString(1); String name=rs.getString(2); String pwd=rs.getString(3); System.out.print(rs.getString(1)); System.out.print(rs.getString(2)); System.out.print(rs.getString(3)); System.out.print("写入成功!"); nameid.appendChild(doc.createTextNode(id)); uname.appendChild(doc.createTextNode(name)); pass.appendChild(doc.createTextNode(pwd)); } Stu.appendChild(nameid); Stu.appendChild(uname); Stu.appendChild(pass); doc.appendChild(Stu); TransformerFactory tf = TransformerFactory.newInstance(); Transformer tr = tf.newTransformer(); tr.transform(new DOMSource(doc), new StreamResult( new FileOutputStream("Binbo.xml"))); rs.close(); } catch(Exception e){ e.printStackTrace(); } } } =====================数据库连接池===================================== 加到tomcat中的server.xml <Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true"/> 这个后面 <Context path="/myjsp" docBase="myjsp" debug="5" reloadable="true" crossContext="true"> <Resource name="jdbc/myjsp" auth="Container" type="javax.sql.DataSource"/> <ResourceParams name="jdbc/myjsp"> <parameter> <name>factory</name> <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> </parameter> <parameter> <name>maxActive</name> <value>100</value> </parameter> <parameter> <name>maxIdle</name> <value>30</value> </parameter> <parameter> <name>maxWait</name> <value>10000</value> </parameter> <parameter> <name>username</name> <value>sa</value> </parameter> <parameter> <name>password</name> <value>sa</value> </parameter> <parameter> <name>driverClassName</name> <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value> </parameter> <parameter> <name>url</name> <value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=jsp</value> </parameter> </ResourceParams> </Context> ----------------------------------------------------------------------- 用DBPool.java获得数据库连接池 package com.binbo.dbo; import java.sql.Connection; import java.sql.DriverManager; import javax.naming.Context; import javax.naming.NamingException; import javax.sql.DataSource; public class DBPool { public static synchronized Connection getConnection()throws Exception{ DataSource ds = null; try{ Context ininCtx = new javax.naming.InitialContext(); Context envCtx = (Context)ininCtx.lookup("java:comp/env"); ds = (DataSource)envCtx.lookup("jdbc/myjsp"); }catch(NamingException e){ e.printStackTrace(); } Connection conn = ds.getConnection(); return conn; } } ----------------------------------------------------------- 操作数据库 package com.binbo.dbo; import java.sql.*; import com.binbo.javabean.BreakBean; import com.binbo.javabean.OpenBean; public class DataBaseClass { private Statement sta = null; private ResultSet rs = null; Connection conn = null; private int count; public DataBaseClass() throws Exception { // 取得数据库的连接 conn = DBPool.getConnection(); sta = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); } public void getExecute(String sql) { try { System.out.println(sql); sta.executeUpdate(sql); } catch (SQLException e) { e.printStackTrace(); } } /* * sql 语句集的查询 */ public ResultSet getQuery(String sql) { try { System.out.println(sql); rs = sta.executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } return rs; } * 取得结果集的行数 public int getCount(ResultSet rs2) { try { rs2.next(); count = rs2.getRow(); } catch (SQLException e) { e.printStackTrace(); } return count; } //添加! public void getRegister(OpenBean open) { String sql = "insert into f_info(nam,email,titl,content,tem,mid)values(?,?,?,?,?,?)"; try { PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, open.getNam()); ps.setString(2, open.getEmail()); ps.setString(3, open.getTitl()); ps.setString(4, open.getContent()); ps.setString(5, open.getTem()); ps.setString(6, open.getDepa()); ps.execute(); } catch (SQLException e) { e.printStackTrace(); } } // 删除 public void getRealys(OpenBean real) { try { String sql = "delete from departments where id=?"; PreparedStatement ppt = conn.prepareStatement(sql); ppt.setString(1, real.getUnam()); ppt.execute(); } catch (SQLException e) { e.printStackTrace(); } } // 查询 public void getRealy(OpenBean hg) { try { String sql = "select * from departments where id=?"; PreparedStatement ppg = conn.prepareStatement(sql); ppg.setString(1, hg.getUnam()); ppg.execute(); } catch (SQLException e) { e.printStackTrace(); } } } ============================hibernate操作数据库==================================== package com.binbo.hibernate.xml; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class PersonOperate { private Session session = null ; public PersonOperate() { Configuration config = new Configuration().configure() ; SessionFactory factory = config.buildSessionFactory() ; this.session = factory.openSession() ; } // 增加数据 public void insert(Person p) { Transaction tran = this.session.beginTransaction() ; this.session.save(p) ; tran.commit() ; this.session.close() ; } ------------------------------------------ 增加数据调用 LinOperate po = new LinOperate(); Lin p = new Lin(); p.setLname(lname); p.setLmonery(lmonery); p.setLmain(lmain); p.setLtime(ltime); LinOperate po = new LinOperate(); po.insert(p); errors.add("success", new ActionMessage("xiangxi")); request.setAttribute("org.apache.struts.action.ERROR", errors); return mapping.findForward("jinru"); ------------------------------------------ // 修改 public void update(Person p) { Transaction tran = this.session.beginTransaction() ; this.session.update(p) ; tran.commit() ; this.session.close() ; } // 用户登录 public boolean queryById(Person person) { boolean flag = false; String hql = "from Person as p where p.id=? and p.password=?" ; Query q = this.session.createQuery(hql) ; q.setString(0,person.getId()) ; q.setString(1,person.getPassword()); Iterator iter = q.list().iterator(); if (iter.hasNext()) { flag = true; person.setName(((Person) iter.next()).getName()); } this.session.close() ; return flag; } //验证用户存不存在 public boolean queryC(Person person) { boolean flag = false; String hql = "from Person as p where p.name=?" ; Query q = this.session.createQuery(hql) ; q.setString(0,person.getName()) ; Iterator iter = q.list().iterator(); if (iter.hasNext()) { flag = true; } this.session.close() ; return flag; } //查看个人资料 public Person queryZliao(String id) { Person p = null ; String hql = "from Person as p where p.id=?" ; Query q = this.session.createQuery(hql) ; q.setString(0,id) ; List l = q.list() ; Iterator iter = l.iterator() ; if(iter.hasNext()) { p = (Person)iter.next() ; } return p ; } // 删除数据 public void delete(Person p) { Transaction tran = this.session.beginTransaction() ; this.session.delete(p) ; tran.commit() ; } // 修改 public void delete(String name) { String hql = "delete Person where name=?" ; Query q = this.session.createQuery(hql) ; q.setString(0,name) ; q.executeUpdate() ; this.session.beginTransaction().commit() ; } // 查询全部数据 public List queryAll() { List l = null ; String hql = "from Person as p" ; Query q = this.session.createQuery(hql) ; l = q.list() ; return l ; } ------------------------------- ( 查询全部数据调用 LinOperate po = new LinOperate(); List l = po.queryAll(); Iterator iter = l.iterator(); ArrayList lus = new ArrayList(); while (iter.hasNext()) { Lin p = (Lin) iter.next(); Luser lu = new Luser(); lu.setName(p.getLname()); lu.setChange(p.getLmonery()); lu.setMainn(p.getLmain()); lu.setLtime(p.getLtime()); lus.add(lu); System.out.print(p.getLname() + " "); request.setAttribute("lus", lus); ) ------------------------ // 模糊查询 public List queryByLike(String cond) { List l = null ; String hql = "from Person as p where p.name like ?" ; Query q = this.session.createQuery(hql) ; q.setString(0,"%"+cond+"%") ; l = q.list() ; return l ; } }