sql撰写的日志

实现数据库的版本控制的思路

    数据库的版本控制与代码版本控制的区别在于数据库中的生产数据是现场创造的,当我们的表结构发生改变时,不能直接用drop table然后再create table,因为这样会导致生产数据丢失。而代码则完全由开发人员创造,可以用完全覆盖的方式升级。由于这点不同,致使数据库在版本控制的过程中必然要采用与代码不同的方法。

    软件过程有一个过程方法叫迭代过程。对数据库的版本化,我们也可以采用这种类似的方法——后一个版本的脚本依赖于前一个版本的脚本,即当你要把数据库升级到第n个版本时,你必须先把数据库升级到第(n-1)个版本,以此递归。

我对对于数据库版本化的具体思路如下:
1.只存在一个基线版本;

2.在基线版本后的修改都是修正版本;

3.版本号遵从的格式通常是:主版本号.次版本号.修正号
 修正版本SQL脚本的命名规则(表,视图,存储过程,用户,角色,规则,默认值,用户定义的数据类型,用户定义的函数,全文目录);
 a.涉及表、视图、存储过程、触发器的增加  版本号为:V1.1.0.0。(主版本号不变,次版本号加一,修正号归零)
 b.涉及表、视图、存储过程、触发器的更改、删除 版本号为:V1.2.1.0。(主版本号和次版本号不变,修正号加一)
 c.向表中增加、删除初始化数据的变化  版本号为:V1.2.1.1。(在修正号后增加一个标识)

4.SQL脚本的格式:
 每一个版本号为一个目录,目录下分别存放处理表、视图、存储过程等的SQL脚本;
/Database
├─V1.0.0.0
│      Full-Text.sql
│      Procedures.sql
│      Tables.sql
│      Views.sql

├─V1.1.0.0
│      Tables.sql
│      Views.sql

├─V1.1.1.0
│      Full-Text.sql
│      Procedures.sql
│      Tables.sql
│      Views.sql

├─V1.1.1.1
│      Tables.sql

└─V1.1.2.0
        Full-Text.sql
        Procedures.sql
        Tables.sql
        Views.sql

5.关于数据库中的版本说明及更新记录:
 在每个数据库中新建一个表,名称为DBVersion,用于记录数据库经历的版本记录以及最新的版本信息;

可用于SQL Server 2000的SQL代码
  1. if exists (select * from dbo.sysobjects where id = object_id(N‘[dbo].[DBVersion]‘and OBJECTPROPERTY(id, N‘IsUserTable’) = 1)   
  2. drop table [dbo].[DBVersion]   
  3. GO   
  4. CREATE TABLE [dbo].[DBVersion] (   
  5.  [DB_ID] [int] IDENTITY (1, 1) NOT NULL ,   
  6.  [DB_Version] [varchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL ,   
  7.  [DB_Update_Time] [datetime] NOT NULL ,   
  8.  [DB_Remark] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL    
  9. ON [PRIMARY]   
  10. GO  

 

6.编写程序以实现以下功能:
 读取Database目录的各个版本中的SQL文件,以实现升级或者新建数据。
 对于升级数据库需要能够根据DBVersion表中的信息自动选择需要导入的SQL文件;或者提示用户当前可以升级到哪一些版本。
 同时还需要有校验Database中版本的文件是否完整(包括版本完整和文件完整,这就需要存在一个校验文件);

 

参考Linux内核版本号的命名规则:

Linux内核 版本号命名规则
Linux内核的版本号是有一定的规则的,版本号遵从的格式通常是:主版本号.次版本号.修正号。
主版本号和次版本号标志着重要的功能变动;修正号表示较小的功能变动。
以2.6.12版本为例,
2代表主版本号,6代表次版本号,12代表修正号。
其中次版本号还有特定的意义:如果次版本
号是偶数,则表示该内核是一个可放心使用的稳定版;如果次版本号是奇数,则表示该内核加
入了一些测试的新功能,是一个内部可能存在BUG的测试版
。如:2.5.74表示是一个测试版就的内核,2.6.12表示是一个稳定版的内核。
我们可以从Linux官方网站上:http://www.kernel.org/下载最新的内核代码!
 

SQL中的保留关键字及INSERT INTO 语句的语法错误

我一直使用数据库SQL Server开发ASP.net程序,但是今天却被ACCESS数据库折磨了。

使用ASP.net向ACCESS数据库中插入数据,相当简单的代码。

一开始是出现“操作必须使用一个可更新的查询”的错误,将存放ACCESS数据库的目录(需要对ACCESS数据库所在的目录)加上“Network”和“Network Service”的写入和修改的权限,解决!

随后的错误"INSERT INTO 语句的语法错误"就让我摸不着头脑了,Google了一些资料后才发现原来是我的ACCESS数据表的字段名使用了SQL的保留关键字。

将插入数据的SQL语句更改为:"insert into users([username],[desc]) values(‘"+username+ "’,'"+desc+"’)",即解决"INSERT INTO 语句的语法错误"的问题.

将保留关键字加上中括号([]).

Asp.net连接Access并更新数据库的代码
  1. using System;   
  2. using System.Collections;   
  3. using System.ComponentModel;   
  4. using System.Data;   
  5. using System.Data.OleDb;   
  6. using System.Drawing;   
  7. using System.Web;   
  8. using System.Web.SessionState;   
  9. using System.Web.UI;   
  10. using System.Web.UI.WebControls;   
  11. using System.Web.UI.HtmlControls;   
  12.   
  13. namespace User   
  14. {   
  15.     /// <summary>   
  16.     /// xr 的摘要说明。   
  17.     /// </summary>   
  18.     public class CreateUser : System.Web.UI.Page   
  19.     {   
  20.         protected System.Web.UI.WebControls.TextBox TBUsername;   
  21.         protected System.Web.UI.WebControls.TextBox TBDesc;   
  22.         protected System.Web.UI.WebControls.Label LabelState;   
  23.         protected System.Web.UI.WebControls.Button BTNCreateUser;   
  24.        
  25.         private void Page_Load(object sender, System.EventArgs e)   
  26.         {   
  27.             // 在此处放置用户代码以初始化页面   
  28.         }   
  29.         private void BTNCreateUser_Click(object sender, System.EventArgs e)   
  30.         {   
  31.             string ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data source=" + Server.MapPath("mdb/database.mdb");   
  32.   
  33.             string username = this.TBUsername.Text.ToString();   
  34.             string desc = this.TBDesc.Text.ToString();   
  35.   
  36.             string strSql = "insert into users([username],[desc]) values(‘"+username+ "’,'"+desc+"’)";   
  37.   
  38.             System.Data.OleDb.OleDbConnection oleDbConnection = new System.Data.OleDb.OleDbConnection(ConnStr);   
  39.             System.Data.OleDb.OleDbCommand oleDbCommand = new System.Data.OleDb.OleDbCommand(strSql, oleDbConnection);   
  40.   
  41.             try  
  42.             {   
  43.                 oleDbCommand.Connection.Open();   
  44.                 LabelState.Text ="Access数据库连接状态:" + oleDbConnection.State;   
  45.                 oleDbCommand.ExecuteNonQuery();   
  46.             }   
  47.             catch(Exception ex)   
  48.             {   
  49.                 Response.Write(ex.Message.ToString());   
  50.             }   
  51.             finally  
  52.             {   
  53.                 oleDbCommand.Connection.Close();   
  54.             }   
  55.         }  
  56.         #region Web 窗体设计器生成的代码   
  57.             //代码省略  
  58.         #endregion   
  59.     }  

以下为SQL中的保留关键字,大家在设计数据表时,尽量不要使用如下单词作为字段名称:

SQL中的保留字
  1. action   add   aggregate   all  
  2. alter   after   and   as  
  3. asc   avg   avg_row_length   auto_increment   
  4. between   bigint   bit   binary  
  5. blob   bool   both   by  
  6. cascade   case   char   character  
  7. change   check   checksum   column  
  8. columns   comment   constraint   create  
  9. cross   current_date   current_time   current_timestamp  
  10. data   database   databases   date  
  11. datetime   day   day_hour   day_minute   
  12. day_second   dayofmonth   dayofweek   dayofyear   
  13. dec   decimal   default   delayed   
  14. delay_key_write   delete   desc   describe   
  15. distinct   distinctrow   double   drop  
  16. end   else   escape   escaped   
  17. enclosed   enum   explain   exists   
  18. fields   file   first   float  
  19. float4   float8   flush   foreign  
  20. from   for   full   function  
  21. global   grant   grants   group  
  22. having   heap   high_priority   hour  
  23. hour_minute   hour_second   hosts   identified   
  24. ignore   in   index   infile   
  25. inner   insert   insert_id   int  
  26. integer   interval   int1   int2   
  27. int3   int4   int8   into  
  28. if   is   isam   join  
  29. key   keys   kill   last_insert_id   
  30. leading   left   length   like  
  31. lines   limit   load   local  
  32. lock   logs   long   longblob   
  33. longtext   low_priority   max   max_rows   
  34. match   mediumblob   mediumtext   mediumint   
  35. middleint   min_rows   minute   minute_second   
  36. modify   month   monthname   myisam   
  37. natural   numeric   no   not  
  38. null   on   optimize   option  
  39. optionally   or   order   outer  
  40. outfile   pack_keys   partial   password  
  41. precision   primary   procedure   process   
  42. processlist   privileges   read   real  
  43. references   reload   regexp   rename   
  44. replace   restrict   returns   revoke  
  45. rlike   row   rows   second  
  46. select   set   show   shutdown   
  47. smallint   soname   sql_big_tables   sql_big_selects   
  48. sql_low_priority_updates   sql_log_off   sql_log_update   
  49. sql_select_limit   
  50. sql_small_result   sql_big_result   sql_warnings   straight_join   
  51. starting   status   string   table  
  52. tables   temporary   terminated   text   
  53. then   time   timestamp   tinyblob   
  54. tinytext   tinyint   trailing   to  
  55. type   use   using   unique  
  56. unlock   unsigned   update   usage   
  57. values   varchar   variables   varying  
  58. varbinary   with   write   when  
  59. where   year   year_month   zerofill        

日期格式的转换

CAST 和 CONVERT

将某种数据类型的表达式显式转换为另一种数据类型。CAST 和 CONVERT 提供相似的功能。

语法

使用 CAST:

CAST ( expression AS data_type )

使用 CONVERT:

CONVERT (data_type[(length)], expression [, style])

参数

expression

是任何有效的 Microsoft® SQL Server™ 表达式。有关更多信息,请参见表达式。

data_type

目标系统所提供的数据类型,包括 bigintsql_variant。不能使用用户定义的数据类型。有关可用的数据类型的更多信息,请参见数据类型。

length

ncharnvarcharcharvarcharbinaryvarbinary 数据类型的可选参数。

style

日期格式样式,借以将 datetimesmalldatetime 数据转换为字符数据(ncharnvarcharcharvarcharncharnvarchar 数据类型);或者字符串格式样式,借以将 floatrealmoneysmallmoney 数据转换为字符数据(ncharnvarcharcharvarcharncharnvarchar 数据类型)。

SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式。

在表中,左侧的两列表示将 datetimesmalldatetime 转换为字符数据的 style 值。给 style 值加 100,可获得包括世纪数位的四位年份 (yyyy)。

不带世纪数位 (yy) 带世纪数位 (yyyy) 标准 输入/输出**
- 0 或 100 (*) 默认值 mon dd yyyy hh:miAM(或 PM)
1 101 美国 mm/dd/yyyy
2 102 ANSI yy.mm.dd
3 103 英国/法国 dd/mm/yy
4 104 德国 dd.mm.yy
5 105 意大利 dd-mm-yy
6 106 - dd mon yy
7 107 - mon dd, yy
8 108 - hh:mm:ss
- 9 或 109 (*) 默认值 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM)
10 110 美国 mm-dd-yy
11 111 日本 yy/mm/dd
12 112 ISO yymmdd
- 13 或 113 (*) 欧洲默认值 + 毫秒 dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)
- 20 或 120 (*) ODBC 规范 yyyy-mm-dd hh:mm:ss[.fff]
- 21 或 121 (*) ODBC 规范(带毫秒) yyyy-mm-dd hh:mm:ss[.fff]
- 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(不含空格)
- 130* 科威特 dd mon yyyy hh:mi:ss:mmmAM
- 131* 科威特 dd/mm/yy hh:mi:ss:mmmAM

*    默认值(style 0 或 100、9 或 109、13 或 113、20 或 120、21 或 121)始终返回世纪数位 (yyyy)。
** 当转换为 datetime 时输入;当转换为字符数据时输出。
*** 专门用于 XML。对于从 datetimesmalldatetimecharacter 数据的转换,输出格式如表中所示。对于从 floatmoneysmallmoneycharacter 数据的转换,输出等同于 style 2。对于从 realcharacter 数据的转换,输出等同于 style 1。

重要  默认情况下,SQL Server 根据截止年份 2049 解释两位数字的年份。即,两位数字的年份 49 被解释为 2049,而两位数字的年份 50 被解释为 1950。许多客户端应用程序(例如那些基于 OLE 自动化对象的客户端应用程序)都使用 2030 作为截止年份。SQL Server 提供一个配置选项("两位数字的截止年份"),借以更改 SQL Server 所使用的截止年份并对日期进行一致性处理。然而最安全的办法是指定四位数字年份。

当从 smalldatetime 转换为字符数据时,包含秒或毫秒的样式将在这些位置上显示零。当从 datetimesmalldatetime 值进行转换时,可以通过使用适当的 charvarchar 数据类型长度来截断不需要的日期部分。

下表显示了从 floatreal 转换为字符数据时的 style 值。

输出
0(默认值) 最大为 6 位数。根据需要使用科学记数法。
1 始终为 8 位值。始终使用科学记数法。
2 始终为 16 位值。始终使用科学记数法。

在下表中,左列表示从 money smallmoney 转换为字符数据时的 style 值。

输出
0(默认值) 小数点左侧每三位数字之间不以逗号分隔,小数点右侧取两位数,例如 4235.98。
1 小数点左侧每三位数字之间以逗号分隔,小数点右侧取两位数,例如 3,510.92。
2 小数点左侧每三位数字之间不以逗号分隔,小数点右侧取四位数,例如 4235.9819。

返回类型

返回与 data type 0 相同的值。

注释

隐性转换指那些没有指定 CAST 或 CONVERT 函数的转换。而显式转换指那些已指定了所需 CAST (CONVERT) 函数的转换。下面的图表显示了所有可用于 SQL Server 系统提供的数据类型的显式和隐性转换,这些数据类型包括 bigintsql_variant

说明  因为 Unicode 数据始终使用偶数位字节,所以当在 binary varbinary 数据类型与 Unicode 所支持的数据类型之间进行转换时会使用提示。例如,此转换不返回 41 的十六进制值,而是返回 4100 的十六进制值:SELECT CAST(CAST(0×41 AS nvarchar) AS varbinary)

不支持 textimage 数据类型的自动数据类型转换。可以将 text 数据显式转换为字符数据,将 image 数据显性转换为 binary varbinary 数据,但是最大长度为 8000。如果尝试进行不正确的转换(例如,将包含字母的字符表达式转换为 int),则 SQL Server 会产生错误信息。

当 CAST 或 CONVERT 的输出是字符串并且输入也是字符串时,输出与输入具有相同的排序规则和排序规则标签。如果输入不是字符串,则输出采用数据库的默认排序规则及强制默认的排序规则标签。有关更多信息,请参见排序规则的优先顺序。

若要给输出指派不同的排序规则,请将 COLLATE 子句应用到 CAST 或 CONVERT 函数的结果表达式中。例如:

SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

不存在有关赋值的从 sql_variant 数据类型进行的隐性转换,但是存在转换为 sql_variant 的隐性转换。

将字符或二进制表达式(charncharnvarcharvarcharbinary varbinary)转换为不同数据类型的表达式时,数据可能会被截断,只显示一部分,或者因为结果太短无法显示而返回错误。除下表中所显示的转换外,转换为 charvarcharncharnvarcharbinaryvarbinary 时将被截断。

被转换的数据类型 转换为的数据类型 结果
intsmallint tinyint char *
  varchar *
  nchar E
  nvarchar E
moneysmallmoneynumericdecimalfloatreal char E
  varchar E
  nchar E
  nvarchar E

* 结果长度太短而无法显示。
E 因为结果长度太短无法显示而返回错误。

Microsoft SQL Server 仅保证往返转换(即,从原始数据类型进行转换后又返回原始数据类型)在各版本间产生相同值。下面的示例显示往返转换:

DECLARE @myval decimal (5, 2)SET @myval = 193.57SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5))-- Or, using CONVERTSELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))

例如,不要尝试构造 binary 值并将它们转换为数字数据类型分类的数据类型。SQL Server 并不保证 decimal numeric 数据类型转换为 binary 的结果在 SQL Server 各版本间相同。

下面的示例显示了由于太短而无法显示的结果表达式。

USE pubsSELECT SUBSTRING(title, 1, 25) AS Title, CAST(ytd_sales AS char(2))FROM titlesWHERE type = 'trad_cook'

下面是结果集:

Title                        ------------------------- -- Onions, Leeks, and Garlic *  Fifty Years in Buckingham *  Sushi, Anyone?            *  

(3 row(s) affected)

当具有不同小数位数的数据类型进行转换时,值将被截断为最精确的数位。例如,SELECT CAST(10.6496 AS int) 的结果为 10。

转换时,若目标数据类型的小数位数小于源数据类型的小数位数,则要转换的值将被四舍五入。例如,CAST(10.3496847 AS money) 的结果是 $10.3497。

当将非数字类型的 charncharvarcharnvarchar 数据转换为 intfloatnumeric decimal 时,SQL Server 将返回错误信息。当将空字符串 (" ") 转换为 numeric decimal 时,SQL Server 也将返回错误信息。

使用二进制字符串数据

binary varbinary 数据转换为字符数据并且在 x 后面指定了奇数位的值时,SQL Server 在 x 后面添加 0(零)以成为偶数位值。

二进制数据包含从 0 到 9 和从 A 到 F(或从 a 到 f)的字符,每两个字符为一组。二进制字符串必须以 0x 开头。例如,若要输入 FF,请键入 0xFF。最大值是一个 8000 字节的二进制值,每个字节的最大值都是 FF。Binary 数据类型不能用于十六进制数据,而是用于位模式。对于存储为二进制数据的十六进制数字的转换和计算结果,无法保证其准确性。

当指定 binary 数据类型的长度时,每两个字符被算作是一个单位长度。长度 10 表示将输入 10 个双字符组。

由 0x 表示的空二进制字符串可以储存为二进制数据。

示例
A. 同时使用 CAST 和 CONVERT

每个示例都将检索书名(这些图书的截止当前销售额的第一位数字为 3),并将这些图书的 ytd_sales 转换为 char(20)

-- Use CAST.USE pubsGOSELECT SUBSTRING(title, 1, 30) AS Title, ytd_salesFROM titlesWHERE CAST(ytd_sales AS char(20)) LIKE '3%'GO

-- Use CONVERT.USE pubsGOSELECT SUBSTRING(title, 1, 30) AS Title, ytd_salesFROM titlesWHERE CONVERT(char(20), ytd_sales) LIKE '3%'GO

下面是任一查询的结果集:

Title                          ytd_sales   ------------------------------ ----------- Cooking with Computers: Surrep 3876        Computer Phobic AND Non-Phobic 375         Emotional Security: A New Algo 3336        Onions, Leeks, and Garlic: Coo 375         

(4 row(s) affected)
B. 使用带有算术运算符的 CAST

下面的示例通过将总的截止当前销售额 (ytd_sales) 与每本图书的价格 (price) 相除,进行单独列计算 (Copies)。在四舍五入到最接近的整数后,此结果将转换为 int 数据类型。

USE pubsGOSELECT CAST(ROUND(ytd_sales/price, 0) AS int) AS 'Copies'FROM titlesGO

下面是结果集:

Copies      ------ 205         324         6262        205         102         7440        NULL        383         205         NULL        17          187         16          204         418         18          1263        273         

(18 row(s) affected)
C. 使用 CAST 进行串联

下面的示例使用 CAST 数据类型转换函数来串联非字符、非二进制表达式。

USE pubsGOSELECT 'The price is ' + CAST(price AS varchar(12))FROM titlesWHERE price > 10.00GO

下面是结果集:

------------------ The price is 19.99        The price is 11.95        The price is 19.99        The price is 19.99        The price is 22.95        The price is 20.00        The price is 21.59        The price is 10.95        The price is 19.99        The price is 20.95        The price is 11.95        The price is 14.99        

(12 row(s) affected)
D. 使用 CAST 获得更多易读文本

下面的示例在选择列表中使用 CAST 将 title 列转换为 char(50) 列,这样结果将更加易读。

USE pubsGOSELECT CAST(title AS char(50)), ytd_salesFROM titlesWHERE type = 'trad_cook'GO

下面是结果集:

                                                       ytd_sales--------------------------------------------------     ---------Onions, Leeks, and Garlic: Cooking Secrets of the      375Fifty Years in Buckingham Palace Kitchens              15096Sushi, Anyone?                                         4095

(3 row(s) affected)
E. 使用带有 LIKE 子句的 CAST

下面的示例将 int 列(ytd_sales 列)转换为 char(20) 列,以便使用 LIKE 子句。

USE pubsGOSELECT title, ytd_salesFROM titlesWHERE CAST(ytd_sales AS char(20)) LIKE '15%'   AND type = 'trad_cook'GO 

下面是结果集:

title                                                        ytd_sales   ------------------------------------------------------------ ----------- Fifty Years in Buckingham Palace Kitchens                    15096       

(1 row(s) affected)

SQL Server备份的三个恢复模型

 

在SQL Server 2000中,有无数种备份数据库的方法。无论你的数据库有多大、改变是否频繁,都有满足你的要求的备份策略。让我们看看几种可以在不同环境下工作的基本备份策略。

本文假定你有备份数据库的权限。也就是说,你要么是系统管理员,要么是db_owner或者backupadministrator。还有,我们还假定你的操作系统提供了访问备份所需要的资源的权利,例如,访问磁盘或者磁带驱动器。

从哪儿开始

在你开始备份一个SQL Server数据库之前,你需要知道该数据库使用了哪个恢复模型。这里有三种不同的恢复模型:FULL、BULK_LOGGED和SIMPLE。

FULL恢复模型向你提供了最大的恢复灵活性。新数据库默认使用的就是这种恢复模型。利用这种模型,你可以恢复数据库的一部分或者完全恢复。假设交易记录(transactions log)还没有被破坏,你还可以在失败之前恢复出最后一次的已提交(committed)交易。在所有的恢复模型中,这种模型使用了最多的交易记录空间,并轻微影响了SQL Server的性能。

BULK_LOGGED恢复模型比FULL模型少了一些恢复选项,但是进行批操作(bulk operation)时它不会严重影响性能。在进行某些批操作时,由于它只需记录操作的结果,因此它使用了较少的记录空间。然而,用这种模型,你不能恢复数据库中的特定标记,也不能仅仅恢复数据库的一部分。

SIMPLE恢复模型是这三种模型中最容易实施的,它所占用的存储空间也最小。然而,你只能恢复出备份结束时刻的数据库。

为了找出你所用数据库的恢复模型,可以运行下面的命令,该命令应该返回FULL、BULK_LOGGED和SIMPLE这三个值中的某一个:

SELECT dbpropertyex("database", "recovery")

为了改变数据库的恢复选项,运行下面的命令:

ALTER DATABASE database name SET RECOVERY {FULL | SIMPLE | BULK_LOGGED}

除数据之外,SQL Server备份还包括数据库大纲(schema)和数据库元数据(即数据库文件、文件组和它们的位置)。SQL Server允许在备份时用户依然使用数据库,所以在备份期间发生的交易也记录到备份中去了。

备份数据库

为了备份数据库,你可以运行BACKUP命令。(你也可以使用SQL Enterprise Manager。)在执行命令之前知道它的语法永远是个好主意。BACKUP命令有许多选项,它的基本语法是:

BACKUP DATABASE { database_name }

TO < backup_device > |

backup_device可以是磁盘或者磁带——或者它也可以是一个用磁盘文件、磁带或者已命名管道表示的逻辑上的备份设备。

如果你想做一个快速、一次性的备份,那么向下面那样使用磁盘文件:

BACKUP DATABASE Northwind TO DISK = "c:\backup\Northwind.bak"

如果你想把数据库备份到另外一台服务器上,可以使用UNC名字:

BACKUP DATABASE Northwind TO DISK = "\\FILESERVER\Shared\Backup\Northwind.bak"

如果想进行有规律、有计划的备份,就需要使用逻辑备份设备。一个逻辑备份设备可以保存若干个数据库备份并驻留在磁盘、磁带或者已命名管道上。如果你使用磁带设备,磁带驱动器必须在同一台物理服务器上。已命名管道可以利用第三方备份软件。

为了创建逻辑备份设备,使用sp_addumpdevice系统保存过程。SQL Enterprise Manager也可以用来创建备份设备。命令行语法如清单A所示。

清单B给出了一个在磁盘上创建逻辑备份设备的例子。

当备份设备创建完毕,Northwind数据库可以用下面的命令进行备份:

BACKUP DATABASE Northwind TO DiskBackup

频繁变动的大数据库的备份

现在,我已经演示了如何备份整个数据库。然而,它只允许你恢复备份结束时刻的数据库所保存的数据。如果数据库很大并且频繁变动,由于时间和空间的限制,频繁进行全数据库备份是不现实的。当数据库失败时,可能会造成大量数据丢失。

在这种情况下,有两种提高可恢复性的途径,这两个途径都要求全数据库备份。而且这两种方法都要求数据库恢复模型为FULL或者BULK_LOGGED。

第一种方法采用差异数据库备份,它只捕获并保存全数据库备份后改变的数据。由于它的文件较小而且信息简明,用它进行数据恢复的速度非常快。

下面的例子在一个名为DiffBackupDevice的逻辑备份设备上创建了一个差异备份:

BACKUP DATABASE Northwind TO DiffBackupDevice WITH DIFFERENTIAL

第二个提高可恢复性的方法利用交易记录备份,恢复可以在一个特定的时间点上完成。

你可能会问这怎么可能。记住,交易记录的目的就是记录发生在数据库中所有交易。交易记录允许COMMIT和ROLLBACK正确工作。为了达到这个功能,该数据的变化前后的数值必须随同操作类型、交易开始(时间)等一齐被记录下来。

备份技巧

利用下面的列出的技巧来确保你不会在每周一次的数据库备份过程中忘记关键步骤。

  • 每周一次备份主数据库。如果你创建、修改或者停止一个数据库,添加新的SQL Server消息,添加或者停止连接服务器,或者添加记录设备,那就进行手工备份。
  • 每天备份一次msdb数据库。它一般非常小,但很重要,因为它包含了所有的SQL Server工作、操作和计划任务。
  • 只有当你修改它时,才有必要备份模型数据库。
  • 用SQL Server Agent来安排你的备份工作的时间表。
  • 如果在你的生产(production)环境中有现成资源,备份生产数据库到本地磁盘或者网络服务器(用同一个开关)。然后,把备份文件/设备拷贝到磁带上。在存在许多硬件故障(特别是在RAID系统中)的情况下,磁盘常常是完好的(inact)。如果备份文件是在磁盘上,那么恢复时的速度会提高很多。
  • 备份开发和测试数据库至少要用到SIMPLE恢复模型。
  • 除了有计划的定时备份外,在进行未记录的(nonlogged)批操作(如,批拷贝)、创建索引、或者改变恢复模型后要备份用户数据库。
  • 如果你使用的是SIMPLE恢复模型,记住在截短(truncate)交易记录之后备份你的数据库。
  • 用文档记录你的恢复步骤。至少要大概记录这些步骤,注意所有的重要文件的位置。

在截短记录之前,也就是所有的已提交(committed)交易从记录中清空之前,所有的这些信息都保存在交易记录中。在SIMPLE恢复模型中,记录在一个CHECKPOINT期间内截短(在SQL Server内存缓冲写道磁盘时),它是自动发生的,但也可以手动执行。这也就是SIMPLE恢复模型不支持时间点(point-in-time)恢复的原因。在FULL和BULK_LOGGED恢复模型下,当交易记录被备份时,交易记录被截短,除非你明确指出不进行截短。

为了备份交易记录,使用BACKUP LOG命令。其基本语法与BACKUP命令非常相似:

BACKUP LOG { database } TO <backup device>

下面是如何把交易记录备份到一个名为LogBackupDevice的逻辑设备上的例子:

BACKUP TRANSACTION Northwind TO LogBackupDevice

如果你不希望截短交易记录,使用NO_TRUNCATE选项,如下所示:

BACKUP TRANSACTION Northwind TO LogBackupDevice WITH NO_TRUNCATE

只是基本知识

尽管我在本文中仅仅概述了数据库恢复的基本知识,你还是可以通过这些技巧来找到正确的方向。那么,为了避免不必要的(丢失数据造成的)恐慌,你要做到每周备份主数据库,每天备份msdb。

如何在windows系统下安装MySQL

可以运行在本地windows版本的MySQL数据库程序自从3.21版以后已经可以从MySQL AB公司获得,而且 MYSQL每日的下载百分比非常大.这部分描述在windows上安装MySQL的过程. 安装程序是针对windows版本的MySQL 5.0,结合了图形安装向导,自动的安装MySQL,创建 一个配置文件,启动服务器,和保护默认的用户帐户. 如果你是升级安装现有的MySQL 4.1.5版本.你必须完成下列步骤:

1. 获得和安装 2. 如果有必要安装配置文件 3. 选择一个想要使用的服务器. 4. 启动服务器 5. 为MYSQL帐户设置密码. 这个过程在没有安装配置的myslq安装程序里完成.

MySQL 5.0 for Windows 可用的种格式:

· 包含二进制的安装程序可以安装所有你需要的依次你可以立即启动服务器. · 原始类包括所有代码和支持文件建造执行使用Visual Studio 2003编译系统.

一般来讲,你应该使用二进制形式.较其他比较简单,和你不需要额外的工具让mysql使用 和运行. 本文主要描述怎样在windows上安装使用二进制格式的MYSQL.

一、要在WINDOWS上运行MYSQL,你要具备下列条件:

· 一个32位WINDOWS操作系统,9x,ME,NT,2000,XP,或者 windows server2003.基于 WINDOWS NT操作系统(NT,2000,XP,2003)允许你运行MYSQL 服务器为一个服务.使用基于 WINDOWS NT操作系统是我们强烈推荐的.

· TCP/IP协议支持. · 二进制版本的MYSQL for windows,可以从 http://dev.mysql.com/downloads/下 载。注意: 如果你通过FTP下载.我们推荐使用适当的FTP软件很重要.避免在现在过程中文件 损坏..

· 一个可以打开.zip 文件的工具,用来打开安装文件

· 硬盘的空间推荐最小200M. 如果准备通过ODBC连接MYSQL,你也需要ODBC连接驱动

· 你过你需要的表大于4GB,安装MYSQL在NTFS或者新的文件系统上.当你创建表的时不 要忘记使用 MAX-ROWS和AVG_ROW_LENGTH.

二、选择一个安装组件

对于MYSQL 5.0,有三个组件用来选择安装MYSQL在WINDOWS上.下列是组件:

· 基本组件:这个组件有一个类似于mysql-essential-5.0.13-rc-win32.msi和包含最 小需求文件组件不包含可选组件与内含的服务器和基准组件

· 全部组件:这个组件有一个文件名类似 mysql-5.0.13-rc-win32.zip和包含所有可需 文件来完成WINDOWS安装.包括配置向导.这个组件包括可选组件与内含的服务器和基准 组件

· 无安装存档:. 这个组件有一个类似于mysql-noinstall-5.0.13-rc-win32.zip的文 件名和包含建立完成安装组件的文件.配置向导除外.这个组件不包含自动安装,必须手 动安装和配置.大多数拥护推荐使用基本组件.

三、使用配置向导

MySQL配置向导可以帮助您实现WINDOWS系统下的服务器自动配置。MySQL配置向导首先会根据一一系列的问题创 建一个定制好的my.ini文件,然后根据填写内容并将其应用到模板中从而产生一个跟安装相适应的my.ini文件 。配置向导包含在MySQL 5.0服务器中,现在只适合WINDOWS用户。配置向导很大程度上来源于用户近几年在My SQL AB上的反馈信息。如果你觉得向导内容缺少你所需要的重要内 容,或者,你发现有错误,请通过MySQL 错误报告系统要求添加新特性或报告错误信息。

安装完毕后可以直接进入配置向导或通过点击WINDOWS开始程序中的MySQL服务器实例向导进入MySQL配置向导。 另外,也可以找到MySQL安装目录下的bin目录下的MySQLInstanceConfig.exe文件并直接运行它。

如果你的MySQL配置向导发现了一个已经存在的my.ini文件,你可以重新配置已经存在的服务器,或者通过删除 my.ini文件、停止并移除MySQL服务的方法移除服务器实例。重新配置已经存在的服务器,选择“重新配置实例”选项并且选择“下一步”按钮。已经存在的my.ini文件被 重新命名为mytimestamp.ini.bak,时间戳是已经存在的my.ini创建时的日期和时间。移除已经存在的数据库实 例,选择“移除实例”选项并选择“下一步”按钮。如果选择了“移除实例”选项,进入到确认界面。单击“运行”按钮:MySQL配置向导停止并开始移除MySQL服 务,并删除my.ini文件。但服务器安装目录并没有移除。如果选择了“重新配置实例”选项,进入到“配置类型”界面,可以选择安装想要配置的安装类型。

选择了MySQL配置向导的 “安装MySQL”,或“重新配置实例”,都将进入到“配置类型”界面有两个配置类型可供选择:详细配置和标准配置。标准配置选项是为那些不需要考虑复杂服务器配置的新手而 设计的。详细配置选项是给那些能更高好的操作服务器的高级用户使用的。如果您刚开始使用MySQL,并且把它做为一个单一用户的开发机器使用的话,标准配置能满足您的需求。选择标 准配置后,除了服务选项和安全选项外配置向导对其他部分都做了自动配置。如果你的机器中有已经安装了MySQL,标准配置可能不太适合你的系统。如果愿意进一步配置的话,“详细配置 ”选项是推荐的。

然后进入服务器类型页面,有三种不同的服务器类型可供选择,选择服务器类型后配置向导将会根据选择的不同确定内存、磁盘、处理器 的使用。

• 开发版:这个选项是典型的桌面工作站,是MySQL为个人使用而设计的。有很多其他的桌面应用程序也 可以在此上运行。MySQL服务器使用了最小的系统资源。

• 服务器版:选择此选项MySQL可以和其他一些服务器应用程序如FTP,email,Web服务同时运行。MySQL 服务器配置使用了中等程度的系统资源。

• MySQL服务器专业版:这个选项是只能运行MySQL服务器,其他应用程序不可以运行。MySQL服务器配置 将使用所有可用资源。

“数据库使用”界面允许在创建MySQL表时可以指示想使用的表操作。选择项将决定InnoDB存储引擎是否可用, InnoDB所能使用系统资源的百分比。多功能的数据库:此选项InnoDB 和 MyISAM存储引擎可用,并且在两者之间平均分配资源。推荐在通常情况下 会使用这两个存储引擎的的用户使用。事务型数据库:此选项InnoDB 和 MyISAM存储引擎均可用,但更倾向于系统大部门资源为InnoDB存储引擎所使 用。推荐经常使用InnoDB而很少使用MyISAM的用户使用。

• 非事务型数据库:此选项完全禁止InnoDB存储引擎,完全专注于MyISAM存储引擎。推荐不使用InnoDB 的用户使用。

InnoDB表空间界面

有些用户更愿意将InnoDB表空间文件放在不同的位置而不是MySQL服务器数据目录。如果系统有更高的存储能力 或更高性能的存储设备可用,比如RAID存储系统,可以把表空间文件放置在不同的位置。可以修改InnoDB表空间文件的默认位置,从下拉列表框的盘符列表中选择一个并选择一个新的路径。创建定制 的路径,单击“…”。 如果修改已经存在的服务器配置,在修改路径之前必须单击“修改”按钮。在启动服务器之前必须先手工把已 经存在的表空间文件移到新的位置。

并发连接界面

控制连接到MySQL服务器的并发连接数目能有效的防止耗进系统资源。并发连接界面允许选择服务器按所需选择 服务器的使用情况, 并同时设置并发连接限制。也可以手工设定并发连接数。

• 决策支持(DSS)/联机分析处理(OLAP):服务器不要求大数目的并发连接时选择此项。最大连接数 目的连接可达100,但平均会有20个并发连接。

• 在线事务处理(OLTP):服务器要求大数量的并发连接时选择此项。最大连接数可达500。

• 手工设置:选择此项可以手工设置并发访问服务器的最大树木。从下拉列表框中选择最大可连接数, 如果下拉列表框中列出的数目没有可选择的。可手工输入最大连接数目。

网络配置选项对话框

可以使用网络配置对话框来激活或者禁止TCP/IP网络服务同时配置和MySQL服务器连接的端口号。TCP/IP网络服 务是默认激活的。Windows可以通过不选择TCP/IP网络选项的选项框禁止TCP/IP网络服务。通常默认使用的端口 是3306。如果需要改变访问MySQL的端口,可以从下拉选项框中选取新的端口号或者在选项框中直接输入新的端 口号。如果你选定的端口号已经被使用,系统将会提示你去确认对端口号的选择。

字体设置对话框

MySQL服务器支持多字体设置,同时可以为服务器设置默认服务字体,该字体可以应用于所有的数据表、列和未 被超级控制的数据库。可以使用字体设置对话框来改变MySQL服务器的默认字体设置。

1 标准的字体设置:该选项用于将Latin1作为默认的服务字体. Latin1可以用于英文和众多西文字体。

2 对于多语言字体的最佳支持:该选项用于UTF8作为默认的服务字体。在单一的字体设置中,UTF8可以存储来自 很多不同语言的字体。

3 手动选择默认字符设置/排序:该选项用于手动设置默认字体。你可以从下拉选择框所提供的字体中选择所需 要的字符。

服务选择对话框

在基于Windows NT的平台上,MySQL服务器可以被作为Windows的一项服务被安装。当作为一项服务安装时, MySQL服务器可以随着系统的启动而自启动,并且在服务失败时,MySQL服务器可以自动重起。在MySQL的默认配置中,将MySQL服务器作为服务安装,同时该服务的名称为MySQL。如果你不希望安装该项服务 ,不选择作为Windows服务的选择框即可。你可以从所提供的下拉选择框中选取一个新的服务名称或者直接在下 拉选择框中输入新的服务名称。如果需要将MySQL服务器作为一项服务来安装,同时使MySQL不随着系统启动而自启动,则不选择自启动Mysql服 务选择框。

安全选择对话框

强烈推荐你为你的MySQL服务器设置一个相应的根用户密码,同时MySQL配置向导需要你设置一个默认的根用户 密码。如果你不希望设置根用户密码,则不要选择修改安全设置选项。为了设置根用户密码,需要将设定的根 用户密码同时输入新根密码和确认选择框里。如果你需要重新配置一个已存在的服务器,你需要将其的根用户 密码输入到当前的根密码选择框里。为了防止通过网络的根用户登录,可以在Root的选择框中设置为只允许从本地连接。这将增强你的根用户的安 全性。为了生成一个匿名用户帐户,选择生成匿名帐户的选择框。生成一个匿名用户帐号可能会降低服务器的安全性 ,同时造成登陆和认证的困难。出于这种原因,该选项一般不被推荐。

确认对话框

MySQL配置向导中的最后的对话框是确认对话框。可以点击“执行”按钮来启动配置操作。为了返回到前一个对 话框,可以点击“返回”按钮。可以点击“取消”按钮退出MySQL配置向导而无需配置服务器。当你点击“执行”按钮后而无需配置服务器,MySQL配置向导执行一系列任务,该任务在被执行时,执行进度将 会被显示在屏幕上。 MySQL配置向导首先使用由MySQL AB开发者和工程师所准备的模版配置文件来决定基于你的选择的配置文件选项 。该模版被命名为my-template.ini,同时位于你的服务期安装目录下。MySQL配置向导将这些选择项写入至 my.ini文件中。my.ini文件的最终位置将会被显示在写配置文件任务中。如果你选择为MySQL服务器生成一项服务,MySQL配置向导将会生成并启动该服务。如果你正在重新配置一个已 存在的服务,MySQL服务向导将会重起服务以重新应用改变的配置。如果你选择设置一个根密码,MySQL配置向导将会和服务器连接,设置你的新的根用户密码同时应用你已经选择 的其他安全设置。在MySQL配置向导完成其的任务后,一个摘要将会被显示出来。点击“结束”按钮退出MySQL配置向导。

配置文件my.ini的位置

MySQL配置向导将my.ini文件放置在MySQL服务器的安装目录中。这将有助于将配置文件和具体的服务器实例相 关联。为了保证MySQL服务器知道到哪里查找my.ini文件,和下面内容类似的参数将会被作为服务安装的一部分 传递给MySQL服务器:–defaults-file="C:\Program Files\MySQL\MySQL Server 5.0\my.ini C:\Program Files\MySQL\MySQL Server 5.0可以被指向MySQL服务器的安装路径所代替。

编辑my.ini文件

可以使用文本编辑器打开该文件同时做出必要的编辑和修改。你也可以以MySQL Administrator的应用程序来修 改服务器配置。 MySQL客户端和应用程序,例如mysql命令行客户端和mysqldump并不能确定位于服务器安装目录中的my.ini文件 的位置。为了配置客户端和应用程序,根据你的Windows版本的不同,在C:\Windows下或者在C:\WINNT目录下生 成新的文件my.ini 文件

四、从Noinstall Zip Archive中安装MySQL

正在从Noinstall软件包安装MySQL的用户可以使用这个说明来手动安装MySQL。从Zip archive 中安装MySQL的 步骤如下:

1 在指定的安装目录下解压软件包。 2 制造选择文件。 3 选择MySQL服务类型。 4 开始MySQL服务。 5 保护默认账户。

解压安装软件包

为了手工安装MySQL,需要按以下步骤进行:

1 如果你需要对以前的版本更新,请参考在更新步骤刚开始时的文章 “Upgrading MySQL on Windows”。

2 如果你正在使用基于Windows NT的操作系统例如Windows NT, Windows 2000, Windows XP或者Windows Server 2003,必须保证你作为拥有管理员特权的用户登录该系统。

3 选择一个安装位置。传统的MySQL服务器安装在 C:\mysql,而MySQL安装向导将 MySQL 安装到 C:\Program Files\MySQL。如果不将 MySQL 安装到 C:\mysql下,你必须在启动或者在选择文件中具体指出安装路径。

4 选用压缩工具将安装压缩软件解压缩至选择安装的位置上。有些压缩工具有可能将其解压到你的被选择的安 装位置的子目录中。如果是这种情况,你可以将该子目录的内容从子目录移至安装路径下。

生成选择文件

如果你需要在运行服务器时,具体化启动选项,你可以在命令行标志出他们或者在一个选择文件中设置他们。 对于每次服务器启动时所使用的服务,你将会发现使用选择文件来具体化你的MySQL配置是非常便利的。尤其是 在以下情况中:当MySQL服务在Windows上启动时,其在两个文件中寻找选项:在Windows目录下的 my.ini 文件以及C:\my.cnf 文件。Windows目录典型的命名如下:C:\WINDOWS or C:\WINNT。你可以通过下面的命令来决定WINDIR环境变量 的值: C:\> echo %WINDIR% MySQL首先在my.ini 文件中寻找选项,然后是在my.cnf 文件中。然而,为了避免混淆,最好是只用一个文件。 如果你的PC使用加载的启动装备同时C:不是启动区,那你只能通过my.ini文件来进配置。不管你使用哪种选择 文件,该文件必须是文本格式。你同时也可以充分利用包含在你的MySQL发布版的样本文件。在你的安装目录下 寻找诸如 my-small.cnf, my-medium.cnf, my-large.cnf和my-huge.cnf的文件,这些文件可以被重新命名同时 拷贝到合适的位置作为一个基本的配置文件来使用。一个选择文件可以被任何文本编辑器生成和修改,诸如 Notepad等。例如,如果MySQL被安装在E:\mysql 目录下,而数据目录是在E:\mydata\data下,你可以生成一个 包含 [mysqld] 部分的选择文件来具体化基本目录和数据目录的参数值:

[mysqld] # set basedir to your installation path basedir=E:/mysql # set datadir to the location of your data directory datadir=E:/mydata/data

在这里需要注意Windows路径名在事先使用的斜线而不是反斜线选择文件中被具体化。因此当你使用反斜线时, 你必须使用双斜线。

[mysqld] # set basedir to your installation path basedir=E:\\mysql # set datadir to the location of your data directory datadir=E:\\mydata\\data

在Windows中,MySQL安装程序直接将数据目录安装在你安装MySQL的目录下。如果你需要在另外不同的位置使用 数据目录,你需要将整个数据目录的内容拷贝至新的位置。例如,如果MySQL安装在C:\Program Files\MySQL\MySQL Server 5.0 目录下,则数据目录的位置默认是在 C:\Program Files\MySQL\MySQL Server 5.0\data下。如果你需要将E:\mydata 作为你的数据目录,你需要做以下两件事情:

1 将整个数据目录和它的所有内容从C:\Program Files\MySQL\MySQL Server 5.0\data 移至E:\mydata.。

2 每次启动服务时,使用a–datadir选项来确认新的数据目录位置。

选择MySQL服务类型

以下显示了MySQL5.0Windows版本提供的服务类型:

mysqld-debug带有完全调试和自动内存分配检查的编译,该编译对象也包括 InnoDB和BDB数据表。 mysqld 优化InnoDB支持的二进制数据。 mysqld-nt优化命名管道支持的二进制数据。 mysqld-max优化InnoDB 和 BDB数据表所支持的二进制数据 mysqld-max-nt同mysqld-max功能一样,但是编译时支持命名管道

上述优化选项都是针对Intel 处理器的,但是应该可以工作在任何Intel i386-class 或者更高的处理器。在MySQL 5.0中,所有的Windows版本服务器都提供了对数据库目录的符号链接。 MySQL提供了对Windows平台上的TCP/IP 的支持。mysqld-nt和 mysql-max-nt 服务器则提供了对Windows NT,2000,XP和2003下的命名管道的支持。然而,不管在何种平台下,默认使用的都是TCP/IP。(在很多Windows 配置下,命名管道要比TCP/IP服务要慢)

命名管道的使用受以下条件的制约:

? 命名管道只有当你启动服务时选择 –enable-named-pipe才会被激活。非常有必要的显式使用该选项 ,因为有些用户在命名管道正在使用时关掉MySQL服务器遇到过故障问题。 ? 命名管道只有在mysqld-nt 或mysqld-max-nt 服务器下并且仅当该服务器运行在支持命名管道的 Windows版本的平台下才能使用。? 在Windows 98 or Me系统下,只有当其安装了TCP/IP后,这些服务才能够运行。命名管道的连接不能 使用。? 上述服务在Windows 95下不能够运行。注意:在参考手册中的大部分例子都使用mysqld作为服务名。如果你使用另外一个服务器,例如mysqld-nt,则 需对上述例子作合理的替代。

首次开启服务

