功能和语句
都那些?

问题补充:包括授权、创建索引、查询等等。。

列下都那些,加上语句。。。

一、 简单查询
简单的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 别名
表名 别名

(二) 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
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 .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.usernae=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 Server 2000做数据库。



音乐歌曲数据库:
电脑中有许多音乐歌曲文件,由于太多,查找起来困难,设计一个数据库,把他们管理起来,要求能按各种方式查找音乐歌曲,如:艺术家方式、唱片公司方式、音乐歌曲名称等。

问题补充:要求要多张表、只用SQL Server 2000做。不用做界面~

一个表就够啦

create table mymusic( 
m_id int primary key clustered identity(1,1), 
m_name varchar(200),--歌曲名 
m_file varchar(2000),--文件路径 
m_artist varchar(200),--艺术家 
m_company varchar(200),--公司 
m_intro text--其他介绍 
) 
go 
create index search_by_name on mymusic(m_name) 
go


搜索方式太多,效率肯定会降低很多,但是如果是你自己用,数据量不多(不超过50万行记录),就无所谓了,所有查询会在0.2秒内搞定,你感觉不到延迟的(除非你用386)
你可以用vb做个界面,搜索用

++++

Sql查询中 Join On 小结


作者:瑞德森

  
  SQL中大概有这么几种JOIN:
  cross join
  inner join
  left outer join
  right outer join
  full outer join
  
  他们都是基于cross join(笛卡尔乘积),举例说明
  
  A_test表
   Id a_name a_describe
   1 a11111 a11111
  2 a22222 a22222
  3 a33333 a33333
  B_test表
   Id b_name b_describe
   1 b11111 01
   1 b11111 02
  2 b22222 01
  2 b22222 02
  3 b44444 04
  select * from a_test a //查询出所有a表中的所有记录 3条
  select * from b_test b //查询出所有b表中的所有记录 5条
  
  select * from a_test a cross join b_test b //a b 两表的笛卡尔乘积 即所有的组合 共15条记录
  结果:
  1 a11111 a111111 1 b11111 01
  1 a11111 a111111 1 b11111 02
  1 a11111 a111111 2 b22222 01
  1 a11111 a111111 2 b22222 02
  1 a11111 a111111 4 b44444 01
  2 a22222 a222222 1 b11111 01
  2 a22222 a222222 1 b11111 02
  2 a22222 a222222 2 b22222 01
  2 a22222 a222222 2 b22222 02
  2 a22222 a222222 4 b44444 01
  3 a33333 a333333 1 b11111 01
  3 a33333 a333333 1 b11111 02
  3 a33333 a333333 2 b22222 01
  3 a33333 a333333 2 b22222 02
  3 a33333 a333333 4 b44444 01
  1 a11111 a111111 1 b11111 01
  1 a11111 a111111 1 b11111 02
  1 a11111 a111111 2 b22222 01
  1 a11111 a111111 2 b22222 02
  1 a11111 a111111 4 b44444 01
  2 a22222 a222222 1 b11111 01
  2 a22222 a222222 1 b11111 02
  2 a22222 a222222 2 b22222 01
  2 a22222 a222222 2 b22222 02
  2 a22222 a222222 4 b44444 01
  3 a33333 a333333 1 b11111 01
  3 a33333 a333333 1 b11111 02
  3 a33333 a333333 2 b22222 01
  3 a33333 a333333 2 b22222 02
  3 a33333 a333333 4 b44444 01
  select * from a_test a inner join b_test b on a.id = b.id
  //在笛卡尔乘积的结果集中去掉不符合连接条件的行 包含于笛卡尔乘积
  结果:
  1 a11111 a111111 1 b11111 01
  1 a11111 a111111 1 b11111 02
  2 a22222 a222222 2 b22222 01
  2 a22222 a222222 2 b22222 02
  1 a11111 a111111 1 b11111 01
  1 a11111 a111111 1 b11111 02
  2 a22222 a222222 2 b22222 01
  2 a22222 a222222 2 b22222 02
  select * from a_test a left outer join b_test b on a.id = b.id
  //是在inner join的结果集上加上左面表中没被选上的不相等的记录,不包含于笛卡尔乘积
  //行的右表部分每个字段都用NUll填充
  结果:
  1 a11111 a111111 1 b11111 01
  1 a11111 a111111 1 b11111 02
  2 a22222 a222222 2 b22222 01
  2 a22222 a222222 2 b22222 02
  3 a33333 a333333 NULL NULL NULL
  select * from a_test a right join b_test b on a.id = b.id
  //是在inner join的结果集上加上右面表中没被选上的不相等的记录,不包含于笛卡尔乘积
  //行的左表部分每个字段都用NUll填充
  1 a11111 a111111 1 b11111 01
  1 a11111 a111111 1 b11111 02
  2 a22222 a222222 2 b22222 01
  2 a22222 a222222 2 b22222 02
  NULL NULL NULL 4 b44444 01
  select * from a_test a full outer join b_test b on a.id = b.id
  //是在inner join的结果集上加上左、右两面表中没被选上的不相等的记录,不包含于笛卡尔乘积
  //行的右、左表两部分每个字段都用NUll填充
  1 a11111 a111111 1 b11111 01
  1 a11111 a111111 1 b11111 02
  2 a22222 a222222 2 b22222 01
  2 a22222 a222222 2 b22222 02
  NULL NULL NULL 4 b44444 01
  3 a33333 a333333 NULL NULL NULL
  
  ******必须指出:
  《1》Inner Join是笛卡尔乘积完整的一部分;但Left Join和Right Join并不是笛卡尔乘积的完整一部分,他们只是包含笛卡尔乘积中InnerJoin那部分;笛卡尔乘积中并没有Null值的那部分记录。
  《2》他们的否定语句” !=”的结果,即select * from a_test a inner join b_test b on a.id != b.id
  
  select * from a_test a left outer join b_test b on a.id != b.id
  
  select * from a_test a right join b_test b on a.id != b.id
  
  select * from a_test a full outer join b_test b on a.id != b.id
  
  都是笛卡尔乘积(cross join)去除Inner Join的结果。11条记录
  
  相当于笛卡尔乘积去除了left outer join与自身的交集(其实就是Inner Join结果),就是left outer join的否定部分。
  
  结果:
  2 a22222 a222222 1 b11111 01
  3 a33333 a333333 1 b11111 01
  2 a22222 a222222 1 b11111 02
  3 a33333 a333333 1 b11111 02
  1 a11111 a111111 2 b22222 01
  3 a33333 a333333 2 b22222 01
  1 a11111 a111111 2 b22222 02
  3 a33333 a333333 2 b22222 02
  1 a11111 a111111 4 b44444 01
  2 a22222 a222222 4 b44444 01
  3 a33333 a333333 4 b44444 01
  《3》多个表可以用 select * from table1 left join table2 on 条件1 left join table3 on 条件2 left join table4 on 条件3 where 条件4 的形式写。
  
  
  
  总结:
  CrossJoin结果集合:笛卡尔乘积A
  InnerJoin结果集合:B
  LeftJoin结果集合:C
  RightJoin结果集合:D
  FullJoin 结果集合:E
  则A不等于B+C+D+E。 B真包含于A 、C、D、E,A 、C、D、E等于B加上Null的记录。C、D、E不包含于A。C、D、E的否定都等于A减去B,或说都等于A减去A于他们的交集。
   +++

