当前位置:文档之家› PowerBuilder动态SQL语句及在组合查询中的应用.

PowerBuilder动态SQL语句及在组合查询中的应用.

PowerBuilder动态SQL语句及在组合查询中的应用.
PowerBuilder动态SQL语句及在组合查询中的应用.

PowerBuilder不仅支持在PowerScript中使用标准嵌入SQL语句,而且支持使用动态SQL语句。动态SQL语句可以解决嵌入SQL语句不支持DDL语句的问题,还能够在运行时构成SQL语句以解决在编译时不知道语句的具体格式或参数的问题。作者在“抚顺机动车辆管理信息系统”的开发过程中,对动态SQL语句的使用有了深刻的体会,车辆信息项目繁多而且组合条件复杂多变,使用该语句,不仅查询速度较高而且使用灵活可靠。下面就各动态SQL语句的使用格式、方法及各自的特点给予简单介绍,然后以查找车辆为例介绍动态SQL语句(格式4)在组合查询中的应用。

一、态SQL语句格式

PowerBuilder 有四种动态SQL格式,每种格式用于处理编译过程中的不同情况。

格式1:既没有输入参数,也没有输出结果集

格式2:有输入参数,但没有输出结果集

格式3:输入参数和结果集的列已知

格式4:输入参数和结果集在编译时有一个或都未知

1.动态SQL语句格式

格式

EXECUTE IMMEDIATE SQLStatement {USING TransactionObject} ;

参数描述

SQLStatement 是包括一条有效SQL语句的字符串。该字符串可以是常量或者冒号后面跟PowerBuilder变量(如:mysql)。该字符串必须只包括在一行上,且不能包含表达式。

TransactionObject(可选项)数据库的事务对象名

执行这种格式的SQL语句没有结果集、也不需要输入参数。这种格式可用来执行所有形式的数据定义语言(DDL)。

以下是一段建立车辆临时视图的例子:

string sql

sql=“CREATE VIEW temp_vehicle AS SELECT code , master FROM vehicle ”

EXECUTE IMMEDIATE :sql USING SQLDA;

2. 动态SQL语句格式

格式

PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ;

EXECUTE DynamicStagingArea USING {ParameterList} ;

参数描述

DynamicStagingArea DynamicStagingArea变量名(通常为SQLSA)

SQLStatement包含一条有效SQL语句的字符串。该字符串可以是常量或者冒号后面跟 PowerBuilder 变量(如:mysql)。在该语句中每个参数键入问号(?)。

TransactionObject(可选项)定义数据库的事务对象名

ParameterList (可选项)用冒号分隔的PowerScript变量列表以下是一段使用格式2的脚本:

int id = 156 //车辆ID

String master //车主

SetNull(master) // 设成NULL值

PREPARE SQLSA

FROM "INSERT INTO vehicle VALUES (?,?)" ;

EXECUTE SQLSA USING :id, :master ;

用这种SQL语句格式执行没有结果集、但需要输入参数。可用来执行所有形式的数据库定义语言(DDL)。

3. 动态SQL语句格式

格式

DECLARE Cursor | Procedure DYNAMIC CURSOR | PROCEDURE FOR DynamicStagingArea ;

PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ;

OPEN DYNAMIC Cursor {USING ParameterList} ;

EXECUTE DYNAMIC Procedure {USING ParameterList} ;

FETCH Cursor | Procedure INTO HostVariableList ;

CLOSE Cursor | Procedure ;

参数描述

Cursor or Procedure cursor或procedure名

DynamicStagingArea DynamicStagingArea变量名(通常为SQLSA)。SQLStatement 一条有效SQL SELECT语句的字符串。该字符串可以是常量或变量。

TransactionObject (可选项)定义数据库的事务对象名

ParameterList (可选项)用豆号分隔的PowerScript变量列表HostVariableList 把数据值提取到PowerScript变量的列表

以下是一段使用格式3的脚本:

DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ; //声明动态游标

integer Vehicle_id //查找的车辆ID string Mark= "BMW" //厂牌是”BMW”string sqlstatement

sqlstatement = "SELECT id FROM vehicle "+"WHERE mark = ?" //SQL语句PREPARE SQLSA FROM :sqlstatement ; //在SQLSA中准备SELECT语句OPEN DYNAMIC my_cursor using :Mark ;

