关于sql server查询语句的写法。

问题描述

关于sql server查询语句的写法。


怎样写一个查询语句select distinct ID from TrainTime order by ID

select Station from TrainTime where S_No='1'order by ID

select Stationfrom TrainTime where D_Time='-' order by ID
怎样把这3个查询语句写为一句啊,让查询查来的结果为这3列数据。
因为我想建一个表,为3列,列名为:列车车次、起点站、终点站。
有没有大神能帮帮我,急用啊!

解决方案

SELECT
A.ID, A.Station, B.Station
FROM (
SELECT * FROM traintime WHERE A_Time = '-'
) A LEFT JOIN (
SELECT * FROM traintime WHERE D_Time = '-'
)B ON A.ID = B.ID

解决方案二:

例如,下面的语句创建了一个名为 newtable 的 新表,该表包含表 mytable 的所有数据: 代码:SELECT * INTO newtable FROM mytable 你也可以指定只有特定的字段被用来创建这个新表。要做 到这一点,只需在字段列表中指定你想要拷贝的字段。另外,你可以使用 WHERE 子句来限制拷贝到新表中 的记录。下面的例子只拷贝字段 second_columnd 的值等于’Copy Me!’的记录的 first_column 字段。 代码:SELECT first_column INTO newtable FROM mytable WHERE second_column=’Copy Me!’ 使用 SQL 修改已经建立的表是很困难的。例如,如果你向一个表中添 加了一个字段,没有容易的办法来去除它。另外,如果你不小心把一个字段的数据类型给错了,你将没有 办法改变它。但是,使用本节中讲述的 SQL 语句,你可以绕过这两个问题。 例如,假设你想从一个表中删除一个字段。使用 SELECT INTO 语句,你可以创建该表的一个拷贝,但不包 含要删除的字段。这使你既删除了该字段,又保留了不想删除的数据。 如果你想改变一个字段的数据类型,你可以创建一个包含正确数据类型字段的新表。创建好该表后,你就 可以结合使用 UPDATE 语句和 SELECT 语句,把原来表中的所有数据拷贝到新表中。通过这种方法,你既可 以修改表的结构,又能保存原有的数据。 _ArticleContent1_lblContent>插入数据 向表中添加一个新记录,你要使用 SQL INSERT 语句。这里有一个如何使用这种语句的例子: 代码:INSERT mytable (mycolumn) VALUES (‘some data’) 这个语句把字符串’some data’插入表 mytable 的 mycolumn 字段中。将要被插入数据的字段的名字在第一个括号中指定,实际的数据在第二个括 号中给出。 INSERT 语句的完整句法如下: 代码:INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES | Values_list | select_statement} 如果一个表有多个字段,通过把字段名和字段值用逗号隔开,你可以向所有的字段中 插入数据。假设表 mytable 有三个字段 first_column,second_column,和 third_column。下面的 INSERT 语 句添加了一条三个字段都有值的完整记录: 代码:INSERT mytable (first_column,second_column,third_column) VALUES (‘some data’,’some more data’,’yet more data’) [code] 注意 你可以使用 INSERT 语句向文本型字段中插入数据。但是,如果你需要输入很长的字符串,你应该使用 WRITETEXT 语句。这部分内容对本书来说太高级了,因此不加讨论。要了解更多的信息,请参考 Microsoft SQL Sever 的文档。 如果你在 INSERT 语句中只指定两个字段和数据会怎么样呢?换句话说,你向一个表中插入一条新记录, 但有一个字段没有提供数据。在这种情况下,有下面的四种可能: 如果该字段有一个缺省值, 该值会被使用。 例如, 假设你插入新记录时没有给字段 third_column 提供数据, 而这个字段有一个缺省值’some value’。在这种情况下,当新记录建立时会插入值’some value’。 如果该字段可以接受空值,而且没有缺省值,则会被插入空值。 如果该字段不能接受空值,而且没有缺省值,就会出现错误。你会收到错误信息: The column in table mytable may not be null. 最后,如果该字段是一个标识字段,那么它会自动产生一个新值。当你向一个有标识字段的表中插入新记 录时,只要忽略该字段,标识字段会给自己赋一个新值。 注意 向一个有标识字段的表中插入新记录后,你可以用 SQL 变量@@identity 来访问新记录 的标识字段的值。考虑如下的 SQL 语句: [code]INSERT mytable (first_column) VALUES(‘some value’) 代码:INSERT anothertable(another_first,another_second) VALUES(@@identity,’some value’) 如 果表 mytable 有一个标识字段,该字段的值会被插入表 anothertable 的 another_first 字段。这是因为变 量@@identity 总是保存最后一次插入标识字段的值。 字段 another_first 应该与字段 first_column 有相同的数据类型。但是,字段 another_first 不能是应该 标识字段。Another_first 字段用来保存字段 first_column 的值。 删除记录 要从表中删除一个或多个记录,需要使用 SQL DELETE 语句。 你可以给 DELETE 语句提供 WHERE 子句。WHERE 子句用来选择要删除的记录。例如,下面的这个 DELETE 语句只删除字段 first_column 的值等于’Delete Me’的记录: 代码:DELETE mytable WHERE first_column=’Deltet Me’ DELETE 语句的完整句法如下: 代码:DELETE [FROM] {table_name|view_name} [WHERE clause] 在 SQL SELECT 语句中可以使用的任何 条件都可以在 DELECT 语句的 WHERE 子句 中使用。 例如, 下面的这个 DELETE 语句只删除那些 first_column 字段的值为’goodbye’或 second_column 字段的值为’so long’的记录: 代码:DELETE mytable WHERE first_column=’goodby’ OR second_column=’so long’ 如果你不给 DELETE 语句提供 WHERE 子句,表中的所有记录都将被删除。你不应该有这种想法。如果你想删除应该表 中的所有记录,应使用第十章所讲的 TRUNCATE TABLE 语句。 注意 为什么要用 TRUNCATE TABLE 语句代替 DELETE 语句?当你使用 TRUNCATE TABLE 语句时,记录的删除是不 作记录的。也就是说,这意味着 TRUNCATE TABLE 要比 DELETE 快得多。 更新记录 要修改表中已经存在的一条或多条记录,应使用 SQL UPDATE 语句。同 DELETE 语句一样,UPDATE 语句可以 使用 WHERE 子句来选择更新特定的记录。请看这个例子: 代码:UPDATE mytable SET first_column=’Updated!’ WHERE second_column=’Update Me!’ 这个 UPDATE 语句更新所有 second_column 字段的值为’Update Me!’的记录。对所有被选中的记录,字段 first_column 的值被置为’Updated!’。 下面是 UPDATE 语句的完整句法: 代码:UPDATE {table_name|view_name} SET [{table_name|view_name}] {column_list|variable_list|variable_and_column_list} [,{column_list2|variable_list2|variable_and_column_list2}… [,{column_listN|variable_listN|variable_and_column_listN}]] [WHERE clause] 注意 你可以对文本型字段使用 UPDATE 语句。但是,如果你需要更新很长的字符串,应使用 UPDATETEXT 语句。 这部分内容对本书来说太高级了,因此不加讨论。要了解更多的信息,请参考 Microsoft SQL Sever 的文 档。 如果你不提供 WHERE 子句,表中的所有记录都将被更新。有时这是有用的。例如,如果你想把表 titles 中 的所有书的价格加倍,你可以使用如下的 UPDATE 语句: 你也可以同时更新多个字段。例如,下面的 UPDATE 语句同时更新 first_column,second_column,和 third_column 这三个字段: 代码:UPDATE mytable SET first_column=’Updated!’ Second_column=’Updated!’ Third_column=’Updated!’ WHERE first_column=’Update Me1’ 技巧 SQL 忽略语句中多余的空格。你可以把 SQL 语句写成任何你最容易读的格式。 用 SELECT 创建记录和表 你也许已经注意到, INSERT 语句与 DELETE 语句和 UPDATE 语句有一点不同, 它一次只操作一个记录。 然而, 有一个方法可以使 INSERT 语句一次添加多个记录。要作到这一点,你需要把 INSERT 语句与 SELECT 语句 结合起来,象这样: 代码:INSERT mytable (first_column,second_column) SELECT another_first,another_second FROM anothertable WHERE another_first=’Copy Me!’ 这个语句从 anothertable 拷贝记录到 mytable.只有表 anothertable 中字段 another_first 的值为’Copy Me!’的记录才被拷贝。 当为一个表中的记录建立备份时,这种形式的 INSERT 语句是非常有用的。在删除一个表中的记录之前, 你可以先用这种方法把它们拷贝到另一个表中。 如果你需要拷贝整个表,你可以使用 SELECT INTO 语句。例如,下面的语句创建了一个名为 newtable 的 新表,该表包含表 mytable 的所有数据: 代码:SELECT * INTO newtable FROM mytable 你也可以指定只有特定的字段被用来创建这个新表。要做 到这一点,只需在字段列表中指定你想要拷贝的字段。另外,你可以使用 WHERE 子句来限制拷贝到新表中 的记录。下面的例子只拷贝字段 second_columnd 的值等于’Copy Me!’的记录的 first_column 字段。 代码:SELECT first_column INTO newtable FROM mytable WHERE second_column=’Copy Me!’ 使用 SQL 修改已经建立的表是很困难的。

解决方案三:

