第一篇:面试SQL
1.存储过程和函数的区别 2.事务是什么?
3.游标的作用?如何知道游标已经到了最后?
4.触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。
1。用C#实现以下功能
a 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。b 对上面生成的数组排序,需要支持升序、降序两种顺序
2。请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。3。请说明.net中的错误处理机制,并举例 4。请说出强名的含义
5。请列出c#中几种循环的方法,并指出他们的不同 6。请指出.net中所有类型的基类 7。请指出GAC的含义
8。SQL SREVER中,向一个表中插入了新数据,如何快捷的得到自增量字段的当前值
您在什么情况下会用到虚方法?它与接口有什么不同? Q:Override与重载有什么区别? Q:值类型与引用类型有什么区别? Q:怎样理解静态变量?
Q:向服务器发送请求有几种方式?
Q:DataReader与Dataset有什么区别?
Q:如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理?
Q:用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
Q:软件开发过程一般有几个阶段?每个阶段的作用?
Q:微软推出了一系列的Application Block,请举出您所知道的Application Block并说明其作用?
Q:请列举一些您用到过的设计模式以及在什么情况下使用该模式? Q:您对WebService的体会?
Q:您对编程的兴趣如何?工作中遇到不懂的问题是怎样去解决的?您一般怎样去提高自己的编程水平? Q:您离职的原因是什么?
Q:通过超链接怎样传递中文参数?
Q:请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? Q:请编程实现一个冒泡排序算法?
1、override与重载的区别
2、.net的错误处理机制是什么
3、C#中接口和类的异同
4、DataReader和DataSet的异同 1.有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.2.如果需记录类的实例个数,该如何实现,请写一个简单的类于以证明.3.A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函数的执行过程.4.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.一.填空题
1.c#中的三元运算符是__?:__ 2.当整数a赋值给一个object对象时,整数a将会被__装箱(封装)___? 3.类成员有_____种可访问形式? this.;new Class().Method;4.public static const int A=1;这段代码有错误么?是什么? const不能用static修饰
5.float f=-123.567F;int i=(int)f;i的值现在是_____? 123 6.利用operator声明且仅声明了“==”,有什么错误么? 7.委托声明的关键字是______? delagete 8.用sealed修饰的类有什么特点?密封,不能继承
9.在Asp.net中所有的自定义用户控件都必须继承自________?Control 10.在.Net中所有可序列化的类都被标记为_____? 11.在.Net托管代码中我们不用担心内存漏洞,这是因为有了______?gc 12.下面的代码中有什么错误吗?_______ using System;class A { public virtual void F(){ Console.WriteLine(“A.F”);} } abstract class B:A { public abstract override void F();// new public abstract void F();} 13.当类T只声明了私有实例构造函数时,则在T的程序文本外部,___可以___(可以 or 不可以)从T派生出新的类,不可以____(可以 or 不可以)直接创建T的任何实例。
14.下面这段代码有错误么? switch(i){ case(): CaseZero();break;case 1: CaseOne();break;case 2: dufault;//wrong CaseTwo();break;} 15.在.Net中,类System.Web.UI.Page 可以被继承么?可以
二.简答题
1.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令 和语句 new 创建实例 new 隐藏基类中方法 4.谈谈类和结构的区别?类是引用类型、结构是值类型
5.一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成。请用c#语言编写主要程序来实现。6.对于这样的一个枚举类型: enum Color:byte{ Red, Green, Blue, Orange } string[] ss=Enum.GetNames(typeof(Color));byte[] bb=Enum.GetValues(typeof(Color));试写一段程序显示出枚举类型中定义的所有符号名称以及它们对应的数值。7.您了解设计模式么?请列出您所知道的设计模式的名称。// 8.请在SQL Server中设计表来保存一个树状结构的组织结构图(假设结构图中只有名称这一项内容需要保存),如果我想查询某一职位下的所有职位,用一个存储过程来实现,你有什么思路?
9.什么叫做SQL注入,如何防止?请举例说明。10.下面这段代码输出什么?为什么? int i=5;int j=5;if(Object.ReferenceEquals(i,j))Console.WriteLine(“Equal”);else Console.WriteLine(“Not Equal”);//不相等,因为比较的是对象
1.写一个实现对一段字符串翻转的方法,附加一些条件,如其中包括“,”、“.”,对其设计测试用 例。
2.对一支纸杯设计测试用例(可以是广义的杯,不一定是某一支特定功能的杯)开发语言概念题 3.什么是反射?
4.用Singleton如何写设计模式 5.C#中的垃圾回收机制是怎样的? 6.什么是Application Pool?
7.链表和数组的区别,各有什么优缺点.8.Remoting在客户端服务器怎么实现 ? 9.什么是友元函数?
10.用标准C如何实现多态? 11.什么是虚函数? 12.什么是抽象函数?
13.什么是内存泄漏,怎样最简单的方法判断被存泄漏 ? 英语题
14.用英文介绍一下使用C#/C++做的项目,主要功能
15.如果要与美国开电话会议,会如何与美国的工程师沟通 16.如果老板认为你的技术落后,你会怎么回答
数据库知识题
17.使用什么工具来调用存储过程
18.SQL Server的两种索引是何形式?索引的作用?索引的优缺点? 19.触发器的作用 其它知识题及问题
20.什么是Web Service? 21.什么是XML?
22.Socket怎么实现?
问题描述:
为管理岗位业务培训信息,建立3个表:
S(S#,SN,SD,SA)S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
C(C#,CN)C#,CN 分别代表课程编号、课程名称
SC(S#,C#,G)S#,C#,G 分别代表学号、所选修的课程编号、学习成绩--1.使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名
SELECT SN,SD FROM S WHERE [S#] IN(SELECT [S#] FROM C,SC WHERE C.[C#]=SC.[C#]AND CN='税收基础')--2.使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位 SELECT S.SN,S.SD FROM S,SC WHERE S.[S#]=SC.[S#] AND SC.[C#]='C2'--3.使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位
SELECT SN,SD FROM S WHERE [S#] NOT IN(SELECT [S#] FROM SC WHERE [C#]='C5')--4.使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位 SELECT SN,SD FROM S WHERE [S#] IN(SELECT [S#] FROM SC RIGHT JOIN C ON SC.[C#]=C.[C#] GROUP BY [S#] HAVING COUNT(*)=COUNT([S#]))--5.查询选修了课程的学员人数
SELECT 学员人数=COUNT(DISTINCT [S#])FROM SC--6.查询选修课程超过5门的学员姓名和所属单位
SELECT SN,SD FROM S WHERE [S#] IN(SELECT [S#] FROM SC GROUP BY [S#] HAVING COUNT(DISTINCT [C#])>5)
--7.学生所有的成绩表单
SELECT S.S# as 学号,S.SN as 姓名,S.SD AS 职业 , SS.[语文],SS.[英语] ,SS.[数学],SS.[政治],SS.[物理],SS.[化学] FROM S ,(SELECT SC1.S#,[语文]=SC1.G ,[英语]=SC2.G ,[数学]=SC3.G,[政治]=SC4.G,[物理]=SC5.G,[化学]=SC6.G from SC SC1,SC SC2,SC SC3,SC SC4,SC SC5,SC SC6,C C1,C C2 ,C C3,C C4,C C5,C C6 WHERE C1.C#=SC1.C# AND C2.C#=SC2.C# AND C3.C#=SC3.C# AND C4.C#=SC4.C# AND C5.C#=SC5.C# AND C6.C#=SC6.C# AND SC1.S#=SC2.S# and SC2.S#=SC3.S# and SC3.S#=SC4.S# and SC4.S#=SC5.S# and SC5.S#=SC6.S# AND C1.CN='语文' AND C2.CN='英语' AND C3.CN='数学' AND C4.CN='政治' AND C5.CN='物理' AND C6.CN='化学')SS WHERE S.S#=SS.S#--and S.S#='1'
--8.列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩 SELECT S.S#,S.SN,AVG_SCGRADE=AVG(SC.G)FROM S,SC,(SELECT S# FROM SC WHERE G<60 GROUP BY S# HAVING COUNT(DISTINCT C#)>=2)A WHERE S.S#=A.S# AND SC.S#=A.S# GROUP BY S.S#,S.SN
第二篇:复习资料(SQL)
以下复习资料仅供考试前作为复习的参考提纲,考试期间不得携带任何资料进入考场,切记!
一、将以下概念理解并牢记。
1、简述SQL Server查询分析器作用?
用于执行SQL语句,查看结果和分析查询计划等。
2、在SQL Server2000中数据库文件有哪几类?各有什么作用? a.主数据库文件:用于存储数据库的启动信息和部分或全部数据。b.辅助数据库文件:用于存储主数据文件没有存储的其他数据。c.事务日志文件:用于存储数据库的修改信息。
3、SQL Server平台有几个系统数据库?功能分别是什么? a.master数据库;记录SQL Server数据库系统中的全部信息。b.model数据库;是所有数据库和tempdb数据库的创建模板。c.tempdb数据库;系统的临时数据库。
d.msdb数据库;所有任务调度,报警,操作员都存储在里面,以及存储备份历史。
e.Northwind数据库;方便学习数据库系统提供的样本数据库。f.pubs数据库;方便学习数据库系统提供的样本数据库。
4、SQL Server包括哪些数据库对象?
表,索引,视图,关系图表,默认,规则,触发器,存储过程,用户。
5、SQL Server中包括几种约束?各自的功能是什么? a.主键约束:可以唯一地标识表中的每一行。b.唯一约束:用于指定一个或多个列的组合值是唯一性,以防止在列中输入重复的值。
c.检查约束:保证数据库数据的完整性。d.默认值约束:可以为指定列定义一个默认值。e.空值约束:意味用户还未为该列输入值。f.外键约束:用来维护两个表之间数据的一致性。
6、在指定数据源部分,表的连接包括几种?在查询结果上有什么不同?
a.交叉连接:集的行是两个表的行数的乘积,集的列是两个表的列数之和。
b.内连接:记录的是两个表中记录的交集。
c.外连接:左外连接:有t1(左),t2表(右),连接结果包含t1表中的全部记录和t2表中的相关记录。
右外连接:有t1,t2表,连接结果包含t2表中的全部记录和t1表中的相关记录。
全外连接:显示内连接的记录和两个表中不符合条件的全部记录,并在左表或右表相应位置设置null。
d.自连接:显示同一个表中一个字段值相同,其他字段不同的信息。
7、根据个人理解给出,完成一个表的创建,需要经过哪几个步骤? A.定义表的结构; B.设置约束; C.添加表数据。
8、备份包括几种?各有什么特点?
a.完整数据库备份:包括完整的数据库信息。
b.差异性数据库备份:复制自上一次完整数据库备份之后修改过的数据库页。
c.事务日志备份:数据库恢复模型必须是完整恢复模型或是批量日志恢复模型。
d.文件或文件组备份:必须与事务日志备份结合才有意义。
9、简述SQL Server企业管理器作用? 功能强大的图形化数据库管理工具
二、在复习的过程中,自行上机运行以下程序题,以便掌握响应的知识点。
1、编写一条SELECT语句,从Leixing表中查询一次性交易金额在1000元以上的交易类型信息。
SELECT FROM Leixing WHERE ‘交易金额’ in(‘>1000’)
2、编写一条UPDATE语句,将Leixing表中ShouzhiLX为“投资”的更改为“股票”。
UPDATE Leixing SET ShouzhiLX=’投资’ WHERE ShouzhiLX=’股票’
3、编写一条DELETE语句,删除Leixing表中ShouzhiLX为“旅游”的项目,对此不再进行消费。Select from Leixing DELETE from ShouzhiLX where ‘旅游’
4、使用CREATE DATABASE语句创建以你的姓名拼音命名的数据库,如姓名为张三,创建的数据库的名称是zhangsan,包括mdf文件,1个ndf文件和ldf文件,各个文件的属性可以自行设置。create database linzitai on primary(name=linzitai_Data,filename=’d:linzitai_Data.mdf’, size=10MB,maxsize=50MB,filegrowth=25%),(name=linzitai_Data1,filename=’d:linzitai_Data1.ndf’, size=20MB,maxsize=50MB,filegrowth=40%)log on(name=linzitai_log,filename=’d:linzitai_log.ldf’, size=10MB,maxsize=unlimited,filegrowth=2MB)go
5、使用CREATE TABLE语句分别创建gerenlicai数据库中的4个表,包ShouzhiMX、Leixing、Zhanghu、YonghuXX,并且在4个表中各自设置主键,在Leixing和ShouzhiMX之间建立外键,在Zhanghu和ShouzhiMX之间建立外键。(以上操作都要求通过SQL语句实现)①.create table YonghuXX(YHBianhao int NOT NULL, DengLuM varchar(32)primary key, Mima varchar(32), QuanXian int)在Leixing和ShouzhiMX之间建立外键: ②.create table ShouzhiMX(SZBianhao int primary key, LXBianhao int, JiaoyiSJ datetime(8), JiaoyiJE money(8), ZHBianhao int)Go create table Leixing(LXBianhao int foreign key references LXBianhao(ShouzhiMX), ShouZhi varchar(50), ShouzhiLX varchar(50), ShouzhiXX varchar(50))Go
6、在Leixing表和ShouzhiMX表之间建立内连接,查询所有满足条件的记录,使用SQL语句完成。
Select a.LXBianhao from Leixing as a join ShouzhiMX as b on a.LXBianhao=b.LXBianhao
7、向Zhanghu表添加一条新的账户信息,使用SQL语句完成。alter table Zhanghu add 账户信息 varchar(50)
8、编写一条DELETE语句,删除ShouzhiMX表中消费在50元以下的数据。delete ShouzhiMX where ‘<50’
第三篇:sql试题
INNER JOIN操作
INNER JOIN操作用于组合两个表中的记录,只要在公共字段之中有相符的值。可以在任何的 FROM 子句中使用 INNER JOIN 运算。这是最普通的联接类型。只要在这两个表的公共字段之中有相符值,内部联接将组合两个表中的记录。语法:FROM table1 INNER JOIN table2 ON table1.field1 compopr table2.field2 说明:table1, table2参数用于指定从其中组合记录的表的名称。
field1, field2参数指定被联接字段的名称。如果这些字段不是数值的,被联接的字段必须是相同的数据类型,并且包含相同类型的数据,但是它们不必名称相同。
compopr参数用于指定关系比较运算符,如:“=”,“<”,“>”,“<=”,“>=”,或 “<>”。
如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。在一个 INNER JOIN 之中,可以嵌套 LEFT JOIN 或 RIGHT JOIN,但是在 LEFT JOIN 或 RIGHT JOIN 中不能嵌套 INNER JOIN。
LEFT JOIN操作
LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2 说明:table1, table2参数用于指定要将记录组合的表的名称。
field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
compopr参数指定关系比较运算符:“=”,“<”,“>”,“<=”,“>=” 或 “<>”。如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。
RIGHT JOIN操作
RIGHT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 RIGHT JOIN 运算创建一个右边外部联接。右边外部联接将包含了从第二个(右边)开始的两个表中的全部记录,即使在第一个(左边)表中并没有匹配值的记录。语法:FROM table1 RIGHT JOIN table2 ON table1.field1 compopr table2.field2 说明:table1, table2参数用于指定要将记录组合的表的名称。
field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
compopr参数指定关系比较运算符:“=”,“<”,“>”,“<=”,“>=” 或 “<>”。如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。
你可以把存储过程当做:把一系列语句合并到一起的这么一个整体
我觉得举例说明比较好,给你个例子:
先将【表1】中ID号为50—2000的记录删除、再将【表2】中的这些记录的状态(STATUS)改为“已解除”:
delete 表1 where ID > 50 and ID < 2000
update 表2 set STATUS = '已解除' where ID > 50 and ID < 2000
正常情况下,以上两条语句分步执行就可以了,如果要用存储过程呢?
先建立存储过程(以下的语法为Sybase数据库的,其他数据库类同):
create procedure PRC_TEST(@start_ID int, @end_ID int)as
begin
delete 表1 where ID > @start_ID and ID < @end_ID
update 表2 set STATUS = '已解除' where ID > @start_ID and ID < @end_ID end
好了,执行这个语句,就将存储过程PRC_TEST提交到数据库里了,它有两个参数:start_ID int 和 end_ID,代表起始和终止ID号,类型为整数型int
怎么用这个存储过程呢? 这样执行:exc PRC_TEST 50, 2000
执行时,它先得到了两个参数,50、2000,分别赋值给start_ID int 和 end_ID,然后按照这两个参数分步执行封装在存储过程里的那两条语句了。
如果你这样执行:exc PRC_TEST 220, 8660
就是处理两个表中ID介于220—8660之间的记录了。
--------------
你也许会问了,既然可以分步执行的几句SQL,为什么要费力的写成存储过程啊?
主要是(我的经验和认识):
1、使数据处理参数化,对经常使用的一系列SQL进行封装,使其成为一个存储过程的整体,在每次执行时只要更换执行参数即可,不用去改里面每句SQL的where子句
2、★★这个很重要★★,假设你要循环处理某些数据,例如需要使用“游标”、“Do...while...语句”…………时,就要用到存储过程(或触发器)
=======================
最后给你转一个短文吧,这是书面上的概念:
将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
那么存储过程与一般的SQL语句有什么区别呢? 存储过程的优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权
存储过程的种类:
1.系统存储过程:以prc_(或sp_)开头,用来进行系统的各项设定.取得信息.相关管理工作, 如 sp_help就是取得指定对象的相关信息
2.扩展存储过程 以XP_开头,用来调用操作系统提供的功能
exec master..xp_cmdshell 'ping 10.8.16.1'
3.用户自定义的存储过程,这是我们所指的存储过程
测试table create table table1(id int,name char)insert into table1 select 1,'q' union all select 2,'r' union all select 3,'3' union all select 4,'5'
要求按指定的id顺序(比如2,1,4,3)排列获取table1的数据
方法1:使用union all,但是有256条数据的限制 select id,name from table1 where id=2 union all select id,name from table1 where id=1 union all select id,name from table1 where id=4 union all select id,name from table1 where id=3
方法2:在order by中使用case when select id ,name from t where id in(2,1,4,3)order by(case id when 2 then 'A' when 1 then 'B' when 4 then 'C' when 3 then 'D' end)
*以上两种方法适合在数据量非常小的情况下使用
方法3:使用游标和临时表
先建一个辅助表,里面你需要的顺序插入,比如2,1,4,3 create table t1(id int)insert into t1 select 2 union all select 1 union all select 4 union all select 3 declare @id int--定义游标 declare c_test cursor for select id from t1
select * into #tmp from table1 where 1=2--构造临时表的结构 OPEN c_test FETCH NEXT FROM c_test INTO @id WHILE @@FETCH_STATUS = 0 BEGIN--按t1中的id顺序插数据到临时表
insert into #tmp select id,name from table1 where id=@id FETCH NEXT FROM c_test INTO @id End Close c_test deallocate c_test
*该方法适合需要按照辅助表的顺序重排table的顺序时使用 方法4:分割字符串参数
select * into #tmp from table1 where 1=2--构造临时表的结构 declare @str varchar(300),@id varchar(300),@m int,@n int set @str='2,1,4,3,'---注意后面有个逗号 set @m=CHARINDEX(',',@str)set @n=1 WHILE @m>0 BEGIN set @id=substring(@str,@n,@m-@n)--print @id insert into #tmp select id,name from table1 where id=convert(int,@id)set @n=@m+1 set @m=CHARINDEX(',',@str,@n)END *该方法比较有通用性
测试结果
id name---------------2 r 1 q 4 5 3 3
本文较长,包含了如下几部分
1.2.3.4.5.使用不带参数的存储过程 使用带有输入参数的存储过程
使用带有输出参数的存储过程
使用带有返回状态的存储过程
使用带有更新计数的存储过程
1使用不带参数的存储过程
使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列。不带参数的 call 转义序列的语法如下所示: {call procedure-name} 作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程:
CREATE PROCEDURE GetContactFormalNames AS BEGIN
SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName FROM Person.Contact END
此存储过程返回单个结果集,其中包含一列数据(由 Person.Contact 表中前十个联系人的称呼、名称和姓氏组成)。
在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,然后使用 executeQuery 方法调用 GetContactFormalNames 存储过程。
public static void executeSprocNoParams(Connection con){ try { Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery(“{call dbo.GetContactFormalNames}”);
while(rs.next()){ System.out.println(rs.getString(“FormalName”));} rs.close();stmt.close();} catch(Exception e){ e.printStackTrace();} } 2使用带有输入参数的存储过程
使用 JDBC 驱动程序调用带参数的存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。带有 IN 参数的 call 转义序列的语法如下所示:
{call procedure-name[([parameter][,[parameter]]...)]}
构造 call 转义序列时,请使用 ?(问号)字符来指定 IN 参数。此字符充当要传递给该存储过程的参数值的占位符。可以使用 SQLServerPreparedStatement 类的 setter 方法之一为参数指定值。可使用的 setter 方法由 IN 参数的数据类型决定。向 setter 方法传递值时,不仅需要指定要在参数中使用的实际值,还必须指定参数在存储过程中的序数位置。例如,如果存储过程包含单个 IN 参数,则其序数值为 1。如果存储过程包含两个参数,则第一个序数值为 1,第二个序数值为 2。作为如何调用包含 IN 参数的存储过程的实例,使用 SQL Server 2005 AdventureWorks 示例数据库中的 uspGetEmployeeManagers 存储过程。此存储过程接受名为 EmployeeID 的单个输入参数(它是一个整数值),然后基于指定的 EmployeeID 返回雇员及其经理的递归列表。下面是调用此存储过程的 Java 代码:
public static void executeSprocInParams(Connection con){ try { PreparedStatement pstmt = con.prepareStatement(“{call dbo.uspGetEmployeeManagers(?)}”);pstmt.setInt(1, 50);ResultSet rs = pstmt.executeQuery();while(rs.next()){ System.out.println(“EMPLOYEE:”);System.out.println(rs.getString(“LastName”)+ “, ” + rs.getString(“FirstName”));System.out.println(“MANAGER:”);System.out.println(rs.getString(“ManagerLastName”)+ “, ” + rs.getString(“ManagerFirstName”));System.out.println();} rs.close();pstmt.close();} catch(Exception e){ e.printStackTrace();} } 3使用带有输出参数的存储过程
使用 JDBC 驱动程序调用此类存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。带有 OUT 参数的 call 转义序列的语法如下所示:
{call procedure-name[([parameter][,[parameter]]...)]}
构造 call 转义序列时,请使用 ?(问号)字符来指定 OUT 参数。此字符充当要从该存储过程返回的参数值的占位符。要为 OUT 参数指定值,必须在运行存储过程前使用 SQLServerCallableStatement 类的 registerOutParameter 方法指定各参数的数据类型。
使用 registerOutParameter 方法为 OUT 参数指定的值必须是 java.sql.Types 所包含的 JDBC 数据类型之一,而它又被映射成本地 SQL Server 数据类型之一。有关 JDBC 和 SQL Server 数据类型的详细信息,请参阅了解 JDBC 驱动程序数据类型。
当您对于 OUT 参数向 registerOutParameter 方法传递一个值时,不仅必须指定要用于此参数的数据类型,而且必须在存储过程中指定此参数的序号位置或此参数的名称。例如,如果存储过程包含单个 OUT 参数,则其序数值为 1;如果存储过程包含两个参数,则第一个序数值为 1,第二个序数值为 2。
作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程: 根据指定的整数 IN 参数(employeeID),该存储过程也返回单个整数 OUT 参数(managerID)。根据 HumanResources.Employee 表中包含的 EmployeeID,OUT 参数中返回的值为 ManagerID。
在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,然后使用 execute 方法调用 GetImmediateManager 存储过程:
public static void executeStoredProcedure(Connection con){ try { CallableStatement cstmt = con.prepareCall(“{call dbo.GetImmediateManager(?, ?)}”);cstmt.setInt(1, 5);cstmt.registerOutParameter(2, java.sql.Types.INTEGER);cstmt.execute();System.out.println(“MANAGER ID: ” + cstmt.getInt(2));} catch(Exception e){ e.printStackTrace();} } 本示例使用序号位置来标识参数。或者,也可以使用参数的名称(而非其序号位置)来标识此参数。下面的代码示例修改了上一个示例,以说明如何在 Java 应用程序中使用命名参数。请注意,这些参数名称对应于存储过程的定义中的参数名称:
CREATE PROCEDURE GetImmediateManager @employeeID INT, @managerID INT OUTPUT AS BEGIN
SELECT @managerID = ManagerID FROM HumanResources.Employee WHERE EmployeeID = @employeeID END
存储过程可能返回更新计数和多个结果集。Microsoft SQL Server 2005 JDBC Driver 遵循 JDBC 3.0 规范,此规范规定在检索 OUT 参数之前应检索多个结果集和更新计数。也就是说,应用程序应先检索所有 ResultSet 对象和更新计数,然后使用 CallableStatement.getter 方法检索 OUT 参数。否则,当检索 OUT 参数时,尚未检索的 ResultSet 对象和更新计数将丢失。使用带有返回状态的存储过程
使用 JDBC 驱动程序调用这种存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。返回状态参数的 call 转义序列的语法如下所示:
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
构造 call 转义序列时,请使用 ?(问号)字符来指定返回状态参数。此字符充当要从该存储过程返回的参数值的占位符。要为返回状态参数指定值,必须在执行存储过程前使用 SQLServerCallableStatement 类的 registerOutParameter 方法指定参数的数据类型。
此外,向 registerOutParameter 方法传递返回状态参数值时,不仅需要指定要使用的参数的数据类型,还必须指定参数在存储过程中的序数位置。对于返回状态参数,其序数位置始终为 1,这是因为它始终是调用存储过程时的第一个参数。尽管 SQLServerCallableStatement 类支持使用参数的名称来指示特定参数,但您只能对返回状态参数使用参数的序号位置编号。
作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程:
CREATE PROCEDURE CheckContactCity(@cityName CHAR(50))AS BEGIN
IF((SELECT COUNT(*)FROM Person.Address WHERE City = @cityName)> 1)RETURN 1 ELSE
RETURN 0 END
该存储过程返回状态值 1 或 0,这取决于是否能在表 Person.Address 中找到 cityName 参数指定的城市。
在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,然后使用 execute 方法调用 CheckContactCity 存储过程:
public static void executeStoredProcedure(Connection con){ try { CallableStatement cstmt = con.prepareCall(“{? = call dbo.CheckContactCity(?)}”);cstmt.registerOutParameter(1, java.sql.Types.INTEGER);cstmt.setString(2, “Atlanta”);cstmt.execute();System.out.println(“RETURN STATUS: ” + cstmt.getInt(1));} cstmt.close();catch(Exception e){ e.printStackTrace();} } 5 使用带有更新计数的存储过程 使用 SQLServerCallableStatement 类构建对存储过程的调用之后,可以使用 execute 或 executeUpdate 方法中的任意一个来调用此存储过程。executeUpdate 方法将返回一个 int 值,该值包含受此存储过程影响的行数,但 execute 方法不返回此值。如果使用 execute 方法,并且希望获得受影响的行数计数,则可以在运行存储过程后调用 getUpdateCount 方法。
作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下表和存储过程:
CREATE TABLE TestTable(Col1 int IDENTITY, Col2 varchar(50), Col3 int);
CREATE PROCEDURE UpdateTestTable @Col2 varchar(50), @Col3 int AS BEGIN
UPDATE TestTable SET Col2 = @Col2, Col3 = @Col3 END;在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,并使用 execute 方法调用 UpdateTestTable 存储过程,然后使用 getUpdateCount 方法返回受存储过程影响的行计数。
public static void executeUpdateStoredProcedure(Connection con){ try { CallableStatement cstmt = con.prepareCall(“{call dbo.UpdateTestTable(?, ?)}”);cstmt.setString(1, “A”);cstmt.setInt(2, 100);cstmt.execute();int count = cstmt.getUpdateCount();cstmt.close();
System.out.println(“ROWS AFFECTED: ” + count);} catch(Exception e){ e.printStackTrace();} }
1.sql存储过程概述
在大型数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合。就本质而言,触发器也是一种存储过程。存储过程在运算时生成执行方式,所以,以后对其再运行时其执行速度很快。SQL Server 2000 不仅提供了用户自定义存储过程的功能,而且也提供了许多可作为工具使用的系统存储过程。
存储过程的概念
存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库。中用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
在SQL Server 的系列版本中存储过程分为两类:系统提供的存储过程和用户自定义存储过程。系统过程主要存储在master 数据库中并以sp_为前缀,并且系统存储过程主要是从系统表中获取信息,从而为系统管理员管理SQL Server 提供支持。通过系统存储过程,MS SQL Server 中的许多管理性或信息性的活动(如了解数据库对象、数据库信息)都可以被顺利有效地完成。尽管这些系统存储过程被放在master 数据库中,但是仍可以在其它数据库中对其进行调用,在调用时不必在存储过程名前加上数据库名。而且当创建一个新数据库时,一些系统存储过程会在新数据库中被自动创建。用户自定义存储过程是由用户创建并能完成某一特定功能(如查询用户所需数据信息)的存储过程。在本章中所涉及到的存储过程主要是指用户自定义存储过程。
存储过程的优点
当利用MS SQL Server 创建一个应用程序时,Transaction-SQL 是一种主要的编程语言。若运用Transaction-SQL 来进行编程,有两种方法。其一是,在本地存储Transaction-SQL 程序,并创建应用程序向SQL Server 发送命令来对结果进行处理。其二是,可以把部分用Transaction-SQL 编写的程序作为存储过程存储在SQL Server 中,并创建应用程序来调用存储过程,对数据结果进行处理存储过程能够通过接收参数向调用者返回结果集,结果集的格式由调用者确定;返回状态值给调用者,指明调用是成功或是失败;包括针对数据库的操作语句,并且可以在一个存储过程中调用另一存储过程。
我们通常更偏爱于使用第二种方法,即在SQL Server 中使用存储过程而不是在客户计算机上调用Transaction-SQL 编写的一段程序,原因在于存储过程具有以下优点:
(1)存储过程允许标准组件式编程
存储过程在被创建以后可以在程序中被多次调用,而不必重新编写该存储过程的SQL 语句。而且数据库专业人员可随时对存储过程进行修改,但对应用程序源代码毫无影响(因为应用程序源代码只包含存储过程的调用语句),从而极大地提高了程序的可移植性。
(2)存储过程能够实现较快的执行速度
如果某一操作包含大量的Transaction-SQL 代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的执行计划。而批处理的Transaction-SQL 语句在每次运行时都要进行编译和优化,因此速度相对要慢一些。
(3)存储过程能够减少网络流量
对于同一个针对数据数据库对象的操作(如查询、修改),如果这一操作所涉及到的 Transaction-SQL 语句被组织成一存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,否则将是多条SQL 语句,从而大大增加了网络流量,降低网络负载。
(4)存储过程可被作为一种安全机制来充分利用
系统管理员通过对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的限制,避免非授权用户对数据的访问,保证数据的安全。(我们将在14 章“SQLServer 的用户和安全性管理”中对存储过程的这一应用作更为清晰的介绍)
注意:存储过程虽然既有参数又有返回值,但是它与函数不同。存储过程的返回值只是指明执行是否成功,并且它不能像函数那样被直接调用,也就是在调用存储过程时,在存储过程名字前一定要有EXEC保留字。
2.SQL存储过程创建
创建存储过程,存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。
可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。
也可以创建在 Microsoft? SQL Server? 启动时自动运行的存储过程。
语法
CREATE PROC [ EDURE ] procedure_name [;number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [...n ]
参数
procedure_name
新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。
要创建局部临时过程,可以在 procedure_name 前面加一个编号符(#procedure_name),要创建全局临时过程,可以在 procedure_name 前面加两个编号符
(##procedure_name)。完整的名称(包括 # 或 ##)不能超过 128 个字符。指定过程所有者的名称是可选的。
;number
是可选的整数,用来对同名的过程分组,以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为
orderproc;
1、orderproc;2 等。DROP PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应在 procedure_name 前后使用适当的定界符。
@parameter
过程中的参数。在 CREATE PROCEDURE 语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2.100 个参数。
使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。
data_type
参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。
说明 对于可以是 cursor 数据类型的输出参数,没有最大数目的限制。
VARYING
指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。
default
参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。
OUTPUT
表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。
n
表示最多可以指定 2.100 个参数的占位符。
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
RECOMPILE 表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE 选项。
ENCRYPTION 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。
说明 在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。
FOR REPLICATION
指定不能在订阅服务器上执行为复制创建的存储过程。.使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和 WITH RECOMPILE 选项一起使用。
AS
指定过程要执行的操作。
sql_statement
过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。
n
是表示此过程可以包含多条 Transact-SQL 语句的占位符。
注释
存储过程的最大大小为 128 MB。
用户定义的存储过程只能在当前数据库中创建(临时过程除外,临时过程总是在 tempdb 中创建)。在单个批处理中,CREATE PROCEDURE 语句不能与其它 Transact-SQL 语句组合使用。
默认情况下,参数可为空。如果传递 NULL 参数值并且该参数在 CREATE 或 ALTER TABLE 语句中使用,而该语句中引用的列又不允许使用 NULL,则 SQL Server 会产生一条错误信息。为了防止向不允许使用 NULL 的列传递 NULL 参数值,应向过程中添加编程逻辑或为该列使用默认值(使用 CREATE 或 ALTER TABLE 的 DEFAULT 关键字)。
建议在存储过程的任何 CREATE TABLE 或 ALTER TABLE 语句中都为每列显式指定 NULL 或 NOT NULL,例如在创建临时表时。ANSI_DFLT_ON 和 ANSI_DFLT_OFF 选项控制 SQL Server 为列指派 NULL 或 NOT NULL 特性的方式(如果在 CREATE TABLE 或 ALTER TABLE 语句中没有指定的话)。如果某个连接执行的存储过程对这些选项的设置与创建该过程的连接的设置不同,则为第二个连接创建的表列可能会有不同的为空性,并且表现出不同的行为方式。如果为每个列显式声明了 NULL 或 NOT NULL,那么将对所有执行该存储过程的连接使用相同的为空性创建临时表。
在创建或更改存储过程时,SQL Server 将保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的设置。执行存储过程时,将使用这些原始设置。因此,所有客户端会话的 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 设置在执行存储过程时都将被忽略。在存储过程中出现的 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 语句不影响存储过程的功能。
其它 SET 选项(例如 SET ARITHABORT、SET ANSI_WARNINGS 或 SET ANSI_PADDINGS)在创建或更改存储过程时不保存。如果存储过程的逻辑取决于特定的设置,应在过程开头添加一条 SET 语句,以确保设置正确。从存储过程中执行 SET 语句时,该设置只在存储过程完成之前有效。之后,设置将恢复为调用存储过程时的值。这使个别的客户端可以设置所需的选项,而不会影响存储过程的逻辑。
第四篇:SQL语言汇总
1.UPDATE MARK
SET 总分=语文+数学+英语
SELECT 准考证号,姓名,总分
FROM MARK
WHERE 语文>=75 AND数学>=75 AND 英语>=75 AND 语文+数学+英语>=240
ORDER BY 总分 DESC
UPDATE MARK
SET 修正分数=高考分数*1.3
WHERE 籍贯='云南' OR 籍贯='福建'
SELECT AVG(高考分数)as平均分
FROM MARK
GROUP BY 性别
SELECT *
FROM cj
WHERE 期中成绩>=80 OR 期末成绩>=80 ORDER BY 课程号 ASC
UPDATE cj
SET平均成绩=期中成绩*0.2+期末成绩*0.8
SELECT 书号,书名,作者
FROM gm
WHERE 书号 LIKE '理*' AND 单价>20 ORDER BY 单价 ASC
UPDATE gm
SET 金额=单价*数量
UPDATE Sale
SET 销售金额=销售数量*单价
UPDATE Wage
SET 实发工资=工资+奖金
SELECT 姓名,实发工资
FROM Wage
WHERE 姓名 LIKE '*辉'OR 姓名 LIKE ' *辉*' ORDER BY 年龄 DESC
SELECT 部门号, COUNT(*)as人数
FROM zhigong
GROUP BY 部门号
UPDATE kaoshi
SET平均成绩=笔试成绩*0.6+上机成绩*0.4
SELECT 考号,姓名,平均成绩
FROM kaoshi
WHERE 姓名 LIKE '黄*'
DELETE *
FROM mark
WHERE 学号='1003'
SELECT 学号,课程号,期末成绩
FROM mark
WHERE 学号 LIKE '*1'
ORDER BY 期末成绩 DESC
UPDATE fk
SET 超期罚款=单价*超期天数*0.005
SELECT *
FROM fk
WHERE 单价>=50 OR 超期天数>30 ORDER BY 超期罚款 DESC
UPDATE gp
SET 浮动盈亏=(市场现价-买入加个)*买入数量
SELECT 股票代码,买入时间,浮动盈亏 FROM gp
WHERE 股票代码 LIKE '6*' AND 浮动盈亏>0 ORDER BY 买入时间 ASC
UPDATE ah
SET 年龄=年龄+1
SELECT 寝室,COUNT(*)as 爱好球类人数 FROM ah
WHERE 爱好 LIKE '*球'
GROUP BY 寝室
UPDATE JHKC
SET 总价=单价*库存量
SELECT 设备编号,设备名称,单价
FROM JHKC
WHERE 库存量<300 AND 单价<500 ORDER BY 单价 DESC
UPDATE HCSK
SET 票价=600
WHERE 航班号=F807
SELECT 航班号,起飞日期,票价
FROM HCSK
WHERE 出发地='福州' AND 目的地='巴黎' ORDER BY 票价 ASC
第五篇:sql常用语句
//创建临时表空间
create temporary tablespace test_temp
tempfile 'E:oracleproduct10.2.0oradatatestservertest_temp01.dbf'size 32m
autoextend on
next 32m maxsize 2048m
extent management local;
//创建数据表空间
create tablespace test_data
logging
datafile 'E:oracleproduct10.2.0oradatatestservertest_data01.dbf'size 32m
autoextend on
next 32m maxsize 2048m
extent management local;
//创建用户并指定表空间
create user username identified by password
default tablespace test_data
temporary tablespace test_temp;
//给用户授予权限
//一般用户
grant connect,resource to username;
//系统权限
grant connect,dba,resource to username
//创建用户
create user user01 identified by u01
//建表
create table test7272(id number(10),name varchar2(20),age number(4),joindate date default sysdate,primary key(id));
//存储过程
//数据库连接池
数据库连接池负责分配、管理和释放数据库连接
//
//创建表空间
create tablespace thirdspace
datafile 'C:/Program Files/Oracle/thirdspace.dbf' size 10mautoextend on;
//创建用户
create user binbin
identified by binbin
default tablespace firstspace
temporary tablespace temp;
//赋予权限
GRANT CONNECT, SYSDBA, RESOURCE to binbin
//null与""的区别
简单点说null表示还没new出对象,就是还没开辟空间
个对象装的是空字符串。
//建视图
create view viewname
as
sql
//建索引
create index indexname on tablename(columnname)
//在表中增加一列
alter table tablename add columnname columntype
//删除一列
alter table tablename drop columnname
//删除表格内容,表格结构不变
truncate table tableneme
//新增数据
insert into tablename()values()
//直接新增多条数据
insert into tablename()
selecte a,b,c
from tableabc
//更新数据 new除了对象,但是这“”表示
update tablename set columnname=? where
//删除数据
delete from tablename
where
//union语句
sql
union
sql
//case
case
when then
else
end