//执行SQL语句,结果存入动态游标my_cursor中

FETCH my_cursor INTO :Vehicle_id ; //从my_cursor中提取结果CLOSE my_cursor ; //关闭游标

此种SQL语句的执行,需输入参数和知道结果集的列。

4.动态SQL语句格式

格式

DECLARE Cursor|Procedure DYNAMIC CURSOR|PROCEDURE FOR DynamicStagingArea;

PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject};

DESCRIBE DynamicStagingArea INTO DynamicDescriptionArea;

OPEN DYNAMIC Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ;

EXECUTE DYNAMIC Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ;

FETCH Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ; CLOSE Cursor | Procedure ;

参数描述

Cursor or Procedure cursor 或 procedure名

DynamicStagingArea DynamicStagingArea变量名(通常为SQLSA)。SQLStatement SQL SELECT语句的字符串。该字符串可以是常量或变量。

在该语句中,给每个参数的值赋予问号(?)。TransactionObject (可选项)定义数据库的事务对象名DynamicDescriptionArea DynamicDescriptionArea变量名(SQLDA)

二、动态SQL语句格式4的使用方法

1.输入参数

可以设置PREPARE语句中每个输入参数的类型和值。在DESCRIBE语句执行时, PowerBuilder 填充SQLDA 属性NumInputs的值。可以使用SetDynamicParm 函数来设置指定参数的类型和值。输入参数是可选的,但如果使用它们,必须在执行OPEN 或EXECUTE语句之前为全部输入参数赋值。

2.输出参数

可以存取PREPARE语句中出现的每个输出参数的类型和值。如果数据库支持输出参数描述,则在DESCRIBE 执行时,PowerBuilder 填充 SQLDA 属性NumOutputs的值,否则在FETCH 执行时填充 SQLDA 属性NumOutputs的值。

FETCH 语句执行后,DynamicDescriptionArea变量(SQLDA)中可以被访问的属性有:

NumInputs 输入参数的个数

InParmType 输入参数类型数组

NumOutputs 输出参数的个数

OutParmType 输出参数类型数组

3.用于获取输出参数值的函数

GetDynamicDate

GetDynamicDateTime

GetDynamicNumber

GetDynamicString

GetDynamicTime

4.输入/输出参数的数据类型

TypeBoolean!

TypeDate!

TypeDateTime!

TypeDecimal!

TypeDouble!

TypeInteger!

TypeLong!

TypeReal!

TypeString!

TypeTime!

TypeUInt!

TypeULong!

TypeUnknown!

下面的程序段使用了格式4的动态SQL语句。

string Sqlstatement

Sqlstatement = "SELECT id FROM vehicle "+"WHERE mark = ?" PREPARE SQLSA FROM :Sqlstatement ;

DESCRIBE SQLSA INTO SQLDA ; //如果DESCRIBE语句执行成功,则输入描述数组必须 // 在OPEN语句执行之前赋值.

DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;

SetDynamicParm(SQLDA, 1, "MA")

OPEN DYNAMIC my_cursor USING DESCRIPTOR SQLDA ;

FETCH my_cursor USING DESCRIPTOR SQLDA ; //FETCH成功,则输出描述数组含有结//果集

CLOSE my_cursor;

5.使用PowerBuilder数据类型DynamicStagingArea和DynamicDescriptionArea

DynamicStagingArea 是PowerBuilder的一种数据类型。PowerBuilder用该类型变量保存在接下来的语句中使用的信息。DynamicStagingArea 是执行语句和事务对象之间的唯一联系者,它在PowerBuilder内部使用,用户无法存取其中的信息。PowerBuilder 提供一个名为SQLSA 的DynamicStagingArea 全局变量,用户需要使用时,调用SQLSA即可。

DynamicDescriptionArea 是PowerBuilder 的另一种数据类型。PowerBuilder 用该类型变量保存动态SQL 语句格式4中有关输入输出参数的信息。PowerBuilder 同样提供一个名为SQLDA的DynamicDescriptionArea 型全局变量,当需要使用时,可以用SQLDA 调用它。

