下列选项中不是rowid

SQL查询,如何去除重复的记录

首先,先说明一个问题。这样的结果出现,说明系统设计是有问题的。
其次
删除重复数据,你要提供你是什么数据库。
不同数据库会有不同的解决方案。
关键字Distinct
去除重复,如下列SQL,去除Test相同的记录;
1.
select
distinct
Test
from
Table
2.
如果是要删除表中存在的重复记录,那就逻辑处理,如下:
3.
select
Test
from
Table
group
by
Test
having
count(test)》1
4.
先查询存在重复的数据,后面根据条件删除
还有一个更简单的方法可以尝试一下:
select
aid,
count(distinct
uid)
from
表名
group
by
aid
这是sqlserver
的写法。
如图一在数据表中有两个膀胱冲洗重复的记录。
2
可以通过sql语句“select
*from
表名
where
编码
in(select
编码
from
表名
group
by
编码
having
count(1)
》=
2)”来查询出变种所有重复的记录如图二
3
通过sql语句“
delete
from
表名
where
编码
in(select
编码
from
表名
group
by
编码
having
count(1)
》=
2)
and
编码
not
in
(select
max(编码)from
表名
group
by
编码
having
count(1)
》=2)
“来删除重复的记录只保留编码最大的记录

第二十九章 SQL命令 DISTINCT

指定仅返回不同值的 SELECT 子句。

可选 DISTINCT 子句出现在 SELECT 关键字之后、可选 TOP 子句和第一个 SELECT-ITEM 之前。

DISTINCT 子句应用于 SELECT 语句的结果集。它将每个不同(唯一)值返回的行数限制为一个任意行。如果未指定 DISTINCT 子句,则默认情况下显示满足选择条件的所有行。 ALL 子句与不指定 DEFAULT 子句相同;如果指定 ALL , SELECT 将返回表中满足选择条件的所有行。

DISTINCT 从句有两种形式:

