参考:http://www.w3school.com.cn/sql/sql_syntax.asp
首先说数据库,数据库仅是存储数据的地方,而对数据库数据的访问、操作等管理数据库的功能是通过数据库管理系统(Database Management System, DBSM)完成的,习惯上把数据库和DBSM统称为数据库,一般说的数据就是两者的集合。DBMS有一个数据字典(也称为系统表),负责存储它所拥有的事务信息,这种关于数据的数据称为元数据(Meta Data)。
目前关系型数据库是最成熟、应用最广的数据库结构类型。对于关系数据库,最基本的存储单元就是数据表(table),可以把数据表抽象成一张二维表格,每一行代表一个记录,每一列是一个字段,创建数据表时通常需要指定含有多少列、列的名称及列数据的类型,而行数是动态改变的不需要在创建时指定行数。每个数据表还应该指定一个特殊的列来唯一表示每一行记录的信息,称为主键列。数据库可以抽象为含有大量数据表的集合。
而SQL(Structured Query Language,结构化查询语句)是一门ANSI的标准计算机语言,用来访问和操作数据库系统,取回和更新数据库中的数据。SQL 可与数据库程序协同工作,比如MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase以及其他数据库系统。不幸地是,存在着很多不同版本的 SQL 语言,但是为了与 ANSI 标准相兼容,它们必须以相似的方式共同地来支持一些主要的关键词(如SELECT、UPDATE、DELETE、INSERT、WHERE等)。除了SQL标准之外,大部分SQL数据库程序都拥有它们自己的私有扩展!
标准的SQL语句有以下几种类型:
SELECT 语句用于从数据库中选取数据。结果被存储在一个结果表中,称为结果集。可以选取表中一列、多列、所有列的数据。
查询语法:
SELECT column_name1[, column_name2] ….
FROM table_name;
与
SELECT * FROM table_name;
在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(DISRINCT)的值。DISTINCT 关键词用于返回唯一不同的值。
唯一查询语句:
SELECT DISTINCT column_name,column_name
FROM table_name;
SELECT UNIQUE效果与SELECT DISTINCT相同,但是仅对于Oracle数据库有效:
SELECT UNIQUE “column_name”
FROM “table_name”;
子查询就是在查询语句中再嵌套一个查询,可以多层嵌套。子查询可以出现在两个位置:
使用子查询可以注意一下几点:
子查询实例1:
SELECT *
FROM student_table
WHERE java_teacher >
#返回单行、单列的子查询被当成标量处理
(SELECT teacher_id
FROM teacher_table
WHERE teacher_name = ‘Vincent’);
如果子查询返回多个值,需要使用IN、ALL、ANY等关键字。
WHERE 子句用于提取那些满足指定条件的记录。WHERE子句是相当于if语句条件限定,如果没有WHERE子句,则默认WHERE子句为TRUE,这样全部记录都会修改。
WHERE子查询语法:
SELECT “column_name”
FROM “table_name”
WHERE “condition”;
其中,”condition”可以为不含列名的条件语句,该条件语句可以是由算术表达式、变量、常量或者函数表达式组成的限定条件。WHERE 子句中的运算符:
运算符 | 描述 |
---|---|
= | 等于 |
<> | 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 != |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
+、-、*、/ | 四则运算符 |
:= | 赋值 |
expr1 between expr2 and expr3 | 在某个范围内(相当于>=和<=) |
expr1 in(expr2, expr3, …) | 任选其一 |
expr1 WHERE exits(expr2) | 如果expr2有返回记录,则执行expr1 注释:expr1、expr2…不仅可以是常量、也可以是变量和列名。 |
IS NULL | 是否为null |
IS NOT NULL | 是否不为null |
ANY | 与比较运算符结合表示满足任一比较条件 |
ALL | 与运算符结合使用表示满足所有的比较条件 |
LIKE pattern | 模糊搜索。搜索模式有pattern语句指定。 |
NOT LIKE | 与LIKE相反 |
AND | 同时满足两个条件 |
OR | 满足两个条件之一 |
NOT | 不满足某个条件 |
>ANY(expr) | 只要大于expr中的最小值即可 |
只要小于expr中的最大值即可 |
|
>ALL(expr) | 只要大于expr中的最大值即可 |
只要小于expr中的最小值即可 |
|
=ANY(expr) | 相当于in(expr) |
SQL中LIKE运算符有几个通配符:
ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。
ORDER BY 关键字默认按照升序(ASC)对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC关键字。
ORDER BY 语法:
SELECT column_name1[, column_name2] …
FROM table_name
[WHERE “condition”]
#优先按column_name1排序,若这样还有重复,则在此基础上按照column_name2排序
ORDER BY column_name1 [ASC|DESC], [column_name2 [ASC|DESC]] …;
GROUP BY关键字用于按照某些列的分组信息(该列中相同的记录为一组)查找信息。
GROUP BY关键字语法:
1.单列分组模式
SELECT “column_name1”, SUM(“column_name2”)
FROM “table_name”
GROUP BY “column_name1”;
上面的语句查找出按照column_name1相同记录组成的组合排列的column_name1列和SUM(“column_name2”)新列组成的行内视图。其中SUM函数可以换为其他聚合函数。
2.多列分组模式
SELECT “column_name1”, “column_name2”, … “column_nameN”, Function(“column_nameN+1”)
FROM “table_name”
GROUP BY “column_name1”, “column_name2”, … “column_nameN”;
上面语句从若干表中选出若干列,一般结合SELECT中的至少一个运算符(包括COUNT, SUM, MAX, MIN, AVG等)一起使用,然后在GROUP BY后添加除了参与运算的列以外的全部列,作为分组的参考。
3.结合HAVING子句实现条件分组
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
HAVING 子句可以让我们筛选分组后的各组数据。
SELECT [“column_name1”], Function(“column_name2”)
FROM “table_name”
[WHERE condition]
[GROUP BY “column_name1”]
HAVING (arithmetic function condition)
[ORDER BY “column_name” [ASC, DESC]];
上面的语句要求只对满足HAVING子句中对聚合函数计算结果的筛选条件来进行分组。
IN 操作符允许我们在 WHERE 子句中规定多个值。
IN 语法:
1.
SELECT column_name(s)
FROM table_name IN (value1,value2,…);上面的语句从column_name列中查找指定值的数据记录。
2.
SELECT column_name(s)
FROM table_name
WHERE column_name2 IN (value1,value2,…);
上面的语句从查找column_name2中值为value1和value2的column_name(s)列记录。
从Persons表中选取姓氏为 Adams 和 Carter 的人:
SELECT * FROM Persons
WHERE LastName IN (‘Adams’,’Carter’);
操作符 BETWEEN … AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
BETWEEN 语法:
SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2;
实例1:
SELECT * FROM Persons
WHERE LastName
BETWEEN ‘Adams’ AND ‘Carter’;
上面语句以字母顺序显示介于 “Adams”(包括)和 “Carter”(不包括)之间的人。
实例 2
如需使用上面的例子显示范围之外的人,请使用 NOT 操作符:
SELECT * FROM Persons
WHERE LastName
NOT BETWEEN ‘Adams’ AND ‘Carter’
重要事项:不同的数据库对 BETWEEN…AND 操作符的处理方式是有差异的。某些数据库会列出介于 “Adams” 和 “Carter” 之间的人,但不包括 “Adams” 和 “Carter” ;某些数据库会列出介于 “Adams” 和 “Carter” 之间并包括 “Adams” 和 “Carter” 的人;而另一些数据库会列出介于 “Adams” 和 “Carter” 之间的人,包括 “Adams” ,但不包括 “Carter” 。所以,请检查你的数据库是如何处理 BETWEEN….AND 操作符的!
SELECT之后不仅可以使列名或者*,还可以是算术表达式、变量、常量或者函数表达式,还可以在SELECT语句中使用算术运算符(+、-、*、/),从而形成算术表达式,规则如下:
也可以为算术表达式、变量、常量或者函数表达式使用AS关键字起一个别名,如果别名中包含特殊字符,或者强制大小写敏感,可以为别名添加双引号。
表的起别名语法:
SELECT column_name(s)
FROM table_name
AS alias_name;
列的起别名语法:
SELECT column_name AS alias_name
FROM table_name;
实例1:
SELECT Id + 5 AS “My Id”, Firsname, 2*3 AS Num
FROM Person
WHERE id > 3;
如果需要选择多列,每列都要起别名,那么可以省略AS关键字。不仅可以为列起别名,还可以为数据表起别名。
实例2:
SELECT Id + 5 “My Id”, CONCAT(Firstname, Lastname) “My Name”
FROM Person person_table
WHERE id > 3;
甚至SELECT和WHERE中都不含列名
实例3:
SELECT 3+5
FROM Person
WHERE 3 < 5;
TOP 子句用于规定要返回的记录的数目。
对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。
注释:并非所有的数据库系统都支持 TOP 子句。
SQL Server 语法:
SELECT TOP number| PERCENT column_name(s)
FROM table_name
从上面的 “Persons” 表中选取头两条记录
实例1:
SELECT TOP 2 * FROM Persons
我们希望从上面的 “Persons” 表中选取 50% 的记录
实例2:
SELECT TOP 50 PERCENT * FROM Persons
PS:MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的
MySQL 语法
SELECT column_name(s)
FROM table_name
LIMIT number
例子
SELECT *
FROM Persons
LIMIT 5
Oracle 语法
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number
例子
SELECT *
FROM Persons
WHERE ROWNUM <= 5
连接查询通过JOIN关键字及其衍生类型完成。JOIN 子句用于把来自两个或多个表的行结合起来,得到完整的结果。
INNER JOIN (内连接,也叫等值连接)关键字在表中存在至少一个匹配时返回行。
INNER JOIN 语法:
SELECT column_name(s)
FROM table1
[INNER] JOIN table2
ON table1.column_name = table2.column_name;
上面语句依据ON子句的连接条件连接两个表,并返回两表共有(共有的依据是连接条件)的数据记录。
注释:INNER JOIN 与 JOIN 是相同的。
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
LEFT JOIN语法:
SELECT column_name(s)
FROM table1
LEFT [OUTER] JOIN table2
ON table1.column_name=table2.column_name;
注释:在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
RIGHT JOIN语法:
SELECT column_name(s)
FROM table1
RIGHT [OUTER] JOIN table2
ON table1.column_name=table2.column_name;
注释:在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行。
FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。
FULL OUTER JOIN 语法:
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
注意:My SQL不支持FULL JOIN,不过可以通过 UNION 关键字来合并 LEFT JOIN 与 RIGHT JOIN来模拟FULL JION。
CROSS JOIN 关键字用于将两个表的数据分别相乘,得到一个N*M的组合,称为广义笛卡尔积。实际很少用到。
CROSS JOIN语法:
SELECT column_name(s)
FROM table1
CROSS JOIN table2
DML语句主要用于操作表格中的数据,常用的功能有INSERT INTO/ UPDATE/DELETE FROM”数据表的数据”。
INSERT INTO命令用于向数据表中插入一行或者多行数据
INSERT INTO 语句可以有两种编写形式。
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
INSERT INTO table_name
VALUES (value1,value2,value3,…);
第二种形式需要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,…)
VALUES (value1,value2,value3,…);
1.一次插入一行记录:
INSERT INTO “table_name” [(“column1” [, “column2”]…)] VALUES (“value1” [, “value2”]…);
实例:
INSERT INTO Person (Firstname, Lastname) VALUES (‘Katy’, ‘Perry’);
注意:
2.通过带子查询的插入语句一次插入多行记录语法:
INSERT INTO “table_name1” [(“column1” [, “column2”]…)] SELECT (“column3” [, “column4”]…) FROM “table_name2” WHERE “condition”];
UPDATE语句用于一次性修改数据表的一条或多条记录,通过where子句限定修改哪些行的记录。
UPDATE语法:
UPDATE “table_name”
SET “column1” = “value1” [, “clomun2” = “value2”]…
WHERE “condition”;
其中,”condition”可以为不含列名的条件语句,该条件语句可以是由算术表达式、变量、常量或者函数表达式组成的限定条件。详见WHERE子句介绍。
使用DELETE FROM语句可以删除指定表的一行或多行记录。
删除一行或多行记录的语法:
DELETE FROM “table_name”
[WHERE “condition”];
注意:
数据类型 | 描述 |
---|---|
CHARACTER(n) | 字符/字符串。固定长度 n。 |
VARCHAR(n) 或CHARACTER VARYING(n) | 字符/字符串。可变长度。最大长度 n。 |
BINARY(n) | 二进制串。固定长度 n。 |
BOOLEAN | 存储 TRUE 或 FALSE 值 |
VARBINARY(n)或BINARY VARYING(n) | 二进制串。可变长度。最大长度 n。 |
INTEGER(p) | 整数值(没有小数点)。精度 p。 |
SMALLINT | 整数值(没有小数点)。精度 5。 |
INTEGER | 整数值(没有小数点)。精度 10。 |
BIGINT | 整数值(没有小数点)。精度 19。 |
DECIMAL(p,s) | 精确数值,精度 p,小数点后位数 s。例如:decimal(5,2) 是一个小数点前有 3 位数小数点后有 2 位数的数字。 |
NUMERIC(p,s) | 精确数值,精度 p,小数点后位数 s。(与 DECIMAL 相同) |
FLOAT(p) | 近似数值,尾数精度 p。一个采用以 10 为基数的指数计数法的浮点数。该类型的 size 参数由一个指定最小精度的单一数字组成。 |
REAL | 近似数值,尾数精度 7。 |
FLOAT | 近似数值,尾数精度 16。 |
DOUBLE PRECISION | 近似数值,尾数精度 16。 |
DATE | 存储年、月、日的值。 |
TIME | 存储小时、分、秒的值。 |
TIMESTAMP | 存储年、月、日、小时、分、秒的值。 |
INTERVAL | 由一些整数字段组成,代表一段时间,取决于区间的类型。 |
ARRAY | 元素的固定长度的有序集合 |
MULTISET | 元素的可变长度的无序集合 |
XML | 存储 XML 数据 |
然而,不同的数据库对数据类型定义提供不同的选择。下面的表格显示了各种不同的数据库平台上一些数据类型的通用名称:
数据类型 | Access | SQLServer | Oracle | MySQL | PostgreSQL |
---|---|---|---|---|---|
boolean | Yes/No | Bit | Byte | N/A | Boolean |
integer | Number (integer) | Int | Number | Int Integer |
Int Integer |
float | Number (single) | Float Real |
Number | Float | Numeric |
currency | Currency | Money | N/A | N/A | Money |
string (fixed) | N/A | Char | Char | Char | Char |
string (variable) | Text (<256) Memo (65k+) |
Varchar | Varchar Varchar2 |
Varchar | Varchar |
binary object | OLE Object Memo | Binary (fixed up to 8K) Varbinary (<8K) Image(<2GB) |
Long Raw |
Blob Text |
Binary Varbinary |
注释:在不同的数据库中,同一种数据类型可能有不同的名称。即使名称相同,尺寸和其他细节也可能不同! 请总是检查文档!
数据类型 | 描述 | 存储 |
---|---|---|
Text | 用于文本或文本与数字的组合 | 最多 255 个字符 |
Memo | Memo 用于更大数量的文本。 注意:无法对 memo 字段进行排序。不过它们是可搜索的 |
最多存储 65,536 个字符 |
Byte | 允许 0 到 255 的数字 | 1 字节 |
Integer | 允许介于 -32,768 到 32,767 之间的数字 | 2 字节 |
Long | 允许介于 -2,147,483,648 与 2,147,483,647 之间的全部数字 | 4 字节 |
Single | 单精度浮点。处理大多数小数 | 4 字节 |
Double | 双精度浮点。处理大多数小数 | 8 字节 |
Currency | 用于货币。支持 15 位的元,外加 4 位小数。 注释:您可以选择使用哪个国家的货币。 |
8 字节 |
AutoNumber | AutoNumber 字段自动为每条记录分配数字,通常从 1 开始。 | 4 字节 |
Date/Time | 用于日期和时间 | 8 字节 |
Yes/No | 逻辑字段,可以显示为 Yes/No、True/False 或 On/Off。 在代码中,使用常量 True 和 False (等价于 1 和 0) 注释:Yes/No 字段中不允许 Null 值 |
1 比特 |
Ole Object | 可以存储图片、音频、视频或其他 BLOBs (Binary Large OBjects) | 最多 1GB |
Hyperlink | 包含指向其他文件的链接,包括网页 | |
Lookup Wizard | 允许你创建一个可从下列列表中进行选择的选项列表 | 4 字节 |
在 MySQL 中,有三种主要的类型:文本、数字和日期/时间类型。
Text 类型:
数据类型 | 描述 |
---|---|
CHAR(size) | 保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度.最多 255 个字符。 |
VARCHAR(size) | 保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。 注释:如果值的长度大于 255,则被转换为 TEXT 类型。 |
TINYTEXT | 存放最大长度为 255 个字符的字符串。 |
TEXT | 存放最大长度为 65,535 个字符的字符串。 |
BLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。 |
MEDIUMTEXT | 存放最大长度为 16,777,215 个字符的字符串。 |
MEDIUMBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。 |
LONGTEXT | 存放最大长度为 4,294,967,295 个字符的字符串。 |
LONGBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。 |
ENUM(x,y,z,etc.) | 允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。 注释:这些值是按照你输入的顺序存储的。可以按照此格式输入可能的值:ENUM(‘X’,’Y’,’Z’) |
SET | 与 ENUM 类似,SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。 |
Number 类型:
数据类型 | 描述 |
---|---|
TINYINT(size) | -128 到 127 常规。0 到 255 无符号*。在括号中规定最大位数。 |
SMALLINT(size) | -32768 到 32767 常规。0 到 65535 无符号*。在括号中规定最大位数。 |
MEDIUMINT(size) | -8388608 到 8388607 普通。0 to 16777215 无符号*。在括号中规定最大位数。 |
INT(size) | -2147483648 到 2147483647 常规。0 到 4294967295 无符号*。在括号中规定最大位数。 |
BIGINT(size) | -9223372036854775808 到 9223372036854775807 常规。0 到18446744073709551615 无符号*。在括号中规定最大位数。 |
FLOAT(size,d) | 带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
DOUBLE(size,d) | 带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
DECIMAL(size,d) | 作为字符串存储的 DOUBLE 类型,允许固定的小数点。 |
* 这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0 开始,而不是某个负数。
Date 类型:
数据类型 | 描述 |
---|---|
DATE() | 日期。格式:YYYY-MM-DD 注释:支持的范围是从 ‘1000-01-01’ 到 ‘9999-12-31’ |
DATETIME() | *日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS 注释:支持的范围是从’1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’ |
TIMESTAMP() | *时间戳。TIMESTAMP 值使用 Unix 纪元(‘1970-01-01 00:00:00’ UTC) 至今的描述来存储。格式:YYYY-MM-DD HH:MM:SS 注释:支持的范围是从 ‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-09 03:14:07’ UTC |
TIME() | 时间。格式:HH:MM:SS 注释:支持的范围是从 ‘-838:59:59’ 到 ‘838:59:59’ |
YEAR() | 2 位或 4 位格式的年。 注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。 |
* 即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERT 或 UPDATE 查询中,TIMESTAMP 自动把自身设置为当前的日期和时间。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。
Character 字符串:
数据类型 | 描述 | 存储 |
---|---|---|
char(n) | 固定长度的字符串。最多 8,000 个字符。 | n |
varchar(n) | 可变长度的字符串。最多 8,000 个字符。 | |
varchar(max) | 可变长度的字符串。最多 1,073,741,824 个字符。 | |
text | 可变长度的字符串。最多 2GB 字符数据。 |
Unicode 字符串:
数据类型 | 描述 | 存储 |
---|---|---|
nchar(n) | 固定长度的 Unicode 数据。最多 4,000 个字符。 | |
nvarchar(n) | 可变长度的 Unicode 数据。最多 4,000 个字符。 | |
nvarchar(max) | 可变长度的 Unicode 数据。最多 536,870,912 个字符。 | |
ntext | 可变长度的 Unicode 数据。最多 2GB 字符数据。 |
Binary 类型:
数据类型 | 描述 | 存储 |
---|---|---|
bit | 允许 0、1 或 NULL | |
binary(n) | 固定长度的二进制数据。最多 8,000 字节。 | |
varbinary(n) | 可变长度的二进制数据。最多 8,000 字节。 | |
varbinary(max) | 可变长度的二进制数据。最多 2GB 字节。 | |
image | 可变长度的二进制数据。最多 2GB。 |
Number 类型:
数据类型 | 描述 | 存储 |
---|---|---|
tinyint | 允许从 0 到 255 的所有数字 | 1 字节 |
smallint | 允许从 -32,768 到 32,767 的所有数字。 | 2 字节 |
int | 允许从 -2,147,483,648 到 2,147,483,647 的所有数字。 | 4 字节 |
bigint | 允许介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间的所有数字。 | 8 字节 |
decimal(p,s) | 固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。 p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。 s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。 |
5-17 字节 |
numeric(p,s) | 固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。 p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。 s 参数指示小数点右侧存储的最大位数。s 必须是 0 到 p 之间的值。默认是 0。 |
5-17 字节 |
smallmoney | 介于 -214,748.3648 和 214,748.3647 之间的货币数据。 | 4 字节 |
money | 介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之间的货币数据。 | 8 字节 |
float(n) | 从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。 参数 n 指示该字段保存 4 字节还是 8 字节。float(24) 保存 4 字节,而 float(53) 保存 8 字节。n 的默认值是 53。 | 4 或 8 字节 |
real | 从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。 | 4 字节 |
Date 类型:
数据类型 | 描述 | 存储 |
---|---|---|
datetime | 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 3.33 毫秒。 | 8 bytes |
datetime2 | 从 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度为 100 纳秒。 | 6-8 bytes |
smalldatetime | 从 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度为 1 分钟。 | 4 bytes |
date | 仅存储日期。从 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 | 3 bytes |
time | 仅存储时间。精度为 100 纳秒。 | 3-5 bytes |
datetimeoffset | 与 datetime2 相同,外加时区偏移。 | 8-10 bytes |
timestamp | 存储唯一的数字,每当创建或修改某行时,该数字会更新。timestamp 基于内部时钟,不对应真实时间。每个表只能有一个 timestamp 变量。 |
其他数据类型:
数据类型 | 描述 |
---|---|
sql_variant | 存储最多 8,000 字节不同数据类型的数据,除了 text、ntext 以及 timestamp。 |
uniqueidentifier | 存储全局标识符 (GUID)。 |
xml | 存储 XML 格式化数据。最多 2GB。 |
cursor | 存储对用于数据库操作的指针的引用。 |
table | 存储结果集,供稍后处理。 |
其中,可供操作的”数据库对象”一般有:database、table、index、view、function、 procedure、trigger、constraint等。
用于创建数据库对象(如database、table、index、view、schema、domain等)。
CREATE DATABASE [IF NOT EXISTS] “database_name”;
CREATE TABLE “table_name”
(“column 1” “data type for column 1” [column 1 constraint(s)],#零到多个列定
“column 2” “data type for column 2” [column 2 constraint(s)],#零到多个约束定义
…
[table constraint(s)] );
有时候也可以使用子查询语句来代替列定义:
CREATE TABLE “table_name” AS
[SQL Statement];
注意:
创建数据表实例:
1.
CREATE TABLE Customer
(First_Name char(50),
Last_Name char(50),
Address char(50),
City char(50),
Country char(25) default ‘United States’,
Birth_Date datetime);
2.
CREATE TABLE Table2 AS
SELECT * FROM Table1;
create用于创建某些数据库对象(table、view、databse等)时可以接受子查询语句:
CREATE [OR REPLACE] VIEW “view_name” AS “SQL Statement” [with check option/with read only];
多数数据库使用with check option表示视图无法修改, Oracle采用with read only
创建视图实例:
CREATE VIEW V_Customer
AS SELECT First_Name, Last_Name, Country
FROM Customer;
创建一般索引,允许出现有两行拥有相同的索引值:
CREATE INDEX “索引名” on “表名” (“列名1” [, “列名2”]…);
创建唯一索引,唯一的索引意味着任意两行不能拥有相同的索引值:
CREATE UNIQUE INDEX “index_name” ON “table_name” (“column1” [, “column2”]…);
创建索引实例:
对单列创建索引:
CREATE UNIQUE INDEX IDX_Person_Firstname ON TABLE Person (Firstname); #不允许出现重复的Firstname的记录
同时对多列创建索引:
CREATE INDEX IDX_Person_Name ON TABLE Person (Firstname, Lastname); #可以出现Firstname和Lastname都相同的记录
索引介绍:
DROP命令用于删除数据库对象(如DATABASE、TABLE等)
DROP DATABASE “databse_name”;
DROP TABLE [IF IF EXISTS] “table_name1” [, table_name2] …;
注意:可以一次删除多个表。删除表之后,表的结构、所有数据、相关的索引和约束也删除了
用于 MS SQL Server 的drop index语法:
DROP INDEX “table_name.index_name”;
用于 DB2/Oracle 的drop index语法:
DROP INDEX “index_name”;
用于 MySQL 的drop index语法:
ALTER TABLE “table_name” DROP INDEX “index_name”;
DROP VIEW “view_name”;
TRUNCATE TABLE命令用于清空一个数据表的内容,与DROP TABLE相比,该命令不会删除数据表,数据表依然存在。
清除表结构的语法:
TRUNCATE TABLE “table_name”;
USE关键字用在MySQL and SQL Server中,用于使用一个数据库。
使用数据库的语法:
USE “database_name”;
在MySQL中可以通过指定 [Database Name].[Table Name]来使用多个数据库的多张表,如果某张表所在的数据正在使用中,可以省略数据库名:
USE Scores;
SELECT …
FROM Course_110, Personnel.Students
WHERE … ;
上面的实例中使用COurse_110, Personnel.Students数据库中某些表
用于限制加入表的数据的类型。可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。
主要有以下几种约束:
根据约束的范围分为:单行约束和多行约束
NOT NULL 约束强制列不接受 NULL 值.如果不向字段添加值,就无法插入新记录或者更新记录。
下面的 SQL 语句强制 “Id_P” 列和 “LastName” 列不接受 NULL 值:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
UNIQUE 约束唯一标识数据库表中的每条记录。
SQL UNIQUE Constraint on CREATE TABLE
创建单列 UNIQUE 约束语法:
MySQL:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
);
SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
如果需要命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束,请使用下面的表级语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
)
SQL UNIQUE Constraint on ALTER TABLE
当表已被创建时,如需在 “Id_P” 列创建 单列UNIQUE 约束,请使用下列 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD UNIQUE (Id_P)
如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
撤销 UNIQUE 约束
如需撤销 UNIQUE 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE Persons
DROP INDEX uc_PersonID
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。
SQL DEFAULT Constraint on CREATE TABLE
下面的 SQL 在 “Persons” 表创建时为 “City” 列创建 DEFAULT 约束:
My SQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT ‘Sandnes’
)
通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)
SQL DEFAULT Constraint on ALTER TABLE
如果在表已存在的情况下为 “City” 列创建 DEFAULT 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE Persons
ALTER City SET DEFAULT ‘SANDNES’
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT ‘SANDNES’
如需撤销 DEFAULT 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE Persons
ALTER City DROP DEFAULT
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值,不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
主键可以是原本资料内的一列,或是一个人造栏位 (与原本资料没有关系的栏位)。主键可以包含一或多个栏位。当主键包含多个栏位时,称为组合键 (Composite Key)。
主键可以在建置新表格时设定 (运用 CREATE TABLE 语句),或是以改变现有的表格架构方式设定 (运用 ALTER TABLE)。
SQL PRIMARY KEY Constraint on CREATE TABLE
下面的 SQL 在 “Persons” 表创建时在 “Id_P” 列创建 PRIMARY KEY 约束:
MySQL:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
)
SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
)
SQL PRIMARY KEY Constraint on ALTER TABLE
如果在表已存在的情况下为 “Id_P” 列创建 PRIMARY KEY 约束,请使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD PRIMARY KEY (Id_P);
如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
注释:如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。
如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE Persons
DROP PRIMARY KEY
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
我们通常希望在每次插入新记录时,自动地创建主键字段的值。
我们可以在表中创建一个 AUTO _INCREMENT 字段。
用于 MySQL 的语法:
MySQL 使用 AUTO_INCREMENT 关键字来执行 AUTO _INCREMENT 任务。
默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。
下列 SQL 语句把 “Persons” 表中的 “P_Id” 列定义为 AUTO _INCREMENT 主键:
CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
);
要让 AUTO_INCREMENT 序列以其他的值起始,请使用下列 SQL 语法:
ALTER TABLE Persons AUTO_INCREMENT=100
要在 “Persons” 表中插入新记录,我们不必为 “P_Id” 列规定值(会自动添加一个唯一的值):
INSERT INTO Persons (FirstName,LastName)
VALUES (‘Bill’,’Gates’)
上面的 SQL 语句会在 “Persons” 表中插入一条新记录。”P_Id” 会被赋予一个唯一的值。”FirstName” 会被设置为 “Bill”,”LastName” 列会被设置为 “Gates”。
MS SQL 使用 IDENTITY 关键字来执行 AUTO_INCREMENT 任务。
默认地,IDENTITY 的开始值是 1,每条新记录递增 1。
要规定 “P_Id” 列以 20 起始且递增 10,请把 IDENTITY 改为 IDENTITY(20,10)
要在 “Persons” 表中插入新记录,我们不必为 “P_Id” 列规定值(会自动添加一个唯一的值):
INSERT INTO Persons (FirstName,LastName)
VALUES (‘Bill’,’Gates’)
上面的 SQL 语句会在 “Persons” 表中插入一条新记录。”P_Id” 会被赋予一个唯一的值。”FirstName” 会被设置为 “Bill”,”LastName” 列会被设置为 “Gates”。
用于 Access 的语法:
下列 SQL 语句把 “Persons” 表中的 “P_Id” 列定义为 AUTO_INCREMENT 主键:
CREATE TABLE Persons
(
P_Id int PRIMARY KEY AUTOINCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
MS Access 使用 AUTOINCREMENT 关键字来执行 AUTO_INCREMENT 任务。
默认地,AUTOINCREMENT 的开始值是 1,每条新记录递增 1。
要规定 “P_Id” 列以 20 起始且递增 10,请把 autoincrement 改为 AUTOINCREMENT(20,10)
要在 “Persons” 表中插入新记录,我们不必为 “P_Id” 列规定值(会自动添加一个唯一的值):
INSERT INTO Persons (FirstName,LastName)
VALUES (‘Bill’,’Gates’)
上面的 SQL 语句会在 “Persons” 表中插入一条新记录。”P_Id” 会被赋予一个唯一的值。”FirstName” 会被设置为 “Bill”,”LastName” 列会被设置为 “Gates”。
用于 Oracle 的语法:
在 Oracle 中,代码稍微复杂一点。
您必须通过 SEQUENCE 对创建AUTO_INCREMENT 字段(该对象生成数字序列)。
请使用下面的 CREATE SEQUENCE 语法:
CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10
上面的代码创建名为 seq_person 的序列对象,它以 1 起始且以 1 递增。该对象缓存 10 个值以提高性能。CACHE 选项规定了为了提高访问速度要存储多少个序列值。
要在 “Persons” 表中插入新记录,我们必须使用 nextval 函数(该函数从 seq_person 序列中取回下一个值):
INSERT INTO Persons (P_Id,FirstName,LastName)
VALUES (seq_person.nextval,’Lars’,’Monsen’)
上面的 SQL 语句会在 “Persons” 表中插入一条新记录。”P_Id” 的赋值是来自 seq_person 序列的下一个数字。”FirstName” 会被设置为 “Bill”,”LastName” 列会被设置为 “Gates”。
一个表中的FOREIGN KEY约束指向另一个表中的 PRIMARY KEY。让我们通过一个例子来解释外键。请看下面两个表:
“Persons” 表:
Id_P LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing
“Orders” 表:
Id_O OrderNo Id_P
1 77895 3
2 44678 3
3 22456 1
4 24562 1
请注意,”Orders” 中的 “Id_P” 列指向 “Persons” 表中的 “Id_P” 列。
“Persons” 表中的 “Id_P” 列是 “Persons” 表中的 PRIMARY KEY。
“Orders” 表中的 “Id_P” 列是 “Orders” 表中的 FOREIGN KEY。
FOREIGN KEY 约束用于预防破坏表之间连接的动作。也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
SQL FOREIGN KEY Constraint on CREATE TABLE
下面的 SQL 在 “Orders” 表创建时为 “Id_P” 列创建 FOREIGN KEY:
MySQL:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
);
SQL Server / Oracle / MS Access:
CREATE TABLE Orders
(
Id_O int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
Id_P int FOREIGN KEY REFERENCES Persons(Id_P)
)
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
)
SQL FOREIGN KEY Constraint on ALTER TABLE
如果在 “Orders” 表已存在的情况下为 “Id_P” 列创建 FOREIGN KEY 约束,请使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
如需撤销 FOREIGN KEY 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders
SQL Server / Oracle / MS Access:
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
SQL CHECK Constraint on CREATE TABLE
下面的 SQL 在 “Persons” 表创建时为 “Id_P” 列创建 CHECK 约束。CHECK 约束规定 “Id_P” 列必须只包含大于 0 的整数。
My SQ不支持CHECK约束,可以使用CHECK约束但是没有任何效果:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)
SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL CHECK (Id_P>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City=’Sandnes’)
)
SQL CHECK Constraint on ALTER TABLE
如果在表已存在的情况下为 “Id_P” 列创建 CHECK 约束,请使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CHECK (Id_P>0)
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City=’Sandnes’)
撤销 CHECK 约束
如需撤销 CHECK 约束,请使用下面的 SQL:
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
MySQL:
ALTER TABLE Persons
DROP CHECK chk_Person
UNION 操作符用于合并两个或多个 SELECT 语句的结果集,相当于OR逻辑运算。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
UNION 语法
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SQL UNION ALL 语法
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
注释:UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
类似于UNION的OR运算,INTERSECR执行的是AND逻辑运算。它们对数据列的要求相同。
INTERSECT 语法
SELECT column_name(s) FROM table1
INTERSECT
SELECT column_name(s) FROM table2;
类似于UNION的OR运算,Minus执行的是求两张表交集相对于左表的补集。它们对数据列的要求相同。
Minus 语法
SELECT column_name(s) FROM table1
Minus
SELECT column_name(s) FROM table2;
上面语句返回的是仅左表有,而右表没有的记录集合,不包含二者共有的部分。
注意:My SQL并不支持MINUS和INTERSECT运算,只能通过子查询语句来替代。
当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。
只要您的数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间部分,情况就有点复杂了。如果希望使查询简单且更易维护,那么请不要在日期中使用时间部分!
MySQL Date 函数
函数 | 描述 |
---|---|
NOW() | 返回当前的日期和时间 |
CURDATE() | 返回当前的日期 |
CURTIME() | 返回当前的时间 |
DATE() | 提取日期或日期/时间表达式的日期部分 |
EXTRACT() | 返回日期/时间的单独部分 |
DATE_ADD() | 向日期添加指定的时间间隔 |
DATE_SUB() | 从日期减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的天数 |
DATE_FORMAT() | 用不同的格式显示日期/时间 |
SQL Server Date 函数
函数 | 描述 |
---|---|
GETDATE() | 返回当前的日期和时间 |
DATEPART() | 返回日期/时间的单独部分 |
DATEADD() | 在日期中添加或减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的时间 |
CONVERT() | 用不同的格式显示日期/时间 |
SQL Date 数据类型
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
DATE - 格式:YYYY-MM-DD
DATETIME - 格式:YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS
YEAR - 格式:YYYY 或 YY
SQL Server 使用下列数据类型在数据库中存储日期或日期/时间值:
DATE - 格式:YYYY-MM-DD
DATETIME - 格式:YYYY-MM-DD HH:MM:SS
SMALLDATETIME - 格式:YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式:唯一的数字
注释:当您在数据库中创建一个新表时,需要为列选择数据类型!具体参考所使用数据库的手册。
对于下面的 SELECT 语句:
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products
在上面的实例中,如果有 “UnitsOnOrder” 值是 NULL,那么结果是 NULL。
微软的 ISNULL() 函数用于规定如何处理 NULL 值。
NVL()、IFNULL() 和 COALESCE() 函数也可以达到相同的结果。
在这里,我们希望 NULL 值为 0。
下面,如果 “UnitsOnOrder” 是 NULL,则不会影响计算,因为如果值是 NULL 则 ISNULL() 返回 0:
SQL Server / MS Access
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
Oracle
Oracle 没有 ISNULL() 函数。不过,我们可以使用 NVL() 函数达到相同的结果:
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products
MySQL
MySQL 也拥有类似 ISNULL() 的函数。不过它的工作方式与微软的 ISNULL() 函数有点不同。
在 MySQL 中,我们可以使用 IFNULL() 函数,如下所示:
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products
或者我们可以使用 COALESCE() 函数,如下所示:
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products
SQL Aggregate 函数(聚合函数)计算从列中取得的值,返回一个单一的值。
有用的 Aggregate 函数:
AVG() 函数返回数值列的平均值。
AVG()函数语法:
SELECT AVG(column_name) FROM table_name;
返回匹配指定条件的行数。
COUNT()函数语法:
COUNT(column_name)函数 用于下面返回返回指定列的值的数目(NULL 不计入):
SELECT COUNT(column_name) FROM table_name;
COUNT(*) 函数返回表中的记录数:
SELECT COUNT(*) FROM table_name;
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:
SELECT COUNT(DISTINCT column_name) FROM table_name;
注释:COUNT(DISTINCT) 适用于 ORACLE 和 Microsoft SQL Server,但是无法用于 Microsoft Access。
FIRST() 函数返回指定的列中第一个记录的值。
FIRST() 函数语法
SELECT FIRST(column_name) FROM table_name;
注释:只有 MS Access 支持 FIRST() 函数。
SQL Server、MySQL 和 Oracle 中的 SQL FIRST() 实现:
SQL Server 语法:
SELECT TOP 1 column_name FROM table_name
ORDER BY column_name ASC;
MySQL 语法:
SELECT column_name FROM table_name
ORDER BY column_name ASC
LIMIT 1;
Oracle 语法:
SELECT column_name FROM table_name
ORDER BY column_name ASC
WHERE ROWNUM <=1;
LAST()函数功能与FIRST()相反,用法相同。
MAX() 函数返回指定列的最大值。
MAX() 语法:
SELECT MAX(column_name) FROM table_name;
MIN() 函数功能与MAX()相反,用法相同。
SUM() 函数返回数值列的总数。
SUM() 语法:
SELECT SUM(column_name) FROM table_name;
Scalar 函数基于输入值,返回一个单一的值。
有用的 Scalar 函数:
UCASE() 函数把字段的值转换为大写。
UCASE() 语法:
SELECT UCASE(column_name) FROM table_name;
用于 SQL Server 的语法
SELECT UPPER(column_name) FROM table_name;
LCASE() 函数把字段的值转换为小写。
LCASE() 语法
SELECT LCASE(column_name) FROM table_name;
用于 SQL Server 的语法
SELECT LOWER(column_name) FROM table_name;
MID() 函数用于从文本字段中提取字符。
MID() 语法:
SELECT MID(column_name,start[,length]) FROM table_name;
参数 | 描述 |
---|---|
column_name | 必需。要提取字符的字段。 |
start | 必需。规定开始位置(起始值是 1)。 |
length | 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。 |
LEN() 函数返回文本字段中值的长度。
LEN() 语法
SELECT LEN(column_name) FROM table_name;
MySQL 中函数为 LENGTH():
SELECT LENGTH(column_name) FROM table_name;
ROUND() 函数
ROUND() 函数用于把数值字段舍入为指定的小数位数。
SQL ROUND() 语法
SELECT ROUND(column_name,decimals) FROM table_name;
参数 | 描述 |
---|---|
column_name | 必需。要舍入的字段。 |
decimals | 必需。规定要返回的小数位数。 |
NOW() 函数返回当前系统的日期和时间。
NOW() 语法
SELECT NOW() FROM table_name;
FORMAT() 函数用于对字段的显示进行格式化。
FORMAT() 语法
SELECT FORMAT(column_name,format) FROM table_name;
参数 | 描述 |
---|---|
column_name | 必需。要格式化的字段。 |
format | 必需。规定格式。 |