这部分的信息主要应用在使用Noinstall版本安装MySQL时,或者希望手动而不是使用GUI工具配置和检测MySQL 的情况下。在Windows 95, 98, or Me下,MySQL客户端经常和使用TCP/IP的服务器相连接。(这允许在你网络上的任意机器 可以和MySQL服务器连接)。基于这一点,你必须保证在启动MySQL前,TCP/IP 支持安装在你的机器上。你可以 到在你Windows CD-ROM中找到TCP/IP服务。 在这里需要注意的是如果你正在使用老的Windows 95发布版本(例如OSR2),那很有可能你在使用一个旧的 Winsock软件包;MySQL需要的是Winsock 2。你可以从http://www.microsoft.com/.下载最新的Winsock软件包 。Windows 98具有新的Winsock 2库,所以无需更新库。在基于NT的系统例如 Windows NT, 2000, XP, or 2003上,客户可以有两个选择。他们可以使用TCP/IP或者当 服务器支持命名管道的连接时使用命名管道。为了得到在TCP/IP下工作的Mysql版本,你必须安装service pack 3(或者更新的版本) 如果在启动时,选择 –shared-memory, Windows版本的MySQL 5.0同样也支持共享内存的连接。客户端可以选 择 –protocol=memory 选项来进行共享内存的连接。

以上对启动MySQL服务进行了总体概述,下面的内容提供了从命令行或者作为Windwos服务来启动MySQL服务器更 加具体的信息:

假设MySQL安装在默认位置C:\Program Files\MySQL\MySQL Server 5.0下。如果你把MySQL安装在不同的位置上 ,则需调整相应的路径名。测试工作可以从控制台窗体(或者通过“DOS window”)通过一个即时命令来完成。 这样你就可以会在窗体中比较容易的看到服务器状态信息。如果你的配置有误时,这些信息将有助于你识别和 修复任何故障。为了开启服务,输入以下命令:

C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld –console 对于InnoDB支持的服务器,在服务启动时你可以看到下列信息: InnoDB: The first specified datafile c:\ibdata\ibdata1 did not exist: InnoDB: a new database to be created! InnoDB: Setting file c:\ibdata\ibdata1 size to 209715200 InnoDB: Database physically writes the file full: wait… InnoDB: Log file c:\iblogs\ib_logfile0 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile0 size to 31457280 InnoDB: Log file c:\iblogs\ib_logfile1 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile1 size to 31457280 InnoDB: Log file c:\iblogs\ib_logfile2 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile2 size to 31457280 InnoDB: Doublewrite buffer not found: creating new InnoDB: Doublewrite buffer created InnoDB: creating foreign key constraint system tables InnoDB: foreign key constraint system tables created 011024 10:58:25 InnoDB: Started

当服务器完成启动序列后,你可以看到如下信息,这些信息表明服务器已经开始服务客户端连接:

mysqld: ready for connections Version: ‘5.0.13-rc’ socket: ” port: 3306

服务器将会继续将其所产成的判断信息输入到控制台上。而你则可以打开一个新的控制台来运行客户端程序。如果你省略了 –console 选项,服务器将会把诊断信息输出到 数据目录下的错误日志中(默认是C:\Program Files\MySQL\MySQL Server 5.0\data )。错误日志以.err为扩展名。注意:在MySQL授权数据表的帐号初始化是没有密码的。

在Windows命令行下开启MySQL服务

MySQL服务器可以手动从命令行启动。该项操作可以在Windows的任何版本下完成。为了从命令行启动mysqld服 务,你应该启动一个控制台窗体(或者"DOS 窗体")同时输入以下命令:

C:\> C:\Program Files\MySQL\MySQL Server 4.1\bin\mysqld

在上述例子中使用的路径可以根据你的系统安装MySQL的路径不同而改变。在非NT版本的Windows版本上, mysqld是在后台启动的。这也就意味着在服务启动之后,你查看另外的即时命令。基于这一点,你应该在服务 运行时打开另外一个控制窗体来运行客户端程序。

你可以通过执行以下命令停止MySQL服务:

C:\> C:\Program Files\MySQL\MySQL Server 4.1\bin\mysqladmin -u root shutdown

该命令激活MySQL管理程序和服务器连接同时告诉他关闭服务。该名令是作为MySQL根用户连接的,在Mysql权限 系统中,根用户默认是管理员帐户。注意在MySQL授权系统中的用户和任意在Windows下登陆的用户是完全独立 的。如果mysqld没有启动,检查错误日志文件查看是否服务器向其中写入了信息,该信息说明问题产生的原因。错 误日志位于C:\Program Files\MySQL\MySQL Server 5.0\data 目录下。该日志是以扩展名为.err的文件。你也 可以试着重新开启mysqld 控制台服务,这样你就有可能获取一些有助于解决问题的信息。最后一个选项是开启mysqld时选择–standalone –debug。在这种情况下,mysqld 将会写一个 C:\mysqld.trace的日志文件,该日志文件将会包含mysqld为何没有启动的原因。

使用mysqld –verbose –help 可以看到mysqld所提供的所有选项的帮助信息。

作为一项Windows服务开启MySQL

在NT系列的Windows版本(Windows NT, 2000, XP, 2003)中,推荐运行MySQL服务的方法是将其作为Windows服务 进行安装,在这种情况下MySQL随着Windows开始和结束自动开始和结束。一个作为服务被安装的MySQL服务器能 够被从命令行上使用NET命令或者使用图形界面服务程序所控制。服务程序(Windows 服务控制管理器)可以被在 Windows控制面板中找到(在Windows 2000, XP, and Server 2003的管理工具下)。建议在执行服务器安装程序 时或者在命令行中执行删除操作时关闭服务应用程序。这将会防止很多错误。在将MySQL作为Windows服务安装之前,如果当前服务器正在运行,应该首先使用下述命令停止其的运行:

C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqladmin -u root shutdown

注意:如果MySQL根用户有密码,那么你需要这样激活命令:

C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqladmin -u root -p shutdown ,同时必须根据提示输入 用户密码。

这调用了MySQL的管理功能mysqladmin,mysqladmin可以连接到服务器,让服务器关闭。这个命令是作为MySQL 的 root用户而和服务器建立连接的,MySQL的 root用户在MySQL授权系统中是默认管理帐户。需要注意的是在 MySQL授权系统中的用户是完全独立于Windows上登录用户。

用下列命令可将服务器作用一项服务安装:

C:\> mysqld –install

如果你用server名字在将服务器安装成一项服务的过程中遇到问题, 那就试试用全称路径名。举例来说:

C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld –install

你也可以将到mysql bin目录的路径加入到Windows 系统PATH 环境变量:

? 在Windows桌面上,右击“我的电脑”,选择“属性” ? 出现系统属性菜单,选择“高级”,然后单击“环境变量”按钮。? 在“系统变量”列表中选择“路径”,然后单击“编辑”按钮。这时会出现编辑系统变量对话框。 ? 将光标放在“变量值”对应的文字的末尾(请使用 End key,以确保光标在最后的位置) 。然后输入 MySQL bin 目录的全称路径, (举个例子, C:\Program Files\MySQL\MySQL Server 5.0\bin), 注意应该用分 号将这个路径与其它值分开。 点击“确定”逐个关闭所有打开的对话框。现在你就可以在DOS系统下从系统的 任意目录中,通过输入任意可执行的 MySQL 程序的名字而找到该程序,不必再输入路径。这包括服务器、 mysql 客户和所有 MySQL 命令行比如 mysqladmin 和 mysqldump。 ? 注意如果你在同一台机器上运行多个MySQL 服务器的话,就不要将MySQL bin 目录加入到 Windows 路 径中。

警告: 在手工编辑系统路径的时候一定要特别小心,如果不小心删除或改变了系统路径中的任何部分都将导致 误操作甚至导致系统不稳定。服务安装命令并不启动服务器,关于这点后面将详细介绍。

MySQL 5.0 在安装服务的过程中对附加参数提供的支持有限:? 你可以在安装选项之后立即为服务命名,否则默认的服务名字是 MySQL。

? 如果设置了一个服务名字,就可以用使用单一选项。通常按照约定,这应当是–defaults- file=file_name 来设置选项文件的名字,服务器在启动时会从选项文件中读取选项。可以使用单一选项而不用–defaults-file,但不推荐这样做。因为,–defaults-file 更加灵活,你可以 通过将多个选项放到指定的选项文件中而为服务器设置多个启动选项。同样,在MySQL 5.0中我们也不支持使用 不同于–defaults-file的选项,但5.0.3版本就可以这样做了。

? 对于MySQL 5.0.1,你也可以在服务名字下设置一个 –local-service(本地服务)选项。这会使服务 器用LocalService Windows帐户运行。这种帐户只在Windows XP或更新的系统上才有。如果服务名字下既有– defaults-file 也有 –local-service,那么它们之间不论次序。 对于安装成Windows服务的MySQL服务器来说,由下面的规则决定服务名字和服务器使用的选项文件: ? 如果服务安装命令没有指定服务名字,那么安装选项将默认服务名字为MySQL, 服务器将使用 MySQL服 务,并从标准选项文件中的 [mysqld]群中读取选择。 ? 如果服务安装命令没有指定了一个服务名字,服务器将使用指定的服务名字并从从标准选项文件中与 服务名字相同的群中读取选项。 服务器也从标准文件选项文件中的[mysqld]群中读取选项。这保证可以从[mysqld]群中读取所有MySQL服务都 用的选项,而用指定服务名字按照的服务器使用和与指定服务名字相同的选项群。 ? 如果安装命令在服务名字之后指定一个 –defaults-file 选项,那么服务器只从指定文件的 [mysqld] 群中读取选项而忽略标准选项文件。

下面的命令是一个复杂的例子:

C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld –install MySQL –defaults-file=C:\my- opts.cnf

