转载自:https://study.qqcf.com/web/168/19166.htm
一、SQL语句的分类
ANSI SQL语句分成以下六类(按使用频率排列):
数据查询语言(DQL):其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
数据操作语言(DML):其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
事务处理语言(TPL):它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
数据控制语言(DCL):它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
数据定义语言(DDL):其语句可在数据库中创建新表(CREAT TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
指针控制语言(CCL):它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。
目前还没有一个商用的RDBMS支持全部的ANSI SQL-92中的所有保留字。例如Jet 3.5数据库引擎不支持任何DCL保留字,而是用Data Accesss Object的计划性安全对象和Visual Basic的保留字及关键字取代。同时Jet 3.5引擎不需支持CCL语句,因为Jet不处理SQL语句中的指针。
二、DQL语法详解
SQL操作符和表达式
SQL提供基本的算术操作符:<,>,=,<=,>=,<>。SQL增加了一组操作符,用于与文本数据类型的字段值连接(LINK和IN)及处理字段中的NULL值(IS NULL和IS NOT NULL)。SQL语句中的大多数操作符都是双值的。双值函数需要两个操作数,像LIKE,IN,IS NULL等则是单值的。
对于文本字段数据类型字段的WHERE标准,最有用的操作符是LIKE。在Jet SQL中称为LIKE操作符。下表显示了LIKE操作符的ANSI SQL语法和用于SQL语句WHERE子句中的Jet SQL Like操作符。
用途 ANSI SQL Jet SQL 返回
取包含字符的任何文本 LIKE '%am%' Like "*am*" ram,rams damsel,amnesty
取以字符打头的任何文本 LIKE 'John%' Like "John*" Johnson,Johnsson
取以字符结尾的任何文本 LIKE '%son' Like "*son" Johnson,Anderson
取文本和任意单个后缀字符 LIKE 'Glen_' Like "Glen?" Glenn,Glens
取文本和任意单个前缀字符 LIKE '_am' Like "?am" dam,Pam,ram
取文本和一个前缀及任意个后缀字符 LIKE '_am%' Like "?am*" dams,Pam,Ramses
注意:为与ANSI SQL-92保持一致,本地OLE DB数据提供者(Microsoft.JET.OLEDB.3.51)使用%和_通配符而非Jet的?和*。这种不一致要求修改已存在的DAO代码以适应ADO使用SQL通配符。
连接表
1。常规的内部连接或相等连接
最常见的连接类型是相等连接(或称为INNER JOIN)。例如:
SELECT Publishers.Name,Titles.ISBN,Titles.Title FROM Publishers INNER JOIN Titles ON Publishers.PubID=Titles.PubID
也可以写成:
SELECT Publishers.Name,Titles.ISBN,Titles.Title FROM Publishers,Titles WHERE Publishers.PubID=Titles.PubID
2。多重相等连接
例如:
SELECT Titles.Title,Publishers.Name,Titles.ISBN,Authors.Author FROM Publishers,Titles,Authors,[Title Author] WHERE Titles.ISBN=[Title Author].ISBN AND Authors.Au_ID=[Title Author].Au_ID AND Publishers.PubID=Tiltes.PubID
3。外部连接
INNER JOIN只返回与字段值相匹配的行,OUTER JOIN返回一个表的所有行和另一个表中有匹配值的行。有两种类型的OUTER JOIN。
LEFT OUTER JOIN返回LEFT OUTER JOIN 语句左边表或结果集的所有行和语句右边表具有匹配值的行。WHERE子句中,*=操作符特指LEFT OUTER JOIN
RIGHT OUTER JOIN返回RIGHT OUTER JOIN 语句右边表或结果集的所有行和语句左边表具有匹配值的行。WHERE子句中,=*操作符表求RIGHT OUTER JOIN。
通常地,按一到多的形式创建。也就是说,代表关系中“一”方的主要表出现在JOIN表达式左边或WHERE子句中操作符左边,而关系中“多”方的相关表出现在表达式或操作符的右边。LEFT OUTER JOIN可以显示主表所有记录,而不管相关表中的匹配记录;RIGHT OUTER JOIN对寻找孤儿记录很有用。所谓“孤儿记录”就是那些在主表中没有相关记录的相关表中的记录,孤儿记录是违反引用一致性规则的结果。
注意:Jet SQL不支持WHERE子句中的*=和=*操作符。用Jet数据库引擎时要用LEFT JOIN或RIGHT JOIN保留字来创建外部连接。
4。DISTINCTROW
限定词DISTINCT告诉查询只返回在SELECT语句指定字段中具有不同值的行,Jet SQL的限定词DISTINCTROW使得返回集包括在两个表任意字段中有异值的行(而不只是SELECT语句指定显示的字段)
5。自连接和复合列
自连接是建立在同一表中具有相似字段数据类型两个字段之间的一个连接。第一个字段常为主键字段,而第二个字段常为与主键字段相关的外部键字段,尽管这种结构并不是自连接必需的(为使自连接结果有意义,前一个要求也许是需要的)。
建立自连接时,RDBMS建立原表的一个副本,然后把副本连接到原表上。以VB自带的Nwind.mdb为例。其中的Employees表包含ReportsTo字段来表示雇员主管的EmployeeID.在Employees表上建立自连接以显示雇员主管名字的Jet SQL语句如下
SELECT Employees.EmployeeID AS EmpID,Employees.LastName & "," & Employees.FirstName AS Employee,Employees.ReportsTo AS SupId, EmpCopy.LastName & "," & EmpCopy.FirstName AS Supervisor FROM Employees, Employees AS EmpCopy,Employees INNER JOIN EmpCopy ON Employees.ReportsTo=EmpCopy.EmployeeID
SQL汇总函数和GROUP BY及HAVING子句
1。汇总函数
COUNT(field_name)返回field_name中包含NOT NULL值的行数,COUNT(*)返回表或查询的行数,不考虑字段的NULL值。
MAX(field_name)返回集合中field_name的最大值
MIN(field_name)返回集合中field_name的最小值
SUM(field_name)返回集合中field_name值的和
AVG(field_name)返回集合中field_name值的算术平均值
下面是使用汇总函数的一个例子:
SELECT COUNT(*) AS Count,SUM(PubID) AS Total,AVG(PubID) AS Average,MIN(PubID) AS Minimum,MAX(PubID) AS Maximum FROM publishers
2。GROUP BY和HAVING
有重要内容的数据库常常有包含代表分类的字段的表,例如Nwind.mdb中的Products表把一种外来食品的品种归为8个类别。当要为一个对象的每个类获得SQL汇总函数值时,可以使用GROUP BY子句,GROUP BY子句创建一个虚表称为分组表。如果想用特殊标准来限制组(类)成员关系,WHERE子句可以建立标准,然而,WHERE作用于整个表。HAVING子句和WHERE子句一样,但它作用于组,而且把SQL汇总函数的适用性限制在一个组的特定集合上。所以可以加上带有IN操作符的HAVING子句。 例如:
SELECT CategoryID AS Categroy,COUNT(ProductID) AS Item, SUM(UnitsInStock) AS Sum_Stock FROM Products GROUP BY CategoryID HAVING CategoryID IN(1,2)