数据库(database)保存有组织的数据的容器(通常是一个文件或一组文件)。
表(table)某种特定类型数据的结构化清单。
模式(schema)关于数据库和表的布局及特性的信息。
数据类型限制可存储在列中的数据种类(例如,防止在数值字段中录入字符值),它还帮助正确地分类数据,并在优化磁盘使用方面起重要的作用。数据类型及其名称是SQL不兼容的一个主要原因。
主键(primary key)一列(或一组列),其值能够唯一标识表中每个行。
表中的任何列都可以作为主键,只要它满足以下条件:
任意两行都不具有相同的主键值;
每个行都必须具有一个主键值(主键值不允许Null值);
主键列中的值不允许修改或更新;
主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)。
SQL(发音为字母S-Q-L或sequel)是结构化查询语言(Structured Query Language)的缩写。SQL是一种专门用来与数据库通信的语言。标准SQL由ANSI标准委员会管理,从而称为ANSI SQL。
在处理SQL语句时,其中所有空格都被忽略。SQL语句可以分成多行。
多条SQL语句必须以分号(;)分隔。多数DBMS不需要在单条SQL语句后加分号。例外是Sybase Adaptive Server,它不允许SQL语句以分号结束。
SQL语句不区分大小写。
子句(clause)SQL语句由子句构成,一个子句通常由一个关键字加上所提供的数据组成。
ORDER BY子句的位置必须是SELECT语句中最后一条子句。可使用非检索列排序。
方式:①列名;②相对列位置(①和②可混合使用)
默认升序(ASC/ASCENDING),降序需使用关键字DESC(DESCENDING)
搜索条件(search criteria)也称为过滤条件(filter condition)。
SQL过滤与应用过滤
让客户机应用(或开发语言)处理数据库的工作将会极大地影响应用的性能,并且使所创建的应用完全不具备可伸缩性。此外,如果在客户机上过滤数据,服务器不得不通过网络发送多余的数据,这将导致网络带宽的浪费。
“!=”和“<>” 通常可以互换使用。但非所用DBMS都支持这两种不等于操作符。例如,Microsoft Access支持<>而不支持!=。
BETWEEN匹配范围中所有的值,包括指定的开始和结束值。
操作符(operator)用来联结或改变WHERE子句中的子句的关键字。也称为逻辑操作符(logical operator)。
SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。为避免操作符被错误地组合,可使用圆括号明确地分组相应的操作符。
IN操作符完成与OR相同的功能。IN操作符的优点为:
l 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
l 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
l IN操作符一般比OR操作符清单执行更快。
l IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。
MySQL不支持“WHERE NOT 列名 操作符 条件”的格式。在MySQL中,NOT只用来否定EXISTS (如NOT EXISTS)。
通配符(wildcard)用来匹配值得一部分的特殊字符。
搜索模式(search pattern)由字面值、通配符或两者组合构成的搜索条件。通配符搜索只能用于文本字段(串),非文本数据类型字段不能使用通配符搜索。
百分号(%)通配符 表示任何字符出现任何次数。如果使用的是Microsoft Access,需要使用*而不是%。
下划线(_)通配符 表示单个字符。如果使用的是Microsoft Access,需要使用?而不是_。
方括号([])通配符用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符。集合只为Microsoft Access、Microsoft SQL Server和Sybase Adaptive Server所支持。此通配符可以用前缀字符^(脱字号)来否定。如果使用的是Microsoft Access,需要用!而不是^来否定一个集合。也可用NOT操作符得出相同的结果。
字段(field)基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上。
拼接(concatenate)将值联结到一起构成单个值。操作符可用加号(+)或两个竖扛(||)表示。Access、SQL Server和Sybase使用+号,DB2、Oracle、PostgreSQL和Sybase使用||。
MySQL中的拼接 MySQL不支持使用+或||的拼接。它使用CONCAT()函数把表项拼接起来。使用CONCAT(),例如:
SELECT CONCAT (name,’ (‘,country, ‘)’).MySQL确实支持||,但并不支持拼接。在MySQL中,||等同于操作符OR,而&&等同于操作符AND。
列别名(alias),有时也称为导出列(derived column)。是一个字段或值得替换名。别名用AS关键字赋予。
函数 |
语法 |
提取串的组成部分 |
Access使用MID();DB2、Oracle和PostgreSQL使用SUBSTR();MySQL、SQL Server和Sybase使用SUBSTRING() |
数据类型转换 |
Access和Oracle使用多喝函数,每种类型的转换有一个函数;DB2和PostgreSQL使用CAST();MySQL、SQL Server和Sybase使用CONVERT() |
取当前日期 |
Access使用NOW();DB2和PostgreSQL使用CURRENT_DATE;MySQL使用CURDATE();Oracle使用SYSDATE;SQL Server和Sybase使用GETDATE() |
可移植(portable)所编写的代码可以在多个系统上运行。
常用的文本处理函数
LOWER()(Access使用LCASE())
UPPER()(Access使用UCASE())
SOUNDEX是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。SOUNDEX考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较。Microsoft Access和PostgreSQL不支持SOUNDEX()。
日期和时间函数的可移植性最差。
例:在SQL Server和Sybase中检索2004年德所有订单
SELECT order_num FROM Orders WHERE DATEPART(yy, order_date)=2004;
在Access中使用如下版本:
SELECT order_num FROM Orders WHERE DATEPART(‘yyyy’,order_date)=2004;
在PostgreSQL中使用如下版本:
SELECT order_num FROM Orders WHERE DATE_PART(‘year’,order_date)=2004;
在MySQL中使用如下版本:
SELECT order_num FROM Orders WHERE YEAR(order_date)=2004;
在Oracle中使用如下版本:
① SELECT order_num FROM Orders WHERE to_number(to_char(order_date, ‘YY’))=2004;
② SELECT order_num FROM Orders WHERE order_date BETWEEN to_date(‘01-JAN-2004’) AND to_date(‘01-DEC-2004’);
*Oracle日期 DD-MMM-YYYY格式的日期(如上)一般能被Oracle正确处理,即使没有用to_date()明确地转换为日期也是如此;但为保险起见,应该总是使用该函数。
在主要DBMS的函数中,数值函数是最一致最统一的函数。
函数 |
说明 |
ABS() |
返回一个数的绝对值 |
COS() |
返回一个角度的余弦 |
EXP() |
返回一个数的指数值 |
PI() |
返回圆周率 |
SIN() |
返回一个角度的正弦 |
SQRT() |
返回一个数的平方根 |
TAN() |
返回一个角度的正切 |
聚集函数(aggregate function)运行在行组上,计算和返回单个值的函数。(不规则的译法还包括聚合函数(微软文档使用)、合计函数、统计函数等。)
AVG()函数:①只用于单个列;② AVG()函数忽略列值为NULL的行。
COUNT()函数有两种使用方式:
n 使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。
n 使用COUNT(column)对特定列中具有值得行进行计数,忽略NULL值。
MAX()/MIN()/SUM()函数:这些函数忽略列值为NULL()的行。
对非数值数据使用MAX()/MIN() 虽然MAX()一般用来找出最大的数值或日期值,但许多(并非所有)DBMS允许将它用来返回任意列中的最大值,包括韩慧文本列中的最大值。在用于文本数据时,如果数据按相应的列排序,则MAX()返回最后一行,MIN()返回最前面的行。
只包含不同的值,指定DISTINCT参数。 Microsoft Access在聚集函数中不支持DISTINCT。
如果指定列名,则DISTINCT()只能用于COUNT()。DISTINCT()不能用于COUNT(*)。类似地,DISTINCT必须使用列名,不能用于计算或表达式。
GROUP BY子句的重要规定:
n GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。
n 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数值)。
n GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
n 大多数SQL实现不允许GROUP BY列带有长度可变的数据类型(如文本或备注型字段)。
n 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。
n 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
n GROUP BY子句必须出现在WHERE子句之后,ORDER BY自居之前。
有的SQL实现(如Microsoft SQL Server)在GROUP BY中支持可选的ALL子句。这个子句可用来返回所有分组,即使是没有匹配行的分组也返回(在此情况下,聚集将返回NULL)。
WHERE过滤行,HAVING过滤分组。WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。
Microsoft Access不允许按别名排序。
查询(query)任何SQL语句都是查询。但此术语一般指SELECT语句。
子查询(subquery),即:嵌套在其他查询中的查询。
MySQL对于子查询的支持是从版本4.1开始引入的,其早期版本不支持子查询。
作为子查询的SELECT语句只能查询单个列。
第12章 联结表
关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各表通过某些常用的值(即关系设计中的关系(relational))互相关联。
可伸缩性(scale)能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可升缩性好(scale well)。
联结是一种机制,用来在一条SELECT语句中关联表。联结并不是物理实体,换句话说,它在实际的数据库表中不存在。联结由DBMS根据需要建立,它存在于查询的执行当中。
完全限定列名 在引用的列可能出现二义性时,必须使用完全限定列名(用一个句点分隔的表名和列名)。如果引用一个没有用表名限制的具有二义性的列名,大多数DBMS将返回错误。
笛卡尔积(cartesian product) 由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
叉联结 优势我们会听到返回称为叉联结(cross join)的笛卡尔积的联结类型。
等值联结(equijoin),它基于两个表之间的相等测试。这种联结也称为内部联结。
联结条件用ON子句。
ANSI SQL规范首选INNER JOIN语法。
第13章创建高级联结
Oracle中没有ASOracle不支持AS关键字。为在Oracle中使用别名,可以不用AS,简单地制定列名既可(因此,应该是Customers C而不是Customers AS C)。
4种类型的联结: 等值联结(equijoin)、自联结、自然联结、外部联结。
自联结通常作为外部语句用来替代从相同表中检索数据的使用子查询语句,虽然最终的结果是相同的。但许多DBMS处理联结远比处理子查询快得多。
自然联结排除多次出现,使每个列只返回一次。自然联结是这样一种联结,其中你只能选择那些唯一的列。这一般是通过对表使用通配符(SELECT *),对所有其他表的列使用明确的子集来完成的。
联结包含了在相关表中没有关联行的行,这种类型的联结称为外部联结。
外部联结的3种形式:
例:检索出所有客户,包括那些没有订单的客户
① SELECT Customers.cust_id,Orders.order_num FROM Customers LEFT OUTER JOIN Orders ON Customers.cust_id=Orders.cust_id;
② SELECT Customers.cust_id, Orders.order_num FROM Customers,Orders WHERE Customers.cust_id *= Orders.cust.id;
③ (仅由Oracle使用),在表明后使用(+)操作符。
④ SELECT Customers.cust_id, Orders.order_num FROM Customers,Orders WHERE Customers.cust_id (+) = Orders.cust.id;
还存在另一种外部联结,那就是全外部联结(full outer join),它检索两个表中的所有行并关联那些可以关联的行。与左外部联结或右外部联结不一样(它们包含来自一个表的不关联的行),全外部联结包含来自两个表的不关联的行。
FULL OUTER JOIN的支持 Access、MySQL、SQL Server或Sybase不支持FULL OUTER JOIN语法。
第14章组合查询
SQL也允许执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query)。
有两种基本情况,其中需要使用组合查询:
n 在单个查询中从不同的表类似返回结构数据。
n 对单个表执行多个查询,按单个查询返回数据。
任何具有多个WHERE子句的SELECT语句都可以作为一个组合查询给出。UNION ALL可完成WHERE子句完成不了的工作。
UNION规则:
n UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)。
n 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如,不同的数值类型或不同的日期类型)。
UNION从查询结果集中自动去除了重复的行,这是UNION的默认行为。如果想返回所有匹配行,可使用UNION ALL而不是UNION。
在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后。
其他类型的UNION某些DBMS还支持另外两种不同类型的UNION。EXCEPT(有时称为MINUS)可用来检索只在第一个表中存在,在第二个表中不存在的行,而INTERSECT可用来检索两个表中都存在的行。但实际上,这些UNION类型很少使用,因为相同的结果可利用联结来得到。
第15章插入数据
INTO关键字 在某些SQL实现中,跟在INSERT之后的INTO关键字是可选的。但是,即使不一定需要,最好还是提供这个关键字。这样做将保证SQL代码在DBMS之间的可移植。
INSERT通常只插入一行。为了插入多行,必须执行多个INSERT语句。INSERT SELECT是个例外,它可以用单条INSERT插入多行,不管SELECT语句返回多少行,都将被INSERT插入。
而即使SELECT的表为空,也不产生错误,因为操作仍然是合法的。
为了将一个表的内容复制到一个全新的表(在运行中创建的表,有的DBMS可以覆盖已经存在的表),可使用SELECT INTO语句。
DB2不支持SELECT INTO。
INSERT SELECT和SELECT INTO它们之间的一个重要差别是前者导出数据,后者导出表。
语法:
SELECT * INTO Custcopy FROM Customers; |
CREATE TABLE Custcopy AS SELECT * FROM Customers; (MySQL和Oracle使用) |
第16章更新和删除数据
DELETE不需要列名或通配符。DELETE删除整行而不是删除列。为了删除指定的列,请使用UPDATE语句。
如果想从表中删除所有行,可以使用TRUNCATE TABLE语句,它完成和DELETE相同的工作,但速度更快(因为不记录数据的变动)。
第17章创建和操纵表
指定NULL 多数DBMS在不指定NOT NULL时认为指定的是NULL。DB2要求指定关键字NULL,如果不指定将出错。
只有不允许NULL值得列可用于主键。
获得系统日期 |
|
DBMS |
函数/变量 |
Access |
NOW() |
DB2 |
CURRENT_DATE |
MySQL |
CURRENT_DATE() |
Oracle |
SYSDATE |
PostgreSQL |
CURRENT_DATE |
SQL Server |
GETDATE() |
Sybase |
GETDATE() |
删除表(DROP TABLE)没有确认,也不能撤销,执行这条语句将永久删除该表。
重命名表 DB2、MySQL、Oracle、PostgreSQL用户可使用RENAME语句。SQL Server和Sybase用户可使用sp_rename存储过程。
第22章了解高级SQL特性
约束(constraint)管理如何插入或处理数据库数据的规则。
外键是表中的一个列,其值必须在另一表的主键中列出。外键的作用:①帮助保证引用完整性;②帮助防止意外删除。在定义外键后,DBMS不允许删除在另一个表中具有关联行的行。
有的DBMS支持称为级联删除(cascading delete)的特性。如果启用,该特性在从一个表中删除行时删除所有相关的数据。
唯一约束和主键的区别:
n 表可以包含多个唯一约束,但每个表只允许一个主键。
n 唯一约束列可包含NULL值。
n 唯一约束列可修改或更新。
n 唯一约束列的值可重复使用。
n 与主键不一样,唯一约束不能用来定义外键。
索引用来排序数据以加快搜索和排序操作的速度。主键数据总是排序的。索引用于数据过滤和数据排序。
索引改善检索操作的性能,但降低数据插入、修改和删除的性能。在执行这些操作时,DBMS必须动态地更新索引。索引数据可能要占用大量的存储空间。
触发器是特殊的存储过程,它在特定的数据库活动发生时自动执行。
触发器内的代码具有以下数据的访问权:
l INSERT操作中的所有数据;
l UPDATE操作中的所有新数据和旧数据;
l DELETE操作中删除的数据。
举例: |
|
SQL Server中 |
CREATE TRIGGER customer_state ON Customers FOR INSERT,UPDATE AS UPDATE Customers SET cust_state = Upper(cust_state) WHERE Customers.cust_id=inserted.cust_id; |
Oracle和PostgreSQL中 |
CREATE TRIGGER customer_state AFTER INSERT OR UPDATE FOR EACH ROW BEGIN UPDATE Customers SET cust_state = Upper(cust_state) WHERE Customers.cust_id =:OLD.cust_id END; |
一般来说,约束的处理比触发器快。
任何安全系统的基础都是用户授权和身份确认。安全性通过SQL的GRANT和REVOKE语句来管理。
附录B 流行的应用系统
Aqua Data Studio是一个基于Java的免费SQL客户机。它运行在所有重要平台上,支持所有重要DBMS(以及ODBC)。
为在Aqua Data Studio中执行SQL语句,可如下进行:
(1) 运行Aqua Data Studio。
(2) 在DBMS能使用前必须注册。从Server菜单中选择Register Server。
(3) 从现实的列表中选择你使用的DBMS(为使用Microsoft Access或任意ODBC数据库,选择Generic ODBC,这要求定义一个ODBC数据源)。基于所选择的DBMS,将会提示输入路径或登录信息。在填写表单后,单击OK。一旦注册,服务器将出现在左边的列表中。
(4) 从注册过的服务器列表中选择一个。
(5) 通过从Server菜单中选择Query Analyzer或按Ctrl-Q,运行Query Analyzer。
(6) 在查询窗(顶上的窗口)中输入SQL语句。
(7) 为了执行SQL,从Query菜单中选择Execute,或按Ctrl+E,或单击Execute按钮(带绿箭头的那个按钮)。
(8) 结果将显示在较下面的窗口中。
使用DB2
(1) 运行Command Center。
(2) 选择Script标签。
(3) 在Script框中输入SQL语句。
(4) 从Script菜单选择Execute, 或单击Execute按钮执行脚本。
(5) 原始数据结果显示在较低的窗口中。切换到Results标签,以网格形式显示结果。
(6) Command Center给出一个名为SQL Assist的交互式SQL语句生成器。它可从Interactive标签中执行。
使用Macromedia ColdFusion
Macromedia ColdFusion是一个Web应用开发平台。ColdFusion使用一个基于标记的语言来创建脚本。为测试SQL,需要创建一个可从Web浏览器调用执行的简单页面。执行以下步骤:
(1) 在ColdFusion代码内使用任意数据库之前,必须定义一个数据源(Data Source)。ColdFusion Administration程序提供了一个定义数据源的基于Web界面。
(2) 创建新ColdFusion页(用CFM扩展)。
(3) 使用CFML<CFQUERY>和</CFQUERY>标记创建一个查询块。用NAME属性命名它并在DATASOURCE属性中定义Data Source。
(4) 在<CFQUERY>和</CFQUERY>标记之间输入SQL语句。
(5) 使用<CFDUMP>或<CFOUTPUT>循环显示查询结果。
(6) 在Web服务器根目录下的任意可执行目录中保持此页面。
(7) 通过从Web浏览器中调用此页面执行它。
使用Microsoft Access
Microsoft Access通常用来交互式地创建和管理数据库,交互式地处理数据,Access给出Query Designer,可用来交互式地建立SQL语句。Query Designer的一个相当有用的特性是它也允许给出直接执行的SQL。这使得能用Access发送SQL语句到任意ODBC数据源,虽然它最适合对打开的数据库执行SQL。为使用这个特性,如下进行:
(1) 运行Microsoft Access。它将提示你打开(或创建)数据库。打开要使用的数据库。
(2) 在Database窗中选择Queries,然后单击New按钮并选择Design View。
(3) 出现Show Table对话框,关闭此窗口,而不选择任何表。
(4) 从View菜单选择SQL View显示Query窗。
(5) 在Query窗钟输入要执行的SQL语句。
(6) 单击Run按钮(有红惊叹号的那个)执行SQL语句。这将切换视图到Datasheet View(它将在网格中显示结果)。
(7) 根据需要在SQL View和Datasheet View切换(为改动SQL语句,需返回到SQL View)。还可以使用Design View交互式地建立SQL语句。
Microsoft Access还支持pass-Through模式,使你能用Access发送SQL语句到任何ODBC数据源。这个特性应该用于与外部数据库打交道,不要直接用于Access数据库。为使用这个特性,如下进行:
(1)Microsoft Access使用ODBC与数据库打交道,因此在继续进行前必须给出一个ODBC数据源。
(2)运行Microsoft Access。提示打开(或创建)数据库。打开任意一个数据库。
(3)在Database窗中选择Queries。然后,单击New按钮并选择Design View。
(4)出现Show Table对话框,关闭此窗口,而不选择表。
(5)从Query菜单中选择SQL Specific,然后选择Pass-Through(旧的Access版本称此选项为SQL Pass-Through)。
(6)从View菜单选择Properties,显示Query Properties对话框。
(7)单击ODBC Connect Str字段,然后单击...按钮显示Select Data Source对话框,可用它来选择ODBC数据源。
(8)选择数据源并单击OK返回到Query Properties对话框。
(9)单击Returns Records字段。如果正执行一条SELECT语句(或者返回结果的任何语句),设置Returns Records为Yes。如果执行不返回数据的SQL语句,则设置Returns Records为No。
(10)在SQL Pass-Through Query窗口中输入SQL语句。
(11)为执行SQL语句,单击Run按钮(红色惊叹号的)。
使用Microsoft-ASP
Microsoft ASP是创建基于Web应用的脚本平台。为了在ASP页内测试SQL语句,必须创建一个可通过从Web浏览器内调用来执行的页面。下面是在ASP页面内执行SQL语句所需的步骤:
(1) ASP使用ODBC与数据库交互,因此在继续往下之前必须给出ODBC数据源。
(2) 用任意文本编辑器创建新ASP页面(带ASP扩展)。
(3) 使用Server.CreateObject创建ADODB.Connection对象的一个实例。
(4) 使用Open方法打开所需的ODBC数据源。
(5) 传递SQL语句到一个对Execute方法的调用。Execute方法返回结果集。使用Set命令保存返回的结果到结果集。
(6) 为显示结果,应该对检索出的数据应用<% Do While NOT EOF %>循环。
(7) 在Web服务器根目录下的任意可执行目录中保存此页面。
(8) 通过从Web浏览器调用,执行此页面。
使用Microsoft ASP.NET
Microsoft ASP.NET是一个使用.NET框架以创建基于Web应用的脚本平台。为在ASP.NET页面内测试SQL语句,必须创建一个可通过从浏览器中调用来执行的页面。油锅中方法完成此工作,下面是其中一种方法:
(1) 创建一个带.aspx扩展的新文件。
(2) 用SqlConnection()或OleDbConnection()创建数据库连接。
(3) 使用SqlCommand()或OleDbCommand()传递语句给DBMS。
(4) 用ExecuteReader创建一个DataReader。
(5) 对返回的读入器(reader)循环以获得返回值。
(6) 在Web服务器根目录下的任意可执行目录中保存页面。
(7) 通过从Web浏览器调用页面执行它。
使用Microsoft Query (文件为MSQRY32.EXE或MSQUERY.EXE)
Microsoft Query是一个独立的SQL查询工具,它是一个对ODBC数据源测试SQL语句的理想实用程序。Microsoft Query是与其他Microsoft产品以及第三方产品一起的可选安装。
为使用Microsoft Query,如下进行:
(1) Microsoft Query使用ODBC与数据库打交道。因此在可以继续往下之前必须给出ODBC数据源。
(2) 在能使用Microsoft Query之前,必须在计算机上安装它。
(3) 从File菜单中,选择Execute SQL,显示Execute SQL窗。
(4) 单击Data Sources按钮选择所要的ODBC数据源。如果所需的数据源未列出,单击Other寻找。在选择了合适的数据源后,单击Use按钮。
(5) 在SQL Statement框中输入SQL语句。
(6) 单击Execute执行SQL语句并显示返回数据。
使用Microsoft SQL Server
Microsoft SQL Server给出了一个称为SQL Query Analyzer的基于窗口的查询分析工具。
使用MySQL
MySQL带有一个名为mysql的命令行实用程序。这是一个纯文本工具,可用来执行任何SQL语句。为使用mysql,如下进行:
(1) 输入mysql运行实用程序。根据如何定义安全性,可能需要使用-u和-p参数指定登录信息。
(2) 在mysql>提示下输入USE database(指定要使用的数据库名)打开数据库。
(3) 在mysql>提示下输入SQL语句,每条语句必须以分号(;)借宿。结果将显示在屏幕上。
(4) 为可能使用的命令列表输入\h,为状态信息输入\s(包括MySQL版本信息)。
(5) 输入\q退出mysql实用程序。
使用Oracle
Oracle还有一个基于Java的管理工具,称为企业管理器(Enterprise Manager)。它实际上是一套工具,其中有一个工具名为SQL*Plus Worksheet。下面介绍如何使用此工具:
(1) 运行SQL*Plus Worksheet(或者直接运行,或者从Oracle企业管理器内运行)。
(2) 提示输入登录信息。提供用户名和密码并连接到数据库服务器。
(3) SQL Worksheet屏幕划分为两块。在上面的块中输入要执行的SQL语句。
(4) 为执行SQL语句,单击Execute按钮(带闪电图形)。结果将显示在线面的块中。
使用PHP
PHP是一个流行的Web脚本语言。PHP提供用来连接各种数据库的函数和库,因此用来执行SQL语句的代码可根据所用(以及如何访问)的DBMS而变化。
使用PostgreSQL
PostgreSQL带有一个命令行实用程序,名为psql。这是一个纯文本工具,可用来执行任意SQL语句。为使用psql,如下进行:
(1) 输入psql运行此实用程序。为装载一个特定的数据库,请在命令行上指定它,格式为:psqldatabase(PostgreSQL不支持USE命令)。
(2) 在=>提示下输入要执行的SQL语句,每条语句以分号(;)结束。结果将显示在屏幕上。
(3) 要列出可能用到的命令,可输入\?。
(4) 为得出SQL帮助,输入\h;未得到特定SQL语句的帮助,输入\h statement(如, \h SELECT).
(5) 输入\q退出psql实用程序。
使用Query Tool
Query Tool是George Poulose创建的一个独立的SQL查询工具,它是对ODBC数据源测试SQL语句的理想实用程序(也有ADO版本)。为使用Query Tool,如下进行:
(1) Query Tool使用ODBC与数据库打交道,因此在继续往下之前,必须给出ODBC数据源。
(2) 在可以使用Query Tool之前,必须在计算机上安装它。
(3) 弹出对话框提示给出要使用的ODBC数据源。如果所需的数据源未列出,单击New创建它。在选择了合适的数据源后,单击OK按钮。
(4) 在右上方的窗口中输入要执行的SQL语句。
(5) 单击Execute按钮(带蓝色箭头)执行SQL语句,并在下面地块中显示返回数据(也可以按F5或从Query菜单选择Execute)。
使用Sybase
Sybase Adaptive Server带有一个基于Java的实用程序,名为SQL Advantage。此实用程序非常类似于Microsoft SQL Server的Query Analyzer(它们具有共同的起源)。为使用SQL Advantage,如下进行:
(1) 执行SQL Advantage应用程序。
(2) 提示输入登录信息,输入你的用户名和密码。
(3) 在显示查询屏幕后,从工具栏的下拉列表框中选择数据库。
(4) 在显示的窗口中输入要执行的SQL语句。
(5) 为执行输入的查询语句,单击Execute按钮,或从Query菜单选择Execute Query,或者按Ctrl+E。
(6) 结果(如果有)将显示在新窗口中。
ODBC是一个标准,它使客户机应用能与不同的后端数据库或基础数据库引擎交互。使用ODBC,能够在一个客户机中编写代码,并使前述各种工具与几乎所有数据库或DBMS交互。
ODBC本身不是数据库。但ODBC包装数据库,使所有数据库以一种一致和清晰定义的方式工作。ODBC所用的语言就是SQL。
ODBC客户机应用程序并不直接与数据库交互,而是与ODBC数据源交互。数据源是一个逻辑数据库,它包括驱动程序和如何连接到数据库的信息。
ODBC数据源并不针对具体的应用程序,它们针对的是系统。
ODBC数据源用Windows Control Panel的ODBC程序来定义。
附录C SQL语句的语法
ALTER TABLE 用来更新已存在表的结构。为了创建新标,应该使用CREATE TABLE。
ALTER TABLE tablename
(
ADD|DROP column datatype [NULL|NOT NULL] [CONSTRAINTS],
ADD|DROP column datatype [NULL|NOT NULL] [CONSTRAINTS],
…
);
COMMIT 用来将事务处理写到数据库。
COMMIT [TRANSACTION];
CREATE INDEX 用于在一个或多个列上创建索引。
CREATE INDEX indexname
ON tablename (column,...);
CREATE PROCEDURE
CREATE PROCEDURE用于创建存储过程。
CREATE PROCEDURE procedurename [parameters]
[options]
AS
SQL statement;
CREATE TABLE 用于创建新数据库表。
CREATE TABLE tablename
(
column datatype [NULL|NOT NULL] [CONSTRAINTS],
column datatype [NULL|NOT NULL] [CONSTRAINTS],
...
);
CREATE VIEW 用来创建一个或多个表上的新视图。
CREATE VIEW viewname AS
SELECT columns,...
FROM table,...
[WHERE ...]
[GROUP BY...]
[HAVING...];
DELETE 从表中删除一行或多行。
DELETE FROM tablename
[WHERE...];
DROP 永久地删除数据库对象(表、视图、索引等)。
DROP INDEX|PROCEDURE|TABLE|VIEW
Indexname|procedurename|tablename|viewname;
INSERT 给表增加行。
INSERT INTO tablename [(columns,...)]
VALUES(values,...);
INSERT SELECT 插入SELECT的结果到一个表。
INSERT INTO tablename [(columns,...)]
SELECT columns,... FROM tablename,...
[WHERE ...];
ROLLBACK 用于撤销一个事务处理块。
ROLLBACK [ TO savepointname];
或者:
ROLLBACK TRANSACTION;
SELECT 用于从一个或多个表(视图)中检索数据。
SELECT columnname,...
FROM tablename,...
[WHERE...]
[UNION...]
[GROUP BY...]
[HAVING...]
[ORDER BY...];
UPDATE 更新表中一行或多行。
UPDATE tablename
SET columnname = value,...
[WHERE...];
附录D SQL数据类型
多数DBMSQ支持一种要你过来存储货币值的特殊数值数据类型。一般记为MONEY或CURRENCY,这种数据类型基本上是特定取值范围的DECIMAL数据类型。
二进制数据类型是最不具有兼容性的数据类型。二进制数据类型可包含任何数据,甚至可包含二进制信息,如图像、多媒体、字处理文档等。