在这里,由安装选项给出了默认服务名字MySQL。如果没有给出–defaults-file选项,那么这个命令将使服务 器从标准选项文件中的[mysqld]群中读取。然而在这里给出了–defaults-file选项,所以服务器只从指定文件 的[mysqld] 选项群读取。

你也可以在启动MySQL服务之前,在Windows Services 工具栏中将选项定义为启动参数。一旦MySQL服务器被安装成一项服务,Windows就会在启动时自动启动该服务。也可以在Services 工具栏中直接 启动MySQL服务器,或使用NET START MySQL命令也可。NET 命令不区分大小写。

作为服务运行时,mysqld无权使用控制窗口,因此在这里看不到消息。如果mysqld不能启动,就查错误记录看 看服务器是不是写下了什么说明问题原因的消息。错误记录在MySQL数据目录下(比如: C:\Program Files\MySQL\MySQL Server 5.0\data)。错误记录的后缀名是 .err。

MySQL作为服务安装的情况下,如果服务正在运行,Windows关闭的时候会自动停止服务。 如果你不想在boot 进程中自动启动服务,你可以将服务器作为手动服务安装。手动服务的安装需要选择“手动 安装” 选项而不是 “安装”选项:

C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld –install-manual

要删除作为服务安装的服务器时,首先要通过NET STOP MYSQL关闭正在运行的MYSQL,然后用“删除”选项删除 它:

C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld –remove 如果mysqld不是作为服务运行,可以用命令行启动它。

五、测试 MySQL安装

你可以通过执行下列任何一个命令来测试MySQL 服务器是否安装:

C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqlshow C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqlshow -u root mysql C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqladmin version status proc C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysql test

如果mysqld对来自客户程序的TCP/IP 连接反应很慢,那么说明你的DNS可能有问题。在这种情况下,用–skip -name-resolve选项启动mysqld,而且在MySQL 授权列表的Host栏中只使用本地Host和IP。 你可以强迫 MySQL客户运用管理连接,而不用TCP/IP。方法是选定–pipe 或–protocol=PIPE 按钮,或指定 . (period)作为主机名。运行–socket 选项来规定管道名。

九、排除在Windows下安装MySQL的故障

如果是初次安装MySQL,你可能会遇到一些阻止MySQL启动的错误,这一部分的目的就是帮助你诊断和排除某些 故障。 在排查故障时,可用的第一项资源就是错误记录。MySQL 服务器的错误记录会记下阻止服务器启动的相关错误 。错误记录在数据目录下,my.ini文件中记载了数据目录的地址。默认的文件目录位置是C:\Program Files\MySQL\MySQL Server 5.0\data。 另外在MySQL服务运行过程中的控制信息也可能会记载一些相关的错误。在mysqld作为服务安装之后,从命令行 中执行NET START mysql命令查看是否有关于作为服务启动MySQL服务器的错误信息。

下面的例子是一些首次安装MySQL和启动服务器的过程中,可能遇到的常见错误信息:

?System error 1067 has occurred. ?Fatal error: Can’t open privilege tables: Table ‘mysql.host’ doesn’t exist

? 当 MySQL 服务器找不到 mysql privileges database 或其它关键文件时,就会产生这样的信息。当 MySQL的原始数据或数据目录安装在不同于默认位置(分别是C:\mysql 和 C:\Program Files\MySQL\MySQL Server 5.0\data )时,常常遇到这个问题。 一种情况是MySQL已升级并安装到新的位置,但配置文件并没有反映新的安装位置。另外 ,可能会产生相互冲 突的新、旧配置文件。因此,在升级MySQL时,应确保删除旧的配置文件或重命名。 如果你将MySQL安装到了C:\Program Files\MySQL\MySQL Server 5.0以外的其它位置,你必须确保MySQL服务器 通过一个配置文件(my.ini) 知道安装的位置。my.ini文件必须在Windows目录下,通常是C:\WINNT 或 C:\WINDOWS。你可以从WINDIR环境变量的值来确定其具体位置,需要从命令提示符发出下列命令:

C:\> echo %WINDIR%

生成一个选项文件,并且可以用任何文本编辑程序修改,比如Notepad。举例来说,如果MySQL安装在E:\mysql 、数据目录是D:\MySQLdata,你可以创建一个选项文件,在其中创建一个[mysqld]部分来定义basedir 和 datadir参数:

[mysqld] # set basedir to your installation path basedir=E:/mysql # set datadir to the location of your data directory datadir=D:/MySQLdata

注意在选项文件中,Windows 路径名是用(forward) slashes 定义的,而不是用 backslashes。如果你使用的 是 backslashes,你就需要将它们加倍:

[mysqld] # set basedir to your installation path basedir=C:\\Program Files\\MySQL\\MySQL Server 5.0 # set datadir to the location of your data directory datadir=D:\\MySQLdata

如果你在MySQL配置文件改变了datadir值,那么你在重新启动MySQL服务器之前就必须将已有的MySQL数据目录 转移到相应的位置。

? Error: Cannot create Windows service for MySql. Error: 0

? 如果你不先停止并删除现有的MySQL而重新安装或升级时,或用MySQL Configuration Wizard安装 MySQL时,就会产生这样的错误。因为当Configuration Wizard试图安装服务时,就会发现已经有一个同名的服 务。 对这个问题的一个解决方法是,在使用configuration wizard时选择一个服务名称,而不用默认的mysql 。这 可以使新的服务正确地安装,但旧的还放在那里。建议最好还是把不用的删掉。

要永久删除旧的mysql服务,需要用户以管理权限在命令行上执行下列命令: C:\>sc delete mysql [SC] DeleteService SUCCESS

如果你的Windows版本上没有sc工具栏,就从下面的网址上下载delsrv工具栏: http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/delsrv-o.asp 然后运用delsrv mysql syntax。

六、在Windows上升级MySQL

这部分介绍一些在Windows上升级MySQL的必需步骤。

1. 在升级之前,你应当一直支持目前的MySQL安装。 “Database Backups” 2. 在http://dev.mysql.com/downloads可以下载在Windows上安装MySQL 的最新内容。 3. 在升级MySQL之前,必须停止服务器。

如果服务器是作为服务安装的,要从命令提示符通过下列命令停止服务:

C:\> NET STOP MYSQL

如果不是作为服务安装的,就用下列命令停止MySQL服务器:

C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqladmin -u root shutdown

当将4.1.5以前的版本升级到 MySQL5.0时,或将用Zip压缩文件安装的MySQL升级到用MySQL Installation Wizard安装的MySQL版本时,必须手动删除以前的安装和MySQL服务(如果服务器有作为服务安装的话). 用下列命令删除原来的MySQL服务:

C:\> C:\mysql\bin\mysqld –remove

如果不删除原有服务,MySQL Installation Wizard可能无法安装新的MySQL服务。

如果你从Zip 压缩文档安装MySQL,要么覆盖原有的MySQL安装(通常在C:\mysql),要么在不同的目录下安装 ,比如C:\mysql4。建议覆盖原有安装。

重启服务器。如果MySQL是作为服务运行的话,用NET START MySQL,或者直接调用mysqld。

Windows 和 Unix两种系统下的MySQL比较

MySQL在Windows上已经相当稳定。Windows版本的MySQL和相应的Unix版本的MySQL具有相同的特性,但存在以下 几点不同:

• Windows 95和线程

Windows 95分出约200字节的主内存给每一个线程。MySQL的每个连接创建一个新的线程,所以如果服务器处理 多个连接时,不应该在Windows 95下运行 mysqld。其他版本的Windows不存在这个bug。

• 限制端口数量

Windows系统下大概有4,000个可用端口,当一个端口的连接关闭时,需要2-4分钟才能重新启用该端口。当处 于代理连接和断开连接的高峰期时,可能使所有的端口在重新启用之前都处于关闭状态。如果发生这种情况, MySQL服务器将停止相应,尽管它还处于运行状态下。需要注意的是,机器上运行的其它应用程序也可能使用端 口,这也会使可用端口的数量下降。更多的信息请参看下面链接: http://support.microsoft.com/default.aspx?scid=kb;en-us;196271.

• 同时读取

MySQL依赖于调用pread()和pwrite()系统来使INSERT和SELECT可用。目前,我们使用mutexes来代替pread()和 pwrite()。我们打算用虚拟的界面来替代文件水平界面,这样我们就可以在NT,2000和XP系统上使用readfile ()/writefile()界面并获得较高的速度。目前MySQL 5.0只能执行2,048个文件,这就意味着不能在Windows NT ,2000,XP和2003以及Unix下运行多个同时运行的线程。

• 封闭读取

MySQL对每一个连接使用封闭读取,如果指定的通道连接可用,这就意味着以下几点:

o一个连接不会在8小时后自动断开,这发生于Unix版本的MySQL。 o如果连接悬挂,只有关闭MySQL才能断开该连接。 omysqladmin kill 对睡眠状态的连接无效。 o只要存在睡眠连接,mysqladmin shutdown不会异常终止。

• ALTER TABLE

当你正在执行一个ALTER TABLE语句时,在被其他线程使用前表格将被锁定。在Windows系统下可发生该情况, 你不能删除被另外一个线程使用的文件。将来我们可能找到解决该问题的方法。

• DROP TABLE

因为MERGE 处理器处理隐藏于MySQL上一层的表格,这可使Windows下的被MERGE表格使用的DROP TABLE不工作。 因为Windows不允许dropping文件开启,你就必须转储清除所有的MERGE表格(使用FLUSH TABLES)或者在 dropping文件前先撤销MERGE表格。

• 数据目录和索引目录

Windows系统忽略了CREATE TABLE的数据目录和索引目录选项,这是由于Windows不支持符号连接造成的。在拥 有无功能realpath()调用的系统上也会忽略这些选项。