例子: Use cust Exec sp_addtype birthday,datetime,’Null’ 创建一个用户定义的数据类型 birthday,其基于的系统数据类型是 DateTime,允许空。 例子: Use master Exec sp_addtype telephone,’varchar(24),’Not Null’ Eexc sp_addtype fax,’varchar(24)’,’Null’ 创建两个数据类型,即 telephone 和 fax (2)删除用户定义的数据类型 当用户定义的数据类型不需要时,可删除。删除用户定义的数据类型的命令是 sp_droptype {’type’}。 例子: Use master Exec sp_droptype ’ssn’ 注意:当表中的列还正在使用用户定义的数据类型时,或者在其上面还绑定有默认或者规则时,这种 用户定义的数据类型不能删除。 以下为 SQL SERVER7.0 以上版本的字段类型说明。SQL SERVER6.5 的字段类型说明请参考 SQL SERVER 提供的说明。 字段类型 描述 bit 0 或 1 的整型数字 int 从-2^31(-2,147,483,648)到 2^31(2,147,483,647)的整型数字 smallint 从-2^15(-32,768)到 2^15(32,767)的整型数字 tinyint 从 0 到 255 的整型数字 decimal 从-10^38 到 10^38-1 的定精度与有效位数的数字 numeric decimal 的同义词 money 从-2^63(-922,337,203,685,477.5808)到 2^63-1(922,337,203,685,477.5807)的货币数据,最小货 币单位千分之十 smallmoney 从-214,748.3648 到 214,748.3647 的货币数据,最小货币单位千分之十 float 从-1.79E+308 到 1.79E+308 可变精度的数字 real 从-3.04E+38 到 3.04E+38 可变精度的数字 datetime 从 1753 年 1 月 1 日到 9999 年 12 日 31 的日期和时间数据,最小时间单位为百分之三秒或 3.33 毫秒 等等。 null_type 表示该数据类型是如何处理空值的,必须使用单引号引起来,例 如’NULL’、’NOT NULL’或者’NONULL’。 smalldatetime 从 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和时间数据,最小时间单位为分钟 timestamp 时间戳,一个数据库宽度的唯一数字 uniqueidentifier 全球唯一标识符 GUID char 定长非 Unicode 的字符型数据,最大长度为 8000 varchar 变长非 Unicode 的字符型数据,最大长度为 8000 text 变长非 Unicode 的字符型数据,最大长度为 2^31-1(2G) nchar 定长 Unicode 的字符型数据,最大长度为 8000 nvarchar 变长 Unicode 的字符型数据,最大长度为 8000 ntext 变长 Unicode 的字符型数据,最大长度为 2^31-1(2G) binary 定长二进制数据,最大长度为 8000 varbinary 变长二进制数据,最大长度为 8000 image 变长二进制数据,最大长度为 2^31-1(2G) 〉〉〉---------我想分页!--这么长的文章,在这里来个分页多好啊!哈哈----------〈〈〈 《SQL 语句的基本语法》 一.Select 语句的完整语法为: Select[ALL|DISTINCT|DISTINCTROW|TOP] {*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]} FROM tableexpression[,…][IN externaldatabase] [Where…] [GROUP BY…] [HAVING…] [ORDER BY…] [WITH OWNERACCESS OPTION] 说明: 用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。 1 FROM 子句 FROM 子句指定了 Select 语句中字段的来源。FROM 子句后面是包含一个或多个的表达式(由逗号分开),其 中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。 如果表或查询存储在外部数据库,在 IN 子句之后指明其完整路径。 例:下列 SQL 语句返回所有有定单的客户: Select orderID,Customer.customerID FROM orders Customers Where orders.CustomerID=Customers.CustomeersID 2 ALL、DISTINCT、DISTINCTROW、TOP 谓词 (1) ALL 返回满足 SQL 语句条件的所有记录。如果没有指明这个谓词,默认为 ALL。 例:Select ALL FirstName,LastName FROM Employees (2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。 (3) DISTINCTROW 如果有重复的记录,只返回一个 (4) TOP 显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT 子句(其中 N 表示百 分比) 例:返回 5%定货额最大的定单 Select TOP 5 PERCENT* FROM [ order Details] orDER BY UnitPrice*Quantity*(1-Discount) DESC 3 用 AS 子句为字段取别名 如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它 放到一个新的列里显示,则用 AS 保留。 例:返回 FirstName 字段取别名为 NickName Select FirstName AS NickName ,LastName ,City FROM Employees 例:返回新的一列显示库存价值 Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock FROM Products 二 .Where 子句指定查询条件 1 比较运算符 比较运算符 含义 = 等于 〉 大于 〈 小于 〉= 大于等于 〈= 小于等于 〈〉 不等于 !〉 不大于 !〈 不小于 例:返回 96 年 1 月的定单 Select orderID, CustomerID, orderDate FROM orders Where orderDate〉#1/1/96# AND orderDate〈#1/30/96# 注意: Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用 Datevalue()函数来代替。在比较字符型的数据 时,要加上单引号’’,尾空格在比较中被忽略。 例: Where orderDate〉#96-1-1# 也可以表示为: Where orderDate〉Datevalue(‘1/1/96’) 使用 NOT 表达式求反。 例:查看 96 年 1 月 1 日以后的定单 Where Not orderDate〈=#1/1/96# 2 范围(BETWEEN 和 NOT BETWEEN) BETWEEN …AND…运算符指定了要搜索的一个闭区间。 例:返回 96 年 1 月到 96 年 2 月的定单。 Where orderDate Between #1/1/96# And #2/1/96# 3 列表(IN ,NOT IN) IN 运算符用来匹配列表中的任何一个值。IN 子句可以代替用 OR 子句连接的一连串的条件。 例:要找出住在 London、Paris 或 Berlin 的所有客户 Select CustomerID, CompanyName, ContactName, City FROM Customers Where City In(‘London’,’ Paris’,’ Berlin’) 4 模式匹配(LIKE) LIKE 运算符检验一个包含字符串数据的字段值是否匹配一指定模式。 LIKE 运算符里使用的通配符 通配符 含义 ? 任何一个单一的字符 * 任意长度的字符 # 0~9 之间的单一数字 [字符列表] 在字符列表里的任一值 [!字符列表] 不在字符列表里的任一值 - 指定字符范围,两边的值分别为其上下限 例:返回邮政编码在(171)555-0000 到(171)555-9999 之间的客户 Select CustomerID ,CompanyName,City,Phone FROM Customers Where Phone Like ‘(171)555-####’ LIKE 运算符的一些样式及含义 样式 含义 不符合 LIKE ‘A*’ A 后跟任意长度的字符 Bc,c255 LIKE’5 ’ 5*5 555 LIKE’5?5’ 5 与 5 之间有任意一个字符 55,5wer5 LIKE’5##5’ 5235,5005 5kd5,5346 LIKE’[a-z]’ a-z 间的任意一个字符 5,% LIKE’[!0-9]’ 非 0-9 间的任意一个字符 0,1 LIKE’[[]’ 1,* 三 .用 ORDER BY 子句排序结果 orDER 子句按一个或多个(最多 16 个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC), 缺省是升序。ORDER 子句通常放在 SQL 语句的最后。 orDER 子句中定义了多个字段,则按照字段的先后顺序排序。 例: Select ProductName,UnitPrice, UnitInStock FROM Products orDER BY UnitInStock DESC , UnitPrice DESC, ProductName orDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。 例:下面的语句产生与上列相同的效果。 Select ProductName,UnitPrice, UnitInStock FROM Products orDER BY 1 DESC , 2 DESC,3 四 .运用连接关系实现多表查询 例:找出同一个城市中供应商和客户的名字 Select Customers.CompanyName, Suppliers.ComPany.Name FROM Customers, Suppliers Where Customers.City=Suppliers.City 例:找出产品库存量大于同一种产品的定单的数量的产品和定单 Select ProductName,OrderID, UnitInStock, Quantity FROM Products, [Order Deails] Where Product.productID=[Order Details].ProductID AND UnitsInStock〉Quantity 另一种方法是用 Microsof JET SQL 独有的 JNNER JOIN 语法: FROM table1 INNER JOIN table2 ON table1.field1 comparision table2.field2 其中 comparision 就是前面 Where 子句用到的比较运算符。 Select FirstName,lastName,OrderID,CustomerID,OrderDate FROM Employees INNER JOIN orders ON Employees.EmployeeID=Orders.EmployeeID 注意: INNER JOIN 不能连接 Memo OLE Object Single Double 数据类型字段。 在一个 JOIN 语句中连接多个 ON 子句 语法: Select fields FROM table1 INNER JOIN table2 ON table1.field1 compopr table2.field1 AND ON table1.field2 compopr table2.field2 or ON table1.field3 compopr table2.field3 也可以 Select fields FROM table1 INNER JOIN (table2 INNER JOIN [( ]table3 [INNER JOER] [( ]tablex[INNER JOIN] ON table1.field1 compopr table2.field1 ON table1.field2 compopr table2.field2 ON table1.field3 compopr table2.field3 外部连接返回更多记录,在结果中保留不匹配的记录,不管存不存在满足条件的记录都要返回另一侧的所 有记录。 FROM table [LEFT|RIGHT]JOIN table2 ON table1.field1comparision table.field2 用左连接来建立外部连接,在表达式的左边的表会显示其所有的数据 例:不管有没有定货量,返回所有商品 Select ProductName ,OrderID FROM Products LEFT JOIN orders ON Products.PrductsID=Orders.ProductID 右连接与左连接的差别在于:不管左侧表里有没有匹配的记录,它都从左侧表中返回所有记录。 例:如果想了解客户的信息,并统计各个地区的客户分布,这时可以用一个右连接,即使某个地区没有客 户,也要返回客户信息。 空值不会相互匹配,可以通过外连接才能测试被连接的某个表的字段是否有空值。 Select * FROM talbe1 LEFT JOIN table2 ON table1.a=table2.c 1 连接查询中使用 Iif 函数实现以 0 值显示空值 Iif 表达式: Iif(IsNull(Amount,0,Amout) 例:无论定货大于或小于¥50,都要返回一个标志。 Iif([Amount]〉50,?Big order?,?Small order?) 五. 分组和总结查询结果 在 SQL 的语法里,GROUP BY 和 HAVING 子句用来对数据进行汇总。GROUP BY 子句指明了按照哪几个字段来 分组,而将记录分组后,用 HAVING 子句过滤这些记录。 GROUP BY 子句的语法 Select fidldlist FROM table Where criteria [GROUP BY groupfieldlist [HAVING groupcriteria]] 注:Microsoft Jet 数据库 Jet 不能对备注或 OLE 对象字段分组。 GROUP BY 字段中的 Null 值以备分组但是不能被省略。 在任何 SQL 合计函数中不计算 Null 值。 GROUP BY 子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。 例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于 1 人的所有头衔。 Select Title ,Count(Title) as Total FROM Employees Where Region = ‘WA’ GROUP BY Title HAVING Count(Title)〉1 JET SQL 中的聚积函数 聚集函数 意义 SUM ( ) 求和 AVG ( ) 平均值 COUNT ( ) 表达式中记录的数目 COUNT (* ) 计算记录的数目 MAX 最大值 MIN 最小值 VAR 方差 STDEV 标准误差 FIRST 第一个值 LAST 最后一个值 六. 用 Parameters 声明创建参数查询 Parameters 声明的语法: PARAMETERS name datatype[,name datatype[, …]] 其中 name 是参数的标志符,可以通过标志符引用参数. Datatype 说明参数的数据类型. 使用时要把 PARAMETERS 声明置于任何其他语句之前. 例: PARAMETERS[Low price] Currency,[Beginning date]datatime Select orderID ,OrderAmount FROM orders Where orderAMount〉[low price] AND orderDate〉=[Beginning date] 七. 功能查询 所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出 符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询. 1 更新查询 Update 子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值. 更新查询语法: Update 表名 SET 新值 Where 准则 例:英国客户的定货量增加 5%,货运量增加 3% Update OEDERS SET orderAmount = orderAmount 1.1 Freight = Freight*1.03 Where ShipCountry = ‘UK’ 2 删除查询 Delete 子句可以使用户删除大量的过时的或冗于的数据. 注:删除查询的对象是整个记录. Delete 子句的语法: Delete [表名.] FROM 来源表 Where 准则 例: 要删除所有 94 年前的定单 Delete * FROM orders Where orderData〈#94-1-1# 3 追加查询 Insert 子句可以将一个或一组记录追加到一个或多个表的尾部. INTO 子句指定接受新记录的表 valueS 关键字指定新记录所包含的数据值. Insert 子句的语法: INSETR INTO 目的表或查询(字段 1,字段 2,…) valueS(数值 1,数值 2,…) 例:增加一个客户 Insert INTO Employees(FirstName,LastName,title) valueS(‘Harry’,’Washington’,’Trainee’) 4 生成表查询 可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础. Select INTO 子句用来创建生成表查询语法: Select 字段 1,字段 2,… INTO 新表[IN 外部数据库] FROM 来源数据库 Where 准则 例:为定单制作一个存档备份 Select * INTO ordersArchive FROM orders 八. 联合查询 UNION 运算可以把多个查询的结果合并到一个结果集里显示. UNION 运算的一般语法: [表]查询 1 UNION [ALL]查询 2 UNION … 例:返回巴西所有供给商和客户的名字和城市 Select CompanyName,City FROM Suppliers Where Country = ‘Brazil’ UNION Select CompanyName,City FROM Customers Where Country = ‘Brazil’ 注: 缺省的情况下,UNION 子句不返回重复的记录.如果想显示所有记录,可以加 ALL 选项 UNION 运算要求查询具有相同数目的字段.但是,字段数据类型不必相同. 每一个查询参数中可以使用 GROUP BY 子句 或 HAVING 子句进行分组.要想以指定的顺序来显示返回的数 据,可以在最后一个查询的尾部使用 OREER BY 子句. 九. 交叉查询 交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个 显示在表的左部,另一个显示在表的顶部. Microsoft Jet SQL 用 TRANSFROM 语句创建交叉表查询语法: TRANSFORM aggfunction Select 语句 GROUP BY 子句 PIVOT pivotfield[IN(value1 [,value2[,…]]) ] Aggfounction 指 SQL 聚积函数, Select 语句选择作为标题的的字段, GROUP BY 分组 说明: Pivotfield 在查询结果集中创建列标题时用的字段或表达式,用可选的 IN 子句限制它的取值. value 代表创建列标题的固定值. 例:显示在 1996 年里每一季度每一位员工所接的定单的数目: TRANSFORM Count(OrderID) Select FirstName&’’&LastName AS FullName FROM Employees INNER JOIN orders ON Employees.EmployeeID = orders.EmployeeID Where DatePart(“yyyy”,OrderDate)= ‘1996’ GROUP BY FirstName&’’&LastName orDER BY FirstName&’’&LastName POVOT DatePart(“q”,OrderDate)&’季度’ 十 .子查询 子查询可以理解为 套查询.子查询是一个 Select 语句. 1 表达式的值与子查询返回的单一值做比较 语法: 表达式 comparision ANY|ALL|SOME 说明: ANY 和 SOME 谓词是同义词,与比较运算符(=, 〈,〉 , , 〈=,〉 〈〉 =)一起使用.返回一个布尔值 True 或 False.ANY 的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生 True 结果,ANY 测试的返 回 True 值(既 Where 子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL 测试则要求表达 式与子查询返回的一系列的值的比较都产生 True 结果,才回返回 True 值. 例:主查询返回单价比任何一个折扣大于等于 25%的产品的单价要高的所有产品 Select * FROM Products Where UnitPrice〉ANY (Select UnitPrice FROM[Order Details] Where Discount〉0.25) 2 检查表达式的值是否匹配子查询返回的一组值的某个值 语法: [NOT]IN(子查询) 例:返回库存价值大于等于 1000 的产品. Select ProductName FROM Products Where ProductID IN (Select PrdoctID FROM [Order DEtails] Where UnitPrice*Quantity〉= 1000) 3 检测子查询是否返回任何记录 语法: [NOT]EXISTS (子查询)

解决方案四:

例:用 EXISTS 检索英国的客户 Select ComPanyName,ContactName FROM orders Where EXISTS (Select * FROM Customers Where Country = ‘UK’ AND Customers.CustomerID= orders.CustomerID) 〉〉〉---------我想分页!--这么长的文章,在这里来个分页多好啊!哈哈----------〈〈〈 Sql Server 和 Access 操作数据库结构 Sql 语句 下面是 Sql Server 和 Access 操作数据库结构的常用 Sql,希望对你有所帮助。 内容由海娃整理,不正确与不完整之处还请提出,谢谢。 新建表: create table 表名 PRIMARY KEY , [字段 1] nVarChar(50) default ’默认值’ null , [字段 2] ntext null , [字段 3] datetime, [字段 4] money null , [字段 5] int default 0, [字段 6] Decimal (12,4) default 0, [字段 7] image null ) 删除表: Drop table [表名] 插入数据: Insert INTO 表名 VALUES (100,’51WINDOWS.NET’) 删除数据: Delete FROM [表名] Where [字段名]〉100 更新数据: Update [表名] SET [字段 1] = 200,[字段 2] = ’51WINDOWS.NET’ Where [字段三] = ’HAIWA’ 新增字段: Alter TABLE [表名] ADD [字段名] NVARCHAR (50) NULL 删除字段: Alter TABLE [表名] Drop COLUMN [字段名] 修改字段: Alter TABLE [表名] Alter COLUMN [字段名] NVARCHAR (50) NULL 重命名表:(Access 重命名表,请参考文章:在 Access 数据库中重命名表) 引用来自 在 Access 数据库中重命名表 Dim Conn,ConnStr,oCat,oTbl ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("data.mdb") Set oCat=Server.CreateObject("ADOX.Catalog") oCat.ActiveConnection = ConnStr Set oTbl = Server.CreateObject("ADOX.Table") Set oTbl = oCat.Tables("OldTable") ’要重命名的表名:OldTable oTbl.Name = "NewTable" ’新表名 Set oCat = Nothing Set oTbl = Nothing sp_rename ’表名’, ’新表名’, ’OBJECT’ 新建约束: Alter TABLE [表名] ADD CONSTRAINT 约束名 CHECK ([约束字段] 〈= ’2000-1-1’) 删除约束: Alter TABLE [表名] Drop CONSTRAINT 约束名 新建默认值 Alter TABLE [表名] ADD CONSTRAINT 默认值名 DEFAULT ’51WINDOWS.NET’ FOR [字段名] 删除默认值 Alter TABLE [表名] Drop CONSTRAINT 默认值名 删除 Sql Server 中的日志,减小数据库文件大小 dump transaction 数据库名 with no_log backup log 数据库名 with no_log dbcc shrinkdatabase(数据库名) exec sp_dboption ’数据库名’, ’autoshrink’, ’true’ 查询语句精华大全.txt SQL 查询语句精华大全.txt 一、 简单查询 简单的 Transact-SQL 查询只包括选择列表、FROM 子句和 WHERE 子句。它们分别说明所查询列、查询的 表或视图、以及搜索条件等。 例如,下面的语句查询 testtable 表中姓名为“张三”的 nickname 字段和 email 字段。 SELECT nickname,email FROM testtable WHERE name='张三' (一) 选择列表 选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 量和全局变量)等构成。 1、选择所有列 例如,下面语句显示 testtable 表中所有列的数据: SELECT * FROM testtable 2、选择部分列并指定它们的显示次序 查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 例如: SELECT nickname,email FROM testtable 3、更改列标题 在选择列表中,可重新指定列标题。定义格式为: 列标题=列名 列名 列标题 如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 标题: SELECT 昵称=nickname,电子邮件=email FROM testtable 4、删除重复行 SELECT 语句中使用 ALL 或 DISTINCT 选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 为 ALL。使用 DISTINCT 选项时,对于所有重复的数据行在 SELECT 返回的结果集合中只保留一行。 5、限制返回的行数 使用 TOP n [PERCENT]选项限制返回的数据行数,TOP n 说明返回 n 行,而 TOP n PERCENT 时,说明 n 是 表示一百分数,指定返回的行数等于总行数的百分之几。 例如: SELECT TOP 2 * FROM testtable SELECT TOP 20 PERCENT * FROM testtable (二) FROM 子句 FROM 子句指定 SELECT 语句查询及与查询相关的表或视图。在 FROM 子句中最多可指定 256 个表或视图, 它们之间用逗号分隔。 在 FROM 子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 所属的表或视图。例如在 usertable 和 citytable 表中同时存在 cityid 列,在查询两个表中的 cityid 时 应 使用下面语句格式加以限定: SELECT username,citytable.cityid FROM usertable,citytable WHERE usertable.cityid=citytable.cityid 在 FROM 子句中可用以下两种格式为表或视图指定别名: 表名 as 别名 表名 别名 例如上面语句可用表的别名格式表示为: SELECT username,b.cityid FROM usertable a,citytable b WHERE a.cityid=b.cityid SELECT 不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 例如: SELECT a.au_fname+a.au_lname FROM authors a,titleauthor ta (SELECT title_id,title FROM titles WHERE ytd_sales>10000 ) AS t WHERE a.au_id=ta.au_id AND ta.title_id=t.title_id 此例中,将 SELECT 返回的结果集合给予一别名 t,然后再从中检索数据。 (三) 使用 WHERE 子句设置查询条件 WHERE 子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于 20 的数据: SELECT * FROM usertable WHERE age>20 WHERE 子句可包括各种条件运算符: 比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 范围运算符(表达式值是否在指定的范围):BETWEEN…AND… NOT BETWEEN…AND… 列表运算符(判断表达式是否为列表中的指定项):IN (项 1,项 2……) NOT IN (项 1,项 2……) 模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE 空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL 逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR 1、范围运算符例:age BETWEEN 10 AND 30 相当于 age>=10 AND age<=30 2、列表运算符例:country IN ('Germany','China') 3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于 char、 varchar、text、ntext、datetime 和 smalldatetime 等类型查询。 可使用以下通配字符: 百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 [^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 例如: 限制以 Publishing 结尾,使用 LIKE '%Publishing' 限制以 A 开头:LIKE '[A]%' 限制以 A 开头外:LIKE '[^A]%' 4、空值判断符例 WHERE age IS NULL 5、逻辑运算符:优先级为 NOT、AND、OR (四)查询结果排序 使用 ORDER BY 子句对查询返回的结果按一列或多列排序。ORDER BY 子句的语法格式为: ORDER BY {column_name [ASC|DESC]} [,…n] 其中 ASC 表示升序,为默认值,DESC 为降序。ORDER BY 不能按 ntext、text 和 image 数据类型进行排 序。 例如: SELECT * FROM usertable ORDER BY age desc,userid ASC 另外,可以根据表达式进行排序。 二、 联合查询 UNION 运算符可以将两个或两个以上上 SELECT 语句的查询结果集合合并成一个结果集合显示,即执行联 合查询。UNION 的语法格式为: select_statement UNION [ALL] selectstatement [UNION [ALL] selectstatement][…n] 其中 selectstatement 为待联合的 SELECT 查询语句。 ALL 选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 行。 联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 在使用 UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值 类 型,系统将低精度的数据类型转换为高精度的数据类型。 在包括多个查询的 UNION 语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: 查询 1 UNION (查询 2 UNION 查询 3) 三、连接查询 通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 数据库管理系统的一个标志。 在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 查询。 连接可以在 SELECT 语句的 FROM 子句或 WHERE 子句中建立,似是而非在 FROM 子句中指出连接时有助于 将连接操作与 WHERE 子句中的搜索条件区分开来。所以,在 Transact-SQL 中推荐使用这种方法。 SQL-92 标准所定义的 FROM 子句的连接语法格式为: FROM join_table join_type join_table [ON (join_condition)] 其中 join_table 指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 个表操作的连接又称做自连接。 join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 外连接分为左外连接(LEFT OUTER JOIN 或 LEFT JOIN)、右外连接(RIGHT OUTER JOIN 或 RIGHT JOIN) 和全外连接(FULL OUTER JOIN 或 FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 数据行。 交叉连接(CROSS JOIN)没有 WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 连接操作中的 ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 运算符等构成。 无论哪种连接都不能对 text、ntext 和 image 数据类型列进行直接连接,但可以对这三种列进行间接 连接。例如: SELECT p1.pub_id,p2.pub_id,p1.pr_info FROM pub_info AS p1 INNER JOIN pub_info AS p2 ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) (一)内连接 内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 三种: 1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 表中的所有列,包括其中的重复列。 2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 运算符包括>、>=、<=、<、!>、!<和<>。 3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 结果集合中所包括的列,并删除连接表中的重复列。 例,下面使用等值连接列出 authors 和 publishers 表中位于同一城市的作者和出版社: SELECT * FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city 又如使用自然连接,在选择列表中删除 authors 和 publishers 表中重复列(city 和 state): SELECT a.*,p.pub_id,p.pub_name,p.country FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city (二)外连接 内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 如下面使用左外连接将论坛内容和作者信息连接起来: SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b ON a.username=b.username 下面使用全外连接将 city 表中的所有作者以及 user 表中的所有作者,以及他们所在的城市: SELECT a.*,b.* FROM city as a FULL OUTER JOIN user as b ON a.username=b.username (三)交叉连接 交叉连接不带 WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 例,titles 表中有 6 类图书,而 publishers 表中有 8 家出版社,则下列交叉连接检索到的记录数将等 于 6*8=48 行。 SELECT type,pub_name FROM titles CROSS JOIN publishers ORDER BY typeSQL 核心语句(非常实用的几个技巧)插入数据 向表中添加一个新记录,你要使用 SQL INSERT 语句。这里有一个如何使用这种语句的例子: INSERT mytable (mycolumn) VALUES (‘some data’) 这个语句把字符串’some data’插入表 mytable 的 mycolumn 字段中。将要被插入数据的字段的名字在第 一个括号中指定,实际的数据在第二个括号中给出。 INSERT 语句的完整句法如下: INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES | Values_list | select_statement} 如果一个表有多个字段,通过把字段名和字段值用逗号隔开,你可以向所有的字段中插入数据。假设表 mytable 有三个字段 first_column,second_column,和 third_column。下面的 INSERT 语句添加了一条三个 字段都有值的完整记录: INSERT mytable (first_column,second_column,third_column) VALUES (‘some data’,’some more data’,’yet more data’) 注意 你可以使用 INSERT 语句向文本型字段中插入数据。但是,如果你需要输入很长的字符串,你应该使用 WRITETEXT 语句。这部分内容对本书来说太高级了,因此不加讨论。要了解更多的信息,请参考 Microsoft SQL Sever 的文档。 如果你在 INSERT 语句中只指定两个字段和数据会怎么样呢?换句话说,你向一个表中插入一条新记录, 但有一个字段没有提供数据。在这种情况下,有下面的四种可能: 如果该字段有一个缺省值, 该值会被使用。 例如, 假设你插入新记录时没有给字段 third_column 提供数据, 而这个字段有一个缺省值’some value’。在这种情况下,当新记录建立时会插入值’some value’。 如果该字段可以接受空值,而且没有缺省值,则会被插入空值。 如果该字段不能接受空值,而且没有缺省值,就会出现错误。你会收到错误信息: The column in table mytable may not be null. 最后,如果该字段是一个标识字段,那么它会自动产生一个新值。当你向一个有标识字段的表中插入新记 录时,只要忽略该字段,标识字段会给自己赋一个新值。 注意 向一个有标识字段的表中插入新记录后,你可以用 SQL 变量@@identity 来访问新记录 的标识字段的值。考虑如下的 SQL 语句: INSERT mytable (first_column) VALUES(‘some value’) INSERT anothertable(another_first,another_second) VALUES(@@identity,’some value’) 如果表 mytable 有一个标识字段,该字段的值会被插入表 anothertable 的 another_first 字段。这是因为 变量@@identity 总是保存最后一次插入标识字段的值。 字段 another_first 应该与字段 first_column 有相同的数据类型。但是,字段 another_first 不能是应该 标识字段。Another_first 字段用来保存字段 first_column 的值。 删除记录 要从表中删除一个或多个记录,需要使用 SQL DELETE 语句。 你可以给 DELETE 语句提供 WHERE 子句。WHERE 子句用来选择要删除的记录。例如,下面的这个 DELETE 语句只删除字段 first_column 的值等于’Delete Me’的记录: DELETE mytable WHERE first_column=’Deltet Me’ DELETE 语句的完整句法如下: DELETE [FROM] {table_name|view_name} [WHERE clause] 在 SQL SELECT 语句中可以使用的任何条件都可以在 DELECT 语句的 WHERE 子句中使用。例如,下面的这个 DELETE 语句只删除那些 first_column 字段的值为’goodbye’或 second_column 字段的值为’so long’ 的记录: DELETE mytable WHERE first_column=’goodby’ OR second_column=’so long’ 如果你不给 DELETE 语句提供 WHERE 子句,表中的所有记录都将被删除。你不应该有这种想法。如果你想 删除应该表中的所有记录,应使用第十章所讲的 TRUNCATE TABLE 语句。 注意 为什么要用 TRUNCATE TABLE 语句代替 DELETE 语句?当你使用 TRUNCATE TABLE 语句时,记录的删除是不 作记录的。也就是说,这意味着 TRUNCATE TABLE 要比 DELETE 快得多。 更新记录 要修改表中已经存在的一条或多条记录,应使用 SQL UPDATE 语句。同 DELETE 语句一样,UPDATE 语句可以 使用 WHERE 子句来选择更新特定的记录。请看这个例子: UPDATE mytable SET first_column=’Updated!’ WHERE second_column=’Update Me!’ 这个 UPDATE 语句更新所有 second_column 字段的值为’Update Me!’的记录。对所有被选中的记录,字 段 first_column 的值被置为’Updated!’。 下面是 UPDATE 语句的完整句法: UPDATE {table_name|view_name} SET [{table_name|view_name}] {column_list|variable_list|variable_and_column_list} [,{column_list2|variable_list2|variable_and_column_list2}… [,{column_listN|variable_listN|variable_and_column_listN}]] [WHERE clause] 注意 你可以对文本型字段使用 UPDATE 语句。但是,如果你需要更新很长的字符串,应使用 UPDATETEXT 语句。 这部分内容对本书来说太高级了,因此不加讨论。要了解更多的信息,请参考 Microsoft SQL Sever 的文 档。 如果你不提供 WHERE 子句,表中的所有记录都将被更新。有时这是有用的。例如,如果你想把表 titles 中 的所有书的价格加倍,你可以使用如下的 UPDATE 语句: 你也可以同时更新多个字段。例如,下面的 UPDATE 语句同时更新 first_column,second_column,和 third_column 这三个字段: UPDATE mytable SET first_column=’Updated!’ Second_column=’Updated!’ Third_column=’Updated!’ WHERE first_column=’Update Me1’ 技巧 SQL 忽略语句中多余的空格。你可以把 SQL 语句写成任何你最容易读的格式。 用 SELECT 创建记录和表 你也许已经注意到, INSERT 语句与 DELETE 语句和 UPDATE 语句有一点不同, 它一次只操作一个记录。 然而, 有一个方法可以使 INSERT 语句一次添加多个记录。要作到这一点,你需要把 INSERT 语句与 SELECT 语句 结合起来,象这样: INSERT mytable (first_column,second_column) SELECT another_first,another_second FROM anothertable WHERE another_first=’Copy Me!’ 这个语句从 anothertable 拷贝记录到 mytable.只有表 anothertable 中字段 another_first 的值为’Copy Me!’的记录才被拷贝。 当为一个表中的记录建立备份时,这种形式的 INSERT 语句是非常有用的。在删除一个表中的记录之前, 你可以先用这种方法把它们拷贝到另一个表中。 如果你需要拷贝整个表,你可以使用 SELECT INTO 语句。例如,下面的语句创建了一个名为 newtable 的 新表,该表包含表 mytable 的所有数据: SELECT * INTO newtable FROM mytable 你也可以指定只有特定的字段被用来创建这个新表。要做到这一点,只需在字段列表中指定你想要拷贝的 字段。另外,你可以使用 WHERE 子句来限制拷贝到新表中的记录。下面的例子只拷贝字段 second_columnd 的值等于’Copy Me!’的记录的 first_column 字段。 SELECT first_column INTO newtable FROM mytable WHERE second_column=’Copy Me!’ 使用 SQL 修改已经建立的表是很困难的。例如,如果你向一个表中添加了一个字段,没有容易的办法来去 除它。另外,如果你不小心把一个字段的数据类型给错了,你将没有办法改变它。但是,使用本节中讲述 的 SQL 语句,你可以绕过这两个问题。 例如,假设你想从一个表中删除一个字段。使用 SELECT INTO 语句,你可以创建该表的一个拷贝,但不包 含要删除的字段。这使你既删除了该字段,又保留了不想删除的数据。 如果你想改变一个字段的数据类型,你可以创建一个包含正确数据类型字段的新表。创建好该表后,你就 可以结合使用 UPDATE 语句和 SELECT 语句,把原来表中的所有数据拷贝到新表中。通过这种方法,你既可 以修改表的结构,又能保存原有的数据。

