sql笔记

添加一条记录:insert Table() values()
修改一个记录:update Table set a='b'
删除一条记录:delete Table where a='b'
查询一条记录:select * from Table

组合查询实现对表的备份
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 newtable FROM TList
 
指定特定字段的拷贝
你也可以指定只有特定的字段被用来创建这个新表。要做到这一点,只需在字段列表中指定你想要拷贝的字段。另外,你可以使用WHERE 子句

来限制拷贝到新表中的记录。下面的例子只拷贝字段second_columnd的值等于’Copy Me!’的记录的first_column字段。
 
SELECT first_column INTO newtable
FROM mytable
WHERE second_column=’Copy Me!’

 

更新语句扩展
你可以对文本型字段使用UPDATE语句。但是,如果你需要更新很长的字符串,应使用UPDATETEXT语句。这部分内容对本书来说太高级了,因此

不加讨论。要了解更多的信息,请参考Microsoft SQL Sever

约束:order by 

多表查询:

select * a left  join b  on a.id=b.id //把a表的所有记录以及与a表关联的b表记录查询出来
select * a right join b  on a.id=b.id //把b表的所有记录以及与b表关联的a表记录查询出来

子查询
select * from Table1 where a in(select a from Table2 where Table2.id=2)

表示值位于二个之间:
select * from Table where a between c and d       //表示查询的值a位于c与d之间

模糊查询
select * from Table where Table.a like'%查询关键字%'

排序
select * from Talbe order by a DESC

统计
select Count(*) from Talbe

组合查询
select * from a,b where a.Id = b.Id

代理查询
select * from Talbe as a where a.id=12

新建数据库表
CREATE  TABLE  guestbook1 (visitor VARCHAR(40),comments TEXT,entrydate  DATETIME)

删除一个表
DROP TABLE guestbook


取出互不相同的两条记录
ELCET  DISTINCT au_lname  FROM  authors   WHERE  au_lname="Ringer"

数据库清空表
TRUNCATE TABLE mytable


给一个表增加一个字段
 alter table Tsex  add  good int null


缺省值DEFAULT 
 CREATE TABLE addresses (street VARCHAR(60)  NULL,
                               city VARCHAR(40) NULL,
                               state VARCHAR(20) NULL
                               zip  VARCHAR(20) NULL,
                               country VARCHAR(30) DEFAULT  ‘USA’)
 //建立表addresses 其中字段country的却省值为usa


给表定义一个索引
 CREATE INDEX ID_index ON TSex (ID)

 

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

DROP INDEX mytable.mycolumn_index

注意在DROP INDEX 语句中你要包含表的名字。在这个例子中,你删除的索引是mycolumn_index,它是表mytable的索引。


给表建立唯一索引
CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)

给表建立多个索引
CREATE INDEX name_index ON username(firstname,lastname)


集合函数
AVG 平均值
count(*) 统计个数
DISTINCT  不同的个数  //SELECT COUNT(DISTINCT au_lname) FROM authors 统计具有不同名字的个数
SUM() 字段求和 //SELECT SUM(purchase_amount) FROM orders
Max()  最大值  //SELECT MAX(vote) FROM opinion
MIN()  最小值  //SELECT MIN(vote) FROM opinion


从一定范围内取数据
方法一:ELECT username FROM opinion WHERE vote>6  and  vote<11
方法二:ELECT username FROM opinion WHERE vote BETWEEN 7 AND 10


取出不在某个范围内的值
你可以在使用BETWEEN或IN的同时使用表达式NOT。
例如,要取出那些投票值不在7到10之间的人的名字,你可以使用如下的SELECT 语句:
SELECT username FROM opinion WHERE vote NOT BETWEEN 7 and 10


取得1或者10,11或者更多的值 //这个比用and 方便多了
SELECT username FROM opinion WHERE vote IN (1,10,11)

要选取那些某个字段的值不在一列值之中的记录
你可以同时使用NOT 和IN,如下例所示:
SELECT vote FROM opinion
            WHERE username NOT IN (‘Bill Gates’,’President Clinton’)

把数据库里的字段在查出的时候进行类型的转换 并可以加入一定的字段
sELECT CONVERT(CHAR(8),VSex)+'US Dollars' FROM TSEx //把从表TSEx查出的字段vsex转换为char型并在查出的值后面加上us dollars字段
例:。例如,下面的语句在一个SELECT语句的查询结果中加入字符串’The vote is’,该SELECT语句返回一个BIT型字段的值:
SELECT ‘The vote is’+CONVERT(CHAR(1),vote) FROM opinion


果你不进行显式的转换,你会收到如下的错误信息:
Implicit conversion from datatype ‘varchar’ to ‘bit’ is not allowec.
Use the CONVERT function to run this query.

 

使用匹配查询

例1:在这个例子中使用了表达式[A-M],只取出那些首字母在A到M之间的站点。中括号([])用来匹配处在指定范围内的单个字符。要得到第

二页中显示的站点,应使用这个语句:

SELECT site_name FROM  site_directory
                 WHERE site_name LIKE ‘[N-Z]%’

例2:
果你想显示那些以A,B或C开头的站点,你可以用下面的查询来实现:
 
SELECT site_name FROM site_directory WHERE site_name LIKE  ‘[ABC]%’


例3:
你可以取出那些首字母在C到F之间,或者以字母Y开头的站点:

SELECT site_name FROM site_directory WHERE site_name LIKE ‘[C-FY]%’

例4:
,要得到那些名字不以Y开头的站点,你可以使用如下的查询:

SELECT site_name FROM site_directory WHERE site_name LIKE ‘[^Y]%’

例5:
下面这个查询返回每一个其名字的第二个字符为任何字母的站点:

SELECT site_name FROM site_directory WHERE site_name LIKE ‘M_crosoft’


注:如果你想匹配百分号或下划线字符本身,你需要把它们括在方括号中。如果你想匹配连字符(-)
,应把它指定为方括号中的第一个字符。如果你想匹配方括号,应把它们也括在方括号中。
例如,下面的语句返回所有其描述中包含百分号的站点:

    SELECT site_name FROM site_directory WHERE site_desc LIKE ‘%[%]%’

 

匹配发音


