精灵巫婆 发表于 2015-1-16 22:34:33

MYSQL编程:SQL数据操纵基本(中级)10

这一切听起来不错,无疑DBaaS具有很多相对于RDBMS的优势。然而MySQL学习教程,DBaaS也有其局限性,云服务中固有的局限性就是之一。当客户开始将数据放入云端时,他们会遭遇到无法控制的网络性能问题。数据操纵日期和工夫

日期和工夫函数对创建一个站点长短常有效的。站点的仆人常常对一个表中的数据什么时候被更新感乐趣。经由过程日期和工夫函数,你能够在毫秒级跟踪一个表的改动。

前往以后日期和工夫

经由过程函数GETDATE(),你能够取得以后的日期和工夫。比方,语句SELECTGETDATE()前往以下的了局:

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

NOV3019973:29AM

(1row(s)affected)

明显,假如你未来利用这个函数,你失掉的日期将比这个工夫晚,大概梗早。

函数GETDATE()能够用来作为DATEDIME()型字段的缺省值。这对拔出纪录时保留事先的工夫是有效的。比方,假定有一个表用来保留你站点上的举动日记。每当有一个会见者会见到你的站点时,就在表中增加一条新纪录,记下会见者的名字,举动,和举行会见的工夫。要创建一个表,个中的纪录包括有以后的日期和工夫,能够增加一个DATETIME型字段,指定其缺省值为函数GETDATE()的前往值,就象如许:

CREATETABLEsite_log(

usernameVARCHAR(40),

useractivityVARCHAR(100),

entrydateDATETIMEDEFAULTGETDATE())

转换日期和工夫

你大概已注重到,在上一节的例子中,函数GETDATE()的前往值在显现时只显现到秒。实践上,SQLSever外部工夫能够准确到毫秒级(切实地说,能够准确到3.33毫秒)。

要失掉分歧格局的日期和工夫,你必要利用函数CONVERT()。比方,当上面的这个语句实行时,显现的工夫将包含毫秒:

SELECTCONVERT(VARCHAR(30),GETDATE(),9)

注重例子中数字9的利用。这个数字指了然在显现日期和工夫时利用哪一种日期和工夫格局。当这个语句实行时,将显现以下的日期和工夫:

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

Nov3019973:29:55:170AM

(1row(s)affected)

在函数CONVERT()中你可使用很多种分歧作风的日期和工夫格局。表11.1显现了一切的格局。

表11.1日期和工夫的范例

范例值尺度输入

0Defaultmonddyyyyhh:miAM

1USAmm/dd/yy

2ANSIyy.mm.dd

3British/Frenchdd/mm/yy

4Germandd.mm.yy

5Italiandd-mm-yy

6-ddmonyy

7-mondd,yy

8-hh:mi:ss

Default+milliseconds--monddyyyy
hh:mi:ss:mmmAM(or)

10USAmm-dd-yy

11JAPANyy/mm/dd

12ISOyymmdd

13EuropeDefault+milliseconds--ddmonyyyy

hh:mi:ss:mmm(24h)

14-hh:mi:ss:mmm(24h)

范例0,9,和13老是前往四位的年。对别的范例,要显现世纪,把style值加上100。范例13和14前往24小不时钟的工夫。范例0,7,和13前往的月份用三位字符暗示(用Nov代表November).

对表11.1中所列的每种格局,你能够把范例值加上100来显现有世纪的年(比方,00年将显现为2000年)。比方,要按日本尺度显现日期,包含世纪,你应利用以下的语句:

SELECTCONVERT(VARCHAR(30),GETDATE(),111)

在这个例子中,函数CONVERT()把日期格局举行转换,显现为1997/11/30

抽取日期和工夫

在很多情形下,你大概只想失掉日期和工夫的一部分,而不是完全的日期和工夫。比方,假定你想列出你的站点目次中每一个站点被查询的月份。这时候你不但愿完全的日期和工夫把网页弄乱。为了抽取日期的特定部分,你可使用函数DATEPART(),象如许:

SELECTsite_name‘SiteName’,

DATEPART(mm,site_entrydate)‘MonthPosted’FROMsite_directory

函数DATEPART()的参数是两个变量。第一个变量指定要抽取日期的哪一部分;第二个变量是实践的数据。在这个例子中,函数DATEPART()抽取月份,由于mm代表月份。上面是这个SELECT语句的输入了局:

SiteNameMonthPosted

………………………………………………………………

Yahoo2

Microsoft5

Magicw35

(3row(s)affected)

MonthPosted列显现了每一个站点被查询的月份。函数DATEPART()的前往值是一个整数。你能够用这个函数抽取日期的各个分歧部分,如表11.2所示。

表11.2日期的各部分及其简写

日期部分简写值

yearyy1753--9999

quarterqq1--4

monthmm1--12

dayofyeardy1--366

daydd1--31

