重要事项
一定要记住,SQL 对大小写不敏感!
SQL 语句后面的分号?
某些数据库系统要求在每条 SQL命令的末端使用分号。在我们的教程中不使用分号。
分号是在数据库系统中分隔每条 SQL语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的语句。
如果您使用的是 MS Access 和SQL Server 2000,则不必在每条 SQL 语句之后使用分号,不过某些数据库软件要求必须使用分号。
SQL DML 和 DDL
可以把 SQL分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
SQL(结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。
查询和更新指令构成了 SQL 的 DML部分:
- SELECT - 从数据库表中获取数据
- UPDATE - 更新数据库表中的数据
- DELETE - 从数据库表中删除数据
- INSERT INTO - 向数据库表中插入数据
SQL 的数据定义语言 (DDL)部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
SQL 中最重要的 DDL 语句:
- CREATE DATABASE - 创建新数据库
- ALTER DATABASE - 修改数据库
- CREATE TABLE - 创建新表
- ALTER TABLE - 变更(改变)数据库表
- DROP TABLE - 删除表
- CREATE INDEX - 创建索引(搜索键)
- DROP INDEX - 删除索引
SQL SELECT 语句
SELECT 语句用于从表中选取数据。
结果被存储在一个结果表中(称为结果集)。
SQL SELECT 语法
SELECT 列名称 FROM 表名称
以及:
SELECT * FROM 表名称
注释:SQL语句对大小写不敏感。SELECT 等效于 select。
SQL SELECT DISTINCT 语句
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。
关键词 DISTINCT用于返回唯一不同的值。
语法:
SELECT DISTINCT 列名称FROM 表名称
WHERE 子句
如需有条件地从表中选取数据,可将WHERE 子句添加到 SELECT 语句。
语法
SELECT 列名称 FROM 表名称WHERE 列 运算符 值
下面的运算符可在 WHERE子句中使用:
操作符 | 描述 |
= | 等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
注释:在某些版本的SQL 中,操作符 <> 可以写为 !=。
AND 和 OR 运算符
AND 和 OR 可在 WHERE子语句中把两个或多个条件结合起来。
如果第一个条件和第二个条件都成立,则AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则OR 运算符显示一条记录。
ORDER BY 语句
ORDER BY语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。(ASC关键字)
如果您希望按照降序对记录进行排序,可以使用DESC 关键字
Update 语句
Update 语句用于修改表中的数据。
语法:
UPDATE 表名称 SET 列名称 =新值 WHERE 列名称 = 某值
DELETE 语句
DELETE 语句用于删除表中的行。
语法
DELETE FROM 表名称WHERE 列名称 = 值
TOP 子句
TOP 子句用于规定要返回的记录的数目。
对于拥有数千条记录的大型表来说,TOP子句是非常有用的。
注释:并非所有的数据库系统都支持 TOP子句。
SQL Server 的语法:
SELECT TOPnumber|percent column_name(s)
FROM table_name
LIKE 操作符
LIKE 操作符用于在 WHERE子句中搜索列中的指定模式。
SQL LIKE 操作符语法
SELECTcolumn_name(s)
FROM table_name
WHERE column_name LIKE pattern
SQL 通配符
在搜索数据库中的数据时,SQL通配符可以替代一个或多个字符。
SQL 通配符必须与 LIKE运算符一起使用。
在 SQL 中,可使用以下通配符:
通配符 | 描述 |
% | 替代一个或多个字符 |
_ | 仅替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist] 或者 [!charlist] | 不在字符列中的任何单一字符 |
IN 操作符
IN 操作符允许我们在 WHERE子句中规定多个值。
SQL IN 语法
SELECTcolumn_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)
BETWEEN 操作符
操作符 BETWEEN ... AND会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
SQL BETWEEN 语法
SELECTcolumn_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2
SQL Alias
表的 SQL Alias 语法
SELECTcolumn_name(s)
FROM table_name
AS alias_name
列的 SQL Alias 语法
SELECT column_nameAS alias_name
FROM table_name
SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
Join 和 Key
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行join。
数据库中的表可通过键将彼此联系起来。主键(PrimaryKey)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
SQL INNER JOIN 关键字
在表中存在至少一个匹配时,INNERJOIN 关键字返回行。
INNER JOIN 关键字语法
SELECTcolumn_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注释:INNER JOIN 与 JOIN是相同的。
SQL LEFT JOIN 关键字
LEFT JOIN 关键字会从左表(table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
LEFT JOIN 关键字语法
SELECTcolumn_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注释:在某些数据库中, LEFTJOIN 称为 LEFT OUTER JOIN。
SQL RIGHT JOIN 关键字
RIGHT JOIN 关键字会右表(table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
RIGHT JOIN 关键字语法
SELECTcolumn_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注释:在某些数据库中, RIGHTJOIN 称为 RIGHT OUTER JOIN。
SQL FULL JOIN 关键字
只要其中某个表存在匹配,FULLJOIN 关键字就会返回行。
FULL JOIN 关键字语法
SELECTcolumn_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注释:在某些数据库中, FULLJOIN 称为 FULL OUTER JOIN。
SQL UNION 操作符
UNION 操作符用于合并两个或多个SELECT 语句的结果集。
请注意,UNION 内部的 SELECT语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法
SELECTcolumn_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注释:默认地,UNION操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SQL UNION ALL 语法
SELECTcolumn_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于UNION 中第一个 SELECT 语句中的列名。
SELECT INTO 语句
SELECT INTO语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO语句常用于创建表的备份复件或者用于对记录进行存档。
SQL SELECT INTO 语法
您可以把所有的列插入新表:
SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename
或者只把希望的列插入新表:
SELECTcolumn_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename
CREATE DATABASE 语句
CREATE DATABASE用于创建数据库。
SQL CREATE DATABASE 语法
CREATE DATABASEdatabase_name
CREATE TABLE 语句
CREATE TABLE语句用于创建数据库中的表。
SQL CREATE TABLE 语法
CREATE TABLE表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)
数据类型(data_type)规定了列可容纳何种数据类型。下面的表格包含了SQL中最常用的数据类型:
数据类型 | 描述 |
| 仅容纳整数。在括号内规定数字的最大位数。 |
| 容纳带有小数的数字。 "size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数。 |
char(size) | 容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。 在括号中规定字符串的长度。 |
varchar(size) | 容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。 在括号中规定字符串的最大长度。 |
date(yyyymmdd) | 容纳日期。 |
函数的语法
内建 SQL 函数的语法是:
SELECT function(列)FROM 表
函数的类型
在 SQL中,基本的函数类型和种类有若干种。函数的基本类型是:
- Aggregate 函数
- Scalar 函数
合计函数(Aggregate functions)
Aggregate函数的操作面向一系列的值,并返回一个单一的值。
注释:如果在 SELECT语句的项目列表中的众多其它表达式中使用 SELECT 语句,则这个 SELECT 必须使用 GROUP BY 语句!
"Persons" table (在大部分的例子中使用过)
Name | Age |
Adams, John | 38 |
Bush, George | 33 |
Carter, Thomas | 28 |
MS Access 中的合计函数
函数 | 描述 |
返回某列的平均值 | |
返回某列的行数(不包括 NULL 值) | |
返回被选行数 | |
FIRST(column) | 返回在指定的域中第一个记录的值 |
LAST(column) | 返回在指定的域中最后一个记录的值 |
返回某列的最高值 | |
返回某列的最低值 | |
STDEV(column) |
|
STDEVP(column) |
|
返回某列的总和 | |
VAR(column) |
|
VARP(column) |
|
在 SQL Server 中的合计函数
函数 | 描述 |
返回某列的平均值 | |
BINARY_CHECKSUM |
|
CHECKSUM |
|
CHECKSUM_AGG |
|
返回某列的行数(不包括NULL值) | |
返回被选行数 | |
返回相异结果的数目 | |
返回在指定的域中第一个记录的值(SQLServer2000 不支持) | |
返回在指定的域中最后一个记录的值(SQLServer2000 不支持) | |
返回某列的最高值 | |
返回某列的最低值 | |
STDEV(column) |
|
STDEVP(column) |
|
返回某列的总和 | |
VAR(column) |
|
VARP(column) |
|
Scalar 函数
Scalar函数的操作面向某个单一的值,并返回基于输入值的一个单一的值。
MS Access 中的 Scalar 函数
函数 | 描述 |
UCASE(c) | 将某个域转换为大写 |
LCASE(c) | 将某个域转换为小写 |
MID(c,start[,end]) | 从某个文本域提取字符 |
LEN(c) | 返回某个文本域的长度 |
INSTR(c,char) | 返回在某个文本域中指定字符的数值位置 |
LEFT(c,number_of_char) | 返回某个被请求的文本域的左侧部分 |
RIGHT(c,number_of_char) | 返回某个被请求的文本域的右侧部分 |
ROUND(c,decimals) | 对某个数值域进行指定小数位数的四舍五入 |
MOD(x,y) | 返回除法操作的余数 |
NOW() | 返回当前的系统日期 |
FORMAT(c,format) | 改变某个域的显示方式 |
DATEDIFF(d,date1,date2) | 用于执行日期计算 |