在本文中,我们将带你了解SqlServer_SQL基础语法总结在这篇文章中,我们将为您详细介绍SqlServer_SQL基础语法总结的方方面面,并解答sqlserver基础语法常见的疑惑,同时我们还将
在本文中,我们将带你了解SqlServer_SQL基础语法总结在这篇文章中,我们将为您详细介绍SqlServer_SQL基础语法总结的方方面面,并解答sql server 基础语法常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的com.microsoft.sqlserver.jdbc.SQLServerException: “?”附近有语法错误、mssqlserver sql基础学入门语句学习、PCB MS SQL SERVER版本管控工具source_safe_for_sql_server、SQL Server SQL 存储过程基础语法之一。
本文目录一览:- SqlServer_SQL基础语法总结(sql server 基础语法)
- com.microsoft.sqlserver.jdbc.SQLServerException: “?”附近有语法错误
- mssqlserver sql基础学入门语句学习
- PCB MS SQL SERVER版本管控工具source_safe_for_sql_server
- SQL Server SQL 存储过程基础语法之一
SqlServer_SQL基础语法总结(sql server 基础语法)
sql教程<kNowledgeStore_server_sql> 地址:http://www.w3school.com.cn/sql/index.asp; 一、sql 基础教程 1、sql(结构化查询语言)定义 (1)、sql 是用于访问和处理数据库的标准的计算机语言。你可以使用 sql 访问和处理数据系统中的数据,这类数据库包括:Oracle,Sybase,sql Server,DB2,Access 等等。 (2)、sql 指结构化查询语言,使我们有能力访问数据库,是一种ANSI(美国国家标准化组织)的标准计算机语言。 2、sql 能做什么? sql 面向数据库执行查询,可从数据库取回数据,可在数据库中插入新的记录,可更新数据库中的数据,可从数据库删除记录, 可创建新数据库,可在数据库中创建新表,可在数据库中创建存储过程,可在数据库中创建视图,可以设置表、存储过程和视图的权限。 3、sql不足 sql是一种标准,不幸地是,存在着很多不同版本的 sql 语言,但是为了与 ANSI 标准相兼容,它们必须以相似的方式共同地来支持一些主要的关键词(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。除了 sql 标准之外,大部分 sql 数据库程序都拥有它们自己的私有扩展! 4、如何在您的网站中使用sql? 要创建发布数据库中数据的网站,您需要以下要素: (1)RDBMS 数据库程序(比如 MS Access,MysqL); (2)服务器端脚本语言(比如 PHP 或 ASP); (3)sql; (4)HTML / CSS; 5、RDBMS RDBMS指的是关系型数据库管理系统。 RDBMS 是 sql 的基础,同样也是所有现代数据库系统的基础,比如 MS sql Server,IBM DB2,Oracle,MysqL 以及 Microsoft Access;RDBMS 中的数据存储在被称为表(tables)的数据库对象中;表是相关的数据项的集合,它由列和行组成; 6、sql语法 sql对大小写不敏感; (1)、sql 语句后面的分号 某些数据库系统要求在每条 sql 命令的末端使用分号。在我们的教程中不使用分号。分号是在数据库系统中分隔每条 sql 语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的语句。如果您使用的是 MS Access 和 sql Server 2000,则不必在每条 sql 语句之后使用分号,不过某些数据库软件要求必须使用分号。 (2)、sql DML(Data Manipulation Language) 和 DDL(data deFinition language) 可以把 sql 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。sql (结构化查询语言)是用于执行查询的语法。但是 sql 语言也包含用于更新、插入和删除记录的语法。 A、查询和更新指令构成sql的DML部分:SELECT - 从数据库表中获取数据;UPDATE - 更新数据库表中的数据;DELETE - 从数据库表中删除数据;INSERT INTO - 向数据库表中插入数据;B、sql的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。 (3)、sql 中最重要的 DDL 语句: CREATE DATABASE - 创建新数据库; ALTER DATABASE - 修改数据库; CREATE TABLE - 创建新表; ALTER TABLE - 变更(改变)数据库表; DROP TABLE - 删除表; CREATE INDEX - 创建索引(搜索键); DROP INDEX - 删除索引; 7、sql SELECT 语句_SELECT语句用于从表中选取数据,结果被存储在一个结果表中(称为结果集)。 语法:SELECT 列名称 FROM 表名称;(多列用逗号","分隔,所有列用星号"*"表示) 外题:如何在结果集(result-set)中导航:由 sql 查询程序获得的结果被存放在一个结果集中。大多数数据库软件系统都允许使用编程函数在结果集中进行导航,比如:Move-To-First-Record、Get-Record-Content、Move-To-Next-Record 等等。类似这些编程函数不在本教程讲解之列。如需学习通过函数调用访问数据的知识,请访问我们的 ADO 教程 和 PHP 教程。 8、sql SELECT disTINCT 语句 说明:在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词 disTINCT 用于返回唯一不同的值; 语法:SELECT disTINCT 列名称 FROM 表名称; 结果:disTINCT关键字指定的列不存在重复值; 9、sql WHERE 子句 说明:WHERE 子句用于规定选择的标准;如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句; 语法:SELECT 列名称 FROM 表名称 WHERE 列 运算符 值; 运算符:=等于;<>不等于;>大于;<小于;>=大于等于;<=小于等于;BETWEEN在某个范围内;LIKE搜索某种模式;切记在某些版本的 sql 中,操作符 <> 可以写为 !=; 引号:sql使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。如果是日期时间值,access用#号,而sqlserver用引号; 10、sql AND & OR 运算符 说明:AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤; 作用:AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来;如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录;如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录; 示例:我们也可以把 AND 和 OR 结合起来(使用圆括号来组成复杂的表达式):SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter'; 11、sql ORDER BY 子句 说明:ORDER BY 语句用于对结果集进行排序;ORDER BY 语句默认按照升序对记录进行排序;如果您希望按照降序对记录进行排序,可以使用 DESC 关键字; 示例:以逆字母顺序显示公司名称,并以数字顺序显示顺序号:SELECT Company,OrderNumber FROM Orders ORDER BY Company DESC,OrderNumber ASC; 12、sql INSERT INTO 语句 说明:INSERT INTO 语句用于向表格中插入新的行; 语法:INSERT INTO table_name (列1,列2,...) VALUES (值1,值2,....);(如果不指定列,默认为所有列) 13、sql UPDATE 语句 说明:Update 语句用于修改表中的数据; 语法:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值; 示例:UPDATE Person SET Address = 'Zhongshan 23',City = 'Nanjing' WHERE LastName = 'Wilson'; 14、sql DELETE 语句 说明:DELETE 语句用于删除表中的行; 语法:DELETE FROM 表名称 WHERE 列名称 = 值; 示例:删除所有数据行:DELETE FROM table_name或者DELETE * FROM table_name; 二、sql 高级教程 1、sql TOP 子句 说明:TOP 子句用于规定要返回的记录的数目;对于拥有数千条记录的大型表来说,TOP 子句是非常有用的;切记:并非所有的数据库系统都支持 TOP 子句; 语法:SELECT TOP number|percent column_name(s) FROM table_name; MysqL语法:SELECT column_name(s) FROM table_name LIMIT number; Oracle语法:SELECT column_name(s) FROM table_name WHERE ROWNUM <= number; 示例:选取头两条记录:SELECT TOP 2 * FROM Persons;选取 50% 的记录:SELECT TOP 50 PERCENT * FROM Persons; 2、sql LIKE 操作符 说明:LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式; 语法:SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern;(like前边加上not则表示不包含) 模式:"%" 可用于定义通配符(模式中缺少的字母); 示例:以 "N" 开始:SELECT * FROM Persons WHERE City LIKE 'N%';以 "g" 结尾:SELECT * FROM Persons WHERE City LIKE '%g';包含 "lon":SELECT * FROM Persons WHERE City LIKE '%lon%';不包含 "lon":SELECT * FROM Persons WHERE City NOT LIKE '%lon%' 3、sql 通配符 说明:在搜索数据库中的数据时,sql 通配符可以替代一个或多个字符;sql 通配符必须与 LIKE 运算符一起使用;%替代一个或多个字符;_仅替代一个字符;[charlist]字符列中的任何单一字符;[^charlist]或者[!charlist]不在字符列中的任何单一字符; 示例:以 "A" 或 "L" 或 "N" 开头:SELECT * FROM Persons WHERE City LIKE '[ALN]%'; 4、sql IN 操作符 说明:IN 操作符允许我们在 WHERE 子句中规定多个值; 语法:SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...); 5、sql BETWEEN 操作符 说明:BETWEEN 操作符在 WHERE 子句中使用,作用是选取介于两个值之间的数据范围; (1)与and使用:操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期;SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2;切记:不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的。某些数据库会列出介于 "Adams" 和 "Carter" 之间的人,但不包括 "Adams" 和 "Carter" ;某些数据库会列出介于 "Adams" 和 "Carter" 之间并包括 "Adams" 和 "Carter" 的人;而另一些数据库会列出介于 "Adams" 和 "Carter" 之间的人,包括 "Adams" ,但不包括 "Carter" 。所以,请检查你的数据库是如何处理 BETWEEN....AND 操作符的! (2)与not使用:不包含;SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'; 6、sql Alias(别名) 说明:通过使用 sql,可以为列名称和表名称指定别名(Alias),使用别名使查询程序更易阅读和书写; (1)、表别名:SELECT column_name(s) FROM table_name AS alias_name; (2)、列别名:SELECT column_name AS alias_name FROM table_name; 示例:SELECT po.OrderID,p.LastName,p.FirstName FROM Persons AS p,Product_Orders AS po WHERE p.LastName='Adams' AND p.FirstName='John'; 7、sql JOIN 说明:sql join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据; Join和Key:有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join;数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起; 引用两个表:(1)、通过主键:SELECT Persons.LastName,Persons.FirstName,Orders.OrderNo FROM Persons,Orders WHERE Persons.Id_P = Orders.Id_P;(2)、通过join:SELECT Persons.LastName,Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P = Orders.Id_P ORDER BY Persons.LastName; join类型:除了我们在上面的例子中使用的 INNER JOIN(内连接),我们还可以使用其他几种连接;JOIN: 如果表中有至少一个匹配,则返回行;LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行;RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行;FULL JOIN: 只要其中一个表中存在匹配,就返回行; 8、sql INNER JOIN (内连接)关键字 说明:在表中存在至少一个匹配时,INNER JOIN 关键字返回行;LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行; 语法:SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name;切记:INNER JOIN 与 JOIN 是相同的; 9、sql LEFT JOIN 关键字 说明:LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行; 语法:SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name;切记:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN; 10、sql RIGHT JOIN 关键字 说明:RIGHT JOIN 关键字会从右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行; 语法:SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name;切记:在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN; 11、sql FULL JOIN 关键字 说明:只要其中某个表存在匹配,FULL JOIN 关键字就会返回行; 语法:SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name; 切记:FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出; 12、sql UNION 和 UNION ALL 操作符 (1)、sql UNION 操作符 说明:UNION 操作符用于合并两个或多个 SELECT 语句的结果集;请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同; 语法:SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2;切记:UNION 操作符默认选取不同的值。如果允许重复的值,请使用 UNION ALL; (2)、UNION ALL语法:SELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2;切记:UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名; 13、sql SELECT INTO 语句 说明:sql SELECT INTO 语句可用于创建表的备份复件;SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中;SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档; 语法:A把所有的列插入新表:SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablename;B或者只把希望的列插入新表:SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_tablename; 示例_制作备份复件:A_制作 "Persons" 表的备份复件:SELECT * INTO Persons_backup FROM Persons;B_IN 子句可用于向另一个数据库中拷贝表:SELECT * INTO Persons IN 'Backup.mdb' FROM Persons; 14、sql CREATE DATABASE 语句 说明:CREATE DATABASE 用于创建数据库; 语法:CREATE DATABASE database_name;切记:可以通过 CREATE TABLE 来添加数据库表; 15、sql CREATE TABLE 语句 说明:CREATE TABLE 语句用于创建数据库中的表; 语法:CREATE TABLE 表名称( 列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,.... ) 数据类型:数据类型(data_type)规定了列可容纳何种数据类型;integer(size)、int(size)、smallint(size)、tinyint(size)仅容纳整数,在括号内规定数字的最大位数;decimal(size,d)、numeric(size,d)容纳带有小数的数字,"size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数;char(size)容纳固定长度的字符串(可容纳字母、数字以及特殊字符), 在括号中规定字符串的长度;varchar(size)容纳可变长度的字符串(可容纳字母、数字以及特殊的字符),在括号中规定字符串的最大长度;date(yyyymmdd)容纳日期; 示例_创建名为 "Person" 的表: CREATE TABLE Persons ( Id_P int,LastName varchar(255),FirstName varchar(255),Address varchar(255),City varchar(255) ) 切记:可使用 INSERT INTO 语句向空表写入数据; 16、sql 约束 (Constraints) 说明:约束用于限制加入表的数据的类型,可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句); 类型:NOT NULL,UNIQUE,PRIMARY KEY,FOREIGN KEY,CHECK,DEFAULT; 17、sql NOT NULL 约束 说明:NOT NULL 约束强制列不接受 NULL 值;NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录; 示例: CREATE TABLE Persons ( Id_P int NOT NULL,LastName varchar(255) NOT NULL,City varchar(255) ) 18、sql UNIQUE 约束 说明:UNIQUE 约束唯一标识数据库表中的每条记录;UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证;PRIMARY KEY 拥有自动定义的 UNIQUE 约束;请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束; 示例_创建主键约束: (1)MysqL: CREATE TABLE Persons ( Id_P int NOT NULL,City varchar(255),UNIQUE (Id_P) ) (2)、sql Server / Oracle / MS Access: CREATE TABLE Persons ( Id_P int NOT NULL UNIQUE,City varchar(255) ) (3)MysqL / sql Server / Oracle / MS Access(如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束:): CREATE TABLE Persons ( Id_P int NOT NULL,CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName) ) 示例_修改表约束: (1)、MysqL / sql Server / Oracle / MS Access: ALTER TABLE Persons ADD UNIQUE (Id_P); (2)、如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束: ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName); 示例_撤销 UNIQUE 约束:MysqL:ALTER TABLE Persons DROP INDEX uc_PersonID;sql Server / Oracle / MS Access:ALTER TABLE Persons DROP CONSTRAINT uc_PersonID; 19、sql PRIMARY KEY 约束 说明:PRIMARY KEY 约束唯一标识数据库表中的每条记录;主键必须包含唯一的值;主键列不能包含 NULL 值;每个表都应该有一个主键,并且每个表只能有一个主键; (1)、创建表时添加主键 >MysqL; CREATE TABLE Persons ( Id_P int NOT NULL,PRIMARY KEY (Id_P) ) >sql Server / Oracle / MS Access: CREATE TABLE Persons ( Id_P int NOT NULL PRIMARY KEY,City varchar(255) ) >如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用下面的 sql 语法: MysqL / sql Server / Oracle / MS Access: CREATE TABLE Persons ( Id_P int NOT NULL,CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName) ) (2)修改表时添加主键,切记:如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时); >MysqL / sql Server / Oracle / MS Access:ALTER TABLE Persons ADD PRIMARY KEY (Id_P); >需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束:MysqL / sql Server / Oracle / MS Access:ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName); (3)、撤销 PRIMARY KEY 约束: MysqL:ALTER TABLE Persons DROP PRIMARY KEY; sql Server / Oracle / MS Access:ALTER TABLE Persons DROP CONSTRAINT pk_PersonID; 20、sql FOREIGN KEY (外键)约束 说明:一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY;FOREIGN KEY 约束用于预防破坏表之间连接的动作;FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一; (1)、创建表时添加外键约束 >MysqL: CREATE TABLE Orders ( Id_O int NOT NULL,OrderNo int NOT NULL,Id_P int,PRIMARY KEY (Id_O),FOREIGN KEY (Id_P) REFERENCES Persons(Id_P) ) >sql Server / Oracle / MS Access: CREATE TABLE Orders ( Id_O int NOT NULL PRIMARY KEY,Id_P int FOREIGN KEY REFERENCES Persons(Id_P) ) >需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束: MysqL / sql Server / Oracle / MS Access: CREATE TABLE Orders ( Id_O int NOT NULL,CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) REFERENCES Persons(Id_P) ) (2)、修改表时添加外键约束_在 "Orders" 表已存在的情况下为 "Id_P" 列创建 FOREIGN KEY 约束; >MysqL / sql Server / Oracle / MS Access:ALTER TABLE Orders ADD FOREIGN KEY (Id_P) REFERENCES Persons(Id_P); >需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束: MysqL / sql Server / Oracle / MS Access:ALTER TABLE Orders ADD CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) REFERENCES Persons(Id_P); (3)、撤销 FOREIGN KEY 约束: >MysqL:ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders; >sql Server / Oracle / MS Access:ALTER TABLE Orders DROP CONSTRAINT fk_PerOrders; 21、sql CHECK 约束 说明:CHECK 约束用于限制列中的值的范围;如果对单个列定义 CHECK 约束,那么该列只允许特定的值;如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制; (1)、创建表时添加检查约束 >CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数: My sql: CREATE TABLE Persons ( Id_P int NOT NULL,CHECK (Id_P>0) ) sql Server / Oracle / MS Access: CREATE TABLE Persons ( Id_P int NOT NULL CHECK (Id_P>0),City varchar(255) ) >需要命名 CHECK 约束,以及为多个列定义 CHECK 约束: CREATE TABLE Persons ( Id_P int NOT NULL,CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes') ) (2)、修改表时添加检查约束 >MysqL / sql Server / Oracle / MS Access:ALTER TABLE Persons ADD CHECK (Id_P>0); >需要命名 CHECK 约束,以及为多个列定义 CHECK 约束: MysqL / sql Server / Oracle / MS Access:ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes'); (3)、撤销检查约束 sql Server / Oracle / MS Access:ALTER TABLE Persons DROP CONSTRAINT chk_Person; MysqL: ALTER TABLE Persons DROP CHECK chk_Person; 22、sql DEFAULT 约束 说明:DEFAULT 约束用于向列中插入默认值;如果没有规定其他的值,那么会将默认值添加到所有的新记录; (1)、创建表时添加默认值约束 >My sql / sql Server / Oracle / MS Access: CREATE TABLE Persons ( Id_P int NOT NULL,City varchar(255) DEFAULT 'Sandnes' ) >使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值,比如系统日期等: CREATE TABLE Orders ( Id_O int NOT NULL,OrderDate date DEFAULT GETDATE() ) (2)、修改表时添加默认值约束 >MysqL: ALTER TABLE Persons ALTER City SET DEFAULT 'SANDnes' >sql Server / Oracle / MS Access: ALTER TABLE Persons ALTER COLUMN City SET DEFAULT 'SANDnes' (3)、撤销默认值约束 >MysqL: ALTER TABLE Persons ALTER City DROP DEFAULT >sql Server / Oracle / MS Access: ALTER TABLE Persons ALTER COLUMN City DROP DEFAULT 23、sql CREATE INDEX (索引)语句 说明:CREATE INDEX 语句用于在表中创建索引;在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据; 功效:您可以在表中创建索引,以便更加快速高效地查询数据;用户无法看到索引,它们只能被用来加速搜索/查询;切记:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引; CREATE INDEX 语法:CREATE INDEX index_name ON table_name (column_name); CREATE UNIQUE INDEX 语法:表上创建一个唯一的索引;唯一的索引意味着两个行不能拥有相同的索引值;CREATE UNIQUE INDEX index_name ON table_name (column_name); 示例:CREATE INDEX PersonIndex ON Person (LastName DESC); 24、sql 撤销索引、表以及数据库 说明:通过使用 DROP 语句,可以轻松地删除索引、表和数据库; (1)、sql DROP INDEX 语句:我们可以使用 DROP INDEX 命令删除表格中的索引; >用于 Microsoft sqlJet (以及 Microsoft Access) 的语法: DROP INDEX index_name ON table_name; >用于 MS sql Server 的语法: DROP INDEX table_name.index_name; >用于 IBM DB2 和 Oracle 语法: DROP INDEX index_name; >用于 MysqL 的语法: ALTER TABLE table_name DROP INDEX index_name; (2)、sql DROP TABLE 语句:DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除); DROP TABLE 表名称; (3)、sql DROP DATABASE 语句:DROP DATABASE 语句用于删除数据库; DROP DATABASE 数据库名称; (4)、sql TruncATE TABLE 语句:使用 TruncATE TABLE 命令(仅仅删除表格中的数据); TruncATE TABLE 表名称; 25、sql ALTER TABLE 语句 说明:ALTER TABLE 语句用于在已有的表中添加、修改或删除列; 语法: >如需在表中添加列,请使用下列语法: ALTER TABLE table_name ADD column_name datatype >要删除表中的列,请使用下列语法: ALTER TABLE table_name DROP COLUMN column_name 切记:某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name); >要改变表中列的数据类型,请使用下列语法: ALTER TABLE table_name ALTER COLUMN column_name datatype 26、sql AUTO INCREMENT 字段 说明:Auto-increment 会在新记录插入表中时生成一个唯一的数字;我们通常希望在每次插入新记录时,自动地创建主键字段的值;我们可以在表中创建一个 auto-increment 字段; 语法: 1>MysqL:MysqL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务;默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1;要让 AUTO_INCREMENT 序列以其他的值起始,请使用下列 sql 语法:ALTER TABLE Persons AUTO_INCREMENT=100; CREATE TABLE Persons ( P_Id int NOT NULL AUTO_INCREMENT,PRIMARY KEY (P_Id) ) 2>sql Server:MS sql 使用 IDENTITY 关键字来执行 auto-increment 任务;默认地,IDENTITY 的开始值是 1,每条新记录递增 1;要规定 "P_Id" 列以 20 起始且递增 10,请把 identity 改为 IDENTITY(20,10); CREATE TABLE Persons ( P_Id int PRIMARY KEY IDENTITY,City varchar(255) ) 3>Access:MS Access 使用 AUTOINCREMENT 关键字来执行 auto-increment 任务;默认地,AUTOINCREMENT 的开始值是 1,每条新记录递增 1;要规定 "P_Id" 列以 20 起始且递增 10,请把 autoincrement 改为 AUTOINCREMENT(20,10); CREATE TABLE Persons ( P_Id int PRIMARY KEY AUTOINCREMENT,City varchar(255) ) 4>Oracle:您必须通过 sequence 对象创建 auto-increment 字段(该对象生成数字序列); 请使用下面的 CREATE SEQUENCE 语法: CREATE SEQUENCE seq_person MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10 上面的代码创建名为 seq_person 的序列对象,它以 1 起始且以 1 递增。该对象缓存 10 个值以提高性能。CACHE 选项规定了为了提高访问速度要存储多少个序列值; 要在 "Persons" 表中插入新记录,我们必须使用 nextval 函数(该函数从 seq_person 序列中取回下一个值): INSERT INTO Persons (P_Id,FirstName,LastName) VALUES (seq_person.nextval,'lars','Monsen') 上面的 sql 语句会在 "Persons" 表中插入一条新记录。"P_Id" 的赋值是来自 seq_person 序列的下一个数字。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。 27、sql VIEW(视图) 说明:视图是可视化的表;在 sql 中,视图是基于 sql 语句的结果集的可视化的表;视图包含行和列,就像一个真实的表;视图中的字段就是来自一个或多个数据库中的真实的表中的字段;我们可以向视图添加 sql 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表;切记:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响; (1)、创建视图 >>sql CREATE VIEW 语句 CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition 注释_视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 sql 语句来重建数据; >>创建视图示例 提示_可以从某个查询内部、某个存储过程内部,或者从另一个视图内部来使用视图。通过向视图添加函数、join 等等,我们可以向用户精确地提交我们希望提交的数据; CREATE VIEW [CurrentProductList] AS SELECT ProductID,ProductName FROM Products WHERE discontinued=No 视图查询_SELECT * FROM [CurrentProductList]; >>选取 Products 表中所有单位价格高于平均单位价格的产品: CREATE VIEW [Products Above Average Price] AS SELECT ProductName,UnitPrice FROM Products WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products) 视图查询_SELECT * FROM [Products Above Average Price]; (2)、更新视图 语法_sql CREATE OR REPLACE VIEW Syntax CREATE OR REPLACE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition 示例_向 "Current Product List" 视图添加 "Category" 列: CREATE VIEW [Current Product List] AS SELECT ProductID,ProductName,Category FROM Products WHERE discontinued=No (3)、撤销(删除)视图:可以通过 DROP VIEW 命令来删除视图; sql DROP VIEW Syntax DROP VIEW view_name 28、sql Date 函数 背景:当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配;只要数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间,情况就有点复杂了; 日期处理函数_MysqL Date 函数:Now()返回当前的日期和时间;CURDATE()返回当前的日期;CURTIME()返回当前的时间;DATE()提取日期或日期/时间表达式的日期部分;EXTRACT()返回日期/时间的单独部分;DATE_ADD()给日期添加指定的时间间隔;DATE_SUB()从日期减去指定的时间间隔;DATEDIFF()返回两个日期之间的天数;DATE_FORMAT()用不同的格式显示日期/时间; 日期处理函数_sql Server Date 函数:GETDATE()返回当前日期和时间;DATEPART()返回日期/时间的单独部分;DATEADD()在日期中添加或减去指定的时间间隔;DATEDIFF()返回两个日期之间的时间;CONVERT()用不同的格式显示日期/时间; sql Date 数据类型:MysqL 使用下列数据类型在数据库中存储日期或日期/时间值:DATE - 格式YYYY-MM-DD;DATETIME - 格式: YYYY-MM-DD HH:MM:SS;TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS;YEAR - 格式 YYYY 或 YY;sql Server 使用下列数据类型在数据库中存储日期或日期/时间值:DATE - 格式 YYYY-MM-DD;DATETIME - 格式: YYYY-MM-DD HH:MM:SS;SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS;TIMESTAMP - 格式: 唯一的数字; 29、sql NULL 值 说明:NULL 值是遗漏的未知数据;默认地,表的列可以存放 NULL 值; sql NULL值:如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存;NULL 值的处理方式与其他值不同;NULL 用作未知的或不适用的值的占位符;切记:无法比较 NULL 和 0,它们是不等价的; sql的NULL值处理:必须使用 IS NULL 和 IS NOT NULL 操作符来判断是否为null; sql IS NULL:仅仅选取在 "Address" 列中带有 NULL 值的记录:SELECT LastName,Address FROM Persons WHERE Address IS NULL; sql IS NOT NULL:选取在 "Address" 列中不带有 NULL 值的记录:SELECT LastName,Address FROM Persons WHERE Address IS NOT NULL; 30、sql NULL 函数 (1)、ISNULL() 函数:微软的 ISNULL() 函数用于规定如何处理 NULL 值;NVL(),IFNULL() 和 COALESCE() 函数也可以达到相同的结果; 示例:如果列值为NULL,则让它为 0; SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnorder) FROM Products;如果有 "UnitsOnorder" 值是 NULL,那么结果是 NULL; >sql Server / MS Access:SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnorder,0)) FROM Products; (2)、NVL()函数 >Oracle 没有 ISNULL() 函数。不过,我们可以使用 NVL() 函数达到相同的结果:SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnorder,0)) FROM Products; (3)、IFNULL() 和 COALESCE() 函数 >MysqL也拥有类似ISNULL()的函数不过它的工作方式与微软的 ISNULL()函数有点不同;在 MysqL 中,我们可以使用 IFNULL() 函数,就像这样:SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnorder,0)) FROM Products;或者我们可以使用 COALESCE() 函数,就像这样:SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnorder,0)) FROM Products; 31、sql 数据类型 说明:Microsoft Access、MysqL 以及 sql Server 所使用的数据类型和范围; (1)、Microsoft Access 数据类型:Text用于文本或文本与数字的组合,最多 255 个字符;Memo,Memo 用于更大数量的文本,最多存储 65,536 个字符,无法对 memo 字段进行排序,不过它们是可搜索的;Byte允许 0 到 255 的数字,1 字节;Integer,允许介于 -32,768 到 32,767 之间的数字,2 字节;Long允许介于-2,147,483,648 与 2,647 之间的全部数字,4字节;Single单精度浮点,处理大多数小数,4 字节;Double双精度浮点。处理大多数小数,8 字节;Currency,用于货币,支持 15 位的元,外加 4 位小数,您可以选择使用哪个国家的货币;8 字节;AutoNumber,AutoNumber字段自动为每条记录分配数字,通常从 1 开始,4 字节;Date/Time用于日期和时间8字节;Yes/No逻辑字段,可以显示为 Yes/No、True/False 或 On/Off,在代码中,使用常量 True 和 False (等价于 1 和 0),Yes/No字段中不允许Null值,1 比特;Ole Object可以存储图片、音频、视频或其他,BLOBs(Binary Large OBjects)最多1GB;Hyperlink包含指向其他文件的链接,包括网页;Lookup Wizard允许你创建一个可从下列列表中进行选择的选项列表,4 字节; (2)、MysqL 数据类型:在 MysqL 中,有三种主要的类型:文本、数字和日期/时间类型;A、Text 类型:CHAR(size)保存固定长度的字符串(可包含字母、数字以及特殊字符),在括号中指定字符串的长度,最多 255 个字符;VARCHAR(size)保存可变长度的字符串(可包含字母、数字以及特殊字符),在括号中指定字符串的最大长度,最多 255 个字符,如果值的长度大于 255,则被转换为 TEXT 类型;TINYTEXT存放最大长度为 255 个字符的字符串;TEXT存放最大长度为 65,535 个字符的字符串;BLOB用于 BLOBs (Binary Large OBjects),存放最多 65,535 字节的数据;MEDIUMTEXT存放最大长度为 16,777,215个字符的字符串;MEDIUMBLOB用于 BLOBs (Binary Large OBjects),存放最多 16,215 字节的数据;LONGTEXT存放最大长度为 4,294,967,295 个字符的字符串;LONGBLOB用于 BLOBs (Binary Large OBjects),存放最多 4,295 字节的数据;ENUM(x,y,z,etc.)允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值,如果列表中不存在插入的值,则插入空值,这些值是按照你输入的顺序存储的,可以按照此格式输入可能的值:ENUM('X','Y','Z');SET与 ENUM 类似,SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值;B、Number 类型:tinyint(size),-128 到 127 常规,0 到 255 无符号*,在括号中规定最大位数;SMALLINT(size),-32768 到767 常规。0 到 65535 无符号*,在括号中规定最大位数;MEDIUMINT(size),-8388608 到 8388607 普通,0 to 16777215 无符号*,在括号中规定最大位数;INT(size),-2147483648 到2147483647 常规,0 到 4294967295 无符号*,在括号中规定最大位数;BIGINT(size),-9223372036854775808 到 9223372036854775807 常规。0 到 18446744073709551615 无符号*,在括号中规定最大位数;FLOAT(size,d)带有浮动小数点的小数字,在括号中规定最大位数,在 d 参数中规定小数点右侧的最大位数;DOUBLE(size,d)带有浮动小数点的大数字,在括号中规定最大位数,在 d 参数中规定小数点右侧的最大位数;DECIMAL(size,d)作为字符串存储的 DOUBLE 类型,允许固定的小数点;C、Date 类型:DATE()日期,格式:YYYY-MM-DD,支持的范围是从 '1000-01-01' 到 '9999-12-31';DATETIME()日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS,支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59';TIMESTAMP()时间戳,TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的描述来存储,格式:YYYY-MM-DD HH:MM:SS,支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC;TIME()时间,格式:HH:MM:SS,支持的范围是从 '-838:59:59' 到 '838:59:59';YEAR()2 位或 4 位格式的年,4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069;切记,即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERT 或 UPDATE 查询中,TIMESTAMP 自动把自身设置为当前的日期和时间。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD; (3)、sql Server 数据类型:A、Character 字符串:char(n) 固定长度的字符串。最多 8,000 个字符;varchar(n)可变长度的字符串。最多 8,000 个字符;varchar(max)可变长度的字符串,最多 1,073,741,824 个字符;text可变长度的字符串,最多 2GB 字符数据;B、Unicode 字符串:nchar(n)固定长度的 Unicode 数据。最多 4,000 个字符;nvarchar(n)可变长度的 Unicode 数据,最多 4,000 个字符;nvarchar(max) 可变长度的 Unicode 数据。最多 536,870,912 个字符;ntext可变长度的 Unicode 数据。最多 2GB 字符数据;C、Binary 类型:bit 允许 0、1 或 NULL;binary(n) 固定长度的二进制数据。最多 8,000 字节;varbinary(n)可变长度的二进制数据。最多 8,000 字节;varbinary(max)可变长度的二进制数据,最多 2GB 字节;image可变长度的二进制数据。最多 2GB;D、Number 类型:tinyint允许从 0 到 255 的所有数字,1 字节;smallint,允许从 -32,767 的所有数字,2 字节;int允许从 -2,648 到 2,647 的所有数字,4 字节;bigint允许介于 -9,223,372,036,854,775,808 和 9,807 之间的所有数字,8 字节;decimal(p,s)固定精度和比例的数字,允许从 -10^38 +1 到 10^38 -1 之间的数字,p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值,默认是 18,s 参数指示小数点右侧存储的最大位数,s 必须是 0 到 p 之间的值,默认是 0,5-17 字节;numeric(p,s)固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字,p 参数指示可以存储的最大位数(小数点左侧和右侧),p 必须是 1 到 38 之间的值,默认是 18,s 参数指示小数点右侧存储的最大位数,s 必须是 0 到 p 之间的值,默认是 0,5-17 字节;smallmoney介于 -214,748.3648 和 214,748.3647 之间的货币数据,4 字节;money介于 -922,337,203,685,477.5808 和 922,477.5807 之间的货币数据,8 字节;float(n)从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据,参数 n 指示该字段保存 4 字节还是 8 字节,float(24) 保存 4 字节,而 float(53) 保存 8 字节,n 的默认值是 53,4 或 8 字节;real从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据,4 字节;E、Date 类型:datetime从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒,8 bytes;datetime2从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒,6-8 bytes;smalldatetime从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟,4 bytes;date仅存储日期,从 0001 年 1 月 1 日 到 9999 年 12 月 31 日,3 bytes;time仅存储时间,精度为 100 纳秒,3-5 bytes;datetimeoffset与datetime2 相同,外加时区偏移,8-10 bytes;timestamp存储唯一的数字,每当创建或修改某行时,该数字会更新,timestamp 基于内部时钟,不对应真实时间,每个表只能有一个 timestamp 变量;F、其他数据类型:sql_variant存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp;uniqueidentifier存储全局标识符 (GUID);xml存储 XML 格式化数据,最多 2GB;cursor存储对用于数据库操作的指针的引用;table存储结果集,供稍后处理; 32、sql 服务器 - RDBMS 说明:现代的 sql 服务器构建在 RDBMS 之上;DBMS - 数据库管理系统(Database Management System),数据库管理系统是一种可以访问数据库中数据的计算机程序;DBMS 使我们有能力在数据库中提取、修改或者存贮信息;不同的 DBMS 提供不同的函数供查询、提交以及修改数据; RDBMS - 关系数据库管理系统(Relational Database Management System),关系数据库管理系统 (RDBMS) 也是一种数据库管理系统,其数据库是根据数据间的关系来组织和访问数据的;20 世纪 70 年代初,IBM 公司发明了 RDBMS;RDBMS 是 sql 的基础,也是所有现代数据库系统诸如 Oracle、sql Server、IBM DB2、Sybase、MysqL 以及 Microsoft Access 的基础; 33、sql 函数 说明:sql 拥有很多可用于计数和计算的内建函数; 语法:内建 sql 函数的语法是,SELECT function(列) FROM 表; 类型:在 sql 中,基本的函数类型和种类有若干种,函数的基本类型是Aggregate 函数、Scalar 函数; (1)、合计函数(Aggregate functions):Aggregate 函数的操作面向一系列的值,并返回一个单一的值;如果在 SELECT 语句的项目列表中的众多其它表达式中使用 SELECT 语句,则这个 SELECT 必须使用 GROUP BY 语句; A、MS Access 合计函数:AVG(column)返回某列的平均值;COUNT(column)返回某列的行数(不包括 NULL 值);COUNT(*)返回被选行数;FirsT(column)返回在指定的域中第一个记录的值;LAST(column)返回在指定的域中最后一个记录的值;MAX(column)返回某列的最高值;MIN(column)返回某列的最低值;STDEV(column);STDEVP(column);SUM(column)返回某列的总和;VAR(column);VARP(column); B、 sql Server合计函数:AVG(column)返回某列的平均值;BINARY_CHECKSUM;CHECKSUM;CHECKSUM_AGG;COUNT(column)返回某列的行数(不包括NULL值);COUNT(*) 返回被选行数;COUNT(disTINCT column)返回相异结果的数目;FirsT(column)返回在指定的域中第一个记录的值(sqlServer2000 不支持);LAST(column)返回在指定的域中最后一个记录的值(sqlServer2000 不支持);MAX(column)返回某列的最高值;MIN(column)返回某列的最低值;STDEV(column);STDEVP(column);SUM(column)返回某列的总和;VAR(column);VARP(column); (2)、Scalar 函数,Scalar 函数的操作面向某个单一的值,并返回基于输入值的一个单一的值; A、MS Access Scalar 函数:UCASE(c)将某个域转换为大写;LCASE(c)将某个域转换为小写;MID(c,start[,end])从某个文本域提取字符;LEN(c) 返回某个文本域的长度;INSTR(c,char)返回在某个文本域中指定字符的数值位置;LEFT(c,number_of_char)返回某个被请求的文本域的左侧部分;RIGHT(c,number_of_char)返回某个被请求的文本域的右侧部分;ROUND(c,decimals)对某个数值域进行指定小数位数的四舍五入;MOD(x,y)返回除法操作的余数;Now()返回当前的系统日期;FORMAT(c,format)改变某个域的显示方式;DATEDIFF(d,date1,date2)用于执行日期计算; 34、sql AVG 函数 说明:AVG 函数返回数值列的平均值。NULL 值不包括在计算中; 语法:SELECT AVG(column_name) FROM table_name; 示例:SELECT Customer FROM Orders WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders); 35、sql COUNT() 函数 说明:COUNT() 函数返回匹配指定条件的行数; 语法:COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):SELECT COUNT(column_name) FROM table_name;COUNT(*) 函数返回表中的记录数:SELECT COUNT(*) FROM table_name;COUNT(disTINCT column_name) 函数返回指定列的不同值的数目:SELECT COUNT(disTINCT column_name) FROM table_name;注意,COUNT(disTINCT) 适用于 ORACLE 和 Microsoft sql Server,但是无法用于 Microsoft Access; 36、sql FirsT() 函数 说明:FirsT() 函数返回指定的字段中第一个记录的值;可使用 ORDER BY 语句对记录进行排序; 语法:SELECT FirsT(column_name) FROM table_name; 37、sql LAST() 函数 说明:LAST() 函数返回指定的字段中最后一个记录的值;可使用 ORDER BY 语句对记录进行排序; 语法:SELECT LAST(column_name) FROM table_name; 38、sql MAX() 函数 说明:MAX 函数返回一列中的最大值。NULL 值不包括在计算中; 语法:SELECT MAX(column_name) FROM table_name;MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值; 39、sql MIN() 函数 说明:MIN 函数返回一列中的最小值。NULL 值不包括在计算中; 语法:SELECT MIN(column_name) FROM table_name;MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值; 40、sql SUM() 函数 说明:SUM 函数返回数值列的总数(总额); 语法:SELECT SUM(column_name) FROM table_name; 41、sql GROUP BY 语句 说明:合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句; 语法:SELECT column_name,aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name 42、sql HAVING 子句 说明:在 sql 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用; 语法:SELECT column_name,aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) operator value 示例_查找订单总金额少于 2000 的客户: SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer HAVING SUM(OrderPrice)<2000 示例_查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额: SELECT Customer,SUM(OrderPrice) FROM Orders WHERE Customer='Bush' OR Customer='Adams' GROUP BY Customer HAVING SUM(OrderPrice)>1500 43、sql UCASE() 函数 说明:UCASE 函数把字段的值转换为大写; 语法:SELECT UCASE(column_name) FROM table_name; 44、sql LCASE() 函数 说明:LCASE 函数把字段的值转换为小写; 语法:SELECT LCASE(column_name) FROM table_name; 45、sql MID() 函数 说明:MID 函数用于从文本字段中提取字符; 语法:SELECT MID(column_name,length]) FROM table_name; 参数:column_name必需,要提取字符的字段;start必需,规定开始位置(起始值是 1);length可选,要返回的字符数,如果省略,则 MID() 函数返回剩余文本; 46、sql LEN() 函数 说明:LEN 函数返回文本字段中值的长度; 语法:SELECT LEN(column_name) FROM table_name; 47、sql ROUND() 函数 说明:ROUND 函数用于把数值字段舍入为指定的小数位数; 语法:SELECT ROUND(column_name,decimals) FROM table_name; 参数:column_name必需,要舍入的字段;decimals必需,规定要返回的小数位数; 48、sql Now() 函数 说明:Now 函数返回当前的日期和时间;注意,如果您在使用 sql Server 数据库,请使用 getdate() 函数来获得当前的日期时间; 语法:SELECT Now() FROM table_name; 49、sql FORMAT() 函数 说明:FORMAT 函数用于对字段的显示进行格式化; 语法:SELECT FORMAT(column_name,format) FROM table_name; 参数:column_name必需,要格式化的字段;format必需,规定格式; 50、sql 快速参考 (1)、AND / OR SELECT column_name(s) FROM table_name WHERE condition AND|OR condition; (2)、ALTER TABLE (add column) ALTER TABLE table_name ADD column_name datatype; (3)、ALTER TABLE (drop column) ALTER TABLE table_name DROP COLUMN column_name; (4)、AS (alias for column) SELECT column_name AS column_alias FROM table_name; (5)、AS (alias for table) SELECT column_name FROM table_name AS table_alias; (6)、BETWEEN SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2; (7)、CREATE DATABASE CREATE DATABASE database_name; (8)、CREATE INDEX CREATE INDEX index_name ON table_name (column_name); (9)、CREATE TABLE CREATE TABLE table_name ( column_name1 data_type,column_name2 data_type,....... ) (10)、CREATE UNIQUE INDEX CREATE UNIQUE INDEX index_name ON table_name (column_name); (11)、CREATE VIEW CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition; (12)、DELETE FROM DELETE FROM table_name (Note: Deletes the entire table!!);or DELETE FROM table_name WHERE condition; (13)、DROP DATABASE DROP DATABASE database_name; (14)、DROP INDEX DROP INDEX table_name.index_name; (15)、DROP TABLE DROP TABLE table_name; (16)、GROUP BY SELECT column_name1,SUM(column_name2) FROM table_name GROUP BY column_name1; (17)、HAVING SELECT column_name1,SUM(column_name2) FROM table_name GROUP BY column_name1 HAVING SUM(column_name2) condition value; (18)、IN SELECT column_name(s) FROM table_name WHERE column_name IN (value1,..); (19)、INSERT INTO INSERT INTO table_name VALUES (value1,....);or INSERT INTO table_name (column_name1,column_name2,...) VALUES (value1,....); (20)、LIKE SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern; (21)、ORDER BY SELECT column_name(s) FROM table_name ORDER BY column_name [ASC|DESC]; (22)、SELECT SELECT column_name(s) FROM table_name; (23)、SELECT * SELECT * FROM table_name; (24)、SELECT disTINCT SELECT disTINCT column_name(s) FROM table_name; (25)、SELECT INTO(used to create backup copies of tables) SELECT * INTO new_table_name FROM original_table_name;or SELECT column_name(s) INTO new_table_name FROM original_table_name; (26)、TruncATE TABLE (deletes only the data inside the table) TruncATE TABLE table_name; (27)、UPDATE UPDATE table_name SET column_name=new_value [,column_name=new_value] WHERE column_name=some_value; (28)、WHERE SELECT column_name(s) FROM table_name WHERE condition; 后续:ADO学习,ADO 是一种从网站访问数据库中数据的编程接口;ADO 使用 sql 来查询数据库中的数据;
com.microsoft.sqlserver.jdbc.SQLServerException: “?”附近有语法错误
com.microsoft.sqlserver.jdbc.SQLServerException: “?”附近有语法错误。 Query: INSERT INTO miaoshua.log_获取真是卡号 VALUES (?,?,?,?,?,?) Parameters: [2015-08-23 17:11:02, 4581233290020227, null, null, null, 20000010001]
怎么有语法错误啊
mssqlserver sql基础学入门语句学习
本文章介绍了关于mssqlserver sql基础语句学习及语法,有需要学习的朋友可以参考一下本文章。
1、说明:创建
Create DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:创建新表
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 col1,col2… from tab_old definition only
4、说明:删除新表
drop table tabname
5、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
6、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
7、说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
8、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
9、说明:几个简单的基本的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%’
排序: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
10、说明:几个高级查询运算词
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),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
11、说明:使用外连接
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:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
PCB MS SQL SERVER版本管控工具source_safe_for_sql_server
PCB由于业务关系复杂,业务触发一个事件时,可能需与数据库多个表进行关连处理才能拿到数据结果,
而表关连并不是简单的关连,实际是要进行大量数据筛选,逻辑判断,转换等过程。。。这个过程是复杂的
想一想,如果将大量数据传到客户端处理,这宽带压力也是挺大的,所以折中选择放到有部份业务逻辑放在存储过程处理了。
但这样一来,存储过程修改无法追溯了,在这里介绍一款工具,管理存储过程修改追溯,挺实用的。呵呵
一.SQL SERVER版本管制工具下载地址
source_safe_for_sql_server.zip
二.主要应用场景:
由于存储过程与函数修改都是立即生效,主要用于存储过程或函数变更追溯
三.数据库增加版本控制操作步聚
四.增加版本控制后,对应的数据库右键就多出签入,签出等功能了
五.测试存储过程修改后,差异对比功能
SQL Server SQL 存储过程基础语法之一
感兴趣的小伙伴,下面一起跟随小编 jb51.cc的小编两巴掌来看看吧!
CREATE PROCEDURE创建存储过程,存储过程是保存起来的可以接受和返回用户提供的参数的 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 个参数。
使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。有关更多信息,请参见 EXECUTE。
data_type
参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 varying 和 OUTPUT 关键字。有关 sql Server 提供的数据类型及其语法的更多信息,请参见数据类型。
说明 对于可以是 cursor 数据类型的输出参数,没有最大数目的限制。
varying
指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。
default
参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。
OUTPUT
表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。
表示最多可以指定 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 语句。但有一些限制。
是表示此过程可以包含多条 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 Server 是将空字符串解释为单个空格还是解释为真正的空字符串,由兼容级别设置控制。如果兼容级别小于或等于 65,sql Server 就将空字符串解释为单个空格。如果兼容级别等于 70,则 sql Server 将空字符串解释为空字符串。有关更多信息,请参见 sp_dbcmptlevel。
获得有关存储过程的信息
若要显示用来创建过程的文本,请在过程所在的数据库中执行 sp_helptext,并使用过程名作为参数。
说明 使用 ENCRYPTION 选项创建的存储过程不能使用 sp_helptext 查看。
若要显示有关过程引用的对象的报表,请使用 sp_depends。
若要为过程重命名,请使用 sp_rename。
引用对象
sql Server 允许创建的存储过程引用尚不存在的对象。在创建时,只进行语法检查。执行时,如果高速缓存中尚无有效的计划,则编译存储过程以生成执行计划。只有在编译过程中才解析存储过程中引用的所有对象。因此,如果语法正确的存储过程引用了不存在的对象,则仍可以成功创建,但在运行时将失败,因为所引用的对象不存在。有关更多信息,请参见延迟名称解析和编译。
延迟名称解析和兼容级别
sql Server 允许 Transact-sql 存储过程在创建时引用不存在的表。这种能力称为延迟名称解析。不过,如果 Transact-sql 存储过程引用了该存储过程中定义的表,而兼容级别设置(通过执行 sp_dbcmptlevel 来设置)为 65,则在创建时会发出警告信息。而如果在运行时所引用的表不存在,将返回错误信息。有关更多信息,请参见 sp_dbcmptlevel 和延迟名称解析和编译。
执行存储过程
成功执行 CREATE PROCEDURE 语句后,过程名称将存储在 sysobjects 系统表中,而 CREATE PROCEDURE 语句的文本将存储在 syscomments 中。第一次执行时,将编译该过程以确定检索数据的最佳访问计划。
使用 cursor 数据类型的参数
存储过程只能将 cursor 数据类型用于 OUTPUT 参数。如果为某个参数指定了 cursor 数据类型,也必须指定 varying 和 OUTPUT 参数。如果为某个参数指定了 varying 关键字,则数据类型必须是 cursor,并且必须指定 OUTPUT 关键字。
说明 cursor 数据类型不能通过数据库 API(例如 OLE DB、ODBC、ADO 和 DB-Library)绑定到应用程序变量上。因为必须先绑定 OUTPUT 参数,应用程序才可以执行存储过程,所以带有 cursor OUTPUT 参数的存储过程不能通过数据库 API 调用。只有将 cursor OUTPUT 变量赋值给 Transact-sql 局部 cursor 变量时,才可以通过 Transact-sql 批处理、存储过程或触发器调用这些过程。
Cursor 输出参数
在执行过程时,以下规则适用于 cursor 输出参数:
对于只进游标,游标的结果集中返回的行只是那些存储过程执行结束时处于或超出游标位置的行,例如:
在过程中的名为 RS 的 100 行结果集上打开一个非滚动游标。
过程提取结果集 RS 的头 5 行。
过程返回到其调用者。
返回到调用者的结果集 RS 由 RS 的第 6 到 100 行组成,调用者中的游标处于 RS 的第一行之前。
对于只进游标,如果存储过程完成后,游标位于第一行的前面,则整个结果集将返回给调用批处理、存储过程或触发器。返回时,游标将位于第一行的前面。
对于只进游标,如果存储过程完成后,游标的位置超出最后一行的结尾,则为调用批处理、存储过程或触发器返回空结果集。
说明 空结果集与空值不同。
对于可滚动游标,在存储过程执行结束时,结果集中的所有行均会返回给调用批处理、存储过程或触发器。返回时,游标保留在过程中最后一次执行提取时的位置。
对于任意类型的游标,如果游标关闭,则将空值传递回调用批处理、存储过程或触发器。如果将游标指派给一个参数,但该游标从未打开过,也会出现这种情况。
说明 关闭状态只有在返回时才有影响。例如,可以在过程中关闭游标,稍后再打开游标,然后将该游标的结果集返回给调用批处理、存储过程或触发器。
临时存储过程
sql Server 支持两种临时过程:局部临时过程和全局临时过程。局部临时过程只能由创建该过程的连接使用。全局临时过程则可由所有连接使用。局部临时过程在当前会话结束时自动除去。全局临时过程在使用该过程的最后一个会话结束时除去。通常是在创建该过程的会话结束时。
临时过程用 # 和 ## 命名,可以由任何用户创建。创建过程后,局部过程的所有者是唯一可以使用该过程的用户。执行局部临时过程的权限不能授予其他用户。如果创建了全局临时过程,则所有用户均可以访问该过程,权限不能显式废除。只有在 tempdb 数据库中具有显式 CREATE PROCEDURE 权限的用户,才可以在该数据库中显式创建临时过程(不使用编号符命名)。可以授予或废除这些过程中的权限。
说明 频繁使用临时存储过程会在 tempdb 中的系统表上产生争用,从而对性能产生负面影响。建议使用 sp_executesql 代替。sp_executesql 不在系统表中存储数据,因此可以避免这一问题。
自动执行存储过程
sql Server 启动时可以自动执行一个或多个存储过程。这些存储过程必须由系统管理员创建,并在 sysadmin 固定服务器角色下作为后台过程执行。这些过程不能有任何输入参数。
对启动过程的数目没有限制,但是要注意,每个启动过程在执行时都会占用一个连接。如果必须在启动时执行多个过程,但不需要并行执行,则可以指定一个过程作为启动过程,让该过程调用其它过程。这样就只占用一个连接。
在启动时恢复了最后一个数据库后,即开始执行存储过程。若要跳过这些存储过程的执行,请将启动参数指定为跟踪标记 4022。如果以最低配置启动 sql Server(使用 -f 标记),则启动存储过程也不会执行。有关更多信息,请参见跟踪标记。
若要创建启动存储过程,必须作为 sysadmin 固定服务器角色的成员登录,并在 master 数据库中创建存储过程。
使用 sp_procoption 可以:
将现有存储过程指定为启动过程。
停止在 sql Server 启动时执行过程。
查看 sql Server 启动时执行的所有过程的列表。
存储过程嵌套
存储过程可以嵌套,即一个存储过程可以调用另一个存储过程。在被调用过程开始执行时,嵌套级将增加,在被调用过程执行结束后,嵌套级将减少。如果超出最大的嵌套级,会使整个调用过程链失败。可用 @@nesTLEVEL 函数返回当前的嵌套级。
若要估计编译后的存储过程大小,请使用下列性能监视计数器。
性能监视器对象名 性能监视计数器名称
sqlServer:缓冲区管理器 高速缓存大小(页面数)
sqlServer:高速缓存管理器 高速缓存命中率
高速缓存页
高速缓存对象计数*
* 各种分类的高速缓存对象均可以使用这些计数器,包括特殊 sql、准备 sql、过程、触发器等。
有关更多信息,请参见 sql Server:Buffer Manager 对象和 sql Server:Cache Manager 对象。
sql_statement 限制
除了 SET SHOWPLAN_TEXT 和 SET SHOWPLAN_ALL 之外(这两个语句必须是批处理中仅有的语句),任何 SET 语句均可以在存储过程内部指定。所选择的 SET 选项在存储过程执行过程中有效,之后恢复为原来的设置。
如果其他用户要使用某个存储过程,那么在该存储过程内部,一些语句使用的对象名必须使用对象所有者的名称限定。这些语句包括:
ALTER TABLE
CREATE INDEX
CREATE TABLE
所有 DBCC 语句
DROP TABLE
DROP INDEX
TruncATE TABLE
UPDATE STATISTICS
权限
CREATE PROCEDURE 的权限默认授予 sysadmin 固定服务器角色成员和 db_owner 和 db_ddladmin 固定数据库角色成员。sysadmin 固定服务器角色成员和 db_owner 固定数据库角色成员可以将 CREATE PROCEDURE 权限转让给其他用户。执行存储过程的权限授予过程的所有者,该所有者可以为其它数据库用户设置执行权限。
示例
A. 使用带有复杂 SELECT 语句的简单过程
下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'au_info_all' AND type = 'P')
DROP PROCEDURE au_info_all
GO
CREATE PROCEDURE au_info_all
AS
SELECT au_lname,au_fname,title,pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
GO
au_info_all 存储过程可以通过以下方法执行:
EXECUTE au_info_all
-- Or
EXEC au_info_all
如果该过程是批处理中的第一条语句,则可使用:
au_info_all
B. 使用带有参数的简单过程
下面的存储过程从四个表的联接中只返回指定的作者(提供了姓名)、出版的书籍以及出版社。该存储过程接受与传递的参数精确匹配的值。
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'au_info' AND type = 'P')
DROP PROCEDURE au_info
GO
USE pubs
GO
CREATE PROCEDURE au_info
@lastname varchar(40),
@firstname varchar(20)
AS
SELECT au_lname,pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
WHERE au_fname = @firstname
AND au_lname = @lastname
GO
au_info 存储过程可以通过以下方法执行:
EXECUTE au_info 'Dull','Ann'
-- Or
EXECUTE au_info @lastname = 'Dull',@firstname = 'Ann'
-- Or
EXECUTE au_info @firstname = 'Ann',@lastname = 'Dull'
-- Or
EXEC au_info 'Dull','Ann'
-- Or
EXEC au_info @lastname = 'Dull',@firstname = 'Ann'
-- Or
EXEC au_info @firstname = 'Ann',@lastname = 'Dull'
如果该过程是批处理中的第一条语句,则可使用:
au_info 'Dull','Ann'
-- Or
au_info @lastname = 'Dull',@firstname = 'Ann'
-- Or
au_info @firstname = 'Ann',@lastname = 'Dull'
C. 使用带有通配符参数的简单过程
下面的存储过程从四个表的联接中只返回指定的作者(提供了姓名)、出版的书籍以及出版社。该存储过程对传递的参数进行模式匹配,如果没有提供参数,则使用预设的默认值。
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'au_info2' AND type = 'P')
DROP PROCEDURE au_info2
GO
USE pubs
GO
CREATE PROCEDURE au_info2
@lastname varchar(30) = 'D%',
@firstname varchar(18) = '%'
AS
SELECT au_lname,pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
WHERE au_fname LIKE @firstname
AND au_lname LIKE @lastname
GO
au_info2 存储过程可以用多种组合执行。下面只列出了部分组合:
EXECUTE au_info2
-- Or
EXECUTE au_info2 'Wh%'
-- Or
EXECUTE au_info2 @firstname = 'A%'
-- Or
EXECUTE au_info2 '[CK]ars[OE]n'
-- Or
EXECUTE au_info2 'Hunter','Sheryl'
-- Or
EXECUTE au_info2 'H%','S%'
D. 使用 OUTPUT 参数
OUTPUT 参数允许外部过程、批处理或多条 Transact-sql 语句访问在过程执行期间设置的某个值。下面的示例创建一个存储过程 (titles_sum),并使用一个可选的输入参数和一个输出参数。
首先,创建过程:
USE pubs
GO
IF EXISTS(SELECT name FROM sysobjects
WHERE name = 'titles_sum' AND type = 'P')
DROP PROCEDURE titles_sum
GO
USE pubs
GO
CREATE PROCEDURE titles_sum @@TITLE varchar(40) = '%',@@SUM money OUTPUT
AS
SELECT 'Title Name' = title
FROM titles
WHERE title LIKE @@TITLE
SELECT @@SUM = SUM(price)
FROM titles
WHERE title LIKE @@TITLE
GO
接下来,将该 OUTPUT 参数用于控制流语言
说明 OUTPUT 变量必须在创建表和使用该变量时都进行定义。
参数名和变量名不一定要匹配,不过数据类型和参数位置必须匹配(除非使用 @@SUM = variable 形式)。
DECLARE @@TOTALCOST money
EXECUTE titles_sum 'The%',@@TOTALCOST OUTPUT
IF @@TOTALCOST < 200
BEGIN
PRINT ' '
PRINT 'All of these titles can be purchased for less than $200.'
END
ELSE
SELECT 'The total cost of these titles is $' + RTRIM(CAST(@@TOTALCOST AS varchar(20)))
下面是结果集:
Title Name
------------------------------------------------------------------------
The Busy Executive's Database Guide
The Gourmet Microwave
The Psychology of Computer Cooking
(3 row(s) affected)
Warning,null value eliminated from aggregate.
All of these titles can be purchased for less than $200.
E. 使用 OUTPUT 游标参数
OUTPUT 游标参数用来将存储过程的局部游标传递回调用批处理、存储过程或触发器。
首先,创建以下过程,在 titles 表上声明并打开一个游标:
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'titles_cursor' and type = 'P')
DROP PROCEDURE titles_cursor
GO
CREATE PROCEDURE titles_cursor @titles_cursor CURSOR varying OUTPUT
AS
SET @titles_cursor = CURSOR
FORWARD_ONLY STATIC FOR
SELECT * FROM titles
OPEN @titles_cursor
GO
接下来,执行一个批处理,声明一个局部游标变量,执行上述过程以将游标赋值给局部变量,然后从该游标提取行。
USE pubs
GO
DECLARE @MyCursor CURSOR
EXEC titles_cursor @titles_cursor = @MyCursor OUTPUT
WHILE (@@FETCH_STATUS = 0)
BEGIN
FETCH NEXT FROM @MyCursor
END
CLOSE @MyCursor
DEALLOCATE @MyCursor
GO
F. 使用 WITH RECOMPILE 选项
如果为过程提供的参数不是典型的参数,并且新的执行计划不应高速缓存或存储在内存中,WITH RECOMPILE 子句会很有帮助。
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'titles_by_author' AND type = 'P')
DROP PROCEDURE titles_by_author
GO
CREATE PROCEDURE titles_by_author @@LNAME_PATTERN varchar(30) = '%'
WITH RECOMPILE
AS
SELECT RTRIM(au_fname) + ' ' + RTRIM(au_lname) AS 'Authors full name',
title AS Title
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON ta.title_id = t.title_id
WHERE au_lname LIKE @@LNAME_PATTERN
GO
G. 使用 WITH ENCRYPTION 选项
WITH ENCRYPTION 子句对用户隐藏存储过程的文本。下例创建加密过程,使用 sp_helptext 系统存储过程获取关于加密过程的信息,然后尝试直接从 syscomments 表中获取关于该过程的信息。
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'encrypt_this' AND type = 'P')
DROP PROCEDURE encrypt_this
GO
USE pubs
GO
CREATE PROCEDURE encrypt_this
WITH ENCRYPTION
AS
SELECT * FROM authors
GO
EXEC sp_helptext encrypt_this
下面是结果集:
The object's comments have been encrypted.
接下来,选择加密存储过程内容的标识号和文本。
SELECT c.id,c.text FROM syscomments c INNER JOIN sysobjects o ON c.id = o.id WHERE o.name = 'encrypt_this'
关于SqlServer_SQL基础语法总结和sql server 基础语法的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于com.microsoft.sqlserver.jdbc.SQLServerException: “?”附近有语法错误、mssqlserver sql基础学入门语句学习、PCB MS SQL SERVER版本管控工具source_safe_for_sql_server、SQL Server SQL 存储过程基础语法之一等相关内容,可以在本站寻找。
本文标签: