关于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列,列名为:列车车次、起点站、终点站。
有没有大神能帮帮我,急用啊!

22个回答

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

qq_29460785
五七一 谢谢你的解答
3 年多之前 回复

例如,下面的语句创建了一个名为 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 修改已经建立的表是很困难的。

八、自定义函数
  函数的分类:
    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

devmiao
见了你女王大人喵姐还不跪下 回复五七一: 采纳以后我还可以给你一些资料呢
3 年多之前 回复
qq_29460785
五七一 呵呵
3 年多之前 回复
devmiao
见了你女王大人喵姐还不跪下 回复五七一: 如果我的回答对你有帮助,请采纳下。
3 年多之前 回复
qq_29460785
五七一 你有病是吧?
3 年多之前 回复

sql server 2000 查询语句
   下面都是sql server 中的查询语句,但大多数是通用于数据库的,特别是sqlite
drop table spname
create table spname
(table1 int primary key , myname nvarchar(4) , age int , date datetime)
insert into spn......
答案就在这里:sql server 查询语句
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

SQL 查询语句大全集锦 一、 简单查询 简单的 Transact-SQL 查询只包括选择列表、FROM 子句和 WHERE 子句。它们分别说明所查询列、查询的 表或视图、以及搜索条件等。 例如,下面的语句查询 testtable 表中姓名为“张三”的 nickname 字段和 email 字段。 代码:SELECT nickname,emailFROM testtableWHERE name='张三' (一) 选择列表 选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全 局变量)等构成。 1、选择所有列 例如,下面语句显示 testtable 表中所有列的数据: 代码:SELECT * FROM testtable 2、选择部分列并指定它们的显示次序 查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 例如: 代码:SELECT nickname,email FROM testtable 3、更改列标题 在选择列表中,可重新指定列标题。定义格式为: 列标题=列名 列名 列标题 如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 标题: 代码:SELECT 昵称=nickname,电子邮件=email 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 时 应 FROM testtable 使用下面语句格式加以限定: 代码: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.cityidSELECT 不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果 集合中查询数据。 例如: 代码: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 子句可包括各种条件运算符: 比较运算符(大小比较):>、>=、=、、!>、!=10 AND age 代码: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 type SQL 核心语句(非常实用的几个技巧) _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’) 注意 你可以使用 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’) [code] [code]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 语句。

例子: 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)

