sql语句之深入学习

规律:数字不用单引号,字符用单引号

选择

1.       假设有一个名为email_table 的表,包含名字和地址两个字段,要得到Bill Gates e_mail地址,你可以使用下面的查询:

SELECT email from email_table WHERE name=Bill Gates

 

2.       前面说过,查询可以在查询条件中包含逻辑运算符。假如你想读取Bill Gates Clinton总统的所有email地址,你可以使用下面的查询语句:

SELECT  email  FROM  email_table  WHERE  name=Bill Gates OR name=president  Clinton

(select name,email,[add] from name  where name='zhd') 单词不完整时,默认加[ ]

 

3.       你可以在一个SELECT语句中一次取出多个字段,比如:

SELECT au_fname ,au_lname, phone FROM authors

SELECT语句中,你需要列出多少个字段,你就可以列出多少。不要忘了把字段名用逗号隔开。你也可以用星号(*)从一个表中取出所有的字段。这里有一个使用星号的例子:

SELECT  *  FROM  authors

(SELECT  *  FROM  NAME,NAME1)

 

4.       你也可以用一个SELECT语句同时从多个表中取出数据,只需在SELECT语句的FROM从句中列出要从中取出数据的表名称即可:

SELECT  au_name,title FROM authors,titles,titleauthor

WHERE  authors.au_id=titleauthor.au_id

AND  titles.title_id=titleauthor.title_id

 

5.       要指明表titles和表publishers之间的关系,你只要让这两个表有一个公共的字段就可以了。在数据库pubs中,表titles和表publishers都有一个名为pub_id的字段。如果你想得到书名及其出版商的一个列表,你可以使用如下的语句:

SELECT  title,pub_name  FROM  titles,publishers

WHERE titles.pub_id=publishers.pub_id

 

6.       SELECT语句中,你可以在缺省字段名后面仅跟一个新名字来取代它。例如,可以用一个更直观易读的名字Author Last Name来代替字段名au_lname

SELECT au_lname Author Last Name FROM authors

当这个SELECT语句执行时,来自字段au_lname的值会与“Author Last Name”相联系。查询结果可能是这样:

      Author Last Name

      White

      Green

      Carson

      OLeary

      Straight

注意字段标题不再是au_lname,而是被Author Last Name所取代。

 

7.       如果你想把表titles中的所有书的价格加倍,你可以使用下面的SELECT语句:

SELECT  price*2 FROM titles      

当这个查询执行时,每本书的价格从表中取出时都会加倍。但是,通过这种途径操作字段不会改变存储在表中的书价。对字段的运算只会影响SELECT语句的输出,而不会影响表中的数据。为了同时显示书的原始价格和涨价后的新价格,你可以使用下面的查询:

SELECT  price  "Original  price", price*2  "New price" FROM  titles

当数据从表titles中取出时,原始价格显示在标题Original price下面,加倍后的价格显示在标题New price下面。结果可能是这样:

      original  price         new  price

19.99                                                           39.98

11.95                 23.90

2.99                                                              5.98

19.99                                                           39.98

19.100                                                        

8.       你可以使用大多数标准的数学运算符来操作字段值,如加(+),减(-),乘(*)和除(/)。你也可以一次对多个字段进行运算,例如:

SELECT  price*ytd_sales total revenue FROM titles

在这个例子中,通过把价格与销售量相乘,计算出了每种书的总销售额。这个SELECT语句的结果将是这样的:

      total  revenue

      81,859,05

      46,318,20

      55,978,78

      81,859,05

      40,619,68

     

最后,你还可以使用连接运算符(它看起来像个加号)来连接两个字符型字段:

SELECT  au_fname+ +au_lnameauthor name FROM authors

(Select au_fname+au_lnameauthor name from authors)

这个语句的执行结果将是这样的:

       author  names

       Johnson White

       Marjorie Green

       Cheryl  Carson

      Michael OLeary

      Dean Straight

     

      (23 row(s)  affected)

 

排序

通过使用ORDER BY子句,你可以强制一个查询结果按升序排列,就像这样:

SELECT au_lname FROM  authors

 ORDER  BY  au_lname

当这个SELECT语句执行时,作者名字的显示将按字母顺序排列。ORDER BY子句将作者名字按升序排列。

你也可以同时对多个列使用ORDER BY子句。例如,如果你想同时按升序显示字段au_lname和字段au_fname,你需要对两个字段都进行排序:

SELECT au_lname,au_fname FROM authors ORDER BY au_lname ,au_fname

这个查询首先把结果按au_lname字段进行排序,然后按字段au_fname排序。记录将按如下的顺序取出:

      au_lname                         au_fname

      …………………………………………………………………….

      Bennet                           Abraham

      Ringer                            Albert

      Ringer                            Anne

      Smith                             Meander

   

如果你想把查询结果按降序排列,你可以使用关键字DESC

SELECT  au_lname,au_fname  FROM authors

WHERE au_lname=Ringer  

ORDER BY  au_lname ,au_fname  DESC

这个查询从表authors中取出所有名字为Ringer的作者记录。ORDER BY子句根据作者的名字和姓,将查询结果按降序排列。结果是这样的:

      au_lname                          au_fname

      ……………………………………………………………………………………….

      Ringer                             Anne

      Ringer                             Albert

      (2 row(s)  affectec)

取出互不相同的值

一个表有可能在同一列中有重复的值。例如,数据库pubs的表authors中有两个作者的名字是Ringer。如果你从这个表中取出所有的名字,名字Ringer将会显示两次。

在特定情况下,你可能只有兴趣从一个表中取出互不相同的值。如果一个字段有重复的值,你也许希望每个值只被选取一次,你可以使用关键字DISTINCT来做到这一点:

SELCET  DISTINCT au_lname  FROM  authors   WHERE  au_lname=Ringer

 

警告:如同ORDER BY子句一样,强制服务器返回互不相同的值也会增加运行开销。不得不花费一些时间来完成这项工作。因此,不是必须的时候不要使用关键字DISTINCT

 

创建表

在查询窗口中键入下面的SQL语句,单击执行查询按钮,执行这个语句:

CREATE  TABLE  guestbook (visitor VARCHAR(40),comments TEXT,entrydate DATETIME)

                                        

删除表和修改表

1.  要删除一个表,你可以使用SQL语句DROP TABLE   

DROP TABLE mytable

警告:使用DROP TABLE命令时一定要小心。一旦一个表被删除之后,你将无法恢复它。

2.如果你想清除表中的所有数据但不删除这个表,你可以使用TRUNCATE TABLE语句。

TRUNCATE TABLE mytable

3.虽然你不能删除和修改已经存在的字段,但你可以增加新字段。

ALTER TABLE mytable ADD mynewcolumn INT NULL

注意:ALTER TABLE 只允许添加可包含空值或指定了 DEFAULT 定义的列。

 

索引(有待深入理解)

对于包含索引的数据库,SQL Sever需要一个可观的额外空间。例如,要建立一个聚簇索引,需要大约1.2倍于数据大小的空间。

索引有两种类型:聚簇索引和非聚簇索引。在聚簇索引中,索引树的叶级页包含实际的数据:记录的索引顺序与物理顺序相同。在非聚簇索引中,叶级页指向表中的记录:记录的物理顺序与逻辑顺序没有必然的联系。

聚簇索引非常象目录表,目录表的顺序与实际的页码顺序是一致的。非聚簇索引则更象书的标准索引表,索引表中的顺序通常与实际的页码顺序是不一致的。一本书也许有多个索引。例如,它也许同时有主题索引和作者索引。同样,一个表可以有多个非聚簇索引。

    通常情况下,你使用的是聚簇索引,但是你应该对两种类型索引的优缺点都有所理解。

    每个表只能有一个聚簇索引,因为一个表中的记录只能以一种物理顺序存放。通常你要对一个表按照标识字段建立聚簇索引。但是,你也可以对其它类型的字段建立聚簇索引,如字符型,数值型和日期时间型字段。

    从建立了聚簇索引的表中取出数据要比建立了非聚簇索引的表快。当你需要取出一定范围内的数据时,用聚簇索引也比用非聚簇索引好。例如,假设你用一个表来记录访问者在你网点上的活动。如果你想取出在一定时间段内的登录信息,你应该对这个表的DATETIME型字段建立聚簇索引。

    对聚簇索引的主要限制是每个表只能建立一个聚簇索引。但是,一个表可以有不止一个非聚簇索引。实际上,对每个表你最多可以建立249个非聚簇索引。你也可以对一个表同时建立聚簇索引和非聚簇索引。

    假如你不仅想根据日期,而且想根据用户名从你的网点活动日志中取数据。在这种情况下,同时建立一个聚簇索引和非聚簇索引是有效的。你可以对日期时间字段建立聚簇索引,对用户名字段建立非聚簇索引。如果你发现你需要更多的索引方式,你可以增加更多的非聚簇索引。

    非聚簇索引需要大量的硬盘空间和内存。另外,虽然非聚簇索引可以提高从表中取数据的速度,它也会降低向表中插入和更新数据的速度。每当你改变了一个建立了非聚簇索引的表中的数据时,必须同时更新索引。因此你对一个表建立非聚簇索引时要慎重考虑。如果你预计一个表需要频繁地更新数据,那么不要对它建立太多非聚簇索引。另外,如果硬盘和内存空间有限,也应该限制使用非聚簇索引的数量。

这两种类型的索引都有两个重要属性:你可以用两者中任一种类型同时对多个字段建立索引(复合索引);两种类型的索引都可以指定为唯一索引。

1.非聚簇索引:CREATE INDEX mycolumn_index ON mytable (myclumn)

注意:蓝色必填,索引名字

2.如果你需要改变一个索引的类型,你必须删除原来的索引并重建一个。建立了一个索引后,你可以用下面的SQL语句删除它:

DROP INDEX mytable.mycolumn_index

聚簇索引:可以使用关键字CLUSTERED

CREATE CLUSTERED INDEX mycolumn_clust_index ON mytable(mycolumn)

(旧版本:如果表中有重复的记录,当你试图用这个语句建立索引时,会出现错误。但是有重复记录的表也可以建立索引;你只要使用关键字ALLOW_DUP_ROW把这一点告诉SQL Sever即可:CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)

                     WITH ALLOW_DUP_ROW

3.要对一个表建立唯一索引,可以使用关键字UNIQUE。对聚簇索引和非聚簇索引都可以使用这个关键字。这里有一个例子:

CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)

4.要建立一个对多个字段的索引──复合索引──在索引建立语句中同时包含多个字段名。下面的例子对firstnamelastname两个字段建立索引:

CREATE INDEX name_index ON username(firstname,lastname)

 

添加 修改 删除数据

添加:向表中添加新记录

INSERT mytable (first_column,second_column,third_column)

        VALUES (some data,some more data,yet more data)

你可以使用INSERT语句向文本型字段中插入数据。但是,如果你需要输入很长的字符串,你应该使用WRITETEXT语句(旧版本)。

如果你在INSERT 语句中只指定两个字段和数据会怎么样呢?换句话说,你向一个表中插入一条新记录,但有一个字段没有提供数据。在这种情况下,有下面的四种可能:

1.如果该字段有一个缺省值,该值会被使用。

2.如果该字段可以接受空值,而且没有缺省值,则会被插入空值。

3.如果该字段不能接受空值,而且没有缺省值,就会出现错误。

4.最后,如果该字段是一个标识字段,那么它会自动产生一个新值。当你向一个有标识字段的表中插入新记录时,只要忽略该字段,标识字段会给自己赋一个新值。

向一个有标识字段的表中插入新记录后,你可以用SQL变量@@identity来访问新记录

的标识字段的值。考虑如下的SQL语句:

INSERT mytable (first_column) VALUES(some value)

INSERT anothertable(another_first,another_second)

         VALUES(@@identity,some value)