weekwk1--53

weekdaydw1--7(Sunday--Saturday)

hourhh0--23

minutemi0--59

secondss0--59

milisecondms0--999

当你必要举行日期和工夫的对照时,利用函数DATEPART()前往整数是有效的。可是,上例中的查询了局(2,5)不是非常易读。要以更容易读的格局失掉部分的日期和工夫,你可使用函数DATENAME(),以下例所示:

SELECTsite_name‘SiteName’

DATENAME(mm,site_entrydate)‘MonthPosted’

FROMsite_directory

函数DATENAME()和函数DATEPART()吸收一样的参数。可是,它的前往值是一个字符串,而不是一个整数。上面是上例该用DATENAME()失掉的了局:

SiteNameMonthPostec

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

YahooFebruary

MicrosoftJune

Magicw3June

(3row(s)affected)

你也能够用函数DATENAE()来抽取一个礼拜中的某一天。上面的这个例子同时抽取一周中的某一天和日期中的月份:

SELECTsite_name‘SiteName’,

DATENAME(dw,site_entrydate)+‘-’+DATENAME(mm,site_entrydate)

‘DayandMonthPosted’FORMsite_directory

这个例子实行时,将前往以下的了局:

SiteNameDayandMonthPosted

………………………………………………………………………

YahooFriday-February

MicrosoftTuesday-June

Magicw3Monday-June

(3row(s)affected)

前往日期和工夫局限

当你剖析表中的数据时,你大概但愿掏出某个特准时间的数据。你大概对特定的某一天中DD好比说2000年12月25日DD会见者在你站点上的举动感乐趣。要掏出这类范例的数据,你大概会试图利用如许的SELECT语句:

SELECT*FROMweblogWHEREentrydate=”12/25/20000”

不要如许做。这个SELECT语句不会前往准确的纪录DD它将只前往日期和工夫是12/25/200012:00:00:000AM的纪录。换句话说,只要恰好在半夜零点输出的纪录才被前往。

注重:

在本节的会商中,假定字段entrydate是DATETIME型,而不是SMALLDATETIME型。本节的会商对SMALLDATETIME型字段也是合用的,不外SMALLDATETIME型字段只能准确到秒。

成绩是SQLSever将用完全的日期和工夫取代部分日期和工夫。比方,当你输出一个日期,但不输出工夫时,SQLSever将加上缺省的工夫“12:00:00:000AM”。当你输出一个工夫,但不输出日期时,SQLSever将加上缺省的日期“Jan11900”。

要前往准确的纪录,你必要合用日期和工夫局限。有不止一种路子能够做到这一点。比方,上面的这个SELECT语句将能前往准确的纪录:

SELECT*FROMweblog

WHEREentrydate>=”12/25/2000”ANDentrydate<”12/26/2000”

这个语句能够完成义务,由于它拔取的是表中的日期和工夫年夜于即是12/25/200012:00:00:000AM并小于12/26/200012:00:00:000AM的纪录。换句话说,它将准确地前往2000年圣诞节这一天输出的每笔记录。

另外一种办法是,你可使用LIKE来前往准确的纪录。经由过程在日期表达式中包括通配符“%”,你能够婚配一个特定日期的一切工夫。这里有一个例子:

SELECT*FROMweblogWHEREentrydateLIKE‘Dec252000%’

这个语句能够婚配准确的纪录。由于通配符“%”代表了任什么时候间。

利用这两种婚配日期和工夫局限的函数,你能够选择某个月,某一天,某一年,某个小时,某一分钟,某一秒,乃至某一毫秒内输出的纪录。可是,假如你利用LIKE来婚配秒或毫秒,你起首必要利用函数CONVERT()把日期和工夫转换为更准确的格局(拜见后面“转换日期和工夫”一节)。

对照日期和工夫

最初,另有两个日期和工夫函数对依据日期和工夫掏出纪录是有效的。利用函数DATEADD()和DATEDIFF(),你能够对照日期的日夕。比方,上面的SELECT语句将显现表中的每笔记录已输出了几个小时:

SELECTentrydate‘TimeEntered’

DATEDIFF(hh,entrydate,GETDATE())‘HoursAgo’FROMweblog

假如以后工夫是2000年11月30号下战书6点15分,则会前往以下的了局:

TimeEnteredHoursAgo

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

Dec3020004:09PM2

Dec3020004:13PM2

Dec120004:09PM698

(3row(s)affected)

函数DADEDIFF()的参数是三个变量。第个变量指定日期的某一部分。在这个例子中,是按小时对日期举行对照,(要懂得日期各部分的具体内容,请参考表11.2)在日期2000年11月1日和2000年11月30日的指准时间之间有689个小时。别的两个参数是要举行对照的工夫。为了前往一个负数,较早的工夫应当先给。