解决方案五:

下面为您介绍的是查询表的字段名的sql语句写法,sql语句可以实现许多的功能,希望可以您在学习sql语句使用方面获得启示。

select name from syscolumns where id = (select id from sysobjects where type = 'u' and name = '相应表名')

或者

select name from syscolumns where id = object_id('相应表名')

用以上sql语句输入相应表名就可以查到表的字段名,对应好数据库 查询是否存在该表语句

而判断表名在数据库中是否存在的方法是

if not object_id('相应表名') is null

print '存在'

这次查询表中的字段名的目标是在写程序的时候需要写一点sql语句,但是表的字段太多了,如果一个一个去复制的话太慢了,而且有可能会复制漏了某个字段,所以利用自己数据库的知识,写了个sql语句直接生成字段名字符串,例如下面我要写一个select语句,需要生成表所有的字段:

declare @s varchar(1000)

select @s = isnull(@s+',', '') + [name] from syscolumns where id = object_id('相应表名')

select @s

获取字段名已经字段类型,类型长度

SELECT a.colid as ID,a.name as ColumnName,b.name as DataType,a.length

as Length FROM syscolumns a,systypes b WHERE a.id=

object_id('相应的表名') and a.xtype=b.xtype

and b.name <> 'sysname' order by a.colid 下面为您介绍的是查询表的字段名的sql语句写法,sql语句可以实现许多的功能,希望可以您在学习sql语句使用方面获得启示。