使用动态 SQL语句格式4时,应该特别注意以正确的次序执行这些语句。

三、实例

下面的图例是《车辆管理系统》中的组合查询界面,用来收集查询条件,条件表达式存于字符串变量condition_sum中。

Sqlstatement = "SELECT count(*) FROM vehicle where "+condition_sum PREPARE SQLSA FROM :Sqlstatement ;

DESCRIBE SQLSA INTO SQLDA ;

DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;

OPEN DYNAMIC my_cursor USING DESCRIPTOR SQLDA ;

FETCH my_cursor USING DESCRIPTOR SQLDA ;

Find_num = GetDynamicNumber(SQLDA, 1) //取出满足条件的记录数

CLOSE my_cursor ;

Sqlstatement="SELECT id,code,master,tele "+" FROM vehicle where "+condition_sum

PREPARE SQLSA FROM :Sqlstatement ;

DESCRIBE SQLSA INTO SQLDA ;

DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;

OPEN DYNAMIC my_cursor USING DESCRIPTOR SQLDA ;

For i=1 to Find_num

FETCH my_cursor USING DESCRIPTOR SQLDA ;

Vehicle_id= GetDynamicNumber(SQLDA, 1)

Vehicle_code=GetDynamicstring(SQLDA,2)

Vehicle_master=GetDynamicstring(SQLDA,3)

Vehicle_tele=GetDynamicstring(SQLDA,4)

: //显示车辆信息程序段

Next

CLOSE my_cursor ;

常用SQL语句大全

常用SQL语句大全 一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 DROP database dbname 3、说明:备份sql server --- 创建备份数据的device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 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 注:列增加后将不能删除。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、说明:几个高级查询运算词

ORACLE常用SQL语句大全

ORACLE常用SQL语句大全 一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mssql7backup/MyNwind_1.dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not nul l],..) 根据已有的表创建新表: A:select * into table_new from table_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only<仅适用于Oracle> 5、说明:删除表 drop table tablename

6、说明:增加一个列,删除一个列 A:alter table tabname add column col type B:alter table tabname drop column colname 注:DB2DB2中列加上后数据类型也不能改变,唯一能改变的是增加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、几个高级查询运算词 A:UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B:EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 C:INTERSECT 运算符 INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。 12、使用外连接

动态SQL总结

关于动态SQL的一些总结 目的 动态SQL用于减小程序消耗并获取较高的执行性能,且容易编码,现越来越广泛的应用于数据库程序开发中。在SQL中,可以采用多种方式构造和执行动态SQL,比如EXECUTE IMMEDIATE、DBMS_SQL包等。由于ORACLE手册中并未覆盖这些功能,现简单说明下关于EXECUTE IMMEDIATE的用法。 名词定义 Oracle数据库开发PL/SQL块,常用SQL分为:静态SQL语句和动态SQL语句。 静态SQL,指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。 处理范围 ◆语句可变:允许用户在程序运行时,临时动态创建完整的语句 ◆条件可变:对于查询语句而言,语句的输出是确定的,但是查询子句(如WHERE 子句,GROUP BY子句,HAVING子句等)可变 ◆数据库对象等其他可变:对于别名,查询的表名、视图、过程名、DBLINK名等, 临时构建,均不确定。 语法 EXECUTE IMMEDIATEdynamic_string [INTO {define_variable [ , define_variable ] … |record}] [USING [IN | OUT | IN OUT ] bing_argument [, [IN | OUT | IN OUT ] bing_argument] … ]

[{RETURNING | RETURN} INTObind_argument [,bind_argument] … ] ◆dynamic_string用于指定存放SQL语句或PL/SQL块的字符串变量;define_variable 用于指定存放单行查询结果的变量;bind_argument用于存放传递的输入、输出变量。 ◆dynamic_string语句需用单引号括起来,需要使用特殊符号的地方需注意转义,如使 用引号时,用’’代替’;需要使用变量的地方,可以直接用:号加变量名,也可以用 || 连接符将直接调用变量。区别在于EXECUTE IMMEDIATE语句中,前者需要加USING传入变量,后者不用。 使用范例 1.一般执行语句: Begin EXECUTEIMMEDIATE'create table tab_test(test_code varchar2(200),test_value varchar2(20),remark varchar2(200))'; End; 2.带传入参数的动态语句(USING语句): 3.带传出参数的动态语句(INTO语句):

