DB2和其他数据库在一些SQL语法上的区别?
掌握SQL四条最基本的数据作语句:Insert,Select,Update和Delete。
mysql向上取整 mysql向上递归查询语句
mysql向上取整 mysql向上递归查询语句
mysql向上取整 mysql向上递归查询语句
练掌握SQL是数据库用户的宝贵财 富。在本文中,我们将你掌握四条最基本的数据作语句—SQL的核心功能—来依次介绍比较作符、选择断言以及三值逻辑。当你完成这些学习后,显然你已经开始算是精通SQL了。
在我们开始之前,先使用CREATE TABLE语句来创建一个表(如图1所示)。DDL语句对数据库对象如表、列和视进行定义。它们并不对表中的行进行处理,这是因为DDL语句并不处理数据库中实际的数据。这些工作由另一类SQL语句—数据作语言(DML)语句进行处理。
SQL中有四种基本的DML作:INSERT,SELECT,UPDATE和DELETE。由于这是大多数SQL用户经常用到的,我们有必要在此对它们进行一一说明。在图1中我们给出了一个名为EMPLOYEES的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表,我们在后面的例子中将要用到它。
用户可以用INSERT语句将一行记录插入到指定的一个表中。例如,要将雇员John Smith的记录插入到本例的表中,可以使用如下语句:
INSERT INTO EMPLOYEES VALUES
('Smith','John','1980-06-10',
'Los Angles',16,45000);
通过这样的INSERT语句,系统将试着将这些值填入到相应的列中。这些列按照我们创建表时定义的顺序排列。在本例中,个值“Smith”将填到个列LAST_NAME中;第二个值“John”将填到第二列FIRST_NAME中……以此类推。
我们说过系统会“试着”将值填入,除了执行规则之外它还要进行类型检查。如果类型不符(如将一个字符串填入到类型为数字的列中),系统将拒绝这一次作并返回一个错误信息。
如果SQL拒绝了你所填入的一列值,语句中其他各列的值也不会填入。这是因为SQL提供对事务的支持。一次事务将数据库从一种一致性转移到另一种一致性。如果事务的某一部分失败,则整个事务都会失败,系统将会被恢复(或称之为回退)到此事务之前的状态。
回到原来的INSERT的例子,请注意所有的整形十进制数都不需要用单引号引起来,而字符串和日期类型的值都要用单引号来区别。为了增加可读性而在数字间插入逗号将会引起错误。记住,在SQL中逗号是元素的分隔符。
同样要注意输入文字值时要使用单引号。双引号用来封装限界标识符。
对于日期类型,我们必须使用SQL标准日期格式(yyyy-mm-dd),但是在系统中可以进行定义,以接受其他的格式。当然,2000年临近,请你还是使用四位来表示年份。
INSERT INTO EMPLOYEES VALUES
('Bunyan','Paul','1970-07-04',
INSERT INTO EMPLOYEES VALUES
('John','Adams','1992-01-21',
'Boston',20,100000);
INSERT INTO EMPLOYEES VALUES
('Smith','Pocahontas','1976-04-06',
'Los Angles',12,100000);
INSERT INTO EMPLOYEES VALUES
('Smith','Bessie','1940-05-02',
'Boston',5,200000);
INSERT INTO EMPLOYEES VALUES
('Jones','Dy','1970-10-10',
'Boston',8,45000);
INSERT INTO EMPLOYEES VALUES
('Jones','Indiana','1992-02-01',
'Chicago',NULL,NULL);
在一项中,我们不知道Jones先生的工薪级别和年薪,所以我们输入NULL(不要引号)。NULL是SQL中的一种特殊情况,我们以后将进行详细的讨论。现在我们只需认为NULL表示一种未知的值。
有时,像我们刚才所讨论的情况,我们可能希望对某一些而不是全部的列进行赋值。除了对要省略的列输入NULL外,还可以采用另外一种INSERT语句,如下:
INSERT INTO EMPLOYEES(
FIRST_NAME, LAST_NAME,
VALUE(
'Indiana','Jones',
'1992-02-01','Indianapolis');
这样,我们先在表名之后列出一系列列名定义选择标准。未列出的列中将自动填入缺省值,如果没有设置缺省值则填入NULL。请注意我们改变了列的顺序,而值的顺序要对应新的列的顺序。如果该语句中省略了FIRST_NAME和LAST_NAME项(这两项规定不能为空),SQL作将失败。
让我们来看一看上述INSERT语句的语法图:
VALUES
(columnvalue []);
和前一篇文章中一样,我们用方括号来表示可选项,大括号表示可以重复任意次数的项(不能在实际的SQL语句中使用if(@a=0, @b,这些特殊字符)。VALUE子句和可选的列名列表中必须使用圆括号。
SELECT语句
SELECT语句可以从一个或多个表中选取特定的行和列。因为查询和检索数据是数据库管理中最重要的功能,所以SELECT语句在SQL中是工作量的部分。实际上,仅仅是访问数据库来分析数据并生成报表的人可以对其他SQL语句一窍不通。
SELECT语句的结果通常是生成另外一个表。在执行过程中系统根据用户的标准从数据库中选出匹配的行和列,并将结果放到临时的表中。在直接SQL(direct SQL)中,它将结果显示在终端的显示屏上,或者将结果送到打印机或文件中。也可以结合其他SQL语句来将结果放到一个已知名称的表中。
SELECT语句功能强大。虽然表面上看来它只用来完成本文部分中提到的关系代数运算“选择”(或称“限制”),但实际上它也可以完成其他两种关系运算—“投影”和“连接”,SELECT语句还可以完成聚合计算并对数据进行排序。
SELECT语句最简单的语法如下:
S每个(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展ASCII码、的GB2312-80、日本的 JIS 等,作为该(区域)信息处理的基础,有着统一编码的重要作用。由于各本地字符集代码范围重叠,相互间信息交换困难,软件本地化版本维护成本较高。因此有必要将本地化工作中的共性抽取出来,做一致性处理,将特殊的本地化处理内容降低到最少,这就是所谓的化(I18N)。各种语言信息被规范为本地信息,而底层字符集采用包含了所有字符的Unicode。ELECT columns FROM tables;
当我们以这种形式执行一条SELECT语句时,系统返回由所选择的列以及用户选择的表中所有指定的行组成的一个结果表。这就是实现关系投影运算的一个形式。
让我们看一下使用图1中EMPLOYEES表的一些例子(这个表是我们以后所有SELECT语句实例都要使用的。而我们在图2和图3中给出了查询的实际结果。我们将在其他的例子中使用这些结果)。
SELECT BRANCH_OFFICE FROM EMPLOYEES;
以上SELECT语句的执行将产生如图2中表2所示的结果。
由于我们在SELECT语句中只指定了一个列,所以我们的结果表中也只有一个列。注意结果表中具有重复的行,这是因为有多个雇员在同一部门工作(记住SQL从所选的所有行中将值返回)。要消除结果中的重复行,只要在SELECT语句中加上DISTINCT子句:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES;
这次查询的结果如表3所示。
现在已经消除了重复的行,但结果并不是按照顺序排列的。如果你希望以字母表顺序将结果列出又该怎么做呢?只要使用ORDER BY子句就可以按照升序或降序来排列结果:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES
这一查询的结果如表4所示。请注意在ORDER BY之后是如何放置列名BRANCH _OFFICE的,这就是我们想要对其进行排序的列。为什么即使是结果表中只有一个列时我们也必须指出列名呢?这是因为我们还能够按照表中其他列进行排序,即使它们并不显示出来。列名BRANCH_ OFFICE之后的关键字ASC表示按照升序排列。如果你希望以降序排列,那么可以用关键字DESC。
同样我们应该指出ORDER BY子句只将临时表中的结果进行排序;并不影响原来的表。
设我们希望得到按部门排序并从工资的雇员到工资的雇员排列的列表。除了工资括号中的内容,我们还希望看到按照聘用时间从最近聘用的雇员开始列出的列表。以下是你将要用到的语句:
SELECT BRANCH_OFFICE,FIRST_NAME,
FROM EMPLOYEES
ORDER BY SALARY DESC,
HIRE_DATE DESC;
这里我们进行了多列的选择和排序。排序的优先级由语句中的列名顺序所决定。SQL将先对列出的个列进行排序。如果在个列中出现了重复的行时,这些行将被按照第二列进行排序,如果在第二列中又出现了重复的行时,这些行又将被按照第三列进行排序……如此类推。这次查询的结果如表5所示。
将一个很长的表中的所有列名写出来是一件相当麻烦的事,所以SQL允许在选择表中所有的列时使用号:
SELECT FROM EMPLOYEES;
下面我们对开始时给出的SELECT语句的语法进行一下更新(竖直线表示一个可选项,允许在其中选择一项。):
SELECT [DISTINCT]
(column [])|
FROM table [ ]
[ORDER BY column [ASC] | DESC
[ ]];
在我们目前所介绍的SELECT语句中,我们对结果表中的列作出了选择但返回的是表中所有的行。让我们看一下如何对SELECT语句进行限制使得它只返回希望得到的行:
SELECT columns FROM tables [WHERE predicates];
WHERE子句对条件进行了设置,只有满足条件的行才被包括到结果表中。这些条件由断言(predicate)进行指定(断言指出了关于某件事情的一种可能的事实)。如果该断言对于某个给定的行成立,该行将被包括到结果表中,否则该行被忽略。在SQL语句中断言通常通过比较来表示。例如,如你需要查询所有姓为Jones的职员,则可以使用以下SELECT语句:
SELECT FROM EMPLOYEES
WHERE LAST_NAME = 'Jones';
LAST_NAME = 'Jones'部分就是断言。在执行该语句时,SQL将每一行的LAST_NAME列与“Jones”进行比较。如果某一职员的姓为“Jones”,即断言成立,该职员的信息将被包括到结果表中(见表6)。
使用最多的六种比较
我们上例中的断言包括一种基于“等值”的比较(LAST_NAME = 'Jones'),但是SQL断言还可以包含其他几种类型的比较。其中最常用的为:
等于 =
不等于 <>
小于 <
大于 >
大于或等于 >=
下面给出了不是基于等值比较的一个例子:
SELECT FROM EMPLOYEES
WHERE SALARY > 50000;
MySQL插入自增列数据的问题
自动增长列是不能为其赋值的,您只需把不是自动增长列赋值就可以了
insert into StuInfo(StuName) valuesdeclare @execSql nvarchar(max)('张三')
以上,希望对你有所HIRE_DATE, BRANCH_OFFICE)帮助!
直接 valendues(NULL ,$name) 就OK了 不行加我 574121312
Mysql 能不能实现日期的查询
[CountNum] [int] NULL可以用分组汇总求极值来实现这个需求,请参考下列写法:
设你想查看雇员工作部门的列表。那下面就是你所需要编写的SQL查询:select `name`,test,max(`time`) as lastTime
group by `name`,test;
如果要取整条记录的会麻烦一些,必须有标识列,如主键、自增id等才可以实现,亲参考下列写法:
select frokeyword1=getStr(keyword1);m tblname where id in
(select max(a.id) from tblname a,
(select `name`,test,max(`time`) as lastTime
group by `name`,test) t
where a.`name`=t.`name and
a.test=t.test and a.`time`=t.maxTime
group by a.`name`,a.test);
mysql修改表结构对原有数据会不会长生影响?
return "";不会,修改表结构时值只是改变表结构的列名,数据类型等字段,在将TEXTfrom tblname where `name`='test'修改为LONGTEXT时,其类型类似于ja中的将byte改为int型,属于向上转型,其已保存的数据是不会改变只要涉及中文的地方全部是乱码,解决办法:在数据库的数据库URL中加上useUnicode=true&characterEncoding=GBK就OK了。的。
mysql_query()执行之后没有结果,MySQL数据库中数据表还为空
INSERT语句sql语句问题大大的。而且sql语句的变量名都搞错了,$spl ??? query里又是$sql,搞什么东东,insert语句也写错了,哎 应该是 $sql = "insert into message (user,title,content,lastdate) values ('".$_POST['user']."','".$_POST['title']."','".$_POST['content']."',now())";
'Boston',12,70000);$spl="insert into 'message'('id','user','title','content','lastdate')" .
" values('','$_POST[user]','$_POST[title]','$_POST[content]',now())";
mysql_query($sql);
上面是$spl,下面用$sql,您的$sql还没定义呢
再有echo “成功”是要判断的
应该是
if(mysql_query($sql)) echo"发表成功";
else echo “失败”
然后你的ID列如果是自[(column )]增的,那么应该往该列插入NULL,(插入‘’应该也行吧,好像自己会转,没试过)应该是
insert into message ('id','user','title','content','lastdate') values(NULL,'$_POST[user]','$_POST[title]','$_POST[content]',now())
或者索性不要插入ID,这一列,即
然后,表名'message',这两边可不是单引号,而是键盘上Esc键下面1左边的那个字符。
其实没必要写,除非你非要用 time 这种关键字作表名
mysql 数据库后台 乱码问题 全市问号 怎么办?
用到的一句代码是:
<%= new String(rst.getString(2).getBytes("ISO-8859-1"),"gb2312")%>
大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。
一、JSP页面显示乱码
对不同的WEB和不同的JDK版本,处理结果就不一样。原因:使用的编码方式不同和浏览器对不同的字符显示结果不同而导致的。解决办法:在JSP页面中指定编码方式(gb2312),即在页面的行加上:,就可以消除乱码了。完整页面如下:
二、表单提交中文时出现乱码
下面是处理页面(process.jsp)代码:
如果submit.jsp提交英文字符能正确显示,如果提交中文时就会出现乱码。原因:浏览器默认使用UTF-8编码方式来发送请求,而UTF-8和GB2312编码方式表示字符时不一样,这样就出现了不能识别字符。解决办法:通过request.seCharacterEncoding("gb2312")对请求进行统一编码,就实现了中文的正常显示。修改后的process.jsp代码如下:
三、数据库连接出现乱码
四、数据库的显示乱码
public class Convert {
/ 把ISO-8859-1码转换成GB2312
/
public static String ISOtoGB(String iso){
String gb;
try{
if(iso.equals("") || iso == null){
}else{
iso = iso.trim();
gb = new String(iso.getBytes("ISO-8859-1"),"GB2312");
return gb;
catch(Exception e){
System.err.print("编码转换错误:"+e.getMessage());
}把它编译成class,就可以调用Convert类的静态方法ISOtoGB()来转换编码。
和Ja一样,JSP是目前比较热门的一个话题。它是一种在端编译执行的Web设计语言,因为脚本语言采用了Ja,所以JSP继承了Ja的所有优点。可是在使用JSP程序的过程中,常遇到中文乱码问题,很多人为此头疼不已,笔者就深受其害,而且使用平台不同,中文乱码问题的解决方法也不同,无形中增加了学习JSP的难度。其实,在了解相关原因后,问题还是比较容易解决的。笔者结合自己的工作实践,对中文显示问题进行了一定的研究,并在不同的环境下进行了相关测试,以下是笔者总结的解决方法,相信对读者会有一定的借鉴意义。
字insert into message ('user','title','content','lastdate') values('$_POST[user]','$_POST[title]','$_POST[content]',now())符内码
字符内码(character code)指的是用来代表字符的内码。我们在输入和存储文档时都要使用内码,内码分为单字节内码和双字节内码。单字节内码的英文全称是Single-Byte Character Sets (SBCS),可以支持256个字符编码;双字节内码的英文全称是Double-Byte Character Sets(DBCS),可以支持65000个字符编码,主要用来对大字符集的东方文字进行编码。
CodePage指的是一个经过挑选的以特定顺序排列的字符内码列表,对于早期的单字节内码的语种,Co思路:可以使用存储过程,通过循环、拼接SQL语句,将结果循环插入另一张表用于保存记录数。dePage中的内码顺序使得系统可以按照此列表来根据键盘的输入值给出一个对应的内码。对于双字节内码,给出的是MultiByte到Unicode的对应表,这样就可以把以Unicode形式存放的字符转化为相应的字符内码。引入对CodePage的支持主要是为了访问多语种文件名,目前在NTFS和FAT32/VFAT下的文件系统上都使用Unicode,这需要系统在读取这些文件名时动态地将其转换为相应的语言编码。
相信了解JSP代码的读者对ISO8859-1一定不陌生,ISO8859-1是我们平时使用比较多的一个CodePage,它属于西欧语系。GB2312-80 是在国内计算机汉字信息技术发展初始阶段制订的,其中包含了大部分常用的一、二级汉字和9区的符号。该字符集是几乎所有的中文系统和化的软件都支持的中文字符集,这也是最基本的中文字符集。
GBK 是 GB2312-80 的扩展,是向上兼容的。它包含了20902个汉字,其编码范围是 0x8140~0xFEFE,剔除高位 0x80 的字位,其所有字符都可以一对一映射到 Unicode 2.0,也就是说 Ja 实际上提供了对 GBK 字符集的支持。
>GB18030-2000(GBK2K) 在 GBK 的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的文字。GBK2K 从根本上解决了字位不够、字形不足的问题。
不小于或等于 <=同开发平台的区别
1.Tomcat 4开发平台
Windows 98/2000下的Tomcat 4以上版本都会出现中文问题(而在Linux下和Tomcat 3.x中则没有问题),主要表现是页面显示乱码。在IE中调整字符集为GB2312,就可以正常显示了。
为解决这个问题,可在每个JSP的页面开始处加上。不过,这还不够,虽然这时显示了中文,但是发现从数据库读出的字段变成了乱码。经过分析发现: 在数据库中保存的中文字符是正常的,数据库用ISO8859-1字符集存取数据,而Ja程序在处理字符时默认采用统一的ISO8859-1字符集(这也体现了Ja化思想),所以在数据添加的时候Ja和数据库都是以ISO8859-1方式处理,这样不会出错。但是在读取数据的时候就出现问题了,因为数据读出也采用ISO8859-1字符集,而 JSP的文件头中有语句,这说明页面采用GB2312的字符集显示,这样就和读出的数据不一样。这时页面显示从数据库中读出的字符是乱码,解决的方法是对这些字符转码,从ISO8859-1转成GB2312,就可以正常显示了。这个解决办法对很多平台具有通用性,读者可以灵活运用。
2.Tomcat 3.x、Resin及Linux平台
在Tomcat 3.x、Resin中或是在Linux下,没有加入语句,而页面中的语句起了作用,此时可以正常显示。相反,如果加上系统会报错,说明Tomcat 4以上版本的引擎在处理JSP时还是有别的。
另外,对于不同的数据库如SQL ,Oracle,Mysql,Sybase等,字符集的选择很重要。如果考虑多语言版本,数据库的字符集就应该统一采用ISO8859-1,需要输出的时候在不同的字符集之间做转换就可以了。
以下是针对不同平台的总结:
(1) JSWDK只适合于普通开发,稳定性和其他问题可能不如商业软件。 由于JDK 1.3版性能要好于JDK 1.2.2很多,并且对中文的支持也较好,所以应该尽量采用。
(2) 作为免费的商业软件,Resin不仅速度快、稳定、自动编译,还可以指出出错行,并可在端支持使用JaScript等,而且对中文的支持也很好。
(3) Tomcat仅仅是一个对JSP 1.1、Servlet 2.2标准的实现, 我们不应该要求这个免费软件在细节和性能上都面面俱到, 它主要考虑英文用户, 这也是为什么不做特殊转换,汉字用URL方法传递就有问题的原因。大部分IE浏览器缺省始终以UTF-8发送, 这似乎是Tomcat的一个不足, 另外Tomcat不管当前的作系统是什么语言, 都按ISO8859去编译JSP, 似乎也欠妥。
JSP代码的中文处理
在JSP代码中以下几处经常需要涉及到中文处理:
1. 在URL中附带中文参数。这里中文参数通常可以直接读取,例如:
2. 在JSWDK中读取HTML表单提交的中文值这时需要加以编码,较为简洁的写法是:
String name1=new String(request.getParameter(“user_id”).getBytes(“ISO8859_1”))。
另外,在JDK 1.3的支持下,不需加入 ,而在JDK 1.2.2 以下,即使以上两种方法同时运用也很不稳定。但在Resin平台,情况较好,只要在页面行加入:即可正确处理中文,如果再加代码则反而不对。
3.在JSWDK中Session包含的中文,如果从表单中读出的值经过编码可正确显示,但直接赋予中文值则不行,而Resin平台则很好。
4. 在编译Servlet和JSP时加入代码选项。在编译Servlet时使用Ja-Encoding ISO8859-1 myservlet.ja;在JSP的ZONE配置文件中,修改编译参数为:Compiler=builtin - jac- encoding ISO8859-1。使用这种方法后,不需要做其他的改动就可以正常显示中文了。
另外,流行的关系数据库系统都支持数据库Encoding,也就是说在创建数据库时可以指定它自己的字符集设置,数据库的数据以指定的编码形式存储。当应用程序访问数据时,在入口和出口处都会有 Encoding 转换。对于中文数据,数据库字符编码的设置应当保证数据的完整性。 GB2312、GBK、UTF-8 等都是可选的数据库 Encoding,也可以选择 ISO8859-1 (8-bit), 但会增加了编程的复杂度,ISO8859-1不是的数据库 Encoding。在JSP/Servlet编程时,可以先用数据库管理系统提供的管理功能检查其中的中文数据是否正确。
处理方法实例
下面是两个具体的中文乱码解决实例,读者仔细研究后可能会有所收获。
1.常见的字符转换方法
将Form 中 的 值 传 送 到 数 据 库 中 再 取 出 来 后 全 变 成 了“?”。Form用POST提交数据,代码中使用了语句:String st=new(request.getParameter(“name”).getBytes(“ISO8859_1”)), 而且也声明了charset=gb2312。
要处理Form中传递的中文参数,应该在JSP中加入下面的代码,另外定义一个专门解决这个问题的getStr类,然后对接收到的参数进行转换:
String keyword1=request.getParameter(“keyword1”);
这样就可以解决问题了,代码如下:
2. JDBC Driver的字符转换
目前大多数JDBC Driver采用本地编码格式来传输中文字符,例如中文字符“0x4175”会被转成“0x41”和“0x75”进行传输。因此需要对JDBC Driver返回的字符以及要发给JDBC Driver的字符进行转换。当用JDBC Driver向数据库中插入数据时,需要先将Unicode转成Native code; 当 JDBC Driver从数据库中查询数据时,则需要将Native code转换成Unicode。下面给出了这两种转换的实现:
String native2Unicode(String s) {
if (s == null || s.length() == 0) {
return null;
}byte[] buffer = new byte[s.length()];
for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {
c = s.charAt(i);
byte []buf = (“”+c).getBytes();
buffer[j++] = (char)buf[0];
buffer[j++] = (char)buf[1];
}else {buffer[j++] = s.charAt(i);}
}return new String(buffer, 0, j);
}要注意的是,有些JDBC Driver如果通过JDBC Driver Mar设置了正确的字符集属性,以上方法就不需要了。具体情况可参考相关JDBC的资料。
mysql使用游标遍历数据进行批量针对性更新数据,急求mysql大神解答
既这次查询返回整个EMPLOYEES表,如表1所示。然你已解了INSERT语句是怎样工作的了,让我们转到EMPLOYEES表中的其他部分:}}1、游标是数据库的一个缓冲区,游标标识这个缓冲区的地址。这个缓冲区的访问是连续的,也可以理解为数据存放是连续的,所以使用游标访问速度快,不需要离散式的寻址,一个接着一个的处理数据即可,省去寻址时间。
2、游标使用的时候,需要设置,也就是把需要处理的数据放入缓冲区中,也就是用条件语句选取数据集,设置好后,游标自然指向个数据项的地址,可以用fetch指令进行取数据作。对于你来说,就是将用like匹配的七位、五位、三位放入缓冲区。游标使用语法,就不多说了,网上多的是。
3、对于父亲的描述,感觉没有描述清楚。根据你的描述,不必进行三位、五位、七位的遍历,直接根据前三位就把所有匹配的数据项都赋给同一个parentid了。但是根据你所说,好像不是这样,也就是你说的转换关系与你意图不同,你的意图是同一个儿子的parentid指向同一个父亲,也就是父亲的ID。如果这样的话,需要从叶子向上遍历,也就是你说的先七位,再五位,再三位。
4、写个例子,可以参考。参数可以依次是七位、五位、三位。
/建立 存储过程 create /
CREATE PROCEDURE useCursor( parent vachar(9))
BEGIN
/局部变量的定义 declare/
declare ID varchar(20) default '' ;
declare temp ID (255) default '' ;
declare parentVchar varchar(9);
set parentVchar=parent;
declare cur1 CURSOR FOR SELECT id FROM tud18 where parented like parentVchar order by id;
/开游标/
OPEN cur1;
/游标向下走一步/
FETCH cur1 INTO ID;
WHILE (tempID is not null) DO
Update tud18 set parentid = ID ;
/游标向下走一步/
FETCH cur1 INTO tempID;
END WHILE;
CLOSE cur1;
END;//
SQL语句批量查询~
set @addnum = 0.100----以下是代码实现
ORDER BY BRANCH_OFFICE ASC;IF EXISTS (SELECT FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CountTable]') AND type in (N'U'))
DROP TABLE [dbo].[CountTable]
GO
CREATE TABLE [dbo].[CountTable](
) ON [PRIMARY]
declare @low float
declare @high float
declare @addnum float
declare @define nvarchar(max)
declare @strSql nvarchar(max)
set @low = 600.000
set @high = 605.000
while(@low < @high)
begin
set @define = 'declare @CountNum int '
set @strSql = ' select @CountNum = count() from table1 where 地点名称=''北路'' and 日期>=''2008-10-10'' and 日期<=''2008-10-17''
and cast(地点里程 as float)>=cast('+''''
+cast(@low as nvarchar(max))+''' as float)'+' and cast(地点里程 as float) set @execSql = ' insert into CountTable values(@CountNum)' print @define+@strSql+@execSql exec (@define+@strSql+@execSql) set @low = @low + @addnum Go select from CountTable 不用这样麻烦! 设计思路:地点里程10且取整 分组 后就是间隔0.100的分组。注意:地点里程字段必须是有效的数字类型。 select count(id) as 数量,里程分段 from (select id,地点名称,地点里程,日期, floor(cast(地点里程 as numeric(12,4))10) as 里程分段 from table1 where 日期 between '2008-10-10' and '2008-10-17') group by 里程分段 order by 里程分段 SELECT count() from table1 where table1.地点名称 = '北路' and table1.日期 >= '2008-10-10'and table1.地点里程 between 600.100 and 600.199; 再编个程序 地点里程每次加0.1执行一次查询,就好了 在MySql中测试通过,地点里程是varchar型,在MySql中也可以直接比较,其他数据库不知道的 感觉charlif 的思路很好, 但就是结果没有将间隔的起始与终止列出来,例如起始 600.100 终止600.199, SQL语句如下: declare @low float declare @high float declare @addnum float set @low = 600.000 set @high = 605.000 while(@low < @high) select @low as 起始,@high as 终止,记录数 = count() from table1 where 地点名称=''北路'' and 日期>=''2008-10-10'' and 日期<=''2008-10-17'' and cast(地点里程 as float)>=@low and cast(地点里程 as float)<@high set @low = @low + @addnum 如果需要将结果出现在一个结果集中的话,就需要将每个间隔的1条结果插入到一个表中,然后从这个表中查询,就和charlif的思路一样, 这个问题算是一个比较经典的应用问题,^_^ 呵呵,希望能有帮助,^_^ SELECT CAST(L.里程段 AS DECIMAL(10,3)) 里程段, COUNT(1) 计数 FROM (SELECT FLOOR(CAST(里程 AS FLOAT) 10) / 10 里程段 FROM [Test] WHERE 地点名称 = '北路' AND 日期 BETWEEN '2008-10-10' AND '2008-10-17') L GROUP BY 里程段 一句搞定 无需编程下面是一个提交页面(submit.jsp),代码如下:之类的 重新修改了一下 测试通过 select Left(里程,5) as 路段, count()记录数 from test where [地点名称] = '北路' and 日期 > '2008-10-10' and 日期 < '2008-10-17' group by Left(地点里程,5),[地点名称] a = x % 7, 求余 b = floor(X / 7) , x/7 然后取整 如果a==0, 结果为b,否则 c = 本月1号是周几, 计算从1号 到a号是否包含周二 如果包含,结果为b+1 否则,结果为b 最终的SQL语LAST_NAME,SALARY,HIRE_DATE句为: SELECT if((1 between weekday(date_sub(now(), interval dayofmonth(now())-1 day)) and weekday(date_sub(now(), interval dayofmonth(now())+dayofmonth(now())%7-1 day))) or (8 between weekday(date_sub(now(), interval dayofmonth(now())-1 day)) and weekday(date_sub(now(), interval dayofmonth(now())+dayofmonth(now())%7-1 day))), floor(dayofmonth(now())/7)+1, floor(dayofmonth(now())/7)) ); 如果使用变量改写一下SQL,看起来更简单一些: set @a=dayofmonth(now()) % 7; set @b=dayofmonth(now()) / 7; set @c=weekday(date_sub(now(), interval dayofmonth(now())-1 day)); set @d=weekday(date_sub(now(), interval dayofmonth(now())+@a-1 day)); SELECT if((1 between @c and @d) or (8 between @c and @d), floor(@b)+1, floor(@b)) ) as result; 小数位数今天是X号设置的问题。 在我们日常计算的过程中,如果计算出小数,对大量的被保留数据,采用四舍五入这种保留法的误总和是最小的,能使被保留部分的与实际值值不超过一位数量级的二分之一。四舍五入是一种度的保留法,是我们使用这种方法为基本保留法的原因。那在INSERT INTO table我们的python中如何四舍五入?如何保留小数?用round函数就可以。mysql中,如何写语句来查询本月从月初到现在,经过了几个礼拜二?
在mysql4.1.0中,varchar类型,text类型就会出现中文乱码,对于varchar类型把它设为binary属性就可以解决中文问题,对于text类型就要用一个编码转换类来处理,实现如下:round函数取整后为什么还有多位小数
if(dayofmonth(now()) % 7=0, dayofmonth(now())/7,