select name from syscolumns where id = (select id from sysobjects where type = 'u' and name = '相应表名')

或者

select name from syscolumns where id = object_id('相应表名')

用以上sql语句输入相应表名就可以查到表的字段名,对应好数据库 查询是否存在该表语句

而判断表名在数据库中是否存在的方法是

if not object_id('相应表名') is null

print '存在'

这次查询表中的字段名的目标是在写程序的时候需要写一点sql语句,但是表的字段太多了,如果一个一个去复制的话太慢了,而且有可能会复制漏了某个字段,所以利用自己数据库的知识,写了个sql语句直接生成字段名字符串,例如下面我要写一个select语句,需要生成表所有的字段:

declare @s varchar(1000)

select @s = isnull(@s+',', '') + [name] from syscolumns where id = object_id('相应表名')

select @s

获取字段名已经字段类型,类型长度

SELECT a.colid as ID,a.name as ColumnName,b.name as DataType,a.length

as Length FROM syscolumns a,systypes b WHERE a.id=

object_id('相应的表名') and a.xtype=b.xtype

and b.name <> 'sysname' order by a.colid

解决方案六:

declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end


while 条件
begin
执行操作
set @i=@i+1
end

WHILE
设置重复执行 SQL 语句或语句块的条件。只要指定的条件为真,就重复执行语句。可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。