SQL常用语法及例子精简——快速入手

sql语言 库表的增删改查常用语及语法 (1)数据记录筛选: sql="select*from 数据表where 字段名=字段值orderby字段名[desc]" sql="select*from 数据表where 字段名like'%字段值%'orderby字段名[desc]" sql="selecttop10*from 数据表where 字段名orderby字段名[desc]" sql="select*from 数据表where 字段名in('值1','值2','值3')" sql="select*from 数据表where 字段名between 值1and 值2" (2)更新数据记录: sql="update 数据表set 字段名=字段值where 条件表达式" sql="update 数据表set 字段1=值1,字段2=值2……字段n=值nwhere条件表达式" (3)删除数据记录: sql="de letefrom数据表where 条件表达式" sql="de letefrom数据表"(将数据表所有记录删除) (4)添加数据记录: sql="insertinto数据表(字段1,字段2,字段3…)values(值1,值2,值3…)" sql="insertinto目标数据表select*from 源数据表"(把源数据表的记录添加到目标数据表) (5)数据记录统计函数: AVG(字段名)得出一个表格栏平均值 COUNT(*|字段名)对数据行数的统计或对某一栏有值的数据行数统计 MAX(字段名)取得一个表格栏最大的值 MIN(字段名)取得一个表格栏最小的值 SUM(字段名)把数据栏的值相加 引用以上函数的方法: sql="selectsum(字段名)as 别名from 数据表where 条件表达式" setrs=conn.excute(sql) 用rs("别名")获取统的计值,其它函数运用同上。 (6)数据表的建立和删除: CREATETABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度)……) 例:CREATETABLEtab01 (namevarchar (50), datetimedefaultnow ()) DROPTABLE 数据表名称(永久性删除一个数据表) 4.记录集对象的方法: rs.movenext将记录指针从当前的位置向下移一行 rs.moveprevious将记录指针从当前的位置向上移一行 rs.movefirst将记录指针移到数据表第一行 rs.movelast将记录指针移到数据表最后一行 rs.absoluteposition=N 将记录指针移到数据表第N 行 rs.absolutepage=N 将记录指针移到第N 页的第一行 rs.pagesize=N 设置每页为N 条记录 rs.pagecount根据pagesize的设置返回总页数 rs.recordcount返回记录总数 rs.bof返回记录指针是否超出数据表首端,true 表示是,false 为否

SQL常用语句+举例

SQL 常用语句+举例 相关表: 1. distinct: 剔除重复记录 例:select distinct stroe_name from Store_information 结果: 2. And / or: 并且/或 例:在表中选出所有sales 高于$1000或是sales 在$275及$500之间的记录 Select store_name ,sales from Store_information Where sales>1000 Or (sales>275 and sales <500) 3. 例:在表中查找store_name 包含 Los Angeles 或San Diego 的记录 Select * from Store_information where store_name in (‘Los Angeles ’,’San Diego ’) 结果: 4. Between : 可以运用一个范围抓出表中的值

与in 的区别:in 依照一个或数个不连续的值的限制抓出表中的值 例:查找表中介于Jan-06-1999 及Jan-10-1999 中的记录 Select * from Store_information where date between ‘Jan-06-1999’ and ‘Jan-10-1999’ 结果: 5. Like : 让我们依据一个套式来找出我们要的记录 套式通常包含: ’A_Z ’: 所有以A 开头,中间包含一个字符,以Z 结尾的字串 ’ABC%’: 所有以ABC 起头的字串 ’%XYZ ’: 所有以XYZ 结尾的字串 ’%AN%’: 所有包含AN 的字串 例:Select * from Store_information where store_name like ‘%An%’ 结果: 6. Order by: 排序,通常与ASC (从小到大,升序)、DESC (从大到小,降序)结合使用 当排序字段不止一个时,先依据字段1排序,当字段1有几个值相同时,再依据字段2排序 例:表中sales 由大到小列出Store_information 的所有记录 Select Store_name, sales,date from Store_information order by sales desc 结果: 7. 函数:AVG (平均值)、COUNT (计数)、MAX (最大值)、MIN (最小值)、SUM(求和) 语句:select 函数名(字段名) from 表名 例:求出sales 的总和 Select sum(sales) from Store_information 结果 8. COUNT (计数) 例:找出Store_information 表中 有几个store_name 值不是空的记录