SELECT site_name FROM site_directory
                 WHERE DIFFERENCE(site_name , ‘Microsoft’>3

这个语句使用函数DEFFERENCE()来取得其名字的发音与Microsoft非常相似的站点。
函数DIFFERENCE()返回一个0到4之间的数字。如果该函数返回4,表示发音非常相近;
如果该函数返回0,说明这两个字符串的发音相差很大。
例如,上面的语句将返回站点名Microsoft和Macrosoft。这两个名字的发音与Microsoft都很相似。
如果你把上一语句中的大于3改为大于2,那么名为Zicrosoft和Megasoft的站点也将被返回
。最后,如果你只需要差别等级大于1即可,则名为Picosoft和Minisoft的站点也将被匹配。

 

 

删除空格
有两个函数,TTRIM()和LTRIM(),可以用来从字符串中剪掉空格。函数LTRIM()去除应该字符串前面的所有空格;函数RTRIM()去除一

个字符串尾部的所有空格。这里有一个任何使用函数RTRIM()的例子:

SELECT RTRIM(site_name) FROM site_directory

在这个例子中,如果任何一个站点的名字尾部有多余的空格,多余的空格将从查询结果中删去。
你可以嵌套使用这两个函数,把一个字符串前后的空格同时删去:

SELECT LTRIM(RTRIM(site_name) FROM site_directory


时间日期

返回当前日期和时间
通过函数GETDATE(),你可以获得当前的日期和时间


要得到不同格式的日期和时间,你需要使用函数CONVERT()。
例如,当下面的这个语句执行时,显示的时间将包括毫秒:
SELECT CONVERT(VARCHAR(30),GETDATE(),9)

表11.1  日期和时间的类型
类型值            标准             输出
   0                 Default           mon dd yyyy hh:miAM
   1                 USA               mm/dd/yy
   2                 ANSI              yy.mm.dd
   3                 British/French    dd/mm/yy
   4                 German            dd.mm.yy
   5                 Italian           dd-mm-yy
   6                 -                 dd mon yy
   7                 -                 mon dd,yy
   8                 -                 hh:mi:ss
9                     Default + milliseconds--mon dd yyyy
hh:mi:ss:mmmAM(or )
   10                USA              mm-dd-yy
   11                JAPAN            yy/mm/dd
   12                ISO              yymmdd
   13                Europe           Default + milliseconds--dd mon yyyy
                                       hh:mi:ss:mmm(24h)
   14                 -                hh:mi:ss:mmm(24h)

   类型0,9,和13总是返回四位的年。对其它类型,要显示世纪,把style值加上100。类型13和14返回24小时时钟的时间。类型0,7,和13返

回的月份用三位字符表示(用Nov代表November).

 

抽取日期和时间
在许多情况下,你也许只想得到日期和时间的一部分,而不是完整的日期和时间。例如,假设你想列出你的站点目录中每个站点被查询的月份

。这时你不希望完整的日期和时间把网页弄乱。为了抽取日期的特定部分,你可以使用函数DATEPART(),象这样:

SELECT site_name ‘Site Name’,
DATEPART(mm,site_entrydate) ‘Month Posted’ FROM site_directory

函数DATEPART()的参数是两个变量。第一个变量指定要抽取日期的哪一部分;第二个变量是实际的数据。在这个例子中,函数DATEPART()

抽取月份,因为mm代表月份。下面是这个SELECT 语句的输出结果:

Site Name                         Month Posted
………………………………………………………………
Yahoo                              2
Microsoft                          5
Magicw3                            5
(3 row(s) affected)

   Month Posted列显示了每个站点被查询的月份。函数DATEPART()的返回值是一个整数。你可以用这个函数抽取日期的各个不同部分,如表

11.2所示。

 


返回日期和时间范围:
要返回正确的记录,你需要适用日期和时间范围。有不止一种途径可以做到这一点。例如,下面的这个SELECT 语句将能返回正确的记录:

SELECT * FROM weblog
WHERE  entrydate>=”12/25/2000” AND entrydate<”12/26/2000”

这个语句可以完成任务,因为它选取的是表中的日期和时间大于等于12/25/2000 12:00:00:000AM并小于12/26/2000 12:00:00:000AM的记录。

换句话说,它将正确地返回2000年圣诞节这一天输入的每一条记录。
另一种方法是,你可以使用LIKE来返回正确的记录。通过在日期表达式中包含通配符“%”,你可以匹配一个特定日期的所有时间。这里有一

个例子:

SELECT * FROM weblog WHERE entrydate LIKE ‘Dec 25 2000%’

这个语句可以匹配正确的记录。因为通配符“%”代表了任何时间。
使用这两种匹配日期和时间范围的函数,你可以选择某个月,某一天,某一年,某个小时,某一分钟,某一秒,甚至某一毫秒内输入的记录。

但是,如果你使用LIKE 来匹配秒或毫秒,你首先需要使用函数CONVERT()把日期和时间转换为更精确的格式(参见前面“转换日期和时间”

一节)。

 


比较日期和时间
最后,还有两个日期和时间函数对根据日期和时间取出记录是有用的。使用函数DATEADD()和DATEDIFF(),你可以比较日期的早晚。例如,

下面的SELECT语句将显示表中的每一条记录已经输入了多少个小时:

SELECT entrydate ‘Time Entered’
DATEDIFF(hh,entrydate,GETDATE()) ‘Hours Ago’ FROM weblog

如果当前时间是2000年11月30号下午6点15分,则会返回如下的结果:

Time Entered                Hours Ago
…………………………………………………..
Dec 30 2000  4:09PM          2
Dec 30 2000  4:13PM          2
Dec 1 2000  4:09PM           698
(3 row(s) affected)

函数DADEDIFF()的参数是三个变量。第个变量指定日期的某一部分。在这个例子中,是按小时对日期进行比较,(要了解日期各部分的详细

内容,请参考表11.2)在日期2000年11月1日和2000年11月30日的指定时间之间有689个小时。另外两个参数是要进行比较的时间。为了返回一

个正数,较早的时间应该先给。
函数DATEADD()把两个日期相加。当你需要计算截止日期这一类的数据时,这个函数是有用处的。例如,假设访问者必须先注册才能使用你的

站点。注册以后,他们可以免费使用你的站点一个月。要确定什么时候他们的免费时间会用完,你可以使用如下的SELECT语句:

SELECT username ‘User Name’,
DATEADD(mm,1,firstvisit_date) ‘Registration Expires’
FROM registration_table

函数DATEADD()的参数有三个变量。第一个变量代表日期的某一部分(参见表11.2),这个例子用到了代表月份的mm。第二个变量指定了时间

的间隔――在本例中是一个月。最后一个变量是一个日期,在这个例子中,日期是取自DATETIME型字段firstvisit_date.假设当前日期是June

30,2000,这个语句将返回如下的内容:

User Name                         Registration Expires
……………………………………………………………………………
Bill Gates                        Jul 30 2000  4:09PM
President Clinton                 Jul 30 2000  4:13PM
William Shakespeare               Jul 1 2000  4:09PM
(3 row(s) affected)

注意:
与你预料的相反,使用函数DATEADD()把一个日期加上一个月,它并不加上30天。这个函数只简单地把月份值加1。这意味着在11月注册的人

将比在2月注册的人多得到2天或3天的时间。要避免这个问题,你可以用函数DATEADD()直接增加天数,而不是月份。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值