语法
WHILE Boolean_expression
{ sql_statement | statement_block }
[ BREAK ]
{ sql_statement | statement_block }
[ CONTINUE ]

参数
Boolean_expression

返回 TRUE 或 FALSE 的表达式。如果布尔表达式中含有 SELECT 语句,必须用圆括号将 SELECT 语句括起来。

{sql_statement | statement_block}

Transact-SQL 语句或用语句块定义的语句分组。若要定义语句块,请使用控制流关键字 BEGIN 和 END。

BREAK

导致从最内层的 WHILE 循环中退出。将执行出现在 END 关键字后面的任何语句,END 关键字为循环结束标记。

CONTINUE

使 WHILE 循环重新开始执行,忽略 CONTINUE 关键字后的任何语句。

注释
如果嵌套了两个或多个 WHILE 循环,内层的 BREAK 将导致退出到下一个外层循环。首先运行内层循环结束之后的所有语句,然后下一个外层循环重新开始执行。

示例
A. 在嵌套的 IF...ELSE 和 WHILE 中使用 BREAK 和 CONTINUE
在下例中,如果平均价格少于 $30,WHILE 循环就将价格加倍,然后选择最高价。如果最高价少于或等于 $50,WHILE 循环重新启动并再次将价格加倍。该循环不断地将价格加倍直到最高价格超过 $50,然后退出 WHILE 循环并打印一条消息。

USE pubs
GO
WHILE (SELECT AVG(price) FROM titles) < $30
BEGIN
UPDATE titles
SET price = price * 2
SELECT MAX(price) FROM titles
IF (SELECT MAX(price) FROM titles) > $50
BREAK
ELSE
CONTINUE
END
PRINT 'Too much for the market to bear'

B. 在带有游标的过程中使用 WHILE
以下的 WHILE 结构是名为 count_all_rows 过程中的一部分。下例中,该 WHILE 结构测试用于游标的函数 @@FETCH_STATUS 的返回值。因为 @@FETCH_STATUS 可能返回 –2、-1 或 0,所以,所有的情况都应进行测试。如果某一行在开始执行此存储过程以后从游标结果中删除,将跳过该行。成功提取 (0) 后将执行 BEGIN...END 循环内部的 SELECT 语句。