学习SQL应知道的动态SQL语句基本语法

精妙SQL详解 本文档由周公(周金桥)从网上搜集整理。版权归原作者所有。 欢迎访问本人博客:https://www.doczj.com/doc/649712731.html,/zhoufoxcn 2008-10-12 周公 目录 学习SQL应知道的动态SQL语句基本语法 (2) SQL Server数据库中经常用到的identity列 (3) “一网打尽”通用SQL数据库的查询语句(1) (3) 教你快速掌握一些异常精妙的"SQL"语句 (6) 实例讲解SQL Server中"Update"的用法 (7) 三种数据库利用SQL语句进行高效果分页 (8) 深入讲解SQL Server数据库的嵌套子查询 (9) 使用SQL视图查出所有的数据库字典 (10) 两个表间不存在的insert与存在的update (12) 实现跨多个表格的数据进行组合的SQL语句(1) (15) 深入讲解SQL Union和Union All的使用方法 (16) 巧用一条SQL 实现其它进制到十进制转换 (18) 实例讲解如何才能让你的SQL运行得更快(1) (19) 利用"SQL"语句自动生成序号的两种方式 (21) 详细讲解有关获取当月天数的实用技巧 (22) 为什么SQL不许在视图定义ORDER BY子句 (23) 一条SQL语句变得巨慢的原因及其解决方法 (23) 教你快速掌握SQL语句各种写法的效率问题 (24) 通过两个例子讲解PIVOT/UNPIVOT的用法 (25) 用一个实例讲解GROUP BY CEIL的使用方法 (27) 解析SQL语句中INSERT语句的另一种写法 (29) 轻松解决“每个Y的最新X”的SQL问题 (29) 教你快速掌握编写高效SQL语句的方法 (30) 个人经验总结:有关SQL语句的优化技术(1) (30) 用SQL语句删除重复记录的四种好方法 (32) 不要在SQL Server中盲目地追求一句处理(1) (35) 用人工智能技术自动对SQL语句进行重写(1) (38)

SQL语句实例

表操作 例1 对于表的教学管理数据库中的表STUDENTS,可以定义如下:CREATE TABLE STUDENTS, ( SNO NUMERIC (6, 0) NOT NULL, SNAME CHAR (8) NOT NULL, AGE NUMERIC(3,0), SEX CHAR(2), BPLACE CHAR(20), PRIMARY KEY(SNO) ) 例2 对于表的教学管理数据库中的表ENROLLS,可以定义如下:CREATE TABLE ENROLLS ( SNO NUMERIC(6,0) NOT NULL, CNO CHAR(4) NOT NULL, GRADE INT, PRIMARY KEY(SNO,CNO), FOREIGN KEY(SNO) REFERENCES STUDENTS(SNO), FOREIGN KEY(CNO) REFERENCES COURSES(CNO), CHECK ((GRADE IS NULL) OR (GRADE BETWEEN 0 AND 100)) ) 例3 根据表的STUDENTS 表,建立一个只包含学号、姓名、年龄的女学生表。CREATE TABLE GIRL AS SELECT SNO, SNAME, AGE FROM STUDENTS WHERE SEX='女'; 例4 删除教师表TEACHER。 DROP TABLE TEACHER 例5 在教师表中增加住址列。 ALTER TABLE TEACHERS ADD (ADDR CHAR(50))