SQL经典语句

Posted on 2007-09-13 19:46 Figo Chen 阅读(21) 评论(0)  编辑  收藏 所属分类: SQL2000 SQL Server 基本语言 sql server基本语句和功能_SQL Server 基本语言

  1. 说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    方法一:select * into b from a where 1<>1
    方法二:select top 0 * into b from a
    注意:复制的新表中的所有字段都将没有默认值,即使源表中有设默认值
  2. 说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
  3. 说明:显示文章、提交人和最后回复时间
    select a.title,a.username,b.adddate from a,(select max(adddate) adddate from table,a where table.title=a.title) b
  4. 说明:两张关联表,删除主表中在副表中没有的信息
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
    注意:
    若将
    select * from table2 where table1.field1=table2.field1
    改为
    select * from table1,table2 where table1.field1=table2.field1
    多了一个table1
    则删除不成功
  5. 说明:日程安排提前五分钟提醒 
    select * from 日程安排 where datediff(mi,开始时间,getdate())>5
  6. 说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
  7. 说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
  8. 说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a from tableC)
  9. 说明:随机取出10条数据
    select top 10 * from tablename order by newid()
  10. 说明:随机选择记录
    select newid()
  11. 说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
  12. 说明:列出数据库里所有的表名
    select name from sysobjects where type='U'
  13. 说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')
  14. 使用SQL语句 用...代替过长的字符串显示
    语法:
    SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
    Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;
  15. --获得当月最后一天,时间全是0,如:2007-09-30 00:00:00.000
    select dateadd(dd,-1,dateadd(mm,datediff(mm,0,dateadd(mm,1,getdate())),0))
    --获得当月最后一天,时间为当前时间,如:2007-09-30 12:07:37.030
    select dateadd(dd,-1,dateadd(mm,1,getdate()-day(getdate())+1))
    --获得当月天数,如:30
    select datediff(dd,getdate()-day(getdate())+1,dateadd(mm,1,getdate()-day(getdate())+1))
    +++
  16. Access2000 使用SQL语句联接表2007-10-20 19:31