如果表mytable有一个标识字段,该字段的值会被插入表anothertableanother_first字段。这是因为变量@@identity总是保存最后一次插入标识字段的值。(查询最后一个)

注意:SET IDENTITY_INSERT 表名 Off ,当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'book' 中的标识列插入显式值。 

      SET IDENTITY_INSERT 表名 on, IDENTITY_INSERT 设置为 ON 时,必须指定表 'book' 中标识列的显式值。

删除:要从表中删除一个或多个记录,需要使用SQL DELETE语句。你可以给DELETE 语句提供WHERE 子句。WHERE子句用来选择要删除的记录。

DELETE mytable WHERE first_column=goodby OR second_column=so long

如果你不给DELETE 语句提供WHERE 子句,表中的所有记录都将被删除。如果你想删除应该表中的所有记录,应使TRUNCATE TABLE语句。当你使用TRUNCATE TABLE语句时,记录的删除是不作记录的。也就是说,这意味着TRUNCATE TABLE 要比DELETE快得多。

修改:要修改表中已经存在的一条或多条记录,应使用SQL UPDATE语句。同DELETE语句一样,UPDATE语句可以使用WHERE子句来选择更新特定的记录。

UPDATE mytable  SET  first_column=Updated!

                     Second_column=Updated!

                     Third_column=Updated!

                 WHERE first_column=Update Me1’

如果你不提供WHERE子句,表中的所有记录都将被更新。

注意:你可以对文本型字段使用UPDATE语句。但是,如果你需要更新很长的字符串,应使用UPDATETEXT语句。

 

Insertselectupdate

有一个方法可以使INSERT 语句一次添加多个记录。

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的记录才被拷贝。

如果你需要拷贝整个表,你可以使用SELECT  INTO 语句。

SELECT * INTO newtable FROM mytable

你也可以指定只有特定的字段被用来创建这个新表。

SELECT first_column INTO newtable

FROM mytable

WHERE second_column=Copy Me!

假设你想从一个表中删除一个字段。使用SELECT INTO 语句,你可以创建该表的一个拷贝,但不包含要删除的字段。这使你既删除了该字段,又保留了不想删除的数据。

如果你想改变一个字段的数据类型,你可以创建一个包含正确数据类型字段的新表。创建好该表后,你就可以结合使用UPDATE语句和SELECT 语句,把原来表中的所有数据拷贝到新表中。通过这种方法,你既可以修改表的结构,又能保存原有的数据。

 

其它常用表达式

1.假设你有一个表用来保存对你的站点进行民意调查的结果。现在你想向所有对你的站点的评价在710之间的访问者发送书面的感谢信。

SELECT username FROM opinion WHERE vote>6  and  vote<11

这个SELECT 语句会实现你的要求。你使用下面的SELECT 语句也可以得到同样的结果:

SELECT username FROM opinion WHERE vote BETWEEN 7 AND 10

2.现在假设你只想取出对你的站点投了1或者10的访问者的名字。要从表opinion中取出这些名字,你可以使用如下的SELECT 语句:

SELECT username FROM opinion WHERE vote=1 or vote=10

    这个SELECT语句会返回正确的结果,没有理由不使用它。但是,存在一种等价的方式。使用如下的SELECT可以得到相同的结果:

SELECT username FROM opinion WHERE vote IN (1,10)

注意表达式IN 的使用。这个SELECT 语句只取出vote的值等于括号中的值之一的记录。

3.你也可以使用IN来匹配字符数据。例如,假设你只想取出Bill GatesPresident Clinton的投票值。

SELECT vote FROM opinion  WHERE  username IN (Bill Gates,President Clinton)

4.你可以在使用BETWEENIN的同时使用表达式NOT。例如,要取出那些投票值不在710之间的人的名字,你可以使用如下的SELECT 语句:

SELECT username FROM opinion WHERE vote NOT BETWEEN 7 and 10

5.要选取那些某个字段的值不在一列值之中的记录,你可以同时使用NOT IN,如下例所示:

SELECT vote FROM opinion WHERE username NOT IN (Bill Gates,President Clinton)

 

下有附件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值