例6 把STUDENTS表中的BPLACE列删除,并且把引用BPLACE列的所有视图和约束也一起删除。 ALTER TABLE STUDENTS DROP BPLACE CASCADE 例7 补充定义ENROLLS表的主关键字。 ALTER TABLE ENROLLS ADD PRIMARY KEY (SNO,CNO); 视图操作(虚表) 例9 建立一个只包括教师号、姓名和年龄的视图FACULTY。(在视图定义中不能包含ORDER BY子句) CREATE VIEW FACULTY AS SELECT TNO, TNAME, AGE FROM TEACHERS 例10 从学生表、课程表和选课表中产生一个视图GRADE_TABLE,它包括学生姓名、课程名和成绩。 CREATE VIEW GRADE_TABLE AS SELECT SNAME,CNAME,GRADE FROM STUDENTS,COURSES,ENROLLS WHERE STUDENTS.SNO=ENROLLS.SNO AND https://www.doczj.com/doc/649712731.html,O=https://www.doczj.com/doc/649712731.html,O 例11 删除视图GRADE_TABLE DROP VIEW GRADE_TABLE RESTRICT 索引操作 例12 在学生表中按学号建立索引。 CREATE UNIQUE INDEX ST ON STUDENTS (SNO,ASC) 例13 删除按学号所建立的索引。 DROP INDEX ST 数据库模式操作 例14 创建一个简易教学数据库的数据库模式TEACHING_DB,属主为ZHANG。 CREATE SCHEMA TEACHING_DB AUTHRIZATION ZHANG 例15 删除简易教学数据库模式TEACHING_DB。((1)选用CASCADE,即当删除数据库模式时,则本数据库模式和其下属的基本表、视图、索引等全

数据库基本SQL语句大全

数据库基本SQL语句大全 数据库基本----SQL语句大全 一、基础 1、说明:创建数据库 Create DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 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 注:列增加后将不能删除。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 范围

SQL语句大全实例

SQL语句实例 表操作 例 1 对于表的教学管理数据库中的表STUDENTS ,可以定义如下:CREATE TABLE STUDENTS (SNO NUMERIC (6, 0) NOT NULL SNAME CHAR (8) NOT NULL AGE NUMERIC(3,0) SEX CHAR(2) BPLACE CHAR(20) PRIMARY KEY(SNO)) 例 2 对于表的教学管理数据库中的表ENROLLS ,可以定义如下: CREATE TABLE ENROLLS (SNO NUMERIC(6,0) NOT NULL CNO CHAR(4) NOT NULL GRADE INT PRIMARY KEY(SNO,CNO) FOREIGN KEY(SNO) REFERENCES STUDENTS(SNO) FOREIGN KEY(CNO) REFERENCES COURSES(CNO) CHECK ((GRADE IS NULL) OR (GRADE BETWEEN 0 AND 100))) 例 3 根据表的STUDENTS 表,建立一个只包含学号、姓名、年龄的女学生表。 CREATE TABLE GIRL

AS SELECT SNO, SNAME, AGE FROM STUDENTS WHERE SEX=' 女'; 例 4 删除教师表TEACHER 。 DROP TABLE TEACHER 例 5 在教师表中增加住址列。 ALTER TABLE TEACHERS ADD (ADDR CHAR(50)) 例 6 把STUDENTS 表中的BPLACE 列删除,并且把引用BPLACE 列的所有视图和约束也一起删除。 ALTER TABLE STUDENTS DROP BPLACE CASCADE 例7 补充定义ENROLLS 表的主关键字。 ALTER TABLE ENROLLS ADD PRIMARY KEY (SNO,CNO) ; 视图操作(虚表) 例9 建立一个只包括教师号、姓名和年龄的视图FACULTY 。( 在视图定义中不能包含ORDER BY 子句) CREATE VIEW FACULTY AS SELECT TNO, TNAME, AGE FROM TEACHERS 例10 从学生表、课程表和选课表中产生一个视图GRADE_TABLE ,它包括学生姓名、课程名和成绩。 CREATE VIEW GRADE_TABLE AS SELECT SNAME,CNAME,GRADE FROM STUDENTS,COURSES,ENROLLS WHERE STUDENTS.SNO =ENROLLS.SNO AND https://www.doczj.com/doc/649712731.html,O=https://www.doczj.com/doc/649712731.html,O 例11 删除视图GRADE_TABLE DROP VIEW GRADE_TABLE RESTRICT 索引操作 例12 在学生表中按学号建立索引。 CREATE UNIQUE INDEX ST ON STUDENTS (SNO,ASC) 例13 删除按学号所建立的索引。 DROP INDEX ST 数据库模式操作