USE pubs
DECLARE tnames_cursor CURSOR
FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
OPEN tnames_cursor
DECLARE @tablename sysname
--SET @tablename = 'authors'
FETCH NEXT FROM tnames_cursor INTO @tablename
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
SELECT @tablename = RTRIM(@tablename)
EXEC ('SELECT ''' + @tablename + ''' = count(*) FROM '

  • @tablename )
    PRINT ' '
    END
    FETCH NEXT FROM tnames_cursor INTO @tablename
    END
    CLOSE tnames_cursor
    DEALLOCATE tnames_cursor

解决方案七:

SQL SERVER 2005语句写法
主要内容
1、LEFT JOIN 、RIGHT JOIN与 INNER JOIN 用区别与用法
2、WITH AS用法
3、不使用NOT IN语句
4、不使用 XX字段=(表查询)语法
5、聚集索引与非聚集索引使用介绍
6、索引创建以及优化
7、联合表更新、删除写法以及批量INSERT
8、WITH (NOLOCK)

1、LEFT JOIN 与 INNER JOIN 用区别与用法
left join(左连接) 返回包括左表中的所有记录和右表中连接字段相等的记录
right join(右连接) 返回包括右表中的所有记录和左表中连接字段相等的记录
inner join(等值连接) 只返回两个表中连接字段相等的行
表值如:
SQL SERVER 2005语句写法
左连接结果:
SELECT * FROM PC_User a
LEFT JOIN PC_Score b ON a.UserID = b.UserID
SQL SERVER 2005语句写法

右连接结果:
SELECT * FROM PC_User a
RIGHT JOIN PC_Score b ON a.UserID = b.UserID
SQL SERVER 2005语句写法
等值连接结果:
SELECT * FROM PC_User a
INNER JOIN PC_Score b ON a.UserID = b.UserID
SQL SERVER 2005语句写法
左右连接附加条件写法:
SELECT * FROM PC_User a
LEFT JOIN PC_Score b ON a.UserID = b.UserID AND b.CourseID='a'
SQL SERVER 2005语句写法
如果写成:
SELECT * FROM PC_User a
LEFT JOIN PC_Score b ON a.UserID = b.UserID
WHERE b.CourseID='a'
SQL SERVER 2005语句写法
等同于:
SELECT * FROM PC_User a
INNER JOIN PC_Score b ON a.UserID = b.UserID
WHERE b.CourseID='a'
多次使用同一张表
SELECT * FROM PC_User a
INNER JOIN PC_Score b ON a.UserID = b.UserID And b.CourseID='a'
Left JOIN PC_Score c ON a.UserID = c.UserID And c.CourseID='b'

  2、WITH AS用法
WITH tmp as (SELECT * FROM PC_Score WHERE CourseID='a')

SELECT * FROM PC_User a
INNER JOIN tmp b ON a.UserID = b.UserID
SQL SERVER 2005语句写法
WITH tmp as (select * from PC_Score where Score=100)
SELECT * FROm PC_User a
LEFT JOIN tmp b on a.UserID = b.UserID
SQL SERVER 2005语句写法

3、不使用NOT IN语句
写法:
SELECT * FROM PC_User
Where UserID NOT IN (Select UserID From PC_Score Where score=100)
改为:
SELECT a.* FROm PC_User a
LEFT JOIN PC_Score b on a.UserID = b.UserID AND score=100
Where b.UserID Is NULL
4、不使用XX字段=(表查询)语法
SELECT UserID,UserName FROM PC_User
WHERE UserID =(SELECT UserID From PC_Score Where score=100)
出错:子查询返回的值不止一个。当子查询跟随在=、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
改为:
SELECT distinct a.UserID,a.UserName FROM PC_User a
INNER JOIn PC_Score b on a.UserID = b.UserID
WHERE b.score=100
或者
SELECT a.UserID,a.UserName FROM PC_User a
INNER JOIn PC_Score b on a.UserID = b.UserID
WHERE b.score=100
GROUP BY a.UserID,a.UserName

5、聚集索引与非聚集索引使用情况说明
n最大不同在于物理存储结构不同。
n聚集索引是根据索引字段进行数据的物理排序。
n非聚集索引类似书本索引,索引与数据存放在不同的物理区域。
如,当前字段数据值为10,15,30
A、使用聚集索引,添加数据20时,数据库将进行物理IO 移动,将(30移动后面)然后添加数据。
物理结果为:10,15,20,30
B、利用非聚集索引,添加数据20时,数据库不进行物理 移动,直接将数据添加到文件末尾,然后建立索引指针。
物理结果为:10,15,30,20
什么时候用聚集索引和非聚集索引呢?
情况如下:
如果字段为自增字段,记流水字段,而且大部分情况下是顺序添加的话,可以用聚集索引
如果字段值存储如用户名这样的结果,如果采用聚集索引,每次添加用户都需要进行移动IO,影响性能,这时候就采用非聚集索引。
6、索引创建以及优化
索引就是在数据库查询的时候提供快捷查找的指针。
索引的建立的时候要根据SQL语法来创建, 最关键的时索引字段的顺序。
建立索引语法:
CREATE INDEX 索引名称 ON 表(字段1,字段2)INCLUDE(字段)
删除索引语法:
DROP INDEX 索引名称 ON 表

CREATE INDEX idx_PC_Score_score1 on PC_Score(score) include (UserID)

优化索引:

SELECT * FROM AccMain.dbo.Jx_Info where OpenID<200
SELECT MemberID,FullName FROM AccMain.dbo.Jx_Info where OpenID<200
Create Index idx_Jx_Info_OpenID ON AccMain.dbo.Jx_info(OpenID)
Create Index idx_Jx_Info_OpenID ON AccMain.dbo.Jx_info(OpenID) include(MemberID,FullName)
Drop Index idx_Jx_Info_OpenID ON AccMain.dbo.Jx_info
7、联合表更新、删除写法
SELECT *
--Update b Set score = 100
--Delete b
FROM PC_User a
INNER JOIN PC_Score b ON a.UserID = b.UserID
where b.CourseID='a'
批量INSERT INTO:
INSERT INTO PC_Score(UserID,CourseID,Score)
Select UserID,'d',60 From PC_User
批量替换更新:
Update PC_Score Set CourseID = Replace(CourseID,'a','e') WHERE Score = 100

8、WITH (NOLOCK)
情况:每次SQL 查询(如Select)会产生共享锁,在此期间影响到的表为只读,不允许进行修改操作。
优点:如果在查询的时候添加上with (nolock) 将不会产生共享锁,可以提高查询速度的同时不影响修改操作。
缺点:会产生脏读,数据完整性要求比较严格的场景就不合适了,如财务结算,支付等环节。
用法如下:
SELECT * FROM 表 WITH(NOLOCk)

解决方案八:

SQL SERVER 2005语句写法
主要内容
1、LEFT JOIN 、RIGHT JOIN与 INNER JOIN 用区别与用法
2、WITH AS用法
3、不使用NOT IN语句
4、不使用 XX字段=(表查询)语法
5、聚集索引与非聚集索引使用介绍
6、索引创建以及优化
7、联合表更新、删除写法以及批量INSERT
8、WITH (NOLOCK)

1、LEFT JOIN 与 INNER JOIN 用区别与用法
left join(左连接) 返回包括左表中的所有记录和右表中连接字段相等的记录
right join(右连接) 返回包括右表中的所有记录和左表中连接字段相等的记录
inner join(等值连接) 只返回两个表中连接字段相等的行
表值如:
SQL SERVER 2005语句写法
左连接结果:
SELECT * FROM PC_User a
LEFT JOIN PC_Score b ON a.UserID = b.UserID
SQL SERVER 2005语句写法

右连接结果:
SELECT * FROM PC_User a
RIGHT JOIN PC_Score b ON a.UserID = b.UserID
SQL SERVER 2005语句写法
等值连接结果:
SELECT * FROM PC_User a
INNER JOIN PC_Score b ON a.UserID = b.UserID
SQL SERVER 2005语句写法
左右连接附加条件写法:
SELECT * FROM PC_User a
LEFT JOIN PC_Score b ON a.UserID = b.UserID AND b.CourseID='a'
SQL SERVER 2005语句写法
如果写成:
SELECT * FROM PC_User a
LEFT JOIN PC_Score b ON a.UserID = b.UserID
WHERE b.CourseID='a'
SQL SERVER 2005语句写法
等同于:
SELECT * FROM PC_User a
INNER JOIN PC_Score b ON a.UserID = b.UserID
WHERE b.CourseID='a'
多次使用同一张表
SELECT * FROM PC_User a
INNER JOIN PC_Score b ON a.UserID = b.UserID And b.CourseID='a'
Left JOIN PC_Score c ON a.UserID = c.UserID And c.CourseID='b'

  2、WITH AS用法
WITH tmp as (SELECT * FROM PC_Score WHERE CourseID='a')

SELECT * FROM PC_User a
INNER JOIN tmp b ON a.UserID = b.UserID
SQL SERVER 2005语句写法
WITH tmp as (select * from PC_Score where Score=100)
SELECT * FROm PC_User a
LEFT JOIN tmp b on a.UserID = b.UserID
SQL SERVER 2005语句写法

3、不使用NOT IN语句
写法:
SELECT * FROM PC_User
Where UserID NOT IN (Select UserID From PC_Score Where score=100)
改为:
SELECT a.* FROm PC_User a
LEFT JOIN PC_Score b on a.UserID = b.UserID AND score=100
Where b.UserID Is NULL
4、不使用XX字段=(表查询)语法
SELECT UserID,UserName FROM PC_User
WHERE UserID =(SELECT UserID From PC_Score Where score=100)
出错:子查询返回的值不止一个。当子查询跟随在=、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
改为:
SELECT distinct a.UserID,a.UserName FROM PC_User a
INNER JOIn PC_Score b on a.UserID = b.UserID
WHERE b.score=100
或者
SELECT a.UserID,a.UserName FROM PC_User a
INNER JOIn PC_Score b on a.UserID = b.UserID
WHERE b.score=100
GROUP BY a.UserID,a.UserName

5、聚集索引与非聚集索引使用情况说明
n最大不同在于物理存储结构不同。
n聚集索引是根据索引字段进行数据的物理排序。
n非聚集索引类似书本索引,索引与数据存放在不同的物理区域。
如,当前字段数据值为10,15,30
A、使用聚集索引,添加数据20时,数据库将进行物理IO 移动,将(30移动后面)然后添加数据。
物理结果为:10,15,20,30
B、利用非聚集索引,添加数据20时,数据库不进行物理 移动,直接将数据添加到文件末尾,然后建立索引指针。
物理结果为:10,15,30,20
什么时候用聚集索引和非聚集索引呢?
情况如下:
如果字段为自增字段,记流水字段,而且大部分情况下是顺序添加的话,可以用聚集索引
如果字段值存储如用户名这样的结果,如果采用聚集索引,每次添加用户都需要进行移动IO,影响性能,这时候就采用非聚集索引。
6、索引创建以及优化
索引就是在数据库查询的时候提供快捷查找的指针。
索引的建立的时候要根据SQL语法来创建, 最关键的时索引字段的顺序。
建立索引语法:
CREATE INDEX 索引名称 ON 表(字段1,字段2)INCLUDE(字段)
删除索引语法:
DROP INDEX 索引名称 ON 表

CREATE INDEX idx_PC_Score_score1 on PC_Score(score) include (UserID)

优化索引:

SELECT * FROM AccMain.dbo.Jx_Info where OpenID<200
SELECT MemberID,FullName FROM AccMain.dbo.Jx_Info where OpenID<200
Create Index idx_Jx_Info_OpenID ON AccMain.dbo.Jx_info(OpenID)
Create Index idx_Jx_Info_OpenID ON AccMain.dbo.Jx_info(OpenID) include(MemberID,FullName)
Drop Index idx_Jx_Info_OpenID ON AccMain.dbo.Jx_info
7、联合表更新、删除写法
SELECT *
--Update b Set score = 100
--Delete b
FROM PC_User a
INNER JOIN PC_Score b ON a.UserID = b.UserID
where b.CourseID='a'
批量INSERT INTO:
INSERT INTO PC_Score(UserID,CourseID,Score)
Select UserID,'d',60 From PC_User
批量替换更新:
Update PC_Score Set CourseID = Replace(CourseID,'a','e') WHERE Score = 100

8、WITH (NOLOCK)
情况:每次SQL 查询(如Select)会产生共享锁,在此期间影响到的表为只读,不允许进行修改操作。
优点:如果在查询的时候添加上with (nolock) 将不会产生共享锁,可以提高查询速度的同时不影响修改操作。
缺点:会产生脏读,数据完整性要求比较严格的场景就不合适了,如财务结算,支付等环节。
用法如下:
SELECT * FROM 表 WITH(NOLOCk)

解决方案九:

1.所有的comment语句需要删除。
2.clob类型转换为text类型。
3.blob类型转换为image类型。
4.number类型转换为int,number(16,2)等转换为decimal(16,2),number(18)转换为bigint。
5.default sysdate改为default getDate()。
6.to_date('2009-12-18','yyyy-mm-dd')改为cast('2009-12-18' as datetime)

SQLSERVER:
变量的声明:
声明变量时必须在变量前加@符号
DECLARE @I INT

变量的赋值:
变量赋值时变量前必须加set
SET @I = 30

声明多个变量:
DECLARE @s varchar(10),@a INT

if语句:
Java代码 收藏代码
if ..

begin

...

end

else if ..

begin

...

end

else

begin

...

end

Example:
Sql代码 收藏代码
DECLARE @d INT

set @d = 1

IF @d = 1 BEGIN

PRINT '正确'

END

ELSE BEGIN

PRINT '错误'

END

多条件选择语句:
Example:
Sql代码 收藏代码
declare @today int

declare @week nvarchar(3)

set @today=3

set @week= case

when @today=1 then '星期一'

when @today=2 then '星期二'

when @today=3 then '星期三'

when @today=4 then '星期四'

when @today=5 then '星期五'

when @today=6 then '星期六'

when @today=7 then '星期日'

else '值错误'

end

print @week

循环语句:
Java代码 收藏代码
WHILE 条件 BEGIN

执行语句

END

Example:
Java代码 收藏代码
DECLARE @i INT

SET @i = 1

WHILE @i<1000000 BEGIN

set @i=@i+1

END

定义游标:
Sql代码 收藏代码
DECLARE @cur1 CURSOR FOR SELECT .........

OPEN @cur1

FETCH NEXT FROM @cur1 INTO 变量

WHILE(@@FETCH_STATUS=0)

BEGIN

处理.....

FETCH NEXT FROM @cur1 INTO 变量

END

CLOSE @cur1

DEALLOCATE @cur1

Sql代码 收藏代码
AS

declare @CATEGORY_CI_TABLENAME VARCHAR(50) =''

declare @result VARCHAR(2000) = ''

declare @CI_ID DECIMAL = 0

declare @num int = 1

declare @countnum int = 1

BEGIN

select @countnum = count(ATTRIBUTE_CONFIG_ID) from T_ATTRIBUTE_CONFIG where CMDB_UPDATE_FLAG= 'Y' and CATEGORY_CODE =@CATEGORY_CODE

IF (@ATTRIBUTE2='A')

begin

DECLARE MyCursor CURSOR for select ATTRIBUTE_CONFIG_CODE from T_ATTRIBUTE_CONFIG where CMDB_UPDATE_FLAG= 'Y' and CATEGORY_CODE =@CATEGORY_CODE

OPEN MyCursor FETCH NEXT FROM MyCursor INTO @CONFIG_CODE

set @result = @result+@CONFIG_CODE+','

WHILE @@FETCH_STATUS = 0

BEGIN

FETCH NEXT FROM MyCursor INTO @CONFIG_CODE

set @num = @num+ 1

if(@num<@countnum)

begin

set @result = @result+@CONFIG_CODE+','

end

else if(@num=@countnum)

begin

set @result = @result +@CONFIG_CODE

end

END

CLOSE MyCursor

DEALLOCATE MyCursor

set @result = 'insert into ' + @ATTRIBUTE1 + '(' + @result +') select '+ @result +' from '+@CATEGORY_CI_TABLENAME +' where CI_ORDER_LINE_ID='+@KEY_ID

end

else if((@ATTRIBUTE2='U'))

临时表:
-- Select INTO 从一个查询的计算结果中创建一个新表。 数据并不返回给客户端,这一点和普通的Select 不同。 新表的字段具有和 Select 的输出字段相关联(相同)的名字和数据类型。
select * into NewTable
from Uname

-- Insert INTO ABC Select
-- 表ABC必须存在
-- 把表Uname里面的字段Username复制到表ABC
Insert INTO ABC Select Username FROM Uname

-- 创建临时表
Create TABLE #temp(
UID int identity(1, 1) PRIMARY KEY,
UserName varchar(16),
Pwd varchar(50),
Age smallint,
Sex varchar(6)
)

-- 打开临时表
Select * from #temp

1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。
2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。
3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop table #Tmp(或者drop table ##Tmp)来显式删除临时表。

临时表对执行效率应该影响不大,只要不是太过份,相反可以提高效率特别是连接查询的地方,只要你的数据库临时表空间足够
游标多,会严重执行效率,能免则免!

临时表在不同数据库设计中的作用
SQLSERVER 存储过程 语法
===============================================================================
其他:
--有输入参数的存储过程--
create proc GetComment
(@commentid int)
as
select * from Comment where CommentID=@commentid

--有输入与输出参数的存储过程--
create proc GetCommentCount
@newsid int,
@count int output
as
select @count=count(*) from Comment where NewsID=@newsid

--返回单个值的函数--
create function MyFunction
(@newsid int)
returns int
as
begin
declare @count int
select @count=count(*) from Comment where NewsID=@newsid
return @count
end

--调用方法--
declare @count int
exec @count=MyFunction 2
print @count

--返回值为表的函数--
Create function GetFunctionTable
(@newsid int)
returns table
as
return
(select * from Comment where NewsID=@newsid)

--返回值为表的函数的调用--
select * from GetFunctionTable(2)


SQLServer 存储过程中不拼接SQL字符串实现多条件查询

 以前拼接的写法
  set @sql=' select * from table where 1=1 '
  if (@addDate is not null)
   set @sql = @sql+' and addDate = '+ @addDate + ' '
  if (@name <>'' and is not null)
   set @sql = @sql+ ' and name = ' + @name + ' '
  exec(@sql)
下面是 不采用拼接SQL字符串实现多条件查询的解决方案
  第一种写法是 感觉代码有些冗余
  if (@addDate is not null) and (@name <> '')
   select * from table where addDate = @addDate and name = @name
  else if (@addDate is not null) and (@name ='')
   select * from table where addDate = @addDate
  else if(@addDate is null) and (@name <> '')
   select * from table where and name = @name
  else if(@addDate is null) and (@name = '')
  select * from table
  第二种写法是
  select * from table where (addDate = @addDate or @addDate is null) and (name = @name or @name = '')
  第三种写法是
  SELECT * FROM table where
  addDate = CASE @addDate IS NULL THEN addDate ELSE @addDate END,
  name = CASE @name WHEN '' THEN name ELSE @name END


SQLSERVER存储过程基本语法

一、定义变量
--简单赋值
declare @a int
set @a=5
print @a

--使用select语句赋值
declare @user1 nvarchar(50)
select @user1= '张三'
print @user1
declare @user2 nvarchar(50)
select @user2 = Name from ST_User where ID=1
print @user2

--使用update语句赋值
declare @user3 nvarchar(50)
update ST_User set @user3 = Name where ID=1
print @user3

二、表、临时表、表变量
--创建临时表1
create table #DU_User1
(
[ID] [ int ] NOT NULL ,
[Oid] [ int ] NOT NULL ,
[Login] nvarchar NOT NULL ,
[Rtx] nvarchar NOT NULL ,
[ Name ] nvarchar NOT NULL ,
[ Password ] nvarchar NULL ,
[State] nvarchar NOT NULL
);
--向临时表1插入一条记录
insert into #DU_User1 (ID,Oid,[Login],Rtx, Name ,[ Password ],State) values (100,2, 'LS' , '0000' , '临时' , '321' , '特殊' );

--从ST_User查询数据,填充至新生成的临时表
select * into #DU_User2 from ST_User where ID<8

--查询并联合两临时表
select * from #DU_User2 where ID<3 union select * from #DU_User1

--删除两临时表
drop table #DU_User1
drop table #DU_User2

--创建临时表
CREATE TABLE #t
(
[ID] [ int ] NOT NULL ,
[Oid] [ int ] NOT NULL ,
[Login] nvarchar NOT NULL ,
[Rtx] nvarchar NOT NULL ,
[ Name ] nvarchar NOT NULL ,
[ Password ] nvarchar NULL ,
[State] nvarchar NOT NULL ,
)

--将查询结果集(多条数据)插入临时表
insert into #t select * from ST_User
--不能这样插入
--select * into #t from dbo.ST_User

--添加一列,为int型自增长子段
alter table #t add [myid] int NOT NULL IDENTITY(1,1)
--添加一列,默认填充全球唯一标识
alter table #t add [myid1] uniqueidentifier NOT NULL default (newid())

select * from #t
drop table #t
--给查询结果集增加自增长列

--无主键时:
select IDENTITY( int ,1,1) as ID, Name ,[Login],[ Password ] into #t from ST_User
select * from #t

--有主键时:
select ( select SUM (1) from ST_User where ID<= a.ID) as myID,* from ST_User a order by myID
--定义表变量
declare @t table
(
id int not null ,
msg nvarchar(50) null
)
insert into @t values (1, '1' )
insert into @t values (2, '2' )
select * from @t
三、循环
--while循环计算1到100的和
declare @a int
declare @ sum int
set @a=1
set @ sum =0
while @a<=100
begin
set @ sum +=@a
set @a+=1
end
print @ sum
四、条件语句
--if,else条件分支
if(1+1=2)
begin
print '对'
end
else
begin
print '错'
end

--when then条件分支
declare @today int
declare @week nvarchar(3)
set @today=3
set @week= case
when @today=1 then '星期一'
when @today=2 then '星期二'
when @today=3 then '星期三'
when @today=4 then '星期四'
when @today=5 then '星期五'
when @today=6 then '星期六'
when @today=7 then '星期日'
else '值错误'
end
print @week

五、游标
declare @ID int
declare @Oid int
declare @Login varchar (50)

--定义一个游标
declare user_cur cursor for select ID,Oid,[Login] from ST_User
--打开游标
open user_cur
while @@fetch_status=0
begin
--读取游标
fetch next from user_cur into @ID,@Oid,@Login
print @ID
--print @Login
end
close user_cur
--摧毁游标
deallocate user_cur
六、触发器
   触发器中的临时表:
  Inserted
  存放进行insert和update 操作后的数据
  Deleted
  存放进行delete 和update操作前的数据
--创建触发器
Create trigger User_OnUpdate

On ST_User

for Update

As

declare @msg nvarchar(50)
--@msg记录修改情况
select @msg = N '姓名从“' + Deleted. Name + N '”修改为“' + Inserted. Name + '”' from Inserted,Deleted
--插入日志表
insert into LOG values (@msg)

--删除触发器
drop trigger User_OnUpdate
七、存储过程
--创建带output参数的存储过程
CREATE PROCEDURE PR_Sum
@a int ,
@b int ,
@ sum int output
AS
BEGIN
set @ sum =@a+@b
END

--创建Return返回值存储过程
CREATE PROCEDURE PR_Sum2
@a int ,
@b int
AS
BEGIN
Return @a+@b
END

--执行存储过程获取output型返回值
declare @mysum int
execute PR_Sum 1,2,@mysum output
print @mysum

--执行存储过程获取Return型返回值
declare @mysum2 int
execute @mysum2= PR_Sum2 1,2
print @mysum2

解决方案十:

八、自定义函数
  函数的分类:
    1)标量值函数
    2)表值函数
        a:内联表值函数
        b:多语句表值函数
    3)系统函数

--新建标量值函数
create function FUNC_Sum1
(
@a int ,
@b int
)
returns int
as
begin
return @a+@b
end

--新建内联表值函数
create function FUNC_UserTab_1
(
@myId int
)
returns table
as
return ( select * from ST_User where ID<@myId)

--新建多语句表值函数
create function FUNC_UserTab_2
(
@myId int
)
returns @t table
(
[ID] [ int ] NOT NULL ,
[Oid] [ int ] NOT NULL ,
[Login] nvarchar NOT NULL ,
[Rtx] nvarchar NOT NULL ,
[ Name ] nvarchar NOT NULL ,
[ Password ] nvarchar NULL ,
[State] nvarchar NOT NULL
)
as
begin
insert into @t select * from ST_User where ID<@myId
return
end

--调用表值函数
select * from dbo.FUNC_UserTab_1(15)
--调用标量值函数
declare @s int
set @s=dbo.FUNC_Sum1(100,50)
print @s

--删除标量值函数
drop function FUNC_Sum1
谈谈自定义函数与存储过程的区别:
一、自定义函数:
  1. 可以返回表变量
  2. 限制颇多,包括
    不能使用output参数;
    不能用临时表;
    函数内部的操作不能影响到外部环境;
    不能通过select返回结果集;
    不能update,delete,数据库表;
  3. 必须return 一个标量值或表变量
  自定义函数一般用在复用度高,功能简单单一,争对性强的地方。
二、存储过程
  1. 不能返回表变量
  2. 限制少,可以执行对数据库表的操作,可以返回数据集
  3. 可以return一个标量值,也可以省略return
   存储过程一般用在实现复杂的功能,数据操纵方面。


SqlServer存储过程--实例
实例1:只返回单一记录集的存储过程。
  表银行存款表(bankMoney)的内容如下

Id
userID
Sex
Money
001
Zhangsan

30
002
Wangwu

50
003
Zhangsan

40

要求1:查询表bankMoney的内容的存储过程
create procedure sp_query_bankMoney
as
select * from bankMoney
go
exec sp_query_bankMoney
注* 在使用过程中只需要把T-Sql中的SQL语句替换为存储过程名,就可以了很方便吧!
实例2(向存储过程中传递参数):
加入一笔记录到表bankMoney,并查询此表中userID= Zhangsan的所有存款的总金额。
Create proc insert_bank @param1 char(10),@param2 varchar(20),@param3 varchar(20),@param4 int,@param5 int output
with encryption ---------加密
as
insert into bankMoney (id,userID,sex,Money)
Values(@param1,@param2,@param3, @param4)
select @param5=sum(Money) from bankMoney where userID='Zhangsan'
go
在SQL Server查询分析器中执行该存储过程的方法是:
declare @total_price int
exec insert_bank '004','Zhangsan','男',100,@total_price output
print '总余额为'+convert(varchar,@total_price)
go
在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容):
1.以Return传回整数
2.以output格式传回参数
3.Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。
实例3:使用带有复杂 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
实例4:使用带有参数的简单过程
  CREATE PROCEDURE au_info
@lastname varchar(40),
@firstname varchar(20)
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
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'

实例5:使用带有通配符参数的简单过程
CREATE PROCEDURE au_info2
@lastname varchar(30) = 'D%',
@firstname varchar(18) = '%'
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
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%'
  = 'proc2'
实例6:if...else
存储过程,其中@case作为执行update的选择依据,用if...else实现执行时根据传入的参数执行不同的修改.
--下面是if……else的存储过程:
if exists (select 1 from sysobjects where name = 'Student' and type ='u' )
drop table Student
go

if exists (select 1 from sysobjects where name = 'spUpdateStudent' and type ='p' )
drop proc spUpdateStudent
go

create table Student
(
fName nvarchar (10),
fAge
smallint ,
fDiqu varchar (50),
fTel int
)
go

insert into Student values ('X.X.Y' , 28, 'Tesing' , 888888)
go

create proc spUpdateStudent
(
@fCase int ,
@fName nvarchar (10),
@fAge smallint ,
@fDiqu varchar (50),
@fTel int
)
as
update Student
set fAge = @fAge, -- 传 1,2,3 都要更新 fAge 不需要用 case
fDiqu = (case when @fCase = 2 or @fCase = 3 then @fDiqu else fDiqu end ),
fTel = (case when @fCase = 3 then @fTel else fTel end )
where fName = @fName
select * from Student
go

-- 只改 Age
exec spUpdateStudent
@fCase = 1,
@fName = N'X.X.Y' ,
@fAge = 80,
@fDiqu = N'Update' ,
@fTel = 1010101

-- 改 Age 和 Diqu
exec spUpdateStudent
@fCase = 2,
@fName = N'X.X.Y' ,
@fAge = 80,
@fDiqu = N'Update' ,
@fTel = 1010101

-- 全改
exec spUpdateStudent
@fCase = 3,
@fName = N'X.X.Y' ,
@fAge = 80,
@fDiqu = N'Update' ,
@fTel = 1010101

时间: 2024-09-23 19:07:51

关于sql server查询语句的写法。的相关文章

sql-【SQL求助】用SQL Server查询语句中,IN 的使用问题。

问题描述 [SQL求助]用SQL Server查询语句中,IN 的使用问题. 我想查询一辆车在一个月内的记录.于是编写了如下代码: select * from 北京车辆能耗数据.dbo.北京朝批商贸股份有限公司 where ( [列 0] in ('京AC3537') and CAST ([列 2] as datetime)>'2013/11/1 00:00:00' and CAST ([列 2] as datetime)<'2013/12/1 00:00:00' ) order by CAS

SQL Server查询语句运行指标值监测学习总结

前言 上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤.筛选条件分析.索引项优化等信息. 本篇我们分析在我们运行的过程中几个关键指标值的检测. 通过这些指标值来分析语句的运行问题,并且分析其优化方式. 通过本篇我们可以学习到调优中经常利用的几个利器! 废话少说,开始本篇的正题. 技术准备 数据库版本为SQL Server2008R2,利用微软的一个更简洁的案例库(Northwind)进行分析. 利器一.IO统计 通过这个IO统计能为我们分析出当前查询语句所要扫描的数据页的

SQL Server查询语句的使用

一.简单查询 简单的Transact-SQL查询只包括选择列表.FROM子句和WHERE子句.它们分别说明所查询列.查询的表或视图.以及搜索条件等.例如,下面的语句查询testtable表中姓名为"张三"的nickname字段和email字段.SELECT nickname,emailFROM testtableWHERE name=张三(一)选择列表 选择列表(select_list)指出所查询列,它可以是一组列名列表.星号.表达式.变量(包括局部变量和全局变量)等构成.1.选择所有

关于SQL Server查询语句的使用_MsSql

一.查询第二个字母是t或者a的雇员的全部信息 复制代码 代码如下:  select * from employees where firstname like '_[t,a]%' 注意:在sql中%表示字符串,所以不可像matlab一样用其注释,两个双斜线好像也不行,/**/可以,有网友说sql单行注释为-- 二.更改字段名 复制代码 代码如下:  select '名字' = firstname ,'姓氏' = lastname from employees  where firstname l

SQL Server查询语句

1.查询第二个字母是t或者a的雇员的全部信息 1 select * 2 from employees 3 where firstname like '_[t,a]%' 注意:在sql中%表示字符串,所以不可像matlab一样用其注释,两个双斜线好像也不行,/**/可以,有网友说sql单行注释为-- 2.更改字段名 1 select '名字' = firstname ,'姓氏' = lastname 2 from employees 3 where firstname like '_[t,a]%'

关于SQL Server查询语句的使用

一.查询第二个字母是t或者a的雇员的全部信息复制代码 代码如下: select * from employees where firstname like '_[t,a]%' 注意:在sql中%表示字符串,所以不可像matlab一样用其注释,两个双斜线好像也不行,/**/可以,有网友说sql单行注释为-- 二.更改字段名复制代码 代码如下: select '名字' = firstname ,'姓氏' = lastname from employees  where firstname like

SQL Server查询语句过滤重复的数据

  情况一:表中存在完全重复的的数据,即所有字段内容都是相同的 create table # (用户ID int, 姓名 varchar(10), 年龄 int ) insert into # select 111, '张三', 26 union all select 222, '李四', 25 union all select 333, '王五', 30 union all select 111, '张三', 26 方法: select distinct * from # 情况2:表中存在部分

sql server 查询记录平均值及并排序 的语句

sql server 查询记录平均值及并排序 的语句 查询学生的平均成绩并进行排名,sql 2000用子查询完成,分平均成绩重复时保留名次空缺和不保留名次空缺两种. select t1.* , px = (select count(1) from (   select m.S# [学生编号] ,          m.Sname [学生姓名] ,          isnull(cast(avg(score) as decimal(18,2)),0) [平均成绩]   from Student

SQL Server 查询分析器快捷键集合

下表列出 SQL Server 查询分析器提供的所有键盘快捷方式. 活动 快捷方式 书签:清除所有书签. CTRL-SHIFT-F2 书签:插入或删除书签(切换). CTRL+F2 书签:移动到下一个书签. F2 功能键 书签:移动到上一个书签. SHIFT+F2 取消查询. ALT+BREAK 连接:连接. CTRL+O 连接:断开连接. CTRL+F4 连接:断开连接并关闭子窗口. CTRL+F4 数据库对象信息. ALT+F1 编辑:清除活动的编辑器窗格. CTRL+SHIFT+DEL 编