• 撤销数据库

你不能够撤销正在被某个线程使用的数据库。

• 从任务管理器内关闭MySQL

你不能够在任务管理器内关闭MySQL,也不能依靠Windows 95的关机操作关闭MySQL。你必须使用mysqladmin shutdown来关闭MySQL。

• 名称的大小写

在Windows下的文件名不区分大小写,所以Windows同样不区分MySQL数据库和表格的名称的大小写。唯一的限制 就是数据库和表格名称必须在给定的语句内全部使用相同的case来指定。

• ‘\’路径名分离字符

在Windows下使用‘\’来分离路径名,‘\’同样是MySQL里的换码符。如果你使用LOAD DATA INFILE 或者 SELECT … INTO OUTFILE,使用Unix格式的文件名内出现‘/’字符:

mysql> LOAD DATA INFILE ‘C:/tmp/skr.txt’ INTO TABLE skr; mysql> SELECT * INTO OUTFILE ‘C:/tmp/skr.txt’ FROM skr; 换句话说, 你必须使用两个‘\’字符。 mysql> LOAD DATA INFILE ‘C:\\tmp\\skr.txt’ INTO TABLE skr; mysql> SELECT * INTO OUTFILE ‘C:\\tmp\\skr.txt’ FROM skr;

• 进程管道的问题

进程管道不会按照Windows命令行的提示可靠的工作。如果进程管道包含有字符^Z / CHAR(24),Windows便为认 为达到文件尾并终止程序。当你应用下面的一个二进制日志时便会出现问题:

C:\> mysqlbinlog binary-log-name | mysql –user=root 如果你需要应用该日志并遇到问题,你可以怀疑这是由于^Z / CHAR(24)字符导致的,可使用下面的工作区来解 决: C:\> mysqlbinlog binary-log-file –result-file=/tmp/bin.sql C:\> mysql –user=root –execute "source /tmp/bin.sql" 这样,后面的命令也可以可靠的读取含有二进制数据的SQL文件。

• 用户错误所导致的拒绝访问

如果你尝试运行MySQL代理程序来连接服务器,同时该服务器又在同一台机子上运行着,你就被当作’some- user’@'unknown’用户而被拒绝访问’mysql’数据库,这表明MySQL不能够恰当的解析主机名。要解决该问题,你必须创建一个名为\windows\hosts的文件,并包含下面的信息:

127.0.0.1 localhost

SQL:JOIN之完全用法

 

外联接

外联接可以是左向外联接、右向外联接或完整外部联接。在 FROM 子句中指定外联接时,可以由下列几组关键字中的一组指定:LEFT JOIN 或 LEFT OUTER JOIN。

左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

RIGHT JOIN 或 RIGHT OUTER JOIN。

右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

FULL JOIN 或 FULL OUTER JOIN。

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行。内联接消除与另一个表中的任何行不匹配的行。而外联接会返回 FROM 子句中提到的至少一个表或视图的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。将检索通过左向外联接引用的左表的所有行,以及通过右向外联接引用的右表的所有行。完整外部联接中两个表的所有行都将返回。

Microsoft® SQL Server™ 2000 对在 FROM 子句中指定的外联接使用以下 SQL-92 关键字:

LEFT OUTER JOIN 或 LEFT JOIN

RIGHT OUTER JOIN 或 RIGHT JOIN

FULL OUTER JOIN 或 FULL JOIN

SQL Server 支持 SQL-92 外联接语法,以及在 WHERE 子句中使用 *= 和 =* 运算符指定外联接的旧式语法。由于 SQL-92 语法不容易产生歧义,而旧式 Transact-SQL 外联接有时会产生歧义,因此建议使用 SQL-92 语法。

使用左向外联接

假设在 city 列上联接 authors 表和 publishers 表。结果只显示在出版商所在城市居住的作者(本例中为 Abraham Bennet 和 Cheryl Carson)。

若要在结果中包括所有的作者,而不管出版商是否住在同一个城市,请使用 SQL-92 左向外联接。下面是 Transact-SQL 左向外联接的查询和结果:

USE pubs

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors a LEFT OUTER JOIN publishers p

ON a.city = p.city

ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC

下面是结果集:

au_fname au_lname pub_name

Reginald Blotchet-Halls NULL

Michel DeFrance NULL

Innes del Castillo NULL

Ann Dull NULL

Marjorie Green NULL

Morningstar Greene NULL

Burt Gringlesby NULL

Sheryl Hunter NULL

Livia Karsen NULL

Charlene Locksley NULL

Stearns MacFeather NULL

Heather McBadden NULL

Michael OLeary NULL

Sylvia Panteley NULL

Albert Ringer NULL

Anne Ringer NULL

Meander Smith NULL

Dean Straight NULL

Dirk Stringer NULL

Johnson White NULL

Akiko Yokomoto NULL

Abraham Bennet Algodata Infosystems

Cheryl Carson Algodata Infosystems

(23 row(s) affected)

不管是否与 publishers 表中的 city 列匹配,LEFT OUTER JOIN 均会在结果中包含 authors 表的所有行。注意:结果中所列的大多数作者都没有相匹配的数据,因此,这些行的 pub_name 列包含空值。

使用右向外联接

假设在 city 列上联接 authors 表和 publishers 表。结果只显示在出版商所在城市居住的作者(本例中为 Abraham Bennet 和 Cheryl Carson)。SQL-92 右向外联接运算符 RIGHT OUTER JOIN 指明:不管第一个表中是否有匹配的数据,结果将包含第二个表中的所有行。

若要在结果中包括所有的出版商,而不管城市中是否还有出版商居住,请使用 SQL-92 右向外联接。下面是 Transact-SQL 右向外联接的查询和结果:

USE pubs

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors AS a RIGHT OUTER JOIN publishers AS p

ON a.city = p.city

ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC

 

下面是结果集:

au_fname au_lname pub_name 

Abraham Bennet Algodata Infosystems

Cheryl Carson Algodata Infosystems

NULL NULL Binnet & Hardley

NULL NULL Five Lakes Publishing

NULL NULL GGG&G

NULL NULL Lucerne Publishing

NULL NULL New Moon Books

NULL NULL Ramona Publishers

NULL NULL Scootney Books

(9 row(s) affected)

使用谓词(如将联接与常量比较)可以进一步限制外联接。下例包含相同的右向外联接,但消除销售量低于 50 本的书籍的书名:

USE pubs

SELECT s.stor_id, s.qty, t.title

FROM sales s RIGHT OUTER JOIN titles t

ON s.title_id = t.title_id

AND s.qty > 50

ORDER BY s.stor_id ASC

下面是结果集:

stor_id qty title 

(null) (null) But Is It User Friendly? 

(null) (null) Computer Phobic AND Non-Phobic Individuals: Behavior 

Variations 

(null) (null) Cooking with Computers: Surreptitious Balance Sheets 

(null) (null) Emotional Security: A New Algorithm 

(null) (null) Fifty Years in Buckingham Palace Kitchens 

7066 75 Is Anger the Enemy? 

(null) (null) Life Without Fear 

(null) (null) Net Etiquette 

(null) (null) Onions, Leeks, and Garlic: Cooking Secrets of the 

Mediterranean 

(null) (null) Prolonged Data Deprivation: Four Case Studies 

(null) (null) Secrets of Silicon Valley 

(null) (null) Silicon Valley Gastronomic Treats 

(null) (null) Straight Talk About Computers 

(null) (null) Sushi, Anyone? 

(null) (null) The Busy Executives Database Guide 

(null) (null) The Gourmet Microwave 

(null) (null) The Psychology of Computer Cooking 

(null) (null) You Can Combat Computer Stress! 

(18 row(s) affected)

有关谓词的更多信息,请参见 WHERE。

使用完整外部联接

若要通过在联接结果中包括不匹配的行保留不匹配信息,请使用完整外部联接。Microsoft® SQL Server™ 2000 提供完整外部联接运算符 FULL OUTER JOIN,不管另一个表是否有匹配的值,此运算符都包括两个表中的所有行。

假设在 city 列上联接 authors 表和 publishers 表。结果只显示在出版商所在城市居住的作者(本例中为 Abraham Bennet 和 Cheryl Carson)。SQL-92 FULL OUTER JOIN 运算符指明:不管表中是否有匹配的数据,结果将包括两个表中的所有行。

若要在结果中包括所有作者和出版商,而不管城市中是否有出版商或者出版商是否住在同一个城市,请使用完整外部联接。下面是 Transact-SQL 完整外部联接的查询和结果:

USE pubs

SELECT a.au_fname, a.au_lname, p.pub_name

FROM authors a FULL OUTER JOIN publishers p

ON a.city = p.city

ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC

 

下面是结果集:


au_fname au_lname pub_name 

Reginald Blotchet-Halls NULL

Michel DeFrance NULL

Innes del Castillo NULL

Ann Dull NULL

Marjorie Green NULL

Morningstar Greene NULL

Burt Gringlesby NULL

Sheryl Hunter NULL

Livia Karsen NULL

Charlene Locksley NULL

Stearns MacFeather NULL

Heather McBadden NULL

Michael OLeary NULL

Sylvia Panteley NULL

Albert Ringer NULL

Anne Ringer NULL

Meander Smith NULL

Dean Straight NULL

Dirk Stringer NULL

Johnson White NULL

Akiko Yokomoto NULL

Abraham Bennet Algodata Infosystems

Cheryl Carson Algodata Infosystems

NULL NULL Binnet & Hardley

NULL NULL Five Lakes Publishing

NULL NULL GGG&G

NULL NULL Lucerne Publishing

NULL NULL New Moon Books

NULL NULL Ramona Publishers

NULL NULL Scootney Books

(30 row(s) affected)