50个常用sql语句实例(学生表 课程表 成绩表 教师表)

Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 create table Student(S# varchar(20),Sname varchar(10),Sage int,Ssex varchar(2)) 前面加一列序号: if exists(select table_name from information_schema.tables where table_name='Temp_Table') drop table Temp_Table go select 排名=identity(int,1,1),* INTO Temp_Table from Student go select * from Temp_Table go drop database [ ] --删除空的没有名字的数据库 问题: 1、查询“”课程比“”课程成绩高的所有学生的学号; select a.S# from (select s#,score from SC where C#='001') a,(select s#,score from SC where C#='002') b where a.score>b.score and a.s#=b.s#; 2、查询平均成绩大于分的同学的学号和平均成绩; select S#,avg(score) from sc group by S# having avg(score) >60; 3、查询所有同学的学号、姓名、选课数、总成绩; select Student.S#,Student.Sname,count(SC.C#),sum(score) from Student left Outer join SC on Student.S#=SC.S# group by Student.S#,Sname 4、查询姓“李”的老师的个数; select count(distinct(Tname)) from Teacher where Tname like '李%'; 5、查询没学过“叶平”老师课的同学的学号、姓名; select Student.S#,Student.Sname from Student

ORACLE关于动态SQL的使用

关于动态SQL的使用-----摘录 内容摘要:在PL/SQL开发过程中,使用SQL,PL/SQL可以实现大部份的需求,但是在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现自己的需求,比如需要动态建表或某个不确定的操作需要动态执行。这就需要使用动态SQL来实现。本文通过几个实例来详细的讲解动态SQL的使用。 本文适宜读者范围:Oracle初级,中级 系统环境: OS:windows2000Professional(英文版) Oracle:8.1.7.1.0 正文: 一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现。 首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL分为:静态SQL语句和动态SQL语句。所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。 Oracle中动态SQL可以通过本地动态SQL来执行,也可以通过DBMS_SQL包来执行。下面就这两种情况分别进行说明: 一、本地动态SQL 本地动态SQL是使用EXECUTE IMMEDIATE语句来实现的。 1、本地动态SQL执行DDL语句: 需求:根据用户输入的表名及字段名等参数动态建表。 create or replace procedure proc_test ( table_name in varchar2,--表名 field1in varchar2,--字段名 datatype1in varchar2,--字段类型 field2in varchar2,--字段名 datatype2in varchar2--字段类型 )as str_sql varchar2(500); begin str_sql:=create table||table_name||(||field1||||datatype1||,||field2|| ||datatype2||); execute immediate str_sql;--动态执行DDL语句 exception when others then null; end; 以上是编译通过的存储过程代码。下面执行存储过程动态建表。

大数据库基本SQL语句大全

数据库基本_SQL语句大全 学会数据库是很实用D~~记录一些常用的sql语句...有入门有提高有见都没见过的...好全...收藏下... 其实一般用的就是查询,插入,删除等语句而已....但学学存储过程是好事...以后数据方面的东西就不用在程序里搞喽..而且程序与数据库只要一个来回通讯就可以搞定所有数据的操作.... 一、基础 1、说明:创建数据库 Create DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的device USE master EXEC sp_addumpdevice ‘disk‘, ‘testBack‘, ‘c:\mssql7backup\MyNwind_1.dat‘ --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 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 注:列增加后将不能删除。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 范围

MyBatis学习 之三动态SQL语句

MyBatis学习之三动态SQL语句 三、动态SQL语句 MyBatis学习之一、MyBatis简介与配置MyBatis+Spring+MySql MyBatis学习之二、SQL语句映射文件(1)resultMap MyBatis学习之二、SQL语句映射文件(2)增删改查、参数、缓存 MyBatis学习之三、动态SQL语句 MyBatis学习之四、MyBatis配置文件 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息。使用Oracle的序列、mysql的函数生成Id。这时我们可以使用动态sql。 下文均采用mysql语法和函数(例如字符串链接函数CONCAT)。 3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列、在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。使用myBatis的selectKey标签可以实现这个效果。 下面例子,使用mysql数据库自定义函数nextval('student'),用来生成一个key,并把他设置到传入的实体类中的studentId属性上。所以在执行完此方法后,边可以通过这个实体类获取生成的key。 select nextval('student') INSERT INTO STUDENT_TBL(STUDENT_ID, STUDENT_NAME, STUDENT_SEX, STUDENT_BIRTHDAY, STUDENT_PHOTO, CLASS_ID, PLACE_ID) V ALUES (#{studentId}, #{studentName}, #{studentSex}, #{studentBirthday}, #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler}, #{classId}, #{placeId}) 调用接口方法,和获取自动生成key StudentEntity entity = new StudentEntity(); entity.setStudentName("黎明你好"); entity.setStudentSex(1); entity.setStudentBirthday(DateUtil.parse("1985-05-28")); entity.setClassId("20000001"); entity.setPlaceId("70000001"); this.dynamicSqlMapper.createStudentAutoKey(entity); System.out.println("新增学生ID: " + entity.getStudentId()); selectKey语句属性配置细节: 属性描述取值keyProper ty selectKey 语句生成结果需要设置的属性。 resultTyp e 生成结果类型,MyBatis 允许使用基本的数据类型,包括String 、int 类型。 order 1:BEFORE,会先选择主键,然后设置keyProperty,再执行insert 语句; 2:AFTER,就先运行insert 语句再运行selectKey 语句。 BEFORE AFTER

50个常用的SQL语句练习

基本信息Student(`S#`,Sname,Sage,Ssex) 学生表 Course(`C#`,Cname,`T#`) 课程表 SC(`S#`,`C#`,score) 成绩表 Teacher(`T#`,Tname) 教师表 问题: 1、查询“001”课程比“002”课程成绩高的所有学生的学号; select a.`S#` from (select `S#`,score from SC where `C#`='001') a,(select `S#`,score from SC where `C#`='002') b where a.score>b.score and a.`S#`=b.`S#`; ↑一张表中存在多对多情况的 2、查询平均成绩大于60分的同学的学号和平均成绩; 答案一:select `S#`,avg(score) from sc group by `S#` having avg(score) >60; ↑一对多,对组进行筛选 答案二:SELECT s ,scr FROM (SELECT sc.`S#` s,AVG(sc.`score`) scr FROM sc GROUP BY sc.`S#`) rs WHERE rs.scr>60 ORDER BY rs.scr DESC ↑嵌套查询可能影响效率 3、查询所有同学的学号、姓名、选课数、总成绩; 答案一:select Student.`S#`,Student.Sname,count(`C#`),sum(score) from Student left Outer join SC on Student.`S#`=SC.`S#` group by Student.`S#`,Sname ↑如果学生没有选课,仍然能查出,显示总分null(边界情况) 答案二:SELECT student.`S#`,student.`Sname`,COUNT(sc.`score`) 选课数,SUM(sc.`score`) 总分FROM Student,sc WHERE student.`S#`=sc.`S#` GROUP BY sc.`S#` ↑如果学生没有选课,sc表中没有他的学号,就查不出该学生,有缺陷! 4、查询姓“李”的老师的个数; select count(distinct(Tname)) from Teacher where Tname like '李%'; 5、查询没学过“叶平”老师课的同学的学号、姓名; select Student.`S#`,Student.Sname from Student where `S#` not in (select distinct(SC.`S#`) from SC,Course,Teacher where SC.`C#`=Course.`C#` and Teacher.`T#`=Course.`T#` and Teacher.Tname='叶平'); ↑反面思考Step1:先找学过叶平老师课的学生学号,三表联合查询 Step2:在用not in 选出没学过的 Step3:distinct以防叶平老师教多节课;否则若某同学的几节课都由叶平教,学号就会出现重复 6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名; select Student.`S#`,Student.Sname from Student,SC where Student.`S#`=SC.`S#` and SC.`C#`='001'and exists( Select * from SC as SC_2 where SC_2.`S#`=SC.`S#` and SC_2.`C#`='002' ); ↑注意目标字段`S#`关联 exists subquery 可以用in subquery代替,如下 select Student.`S#`,Student.Sname from Student,Sc where Student.`S#`=SC.`S#` and SC.`C#`='001'and sc.`s#` in ( select sc_2.`s#` from sc as sc_2 where sc_2.`c#`='002' ); ↑不同之处,in subquery此处就不需要关联了

相关主题
文本预览
相关文档 最新文档