使用SQL语句联接表

  在SQL中,很多威力都来自于将几个表或查询中的信息联接起来,并将结果显示为单个逻辑记录集的能力。在这种联接中包括INNER、LEFT、RIGHT这三种JOIN操作。
  首先我们来讲讲INNER JOIN 的用法:INNER JOIN 语句可以用来组合两个表中的记录,只要在公共字段之中有相符的值即可,在语法上,INNER JOIN 是这样定义的。

  举个例子:我们现在要将“图书资料表”和“出版社资料表”联接起来,然后列出出版社所出的图书。让我们先看看这两个表,



  然后在SQL设计视图中输入以下内容

  现在我们执行这个SQL语句,

  发现现在的查询结果将所有出版社和图书都列了出来。
  这个查询好像也可以用下面的语句来实现。

  将两个查询都切换到数据表视图后我们会发现两个查询的查询结果虽然一样,但在使用INNER JOIN操作的查询中可以添加新的数据。就像在表中添加数据一样。而没有使用INNER JOIN 操作的查询就不能添加新数据,相比之下使用INNER JOIN操作的查询更像将两个具有相关内容的表联接在一起新生成的表。
  知道了它的用处,我们来看看LEFT JOIN 的结构:
FROM [表名1] LEFT JOIN [表名2]
ON [表名1.字段A] 〈关系运算符〉[表名2.字段B]
  其实LEFT JOIN 的功能就是将LEFT左边的表名1中的所有记录全部保留,而将右边的表名2中的字段B与表名1.字段A相对应的记录显示出来。而RIGHT JOIN 和LEFT JOIN 相反。
  所以刚才的那个例子还可以写成:

  单击工具栏上的“执行”按钮,我们看到这时显示的数据表和刚才显示的用LEFT JOIN 的数据表一样。现在看出来了吧,原来它们的功能是可以互换的。

  如果想将几个表联接起来,在JOIN操作中我们可以进行嵌套操作,有三个表:表1、表2、表3,现在将三个表联接起来:
FROM (表1 INNER JOIN 表2 ON 表1.序号=表2.序号)
INNER JOIN 表3
ON 表1.序号=表3.序号
  这样这三个表就联接起来了。



ACCESS中的"Case...When" 用iif()函数   
    
    例如:     select     iif(aa="a","字母a",iif(aa="b","字母b,"其他"))     from     表