第14章 数据库概念及SQL介绍
关系型数据库就是一种二维表格式的数据结构,依据数据表之间的关联来作访问的操作。
一、数据库基本概念
1、数据库结构:
数据库的组织结构由下而上依序为字段(Field)、记录(record)、数据表(Table)。
2、开放数据库连接协议(ODBC)
ODBC提供程序与数据库之间的接口。通过ODBC当作我们访问数据库的接口,就可轻易访问不同数据库。当然,这样的访问,必须通过ODBC驱动程序完成,也就是数据库厂商必须提供支持OS的ODBC驱动程序。
ODBC的架构:由应用程序、驱动程序管理器、驱动程序、数据源四个构成要素。
ODBC窗口中有三种与数据源有关的选项卡可供设置“数据源名称” 。分别是:
用户DSN:只能提供给本地计算机使用,且仅供当前用户使用。
系统DSN:只能提供给本地计算机使用,本系统上或其他具有访问权限的用户都可使用。
文件DSN:设置在这个选项卡的数据源可被安装同一个驱动程序的所有用户使用,此种数据源并不限定在某一个用户身上或某一个计算机上。文件数据源并不以数据源名称记录我们设置的数据源,而是以文件名称记录。
虽这三种使用对象不同,但设置方式几乎一样。
3、SQL Explorer
Delphi的DatabaseExplorer在不同Delphi版本中有些不同的功能特征。在Delphi Enterprise版本中名称是“SQL Explorer”:可直接访问非关系型数据库(像dBASE、Paradox)、通过ODBC访问所支持的数据库、或任何支持SQL的关系型数据库。在Delphi Professional版本中名称是“Database Explorer”,仅支持访问非关系型数据库和通过ODBC访问所支持的数据库。
二、结构化查询语言(SQL)
1、SQL语法:不区分大小写,但建议将SQL关键字以大写表示,非SQL关键字以小写或大小写混合表示。
SQL的命名规则中,对数据包、字段的命名有些规范。以下是命名的基本原则:
数据表命名:避免命名为中文或空。当数据表名称、字段名称含有空格或使用关键字时,需使用“[]”将名称扩住,否则,会造成SQL语法错误。
字段命名:避免使用中文、空格或特殊符号。常用类型:
Ø CHAR(n):固定长度的字符串类型。意味着不管字符串是否达到n个长度,都会占用n个Bytes空间(以空格补满剩余空间)。
Ø VARCHAR(n):可变长度。占用大小是其实际大小,不补空格。
因CHAR长度固定,所以处理速度较快。但比较麻烦,需用trim之类的函数去除空格。
Ø INTEGER:整型,以4Bytes为保存单位,其中第一个bit用来记录正负数。
2、SQL指令:依用途分为两类:数据定义语言(DDL)和数据操作语言(DML)。先说明下出现在语法中的符号:
[]:表示它是可以省略的。
|、{}:多个选项只能选取一项时,以“|”分隔。若这个多选一的项目可省略,用[]括起;不可省略,则用{}括起。
[,…]:除表示此项目可被省略外,同时也表示此项目若存在,其语法与前面的项目相同。
3、SQL语句:
1)CREATE语句:建立数据表或数据表的索引。
建立数据表语法:
CREATE TABLE table_name
{
column_definition [NULL | NOT NULL][PRIMARY KEY | UNIQUE] [,
column_definition [NULL | NOT NULL] [PRIMARY KEY | UNIQUE] [,…] ]
}
column_definition:格式“字段名称 类型(大小)”。
[PRIMARY KEY |UNIQUE]:主索引是唯一值,但唯一值不一定是主索引。
CREATE TABLEFriend_Table
{
Id int NOT NULL PRIMARY KEY,
Name char(12) NOT NULL,
Phone char(15) NOT NULL,
Age int NULL
}
建立数据表索引:
CREATE INDEX能在一个已存在的数据表中,建立次索引(非主索引)。语法:
CREATE [UNIQUE] INDEXindex_name ON table_name
{
Column_name
}
[UNIQUE]:设置建立索引的字段具有唯一性。
2)ALTER TABLE语句:提供修改数据表的能力
ALTER TABLEtable_name
{ ADDcolumn_definition [,…] | DROP column_name [,…] }
ALTER TABLEFriend_Table ADD Sex CHAR(6), Address CHAR(50)
ALTER TABLEFriend_Table DROP Sex, Address //删除Sex和Address字段
3)DROP语句
可删除数据表索引或整个数据表。
DROP TABLE语句:DROP TABLEtable_name [,…]
DROP INDEX语句:(Access一次仅能删除一个索引名称,而SQL Server一次能删除多个索引名称):
DROP INDEXindex_name ON table_name
DROP INDEXtable_name.index_name [,…]
4)SELECT语句
SELECT[predicate] {* | column_list} FROM tableexpression [,…]
[WHERE clause]
[GROUP BYclause]
[HAVING clause]
[ORDER BYclause]
predicate:可用ALL、DISTINCT、TOPn[PERCENT]中的一个条件来限制要返回的查询结果。其中,ALL表示要显示所有数据;DISTINCT表示查询结果中,若多条记录完全相同(只管查询的字段),则不显示重复的字段;TOPn[PERCENT]为显示字段数据的前n条或前n百分比的记录。
{* |column_list}:查询所有字段或选择性查询指定字段。column_list可是“table_name.*”、“[table_name.]column_name”。若指定字段名称,则可同时搭配AS关键字为此查询字段设置“别名”以方便显示查询结果。如“SELECT id AS 编号, name AS 姓名 FROM Table”。
tableexpression:一个或多个(逗号分隔)数据表名称。
GROUP BY clause:可将查询结果按照clause设置的条件分组。
HAVING clause:通常与GROUP BY子句搭配使用。HAVING子句可用聚合函数,而WHERE子句不可用聚合函数。
ORDER BY clause:对所得结果作递增(ASC)或递减(DESC)的排序。
SQL提供AVG()、COUNT()、MAX()、MIN()、SUM()五个标准的聚合函数。AVG()将符合查询条件的某一字段所有记录取平均值。COUNT()用来取得符合查询条件的记录条数。SUM()用来计算符合条件的某字段值的总和。
SELECT INTO:将包括字段名称、字段定义的查询结果,新增到一个新的数据表。一般,这个新的数据表不该存在,若存在,可能覆盖或产生错误。语法:
SELECTcolumn_name [,…] INTO New_Table_Name FROM Source_Table_Name [,…]
New_Table_Name:要建立的新数据表名称,用来存放查询结果。
当含多个源数据表时,若两个或两个以上的表含有相同的字段名称,则必须使用“表名.字段名”的格式。
5、INSERT、UPDATE语句
INSERT语句:新增一条或多条记录到一个数据表中。
INSERT [INTO]table_name(column_name1 [,column_name2 [,…]])
VALUE(value1[, value2 [,…]])
[INTO]:有些数据库允许省略,但Access不允许。
当字段类型为文字时,需以单引号将字段值括住,且各字段值之间以逗号隔开。未指定字段自动填入默认值。
INSERT INTO 产品来源(产品名称, 产地)
VALUE (‘葡萄牛奶’, ‘黑龙江’)
INSERT语句一次只能新增一条记录,当一次要新增多条记录时,可通过INSERT搭配SELECT来完成。
INSERT [INTO]table_name[(column_name [,…])]
SELECT {* |columu_list} FROM tableexpression [,…]
UPDATE用来更新现有记录。
UPDATEtable_name
SET column_ref =new_value[, column_ref2 = new_value2 [,…]]
[WHERE criteria]
UPDATE 产品来源
SET 产品名称 = ‘特级_’ + 产品名称
WHERE 产地 = ‘广东’
6、DELETE语句
DELETE [FROM]table_name
[WHERE criteria]
三、SQL高级指令使用
1、UNION运算:SQL指令中可用SELECT语句配合UNION运算对多个数据表作联集的查询。即取得两个或多个数据表的共同数据,以便做各数据记录的连接,其中的共同条件指各查询结果的字段数相同。
query1UNION [ALL] query2 [UNION (ALL) queryn [,…]]
query1、query2……queryn:每个query都是一个SELECT语句,且查询结果的字段数必须相同。
ALL:若未设置ALL,查询结果中重复的数据只会列出一条,加上后,则重复数据会全数显示。
在搭配UNION的SELECT语句中,对于ORDERBY子句的搭配上有特殊的限制:ORDER BY子句只能在最后一个SELECT语句中搭配使用,以便达到对整个查询结果做排序的操作。
SELECT 联系人姓名 AS 宾客名称, ‘供应商’ AS 关系 FROM 供应商
UNION
SELECT 经理人, ‘员工’ FROM 员工 ORDER BY 关系 ASC
2、JOIN运算
SQL指令可对两个数据表做交集,即取得两个或多个数据表之间符合条件的记录,用来作不同数据表之间的数据合并。依其数据合并的方式,将交集分为左交集(LEFT JOIN)、右交集(RIGHT JOIN)、内部交集(INNER JOIN)。
table1 [LEFT |RIGHT | INNER] JOIN table2
ON table1.field1compopr table2.field2
compopr:比较运算符,如=、<>、<=、>=。
左交集即table1所有记录+table2符合条件的记录。
右交集即table2所有记录+table1符合条件的记录。
内部交集即table1和table2中符合条件的记录。
3、特殊运算符
除一般运算符<、=等外,还有特殊运算符:LIKE、IS、IN、AND、OR、BETWEEN……AND等6种。
① {WHERE | HAVING} [NOT] column_name LIKE match_string
[NOT]:将查询条件反相。
match_string:条件值,必须以单引号扩住。多个字符:在Access中用*表示,在SQL Server中用%。特定或某范围的字符、数字:用[]表示。
② IS:查询哪些字段值为NULL,或搭配NOT来查询哪些字段值不是NULL。
{WHERE |HAVING} [NOT] column_name IS [NOT] NULL
[NOT]:两个NOT都是取反,都设置时,相当于没设置。
③ IN:查询指定的字段值,是否为条件列的其中一个条件指。
{WHER | HAVING}[NOT] column_name IN (value1[,value2[,…]])
④ BETWEEN…AND:查询指定的字段值,是否在我们设置的条件范围内。
{WHER | HAVING}[NOT] column_name BETWEEN value1 AND value2
⑤ AND、OR:且、或运算。
{WHER | HAVING}[NOT] (Bool_exp (AND | OR) Bool_exp)
Bool_exp:一个运算结果为BOOL型的表达式。
4、子查询:一个查询语句中,有另一个SELECT语句(以小括号将SELECT语句扩住)。子查询可在SELECT语句的查询字段列表或WHERE、HAVING子句中。
{WHERE | HAVING} column_name compare (subquery)
或{WHERE |HAVING} column_name [NOT] IN (subquery)
或{WHERE | HAVING} [NOT] EXISTS (subquery)
compare:一般的比较运算符,如=、>等。
subquery:子查询内的SELECT语句。
第一种语法主要用于子查询返回的值为单一字段的单条数据时,且我们将返回的该项数据,当做另一个查询条件中的比较值。