函数DATEADD()把两个日期相加。当你必要盘算停止日期这一类的数据时,这个函数是有效处的。比方,假定会见者必需先注册才干利用你的站点。注册今后,他们能够无偿使用你的站点一个月。要断定甚么时分他们的收费工夫会用完,你可使用以下的SELECT语句:

SELECTusername‘UserName’,

DATEADD(mm,1,firstvisit_date)‘RegistrationExpires’

FROMregistration_table

函数DATEADD()的参数有三个变量。第一个变量代表日期的某一部分(拜见表11.2),这个例子用到了代表月份的mm。第二个变量指定了工夫的距离DD在本例中是一个月。最初一个变量是一个日期,在这个例子中,日期是取自DATETIME型字段firstvisit_date.假定以后日期是June30,2000,这个语句将前往以下的内容:

UserNameRegistrationExpires

……………………………………………………………………………

BillGatesJul3020004:09PM

PresidentClintonJul3020004:13PM

WilliamShakespeareJul120004:09PM

(3row(s)affected)

注重:

与你意料的相反,利用函数DATEADD()把一个日期加上一个月,它其实不加上30天。这个函数只复杂地把月份值加1。这意味着在11月注册的人将比在2月注册的人多失掉2天或3天的工夫。要制止这个成绩,你能够用函数DATEADD()间接增添天数,而不是月份。

发送邮件

你能够用SQLSever发送复杂的e_mail信息。要做到这一点,你必要在你的体系中安装邮件服务器,如MicrosoftExchangeSever(拜见第四章“ExchangeActiveSever,IndexSever,和NetShow”)。你还必要设置SQLSever以辨认邮件服务器。

要让SQLSever能辨认邮件服务器,启动事件办理器并从菜单当选择Sever|SQLMail|Configue,这时候会呈现一个如1.3所示的对话框。输出你在邮件服务器中注册的用户名和口令,然后单击OK。

注重:

假如你利用MicrosoftExchangeSever,设置SQLSever的历程将会年夜年夜分歧。你必要在统一个(域)用户帐号下运转MicrosoftSQLSever和ExchangeSever。你还必要在安装了SQLSever的呆板上安装ExchangeCliect并给这个帐号创立一个一个设置文件。完成这些以后,你就能够在SQLMailConfiguration对话框中输出该设置文件的名字。

1。3

在发送邮件之前,你要先启动SQLMail。从菜单当选择Sever|SQLMail|Start。假如你的邮件服务器设置准确,而且你输出了准确的用户名和口令,则SQLMail会乐成启动。

注重:

你能够把SQLSever设置为主动启动邮件服务。要做到这一点,在SetSeverOptons对话框(从菜单当选择Sever|SQLSever|Configure)当选择AutoStartMailClient便可。

要发送一个邮件,你可使用名为xp_sendmail的扩大存储历程。这里有一个怎样利用这个历程的例子:

master..xp_sendmail“president@whitehouse.gov”,”HelloMr.President”

这个历程挪用向e_mail地点president@whitehouse.gov发送一个复杂的email信息:“HelloMr.President”。你能够用任何别的的email地点和信息代替上例中响应的内容,可是,你所发送的信息不克不及凌驾255个字符长度。

当你想随时懂得你的站点数据库的形态时,存储历程xp_sendmail是有效处的。比方,你能够向一个页面办理程序发送信息。假如你的站点出了甚么成绩,你即刻就能够晓得。下一章将报告更多有关存储历程的内容。

总结

这一章加深了你的SQL常识。你学会了怎样创建索引,使你的查询速率更快。你还学会了怎样拔出,删除和更新一个表中的数据,怎样利用汇合函数失掉一个表中数据的统计信息。最初,你学会了很多有代价的表达式,函数和历程,用来操纵字符串,日期和工夫及邮件。

下一章将进一步加深你对MicrosoftSQLSever的把握。你将进修怎样用SQL来举行程序计划,怎样创建存储历程,触发器和实行企图。更另人镇静的是,你将学会让SQLSever主动创立网页的一个复杂办法。
也许最好的策略是以不变应万变:给客户他们所需要的,不多也不少。如果MySQL学习教程适合他们,他们就不应该买别的工具。事实上,云计算产业一直推崇自助服务,但提供这些服务的公司已经开始认识到解决方案提供商推销他们商品的价值。

爱飞 发表于 2015-1-19 17:10:55

XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!)

变相怪杰 发表于 2015-1-25 11:15:14

数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。

仓酷云 发表于 2015-2-2 21:53:28

不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?

小女巫 发表于 2015-2-8 07:54:06

还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。

若相依 发表于 2015-2-25 01:27:24

理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识

海妖 发表于 2015-3-7 15:12:37

学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了!

不帅 发表于 2015-3-15 08:43:59

外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。

只想知道 发表于 2015-3-21 22:48:19

Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。
页: [1]
查看完整版本: MYSQL编程:SQL数据操纵基本(中级)10