共22条数据 1 3 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
一个很纠结的查询语句写法?
-
关于SQL server查询语句的问题
-
关于sql server 2005 查询语句的问题
-
关于sql server sql语句跟踪问题
-
SQL查询语句的写法与优化
-
sql server 的语句统计外包人员出勤时间
-
【SQL求助】用SQL Server查询语句中,IN 的使用问题。
-
关于SQL SERVER如何获取执行过的语句
-
jsp动态SQL语句的写法
-
sql server语句如何转化为oracle语句
-
关于SQL server语句查询统计问题
-
sql server 查询语句。。。。
-
.net+SQL server开发程序的SQL语句的跟踪器
-
sql server查询语句该怎么写,具体要求如下
-
sqlserver查询数据库权限的sql语句
-
sql server manager 里面的edit top 200 rows对应的sql语句是什么
-
sql server同一条sql查询语句,在我本地库里执行特别慢,但是在服务器上速度非常快为什么
-
把oracle start with 转为 sql server with语句,创建视图不成功
-
学会了这些技术,你离BAT大厂不远了
每一个程序员都有一个梦想,梦想着能够进入阿里、腾讯、字节跳动、百度等一线互联网公司,由于身边的环境等原因,不知道 BAT 等一线互联网公司使用哪些技术?或者该如何去学习这些技术?或者我该去哪些获取这些技术资料?没关系,平头哥一站式服务,上面统统不是问题。平头哥整理了 BAT 等一线大厂的必备技能,并且帮你准备了对应的资料。对于整理出来的技术,如果你掌握的不牢固,那就赶快巩固,如果你还没有涉及,现在...
程序员真是太太太太太有趣了!!!
网络上虽然已经有了很多关于程序员的话题,但大部分人对这个群体还是很陌生。我们在谈论程序员的时候,究竟该聊些什么呢?各位程序员大佬们,请让我听到你们的声音!不管你是前端开发...
史上最详细的IDEA优雅整合Maven+SSM框架(详细思路+附带源码)
网上很多整合SSM博客文章并不能让初探ssm的同学思路完全的清晰,可以试着关掉整合教程,摇两下头骨,哈一大口气,就在万事具备的时候,开整,这个时候你可能思路全无 ~中招了咩~ ,还有一些同学依旧在使用eclipse或者Myeclipse开发,我想对这些朋友说IDEA 的编译速度很快,人生苦短,来不及解释了,直接上手idea吧。这篇文章每一步搭建过程都测试过了,应该不会有什么差错。本文章还有个比较优秀的特点,就是idea的使用,基本上关于idea的操作都算是比较详细的,所以不用太担心不会撸idea!最后,本文
知乎上 40 个有趣回复,很精辟很提神
点击蓝色“五分钟学算法”关注我哟加个“星标”,天天中午 12:15,一起学算法作者 |佚名来源 |网络整理,版权归原作者所有,侵删。1交朋友的标准是什么?- Ques...
武汉为什么进不了互联网第一梯队?
作者 |盛佳莹、张帆 本文经授权转自猎云网(ID:ilieyun) 从2011年以前双创在武汉萌芽,到现在力争互联网第四极,看武汉的互联网企业如何成长。 艰难中萌芽 2011年高考前夕,付小龙坐在宿舍里用人生第一台智能手机听广播,电台里正在讲述姚欣休学创业做出了用户量逾4亿的视频平台PPTV。 夜深人静时,仿佛有什么东西击中了付小龙的内心,“像姚欣一样‘开公司,...
我花了一夜用数据结构给女朋友写个H5走迷宫游戏
起因 又到深夜了,我按照以往在csdn和公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满! 而女朋友时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,有啥作用。而我答道:能干事情多了,比如写个迷宫小游戏啥的! 当我码完字准备睡觉时:写不好别睡觉! 分析 如果用数据结构与算法造出东西来呢? ...
别再翻了,面试二叉树看这 11 个就够了~
写在前边 数据结构与算法: 不知道你有没有这种困惑,虽然刷了很多算法题,当我去面试的时候,面试官让你手写一个算法,可能你对此算法很熟悉,知道实现思路,但是总是不知道该在什么地方写,而且很多边界条件想不全面,一紧张,代码写的乱七八糟。如果遇到没有做过的算法题,思路也不知道从何寻找。面试吃了亏之后,我就慢慢的做出总结,开始分类的把数据结构所有的题型和解题思路每周刷题做出的系统性总结写在了 Github...
接班马云的为何是张勇?
上海人、职业经理人、CFO 背景,集齐马云三大不喜欢的张勇怎么就成了阿里接班人? 作者|王琳 本文经授权转载自燃财经(ID:rancaijing) 9月10日,张勇转正了,他由阿里巴巴董事局候任主席正式成为阿里巴巴董事局主席,这也意味着阿里巴巴将正式开启“逍遥子时代”。 从2015年接任CEO开始,张勇已经将阿里巴巴股价拉升了超过200%。但和马云强大的个人光环比,张勇显得尤其...
让程序员崩溃的瞬间(非程序员勿入)
今天给大家带来点快乐,程序员才能看懂。 来源:https://zhuanlan.zhihu.com/p/47066521 1. 公司实习生找 Bug 2.在调试时,将断点设置在错误的位置 3.当我有一个很棒的调试想法时 4.偶然间看到自己多年前写的代码 5.当我第一次启动我的单元测试时 ...
用Python分析2000款避孕套,得出这些有趣的结论
到现在为止,我们的淘宝教程已经写到了第四篇,前三篇分别是: 第一篇:Python模拟登录淘宝,详细讲解如何使用requests库登录淘宝pc端。 第二篇:淘宝自动登录2.0,新增Cookies序列化,教大家如何将cookies保存起来。 第三篇:Python爬取淘宝商品避孕套,教大家如何爬取淘宝pc端商品信息。 今天,我们来看看淘宝系列的第四篇 我们在上一篇的时候已经将淘宝数据爬取下来了,...
IPv6 带来的反欺诈难题,程序员该如何破解?
作者 |威胁猎人 本文转载自威胁猎人(ID:ThreatHunter) IP是互联网最基础的身份标识,也是黑灰产业发展不可或缺的底层资源支撑。如果说IPv4是一颗星球,那IPv6就是一整个宇宙,它的地址空间接近无限。本文将揭露目前黑灰产对IPv6资源的利用情况,并剖析在IPv4向IPv6升级的过程中,业务场景下的安全将面临的挑战。 黑灰产采用IPv6发起攻击的趋势不可逆转...
分享靠写代码赚钱的一些门路
作者 mezod,译者 josephchang10如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。今天给大家分享一个精彩...
技术人员要拿百万年薪,必须要经历这9个段位
很多人都问,技术人员如何成长,每个阶段又是怎样的,如何才能走出当前的迷茫,实现自我的突破。所以我结合我自己10多年的从业经验,总结了技术人员成长的9个段位,希望对大家的职...
面试官:兄弟,说说基本类型和包装类型的区别吧
Java 的每个基本类型都对应了一个包装类型,比如说 int 的包装类型为 Integer,double 的包装类型为 Double。基本类型和包装类型的区别主要有以下 4 点。
C语言这么厉害,它自身又是用什么语言写的?
这是来自我的星球的一个提问:“C语言本身用什么语言写的?”换个角度来问,其实是:C语言在运行之前,得编译才行,那C语言的编译器从哪里来? 用什么语言来写的?如果是用C语...
面试官,不要再问我三次握手和四次挥手
三次握手和四次挥手是各个公司常见的考点,也具有一定的水平区分度,也被一些面试官作为热身题。很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了。 见过比较典型的面试场景是这样的: 面试官:请介绍下三次握手 求职者:第一次握手就是客户端给服务器端发送一个报文,第二次就是服务器收到报文之后,会应答一个报文给客户端,第三次握手就是客户端收到报文后再给服务器发送一个报文,三次握手就...
一些实用的GitHub项目
最近整理了一些在GitHub上比较热门的开源项目关于GitHub,快速了解请戳这里其中涵盖了:学习教程,面试总结,实用工具,框架,机器学习等东西比较杂,要学的东西也比较多...
八大排序(C语言)
void BubbleSort();//冒泡 void SelectSort();//选择 void InsertSort();//直接插入 void ShellSort();//希尔 void HeapSort();//堆排 void QuickSort();//快排 void MegerSort();//归并 void RadixSort();//基数(桶排序) 冒泡: 1)...
为什么说 Web 开发永远不会退出历史舞台?
早在 PC 崛起之际,Web 从蹒跚学步一路走到了主导市场的地位,但是随着移动互联网时代的来临,业界曾有不少人猜测,“Web 应该被杀死,App 才是未来”。不过时间是检...
动画:用动画给面试官解释 TCP 三次握手过程
作者 | 小鹿 来源 | 公众号:小鹿动画学编程 写在前边 TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐。 对于这部分掌握以及 TCP 的四次挥手,小鹿将会以动画的形式呈现给每个人,这样将复杂的知识简单化,理解起来也容易了很多,尤其对于一个初学者来说。 学习导图 一、TCP 是什么? TCP(Transmissio...
500行代码,教你用python写个微信飞机大战
这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。 帮助蹲厕族、YP族、饭圈女孩在无聊之余可以有一样东西让他们振作起来!让他们的左手 / 右手有节奏有韵律的朝着同一个方向来回移动起来! 这是史诗级的发明,是浓墨重彩的一笔,是…… 在一阵抽搐后,我结束了游戏,瞬时觉得一切都索然无味,正在我进入贤者模式时,突然想到,如果我可以让更多人已不同的方式体会到这种美轮美奂的感觉岂不美哉? 所以我打开电脑,创建了一个 `plan_game.py`……
2019诺贝尔经济学奖得主:贫穷的本质是什么?
2019年诺贝尔经济学奖,颁给了来自麻省理工学院的 阿巴希·巴纳吉(Abhijit Vinayak Banerjee)、艾丝特·杜芙若(Esther Duflo)夫妇和哈...
相关热词 c#sdf数据库连接 c# 使用配置文件 c#float 转int c#报警指示灯 c#复制二维数组 c# 歌词滚动 c#获取数据库一列数据 c#中parse用法 c#异步编程是什么意思 c#验证手机号正则