项目字段必须按列名指定。有效值包括以下值:列名( DISTINCT BY(City) ); %ID (返回所有行);指定列名的标量函数( DISTINCT BY(ROUND(Age,-1) ;指定列名的排序函数( DISTINCT BY(%Exact(City) 。不能按列别名指定字段;尝试这样做会生成 SQLCODE-29 错误。不能按列号指定字段;这将被解释为文字,并返回一行。将文字指定为 DISTINCT 子句中的项值将返回 1 行;返回哪行是不确定的。因此,指定 7 、 ‘Chicago’ 、 ‘’ 、 0 或 NULL 都返回 1 行。但是,如果将文字指定为逗号分隔列表中的项值,则该文字将被忽略,并且 DISTINCT 将为指定字段名的每个唯一组合选择一行。

DISTINCT 子句在 TOP 子句之前应用。如果两者都指定,则 SELECT 只返回具有唯一值的行,唯一值是在 TOP 子句中指定的唯一值行数。

如果 DISTINCT 子句中指定的列包含 NULL (不包含值)行,则 DISTINCT 将返回一行作为 DISTINCT (唯一)值的 NULL ,如以下示例所示:

DISTINCT 子句在嵌入式SQL简单查询中没有意义,因为在这种类型的嵌入式SQL中, SELECT 始终只返回一行数据。但是,嵌入式SQL基于游标的查询可以返回多行数据;在基于游标的查询中, DISTINCT 子句只返回唯一值行。

DISTINCT 子句在 ORDER BY 子句之前应用。因此, DISTINCT 和 ORDER BY 的组合将首先选择满足 DISTINCT 子句的任意行,然后根据 ORDER BY 子句对这些行进行排序。

DISTINCT 和 GROUP BY 这两个记录按指定字段(或多个字段)分组,并为该字段的每个唯一值返回一条记录。它们之间的一个重要区别是 DISTINCT 在分组之前计算聚合函数。 GROUP BY 计算分组后的聚合函数。以下示例显示了这种差异:

DISTINCT 子句可以用一个或多个聚合函数字段指定,尽管这很少有意义,因为聚合函数返回单个值。因此,下面的示例返回单行:

注意:如果将聚合函数作为唯一项或选择项的 DISTINCT 子句与 GROUP BY 子句一起使用,则 DISTINCT 子句将被忽略。可以使用子查询实现 DISTINCT 、聚合函数和 GROUP BY 的预期组合。

根据为字段定义的排序规则类型,将字符串值不同地分组在一起。默认情况下,字符串数据类型字段使用 SQLUPPER 排序规则定义,该排序规则不区分大小写。

如果字段/特性排序规则类型为 SQLUPPER ,则分组的字段值将全部以大写字母返回。要按原始字母大小写对值进行分组,或以原始字母大小写显示分组字段的返回值,请使用 %Exact 排序规则函数。以下示例显示了这一点,这些示例假设 Home_City 字段是使用排序规则类型 SQLUPPER 定义的,并且包含值 ‘New York’ 和 ‘New York’ :

可以使用管理门户优化包含 DISTINCT 子句的查询的查询性能。依次选择系统管理、配置、SQL和对象设置、SQL。查看和 GROUP BY 和 DISTINCT 查询必须生成原始值选项。(此优化也适用于 GROUP BY 子句。)。默认值为“否”。

此默认设置按字母值的大写排序规则对字母值进行分组。此优化利用选定字段的索引。因此,只有在一个或多个选定字段存在索引时才有意义。它对存储在索引中的字段值进行排序;字母字符串以全部大写字母返回。您可以设置此系统范围的选项,然后使用 %exact 排序规则函数为特定查询覆盖它以保留字母大小写。

也可以使用 $SYSTEM.SQL.Util.SetOption() 方法快速区分选项在系统范围内设置此选项。要确定当前设置,请调用 $SYSTEM.SQL.CurrentSettings() ,它显示打开的不同优化设置;默认值为 1 。

指定 DISTINCT 关键字会导致基于游标的嵌入式SQL查询不设置 %ROWID 变量。即使 DISTINCT 不限制返回的行数,也不设置 %ROWID 。下面的示例显示了这一点:

查询行为的这种更改仅适用于基于游标的嵌入式 SQL SELECT 查询。动态 SQL SELECT 查询和非游标嵌入式 SQL SELECT 查询从未设置 %ROWID 。

指定 DISTINCT 关键字会导致查询检索所有当前数据,包括当前事务尚未提交的数据。忽略事务的 READ COMMITTED 隔离模式参数(如果设置);在 READ UNCOMMITTED 模式下检索所有数据。

以下查询为每个不同的 Home_State 值返回一行:

以下查询为每个不同的 Home_State 值返回一行,但返回该行的其他字段。无法预测检索到的是哪一行:

以下查询为 Home_State 和 Office_State 值的每个不同组合返回一行。根据数据的不同,它要么返回更多行,要么返回与上一个示例相同的行数:

以下查询使用 DISTINCT BY 为每个不同的名称长度返回一行:

下面的查询使用 DISTINCT BY 为 FavoriteColors %List 值的每个不同的第一个元素返回一行。它列出 FavoriteColors 为空的不同行:

以下查询按排序规则升序返回从 Sample.Person 检索到的前 20 个不同的 Home_State 值。 “top” 行反映 Sample.Person 中所有行的 ORDER BY 子句排序。

以下查询在主查询和 WHERE 子句子查询中都使用 DISTINCT 。它返回 Sample.Person 中的前 20 个不同的 Home_State 值,这些值也在 Sample.Employee 中。如果未提供子查询 DISTINCT ,它将检索 Sample.Person 中与 Sample.Employee 中随机选择的 Home_State 值匹配的 DISTINCT Home_State 值:

以下查询返回前 20 个不同的 FavoriteColore 值。这反映了 Sample.Person 中所有行的 ORDER BY 子句排序。众所周知, FavoriteColors 字段具有 NULL ,因此 FavoriteColors 为 NULL 的不同行出现在排序规则序列的顶部。

还要注意,在前面的示例中,因为 FavoriteColors 是一个列表字段,所以归类序列包括元素长度字节。因此,以三个字母元素(红色)开头的不同列表值列在以四个字母元素(蓝色)开头的列表值之前。

Oracle数据库中什么字段类型能保存’0’字符

目前Oracle 数据库大概有26个字段类型,大体分为六类,分别是字符串类型、数字数据类型、日期时间数据类型、大型对象(LOB)数据类型、RAW和LONG RAW数据类型、ROWID和UROWID数据类型。当然Oracle还提供用户自定义的数据类型,但在我这篇不做讨论。
字符串类型
Char
char数据类型存储固定长度的字符值。一个CHAR数据类型可以包括1到2000个字符。如果对CHAR没有明确地说明长度,它的默认长度则设置为1。 如果对某个CHAR类型变量赋值,其长度小于规定的长度,那么Oracle自动用空格填充。
注意:如果给了一个比固定长度更长的值,其尾部带有空格,则空格会被删除到固定的长度。如果值太大Oracle会返回一个错误,
Varchar
用于保存变长的字符串数据。其中最大字节长度由(size)指定。每行长度可变,最大长度为每行4000字节。设置长度(size)前需考虑字符集为单字节或多字节。
注意:varchar是被废弃的类型,oracle目前都推荐使用varchar2。虽然varchar也可以用,但不确保未来的版本是否还支持
Varchar2
用于保存变长的字符串数据。其中最大字节长度由(size)指定。每行长度可变,最大长度为每行4000字节。设置长度(size)前需考虑字符集为单字节或多字节。由于VARCHAR2数据类型只存储为该列所赋的字符(不加空格),所以VARCHAR2需要的存储空间比CHAR数据类型要小。
区别:varchar2把所有字符都占两字节处理(一般情况下),varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节;VARCHAR2把空串等同于null处理,而varchar仍按照空串处理;大部分情况下建议使用varchar2类型,可以保证更好的兼容性。
Nchar
Unicode数据类型,根据字符集而定的固定长度字符串,最大长度2000bytes。
Nvarchar2
Unicode数据类型,根据字符集而定的可变长度字符串,最大长度4000bytes。
Long
可变长字符列,最大长度限制为2GB,用于不需要作字符串搜索的长串数据。
说明:此类型是一个遗留下来的而且将来不会被支持的数据类型,逐渐被BLOB,CLOB,NCLOB等大的数据类型所取代。
数字类型
Number
NUMBER数据类型精度可以高达38位,它有两个限定符,如:column NUMBER(precision,scale)。precision表示数字中的有效位。如果没有指定precision的话,Oracle将使用38 作为精度。scale表示小数点右边的位数,scale默认设置为0。如果把scale设成负数,Oracle将把该数字取舍到小数点左边的指定位数。
Decimal
Oracle只是在语法上支持decimal类型,但是在底层实际上它就是number类型,支持decimal类型是为了能把数据从Oracle数据库移到其他数据库中。
Float
FLOAT类型也是NUMBER的子类型。其格式Float(n),数 n 指示位的精度,可以存储的值的数目。N 值的范围可以从1 到 126。若要从二进制转换为十进制的精度,请将n 乘以 0.30103。要从十进制转换为二进制的精度,请用 3.32193乘小数精度。126 位二进制精度的最大值是大约相当于 38 位小数精度。
BINARY_FLOAT
BINARY_FLOAT 是一种 32 位,单精度浮点数字数据类型。每个 BINARY_FLOAT 值需要5 字节存储空间,其中 1字节用于存储数据值的长度。支持 NUMBER 数据类型所提供的基本功能。但采用二进制精度,而NUMBER 采用十进制精度。因此能够提供更快的数学运算速度,且能减少占用的存储空间。
BINARY_DOUBLE
BINARY_DOUBLE 是一种 64 位,双精度浮点数字数据类型。每个 BINARY_DOUBLE 值需要9 字节存储空间,其中1 字节用于存储数据值的长度。支持 NUMBER 数据类型所提供的基本功能。但采用二进制精度,而NUMBER 采用十进制精度。因此能够提供更快的数学运算速度,且能减少占用的存储空间。
日期数据类型
Date
ORACLE最常用的日期类型,它可以保存日期和时间,常用日期处理都可以采用这种类型。DATE表示的日期范围可以是公元前4712年1月1日至公元9999年12月31日。
date类型在数据库中的存储固定为7个字节, 第1字节:世纪+100、 第2字节:年、第3字节:月、第4字节:天、第5字节:小时+1、第6字节:分+1、第7字节:秒+1。
Timestamp
ORACLE常用的日期类型,它与date的区别是不仅可以保存日期和时间,还能保存小数秒,小数位数可以指定为0-9,默认为6位,所以最高精度 可以到ns(纳秒),数据库内部用7或者11个字节存储,如果精度为0,则用7字节存储,与date类型功能相同,如果精度大于0则用11字节存储。第1字节:世纪+100、第2字节:年、第3字节:月、第4字节:天、 第5字节:小时+1、第6字节:分+1、第7字节:秒+1、 第8-11字节:纳秒,采用4个字节存储,内部运算类型为整形
注:TIMESTAMP日期类型如果与数值进行加减运算会自动转换为DATE型,也就是说小数秒会自动去除。
TIMESTAMP WITH TIME ZONE
对TIMESTAMP进行了扩展,用于存储时区。时间戳以及时区位移值,其中fractional_seconds_precision是数字在第二日期时间字段的小数部分数字的所有值。可接受的值是0到9。默认是6。默认格式是确定明确的NLS_DATE_FORMAT参数或隐式的NLS_TERRITORY参数。大小固定为13字节。此数据类型包含日期时间字段YEAR,MONTH,日,小时,分钟,秒TIMEZONE_HOUR和TIMEZONE_MINUTE。它有一个明确的分数秒和时区。
TIMESTAMP WITH LOCAL TIME ZONE
所有的TIMESTAMP WITH TIME ZONE值,但下列情况除外:数据标准化数据库的时区时,存储在数据库中。当数据被检索,用户可以看到在会话时区中的数据。
默认格式是确定明确的NLS_DATE_FORMAT参数或隐式的NLS_TERRITORY参数。的大小不同的7至11个字节,取决于精度。
INTERVAL YEAR TO MONTH
存储期间年数和月的时间,其中year_precision是数字的年份日期时间字段的数量。可接受的值是0到9。默认是2。大小固定为5个字节。
INTERVAL DAY TO SECOND
其格式为:INTERVAL DAY ,是存储一段时间以天,小时,分钟和秒,其中day_precision是数字在DAY日期时间字段的最大数量。可接受的值是0到9。默认是2。fractional_seconds_precision是数字中的第二个字段的小数部分的数量。可接受的值是0到9。默认是6。大小固定为11个字节。
INTERVAL YEAR TO MONTH
Oracle语法:INTERVAL YEAR TO MONTH,用来表示一段时间差, 只精确到年和月. year_precision是数字年的时间段,接受的值为0到9。默认值是2。大小固定为5个字节。
大型对象(LOB)数据类型
Clob
最大4G,存储单字节字符型数据。适用于存储超长文本。
Nclob
最大4G,存储多字节国家字符型数据。适用于存储超长文本。
Blob
最大4G,存储二进制数据。适用于存储图像、视频、音频等。
BFile
最大长度是4GB,在数据库外部保存的大型二进制对象文件,最大长度是4GB。这种外部的LOB类型,通过数据库记录变化情况,但是数据的具体保存是在数据库外部进行的。 Oracle 可以读取、查询BFILE,但是不能写入,不参与事务。
RAW和LONG RAW数据类型
RAW
raw(n)格式,其中n=1 to 2000,可变长二进制数据,在具体定义字段的时候必须指明最大长度n,Oracle 用这种格式来保存较小的图形文件或带格式的文本文件,如Miceosoft Word文档。raw是一种较老的数据类型,将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。
LONG RAW
最大长度是2GB。可变长二进制数据,最大长度是2GB。Oracle 用这种格式来保存较大的图形文件或带格式的文本文件,如Miceosoft Word文档,以及音频、视频等非文本文件。在同一张表中不能同时有long类型和long raw类型,long raw也是一种较老的数据类型,将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。
ROWID和UROWID数据类型
Rowid
ROWID为该表行的唯一标识,是一个伪列,可以用在SELECT中,但不可以用INSERT, UPDATE来修改该值。ROWID列,Oracle使用ROWID列来建立内部索引。你可以引用ROWID的值,但ROWID并不存放在数据库中,你可以创建一个表包含ROWID数据类型。但Oracle不保证该值是合法的rowids。用户必须确保该rowid值是真实合法的。
Urowid
UROWID支持逻辑和物理的rowids,列UROWID类型可以存储各种rowids, 从8.1以后的Oracle才有UROWID类型,它也可以用来保存以前的ROWID类型数据信息。
特殊数据类型
Xmltype
XMLType是Oracle从9i开始特有的数据类型,是一个继承了Blob的强大存在,可以用来存储xml并提供了相当多的操作函数,用来直接读取xml文档和管理节点。理论上可以保存2G大小的数据。作为XML数据的特殊存储类型。Xmltype提供了适合的保存、检索和操作的支持。
Xmlindex
XMLIndex 索引可用于 SQL/XML 函数 XMLExists()、XMLTable() 和 XMLQuery(),而且它在查询的任何部分都有效;它并不限于用在 WHERE 子句中。而您可能用于 XML 数据的其他任何索引都无法做到这一点。
XMLIndex 因此可提高对 SELECT 列表数据和 FROM 列表数据的访问速度,对 XML 片段提取尤为有用。基于函数的索引和 CTXXPath 索引。您无需预先了解将在查询中使用的XPath 表达式。XMLIndex 完全是通用的,而基于函数的索引则不同。可将 XMLIndex 索引用于基于 XML 模式或非基于模式的数据。它可用于二进制 XML 和非结构化存储模型。B 树索引仅适用于以对象关系方式存储(结构化存储)的基于模式的数据;它对于存储在二进制XML 或CLOB 实例中的基于 XML 模式的数据效率低下。可使用 XMLIndex 索引通过 XPath 表达式进行搜索,这些表达式的目标是集合(即文档中出现多次的节点)。而函数索引则不然。

sql pro for mysql怎么用

直接和windows系统的使用一样的
MySQL数据库客户端是一个轻量级但强大的MySQL数据库客户端,允许快速和简单的访问MySQL服务器,包括那些驻留在Amazon RDS。
这个SQL客户端只是为MySQL和不会使用该软件或PostgresSQL等其他数据库服务器。
SQLPro for MySQL功能包括:
+语法高亮显示。
+智能感知/自动完成。
+基于选项卡界面。
+支持执行多个查询。
+快速访问表、列和更多。
+使用预构建的一个主题,或定制你自己的。
+存储过程执行。

mysql 大数据量查询如何优化,没办法去掉<>和like

其实你这个需要程序和数据库有一致的设计。可考虑分区。
通过电话前缀来分区,以下只是一个形式,不推荐用中文命名,
这样,只要用户不填写电话,那么前三字符就是xxx,自动会放入 ZFU区。
CREATE TABLE Customer
(
ID INT NOT NULL,
Mobile_PerNO CHAR(3) DEFAULT ’xxx’,
Mobile VARCHAR(30)
)
PARTITION BY LIST(Mobile_PerNO)
PARTITION 联通186 VALUES IN (133),
PARTITION 移动139 VALUES IN (139),
PARTITION 电信133 VALUES IN (133),
PARTITION ZFU VALUES IN (xxx)
);
其次你过于依赖数据库而成形的程序,用点不客气的话说,那就是耦合极高的设计。
你其实完全可以在注册时,写入验证,一个手机号就能注册一次。左右打掉空格,这样手机上就能建立唯一索引。 使用LIKE ‘133%’ 至少性能上有一定的飞跃。
至于你的第二个SQL, 在时间和发送号码上可以建立索引,然后条件上写入时间。
也可以使用hash方式按照年季度分区。
理论上 性能提升百倍还是一点问题都没有的。
分区资料 看官方文档。

jqgrid导航栏上默认的增删改查问题

jqGrid的调用以及常用增删改查的使用方法 以下是代码参考一下吧
jquery grid是富客户端的,基于XML , Ajax网格插件的jQuery库。 jqGridView提供专业的解决方案,代表和表格数据在网络上。精心设计的,具有强大的脚本API的,这可网格是很简单的DHTML与XML 的配置,并显示出令人信服的成果与大量数据。现在我现在熟悉一下jquery grid的的使用方法和一些常用的option设置。

jquery grid是富客户端的,基于XML , Ajax网格插件的jQuery库。 jqGridView提供专业的解决方案,代表和表格数据在网络上。精心设计的,具有强大的脚本API的,这可网格是很简单的DHTML与XML 的配置,并显示出令人信服的成果与大量数据。现在我现在熟悉一下jquery grid的的使用方法和一些常用的option设置。
1.调用grid
jqGrid已经可以从Server端获得数据,并显示在Grid表格中了。下面说一下,如何操作Grid表格及其数据。
jqGrid有很多方法函数,用来操作数据或者操作Grid表格本身。jqGrid的方法有两种调用方式:

1$(“#grid_id“).jqGridMethod( parameter1,…,parameterN );
或者

1$(“#grid_id“).jqGrid(’method’, parameter1,…,parameterN );
2.常用的方法函数(
附上代码:
javascript部分:

01$(function(){
02 // 配置jqGrid组件
03 $(“#gridTable“).jqGrid({
04 url: “jqGrid01.action“,
05 datatype: “json“,
06 mtype: “GET“,
07 height: 350,
08 width: 600,
09 colModel: [
10 {name:“id“,index:“id“,label:“编码“,width:40},
11 {name:“lastName“,index:“lastName“,label:“姓“,width:80,sortable:false},
12 {name:“firstName“,index:“firstName“,label:“名“,width:80,sortable:false},
13 {name:“email“,index:“email“,label:“电子邮箱“,width:160,sortable:false},
14 {name:“telNo“,index:“telNo“,label:“电话“,width:120,sortable:false}
15 ],
16 viewrecords: true,
17 rowNum: 15,
18 rowList: ,
19 prmNames: {search: “search“},
20 jsonReader: {
21 root:“gridModel“,
22 records: “record“,
23 repeatitems : false
24 },
25 pager: “#gridPager“,
26 caption: “联系人列表“,
27 hidegrid: false,
28 shrikToFit: true
29 });
30});
31var echoSelRow = function() {
32 var id = $(“#gridTable“).jqGrid(“getGridParam“, “selrow“);
33
34 alert(“当前选中行ID:“ + id);
35};
36var getContact = function() {
37 var selectedId = $(“#gridTable“).jqGrid(“getGridParam“, “selrow“);
38
39 var rowData = $(“#gridTable“).jqGrid(“getRowData“, selectedId);
40
41 alert(“First Name: “ + rowData.firstName);
42};
43var addContact = function() {
44 var selectedId = $(“#gridTable“).jqGrid(“getGridParam“, “selrow“);
45
46 var dataRow = {
47 id : 99,
48 lastName : “Zhang“,
49 firstName : “San“,
50 email : “zhang_san@126.com“,
51 telNo : “0086-12345678“
52 };
53
54 if (selectedId) {
55 $(“#gridTable“).jqGrid(“addRowData“, 99, dataRow, “before“, selectedId);
56
57 } else {
58 $(“#gridTable“).jqGrid(“addRowData“, 99, dataRow, “first“);
59
60 }
61};
62var updateContact = function() {
63 var selectedId = $(“#gridTable“).jqGrid(“getGridParam“, “selrow“);
64
65 var dataRow = {
66 lastName : “Li“,
67 firstName : “Si“,
68 email : “li_si@126.com“
69 };
70
71 var cssprop = {
72 color : “#FF0000“
73 };
74
75 $(“#gridTable“).jqGrid(’setRowData’, selectedId, dataRow, cssprop);
76};
77var deleteContact = function() {
78 var selectedId = $(“#gridTable“).jqGrid(“getGridParam“, “selrow“);
79
80 $(“#gridTable“).jqGrid(’delRowData’, selectedId);
81};
82var changeGridOptions = function() {
83 $(“#gridTable“).jqGrid(“setGridParam“, {
84 rowNum: 50,
85 page: 16
86 }).trigger(’reloadGrid’);
87
88 $(“#gridTable“).jqGrid(“setCaption“, “Contact List“).trigger(’reloadGrid’);
89
90 alert($(“#gridTable“).jqGrid(“getGridParam“, “caption“));
91 alert($(“#gridTable“).jqGrid(“getGridParam“, “rowNum“));
92};
93var resetWidth = function() {
94 $(“#gridTable“).jqGrid(“setGridWidth“, 300, false);
}
html部分:
《!DOCTYPE html
PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN“
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“》
《html xmlns=“http://www.w3.org/1999/xhtml“ xml:lang=“zh-CN“ lang=“zh-CN“》
《head》
《title》jqGrid02《/title》
《link rel=“stylesheet“ type=“text/css“ media=“screen“ href=“../css/themes/aero/jquery-ui-1.8.1.custom.css“ mce_href=“css/themes/aero/jquery-ui-1.8.1.custom.css“ /》
《link rel=“stylesheet“ type=“text/css“ media=“screen“ href=“../css/themes/aero/ui.jqgrid.custom.css“ mce_href=“css/themes/aero/ui.jqgrid.custom.css“ /》

《mce:script type=“text/javascript“ src=“../js/jquery-1.4.2.min.js“ mce_src=“js/jquery-1.4.2.min.js“》《/mce:script》
《mce:script src=“../js/jquery-ui-1.8.1.custom.min.js“ mce_src=“js/jquery-ui-1.8.1.custom.min.js“ type=“text/javascript“》《/mce:script》
《mce:script src=“../js/i18n/grid.locale-zh-CN.js“ mce_src=“js/i18n/grid.locale-zh-CN.js“ type=“text/javascript“》《/mce:script》
《mce:script src=“../js/jquery.jqGrid.min.js“ mce_src=“js/jquery.jqGrid.min.js“ type=“text/javascript“》《/mce:script》

《mce:script src=“js/jqGrid02.js“ mce_src=“js/jqGrid02.js“ type=“text/javascript“》《/mce:script》
《/head》
《body》
《h3》
jqGrid测试 02
《/h3》
《div》
《table id=“gridTable“》《/table》
《div id=“gridPager“》《/div》
《/div》

《br /》

《div》
《button onclick=“echoSelRow()“》当前行ID《/button》
《button onclick=“getContact()“》当前联系人《/button》
《button onclick=“addContact()“》添加行《/button》
《button onclick=“updateContact()“》修改行《/button》
《button onclick=“deleteContact()“》删除行《/button》
《button onclick=“changeGridOptions()“》改变Grid选项《/button》
《button onclick=“resetWidth()“》改变Grid宽度《/button》
《/div》
《/body》
《/html》
记得加分哦

oracle的一个菜鸟问题关于rowid和主键

rowid–是行的唯一标识,这样查询时能快速准确定位到该行,不是主键,是系统默认有的
主键的作用很明显,主键必须是唯一不能重复的,插入重复主键的记录是要报错的哟

如何优化SQL语句

(1)选择最有效率的表名顺序(只在基于规则的优化器中有效):

ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写

在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的

情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询

, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其

他表所引用的表.

(2) WHERE子句中的连接顺序.:

ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必

须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE

子句的末尾.

(3) SELECT子句中避免使用‘ * ‘:

ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过

查询数据字典完成的, 这意味着将耗费更多的时间

(4)减少访问数据库的次数:

ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变

量 , 读数据块等;

(5)在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加

每次数据库访问的检索数据量 ,建议值为200

(6)使用DECODE函数来减少处理时间:

使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.

(7)整合简单,无关联的数据库访问:

如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使

它们之间没有关系)

(8)删除重复记录:

最高效的删除重复记录方法 ( 因为使用了ROWID)例子:

DELETE FROM EMP E WHERE E.ROWID 》 (SELECT MIN(X.ROWID)

FROM EMP X WHERE X.EMP_NO = E.EMP_NO);

(9)用TRUNCATE替代DELETE:

当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存

放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前

的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回

滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的

资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适

用,TRUNCATE是DDL不是DML)

(10)尽量多使用COMMIT:

只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也

会因为COMMIT所释放的资源而减少:

COMMIT所释放的资源:

a. 回滚段上用于恢复数据的信息.

b. 被程序语句获得的锁

c. redo log buffer 中的空间

d. ORACLE为管理上述3种资源中的内部花费

(11)用Where子句替换HAVING子句:

避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行

过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,

那就能减少这方面的开销. (非oracle中)on、where、having这三个都可以加条

件的子句中,on是最先执行,where次之,having最后,因为on是先把不符合条

件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该

速度是最快的,where也应该比having快点的,因为它过滤数据后才进行sum,在

两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。

在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们

的结果是一样的,只是where可以使用rushmore技术,而having就不能,在速度

上后者要慢如果要涉及到计算的字段,就表示在没计算之前,这个字段的值是不

确定的,根据上篇写的工作流程,where的作用时间是在计算之前就完成的,而

having就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。在多

表联接查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,

把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由

having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条

件应该在什么时候起作用,然后再决定放在那里

(12)减少对表的查询:

在含有子查询的SQL语句中,要特别注意减少对表的查询.例子:

SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT

TAB_NAME,DB_VER FROM TAB_COLUMNS WHERE VERSION = 604)

(13)通过内部函数提高SQL效率.:

复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法

在实际工作中是非常有意义的

(14)使用表的别名(Alias):

当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column

上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.

(15)用EXISTS替代IN、用NOT EXISTS替代NOT IN:

在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联

接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查

询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是

最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN

,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.

例子:

(高效)SELECT * FROM EMP (基础表) WHERE EMPNO 》 0 AND EXISTS (SELECT

‘X’ FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)

(低效)SELECT * FROM EMP (基础表) WHERE EMPNO 》 0 AND DEPTNO IN(SELECT

DEPTNO FROM DEPT WHERE LOC = ‘MELB’)

(16)识别’低效执行’的SQL语句:

虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具

来解决问题始终是一个最好的方法:

SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, ROUND((BUFFER_GETS-

DISK_READS)/BUFFER_GETS,2) Hit_radio, ROUND(DISK_READS/EXECUTIONS,2)

Reads_per_run,

SQL_TEXT FROM V$SQLAREA WHERE EXECUTIONS》0 AND BUFFER_GETS 》 0 AND

(BUFFER_GETS-DISK_READS)/BUFFER_GETS 《 0.8 ORDER BY 4 DESC;

(17)用索引提高效率:

索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了一个复

杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找

出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结

多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键

(primary key)的唯一性验证.。那些LONG或LONG RAW数据类型, 你可以索引几乎

所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小

表时,使用索引同样能提高效率. 虽然使用索引能得到查询效率的提高,但是我们

也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在

表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT

, DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存

储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引

是有必要的.:

ALTER INDEX 《INDEXNAME》 REBUILD 《TABLESPACENAME》

(18)用EXISTS替换DISTINCT:

当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在

SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换, EXISTS 使查询更为迅

速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果. 例子:

(低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E

WHERE D.DEPT_NO = E.DEPT_NO (高效): SELECT DEPT_NO,DEPT_NAME FROM DEPT

D WHERE EXISTS ( SELECT ‘X’ FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);

(19) sql语句用大写的;因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行

(20)在java代码中尽量少用连接符“+”连接字符串!

  • 21)避免在索引列上使用NOT 通常,
    我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描.
    (22)避免在索引列上使用计算.
    WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.举例: 低效:

  • SELECT … FROM DEPT WHERE SAL *12》25000; 高效:

    SELECT … FROM DEPT WHERE SAL 》25000/12;

    (23)用》=替代》
    高效:
    SELECT * FROM EMP WHERE DEPTNO 》=4 低效:
    SELECT * FROM EMP WHERE DEPTNO 》3 两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.
    (24)用UNION替换OR (适用于索引列)
    通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引. 高效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE REGION = “MELBOURNE” 低效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = “MELBOURNE” 如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面. 
    (25)用IN来替换OR
    这是一条简单易记的规则,但是实际的执行效果还须检验,在ORACLE8i下,两者的执行路径似乎是相同的. 
    低效: SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30 高效 SELECT… FROM LOCATION WHERE LOC_IN IN (10,20,30);
    (26)避免在索引列上使用IS NULL和IS NOT NULL
    避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引.对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空,则记录存在于索引中.举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入). 然而如果所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.
    低效: (索引失效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL; 高效: (索引有效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE 》=0;
    (27)总是使用索引的第一个列:
    如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则,当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引
    (28)用UNION-ALL 替换UNION ( 如果有可能的话):
    当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高. 需要注意的是,UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是要从业务需求分析使用UNION ALL的可行性. UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这块内存的优化也是相当重要的. 下面的SQL可以用来查询排序的消耗量
    低效:

  • ·          
  • ·         SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS
  • WHERE TRAN_DATE =’31-DEC-95’UNIONSELECT ACCT_NUM, BALANCE_AMT
  • FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE =’31-DEC-95’高效: SELECT ACCT_NUM, BALANCE_AMT
  • FROM DEBIT_TRANSACTIONS·         WHERE TRAN_DATE =’31-DEC-95’UNIONALLSELECT ACCT_NUM, BALANCE_AMT
  • FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE =’31-DEC-95’·          
  • (29)用WHERE替代ORDER BY:
    ORDER BY 子句只在两种严格的条件下使用索引.
    ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
    ORDER BY中所有的列必须定义为非空.
    WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.
    例如: 表DEPT包含以下列:
    DEPT_CODE PK NOT NULL
    DEPT_DESC NOT NULL
    DEPT_TYPE NULL
    低效: (索引不被使用) SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE 高效: (使用索引) SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE 》 0 
    (30)避免改变索引列的类型.:
    当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换.
    假设 EMPNO是一个数值类型的索引列. SELECT … FROM EMP WHERE EMPNO = ‘123’ 实际上,经过ORACLE类型转换, 语句转化为: SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123’) 幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变. 现在,假设EMP_TYPE是一个字符类型的索引列. SELECT … FROM EMP WHERE EMP_TYPE = 123 这个语句被ORACLE转换为: SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123 因为内部发生的类型转换, 这个索引将不会被用到! 为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型 

    31)需要当心的WHERE子句:
    某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子. 在下面的例子里, (1)‘!=’ 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中. (2) ‘||’是字符连接函数. 就象其他函数那样, 停用了索引. (3) ‘+’是数学函数. 就象其他数学函数那样, 停用了索引. (4)相同的索引列不能互相比较,这将会启用全表扫描.
    (32) a. 如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高.
    b. 在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!
    (33)避免使用耗费资源的操作:
    带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写. 如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强
    (34)优化GROUP BY:
    提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多.

    ·         低效:

  • ·         SELECT JOB , AVG(SAL)
  • ·         FROM EMP GROUP JOB HAVING JOB = ‘PRESIDENT’ OR JOB = ‘MANAGER’高效:
  • ·         SELECT JOB , AVG(SAL)
  • ·         FROM EMP
  • ·         WHERE JOB = ‘PRESIDENT’
  • ·         OR JOB = ‘MANAGER’GROUP JOB
  • ·          
  • 下面看一下oracle的执行过程

    分析一个SQL语句是怎样在Orcle内部工作的。
    A、用户发出SQL请求,打开游标;
    B、把SQL语句语法分析,执行计划,数据字典等信息存入内存中共享池内;
    C、从数据文件中把相关数据块读入数据缓冲区;
    D、做相应操作,若做修改,先加上行级锁,经确认后,把改过前后记录内容存入重做日志缓冲区内;
    E、返回结果给用户,关闭游标。
    备注:SQL语句大小写敏感的,同样的一个语句,若大小写
    不同,oracle需分析执行两次,每句后必以“;”结束。

什么是Oracle的物化视图

物化视图看成是, 一个定时运行的计算JOB+一个存计算结果的表物化视图 实质上就是表 只不过会定时刷新物化视图是包括一个查询结果的数据库对像,它可以说是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。 物化视图可以查询表,视图和其它的物化视图。 通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。 对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。 对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。本篇我们将会看到怎样创建物化视图并且讨论它的刷新选项。 在复制环境下,创建的物化视图通常情况下主键,rowid,和子查询视图。1.主键物化视图: 下面的语法在远程数据库表emp上创建主键物化视图 SQL》 CREATE MATERIALIZED VIEW mv_emp_pk REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 1/48 WITH PRIMARY KEY AS SELECT * FROM emp@remote_db; Materialized view created. 注意:当用FAST选项创建物化视图,必须创建基于主表的视图日志,如下: SQL》 CREATE MATERIALIZED VIEW LOG ON emp; Materialized view log created.2.Rowid物化视图 下面的语法在远程数据库表emp上创建Rowid物化视图 SQL》 CREATE MATERIALIZED VIEW mv_emp_rowid REFRESH WITH ROWID AS SELECT * FROM emp@remote_db; Materialized view log created.3.子查询物化视图 下面的语法在远程数据库表emp上创建基于emp和dept表的子查询物化视图 SQL》 CREATE MATERIALIZED VIEW mv_empdept AS SELECT * FROM emp@remote_db e WHERE EXISTS (SELECT * FROM dept@remote_db d WHERE e.dept_no = d.dept_no) Materialized view log created. REFRESH 子句 Refresh选项说明:a. oracle用刷新方法在物化视图中刷新数据.b. 是基于主键还是基于rowid的物化视图c. 物化视图的刷新时间和间隔刷新时间Refresh方法-FAST子句 增量刷新用物化视图日志(参照上面所述)来发送主表已经修改的数据行到物化视图中.如果指定REFRESH FAST子句,那么应该对主表创建物化视图日志 SQL》 CREATE MATERIALIZED VIEW LOG ON emp; Materialized view log created.对于增量刷新选项,如果在子查询中存在分析函数,则物化视图不起作用。Refresh方法- COMPLETE子句 完全刷新重新生成整个视图,如果请求完全刷新,oracle会完成 完全刷新即使增量刷新可用。Refresh Method – FORCE 子句 当指定FORCE子句,如果增量刷新可用Oracle将完成增量刷新,否则将完成完全刷新,如果不指定刷新方法(FAST, COMPLETE, or FORCE),Force选项是默认选项主键和ROWD子句 WITH PRIMARY KEY选项生成主键物化视图,也就是说物化视图是基于主表的主键,而不是ROWID(对应于ROWID子句). PRIMARY KEY是默认选项,为了生成PRIMARY KEY子句,应该在主表上定义主键,否则应该用基于ROWID的物化视图. 主键物化视图允许识别物化视图主表而不影响物化视图增量刷新的可用性。 Rowid物化视图只有一个单一的主表,不能包括下面任何一项:n Distinct 或者聚合函数.n Group by,子查询,连接和SET操作刷新时间 START WITH子句通知数据库完成从主表到本地表第一次复制的时间,应该及时估计下一次运行的时间点, NEXT 子句说明了刷新的间隔时间. SQL》 CREATE MATERIALIZED VIEW mv_emp_pk REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 3WITH PRIMARY KEY AS SELECT * FROM emp@remote_db; Materialized view created.在上面的例子中,物化视图数据的第一个副本在创建时生成,以后每三天刷新一次.总结物化视图提供了可伸缩的基于主键或ROWID的视图,指定了刷新方法和自动刷新的时间。

oracle记录中选择出第一条记录

oracle记录中选择出第一条记录的方法。

如下参考:

1.创建测试表

Createtabletest_order(idnumber,valuevarchar2(50));

2.插入测试数据

插入test_order值(3,'v3');

插入test_order值(2,'v2');

插入test_order值(1,'v1');

插入test_order值(5,'v5');

插入test_order值(4,'v4');

提交;

3.检查查询表中的全部数据,可以发现数据没有排序,选择t。*,rowidfromtest_ordert;

4.写SQL,数据只要第一个记录(不是rownum=1)select*from(selectt)。*,row_number()/(orderbyid)rnfromtest_ordert)t,其中rn=1;