SQL语句

SQL SELECT 语法
SELECT column_name,column_name
FROM table_name;

SELECT * FROM table_name;

SQL SELECT DISTINCT 语法
在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。
DISTINCT 关键词用于返回唯一不同的值。

SELECT DISTINCT column_name,column_name
FROM table_name;

SQL AND & OR 运算符
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。

如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。

SQL ORDER BY 语法
ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。
ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。

SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;

SQL INSERT INTO 语法
INSERT INTO 语句可以有两种编写形式。

第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
INSERT INTO table_name
VALUES (value1,value2,value3,…);
第二种形式需要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,…)
VALUES (value1,value2,value3,…);

SQL UPDATE 语法
UPDATE 语句用于更新表中已存在的记录。

UPDATE table_name
SET column1=value1,column2=value2,…
WHERE some_column=some_value;

SQL DELETE 语法
DELETE 语句用于删除表中的行。

DELETE FROM table_name
WHERE some_column=some_value;

SQL高级

SQL SELECT TOP 子句
SELECT TOP 子句用于规定要返回的记录的数目。
SELECT TOP 子句对于拥有数千条记录的大型表来说,是非常有用的。
SQL Server / MS Access 语法
SELECT TOP number|percent column_name(s)
FROM table_name;
MySQL 语法
SELECT column_name(s)
FROM table_name
LIMIT number;

SQL LIKE 语法
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;
NOT LIKE
pattern->G%以’G’开始的所有客户
%k以’k’结尾的所有客户
%oo%包含"oo"的所有客户

SQL通配符

通配符 描述
% 替代 0 个或多个字符
_ 替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]

[!charlist] 不在字符列中的任何单一字符

使用 SQL % 通配符
下面的 SQL 语句选取 url 以字母 “https” 开始的所有网站:
实例
SELECT * FROM Websites
WHERE url LIKE ‘https%’;
下面的 SQL 语句选取 url 包含模式 “oo” 的所有网站:
实例
SELECT * FROM Websites
WHERE url LIKE ‘%oo%’;

使用 SQL _ 通配符
下面的 SQL 语句选取 name 以一个任意字符开始,然后是 “oogle” 的所有客户:

实例
SELECT * FROM Websites
WHERE name LIKE ‘_oogle’;
下面的 SQL 语句选取 name 以 “G” 开始,然后是一个任意字符,然后是 “o”,然后是一个任意字符,然后是 “le” 的所有网站:
实例
SELECT * FROM Websites
WHERE name LIKE ‘G_o_le’;

使用 SQL [charlist] 通配符
MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式。
下面的 SQL 语句选取 name 以 “G”、“F” 或 “s” 开始的所有网站:

实例
SELECT * FROM Websites
WHERE name REGEXP ‘1’;
下面的 SQL 语句选取 name 以 A 到 H 字母开头的网站:
实例
SELECT * FROM Websites
WHERE name REGEXP ‘2’;

下面的 SQL 语句选取 name 不以 A 到 H 字母开头的网站:
实例
SELECT * FROM Websites
WHERE name REGEXP ‘[A-H]’;

SQL IN 语法
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,…);

SQL BETWEEN 语法
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。

SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;

SQL 别名
通过使用 SQL,可以为表名称或列名称指定别名。
基本上,创建别名是为了让列名称的可读性更强。

列的 SQL 别名语法
SELECT column_name AS alias_name
FROM table_name;
表的 SQL 别名语法
SELECT column_name(s)
FROM table_name AS alias_name;

SQL JOIN
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN)。 SQL INNER JOIN 从多个表中返回满足 JOIN 条件的所有行。

Websites" 表中的 “id” 列指向 “access_log” 表中的字段 “site_id”。上面这两个表是通过 “site_id” 列联系起来的。
然后,如果我们运行下面的 SQL 语句(包含 INNER JOIN):
实例
SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;

SQL INNER JOIN 语法
INNER JOIN 关键字在表中存在至少一个匹配时返回行。

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;

SQL LEFT JOIN 语法
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;

SQL RIGHT JOIN 语法
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;

SQL FULL OUTER JOIN 语法
ULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.
FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
SQL 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 语句中的列名。

SQL SELECT INTO 语法
我们可以复制所有的列插入到新表中:
SELECT *
INTO newtable [IN externaldb]
FROM table1;
或者只复制希望的列插入到新表中:
SELECT column_name(s)
INTO newtable [IN externaldb]
FROM table1;

SQL INSERT INTO SELECT 语法
INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。
我们可以从一个表中复制所有的列插入到另一个已存在的表中:
INSERT INTO table2
SELECT * FROM table1;
或者我们可以只复制希望的列插入到另一个已存在的表中:
INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;

SQL CREATE DATABASE 语法
CREATE DATABASE 语句用于创建数据库。

CREATE DATABASE dbname;

SQL CREATE TABLE 语法
CREATE TABLE 语句用于创建数据库中的表。
表由行和列组成,每个表都必须有个表名。
column_name 参数规定表中列的名称。
data_type 参数规定列的数据类型(例如 varchar、integer、decimal、date 等等)。
size 参数规定表中列的最大长度。
提示:如需了解 MS Access、MySQL 和 SQL Server 中可用的数据类型,请访问我们完整的 数据类型参考手册。

CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),

);

SQL 约束(Constraints)
SQL 约束用于规定表中的数据规则。
如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。

在 SQL 中,我们有如下约束:
NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。
DEFAULT - 规定没有给列赋值时的默认值。
SQL CREATE TABLE + CONSTRAINT 语法

CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,

);

SQL NOT NULL 约束
NOT NULL 约束强制列不接受 NULL 值。
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

下面的 SQL 强制 “ID” 列、 “LastName” 列以及 “FirstName” 列不接受 NULL 值:
实例

CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Age int
);

添加 NOT NULL 约束
在一个已创建的表的 “Age” 字段中添加 NOT NULL 约束如下所示:
实例

ALTER TABLE Persons
MODIFY Age int NOT NULL;

删除 NOT NULL 约束
在一个已创建的表的 “Age” 字段中删除 NOT NULL 约束如下所示:
实例

ALTER TABLE Persons
MODIFY Age int NULL;

SQL UNIQUE 约束
UNIQUE 约束唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。
请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

CREATE TABLE 时的 SQL UNIQUE 约束
下面的 SQL 在 “Persons” 表创建时在 “P_Id” 列上创建 UNIQUE 约束:

MySQL:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
)

SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
P_Id int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
)

ALTER TABLE 时的 SQL UNIQUE 约束
当表已被创建时,如需在 “P_Id” 列创建 UNIQUE 约束,请使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD UNIQUE (P_Id)
如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)

撤销 UNIQUE 约束
如需撤销 UNIQUE 约束,请使用下面的 SQL:

MySQL:

ALTER TABLE Persons
DROP INDEX uc_PersonID

SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID

SQL主键约束
PRIMARY KEY约束唯一标识数据库表中的每条记录。

主键必须包含唯一的值。

主键列不能包含NULL值。

每个表都应该有一个主键,并且每个表只能有一个主键。

CREATE TABLE时的SQL PRIMARY KEY约束
下面的SQL在“ Persons”表创建时在“ P_Id”列上创建PRIMARY KEY约束:
MySQL:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)

SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
作为命名PRIMARY KEY约束,并定义多个列的,请使用下面的SQL语法:

MySQL / SQL Server / Oracle / MS访问:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)
注释:在上面的实例中,只有一个主键PRIMARY KEY(pk_PersonID)。然而,pk_PersonID的值是由两个列(P_Id和LastName)组成的。

ALTER TABLE时的SQL PRIMARY KEY约束
当表已被创建时,如需在“ P_Id”列创建PRIMARY KEY约束,请使用下面的SQL:
MySQL / SQL Server / Oracle / MS访问:
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
作为命名PRIMARY KEY约束,并定义多个列的,请使用下面的SQL语法:
MySQL / SQL Server / Oracle / MS访问:
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
注释:如果您使用ALTER TABLE语句添加主键,必须把主键列声明为不包含NULL值(在表首次创建时)。

撤销PRIMARY KEY约束
若要取消PRIMARY KEY约束,请使用下面的SQL:

MySQL:
ALTER TABLE Persons
DROP PRIMARY KEY

SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID

SQL外部键约束
SQL FOREIGN KEY约束
一个表中的FOREIGN KEY指向另一个表中的UNIQUE KEY(唯一约束的键)。
让我们通过一个实例来解释外键。请看下面两个表:

“人员”表:

“订单”表:

请注意,“ Orders”表中的“ P_Id”列指向“ Persons”表中的“ P_Id”列。

“ Persons”表中的“ P_Id”列是“ Persons”表中的PRIMARY KEY。

“ Orders”表中的“ P_Id”列是“ Orders”表中的FOREIGN KEY。

FOREIGN KEY约束用于预防破坏表之间连接的行为。

FOREIGN KEY约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

CREATE TABLE时的SQL FOREIGN KEY约束
下面的SQL在“ Orders”表创建时在“ P_Id”列上创建FOREIGN KEY约束:

MySQL:
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)
SQL Server / Oracle / MS Access:
CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
)
若要命名FOREIGN KEY约束,并定义多个列的FOREIGN KEY约束,请使用下面的SQL语法:

MySQL / SQL Server / Oracle / MS访问:
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
)

ALTER TABLE时的SQL FOREIGN KEY约束
当“ Orders”表已被创建时,如需在“ P_Id”列创建FOREIGN KEY约束,请使用下面的SQL:
MySQL / SQL Server / Oracle / MS访问:
ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
若要命名FOREIGN KEY约束,并定义多个列的FOREIGN KEY约束,请使用下面的SQL语法:
MySQL / SQL Server / Oracle / MS访问:
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

撤销FOREIGN KEY约束
要取消FOREIGN KEY约束,请使用下面的SQL:
MySQL:
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders

SQL Server / Oracle / MS Access:
ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders

SQL检查约束
检查约束条件以限制列中的值的范围。
如果对单一列定义CHECK约束,那么该列只允许特定的值。
如果对一个表定义CHECK约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。

CREATE TABLE时的SQL CHECK约束
下面的SQL在“ Persons”表创建时在“ P_Id”列上创建CHECK约束。CHECK约束规定“ P_Id”列必须只包含大于0的整数。

MySQL:

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
)

SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
P_Id int NOT NULL CHECK (P_Id>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
要命名的CHECK约束,并定义多个列的CHECK约束,请使用下面的SQL语法:

MySQL / SQL Server / Oracle / MS访问:

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND City=‘Sandnes’)
)

ALTER TABLE时的SQL CHECK约束
当表已被创建时,如需在“ P_Id”列创建CHECK约束,请使用下面的SQL:

MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CHECK (P_Id>0)
要命名的CHECK约束,并定义多个列的CHECK约束,请使用下面的SQL语法:

MySQL / SQL Server / Oracle / MS访问:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>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

SQL DEFAULT 约束
DEFAULT 约束用于向列中插入默认值。
如果没有规定其他的值,那么会将默认值添加到所有的新记录。

CREATE TABLE 时的 SQL DEFAULT 约束
下面的 SQL 在 “Persons” 表创建时在 “City” 列上创建 DEFAULT 约束:
My SQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT ‘Sandnes’
)
通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
OrderDate date DEFAULT GETDATE()
)

ALTER TABLE 时的 SQL DEFAULT 约束
当表已被创建时,如需在 “City” 列创建 DEFAULT 约束,请使用下面的 SQL:

MySQL:
ALTER TABLE Persons
ALTER City SET DEFAULT ‘SANDNES’
SQL Server / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT ab_c DEFAULT ‘SANDNES’ for City
Oracle:
ALTER TABLE Persons
MODIFY City DEFAULT ‘SANDNES’
撤销 DEFAULT 约束
如需撤销 DEFAULT 约束,请使用下面的 SQL:

MySQL:
ALTER TABLE Persons
ALTER City DROP DEFAULT
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT

SQL CREATE INDEX 语句
CREATE INDEX 语句用于在表中创建索引。

在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。

索引
您可以在表中创建索引,以便更加快速高效地查询数据。

用户无法看到索引,它们只能被用来加速搜索/查询。

注释:更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

SQL CREATE INDEX 语法
在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name
ON table_name (column_name)
SQL CREATE UNIQUE INDEX 语法
在表上创建一个唯一的索引。不允许使用重复的值:唯一的索引意味着两个行不能拥有相同的索引值。Creates a unique index on a table. Duplicate values are not allowed:
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
注释:用于创建索引的语法在不同的数据库中不一样。因此,检查您的数据库中创建索引的语法。

CREATE INDEX 实例
下面的 SQL 语句在 “Persons” 表的 “LastName” 列上创建一个名为 “PIndex” 的索引:
CREATE INDEX PIndex
ON Persons (LastName)
如果您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
CREATE INDEX PIndex
ON Persons (LastName, FirstName)

QL 撤销索引、撤销表以及撤销数据库
通过使用 DROP 语句,可以轻松地删除索引、表和数据库。

DROP INDEX 语句
DROP INDEX 语句用于删除表中的索引。

用于 MS Access 的 DROP INDEX 语法:
DROP INDEX index_name ON table_name
用于 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 TABLE 语句
DROP TABLE 语句用于删除表。
DROP TABLE table_name

DROP DATABASE 语句
DROP DATABASE 语句用于删除数据库。
DROP DATABASE database_name

TRUNCATE TABLE 语句
如果我们仅仅需要删除表内的数据,但并不删除表本身,那么我们该如何做呢?
请使用 TRUNCATE TABLE 语句:
TRUNCATE TABLE table_name

SQL ALTER TABLE 语句
ALTER TABLE 语句

ALTER TABLE 语句用于在已有的表中添加、删除或修改列。

SQL ALTER TABLE 语法
如需在表中添加列,请使用下面的语法:

ALTER TABLE table_name
ADD column_name datatype
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):

ALTER TABLE table_name
DROP COLUMN column_name
要改变表中列的数据类型,请使用下面的语法:

SQL Server / MS Access:
ALTER TABLE table_name
ALTER COLUMN column_name datatype
My SQL / Oracle:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype
Oracle 10G 之后版本:

ALTER TABLE table_name
MODIFY column_name datatype;

SQL ALTER TABLE 实例
请看 “Persons” 表:

现在,我们想在 “Persons” 表中添加一个名为 “DateOfBirth” 的列。

我们使用下面的 SQL 语句:

ALTER TABLE Persons
ADD DateOfBirth date
请注意,新列 “DateOfBirth” 的类型是 date,可以存放日期。数据类型规定列中可以存放的数据的类型。如需了解 MS Access、MySQL 和 SQL Server 中可用的数据类型,请访问我们完整的 数据类型参考手册。

现在,“Persons” 表将如下所示:

改变数据类型实例
现在,我们想要改变 “Persons” 表中 “DateOfBirth” 列的数据类型。

我们使用下面的 SQL 语句:

ALTER TABLE Persons
ALTER COLUMN DateOfBirth year
请注意,现在 “DateOfBirth” 列的类型是 year,可以存放 2 位或 4 位格式的年份。

DROP COLUMN 实例
接下来,我们想要删除 “Person” 表中的 “DateOfBirth” 列。

我们使用下面的 SQL 语句:

ALTER TABLE Persons
DROP COLUMN DateOfBirth
现在,“Persons” 表将如下所示:

SQL AUTO INCREMENT 字段
Auto-increment 会在新记录插入表中时生成一个唯一的数字。
AUTO INCREMENT 字段
我们通常希望在每次插入新记录时,自动地创建主键字段的值。
我们可以在表中创建一个 auto-increment 字段。

用于 MySQL 的语法
下面的 SQL 语句把 “Persons” 表中的 “ID” 列定义为 auto-increment 主键字段:
CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (ID)
)
MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。
默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。
要让 AUTO_INCREMENT 序列以其他的值起始,请使用下面的 SQL 语法:
ALTER TABLE Persons AUTO_INCREMENT=100
要在 “Persons” 表中插入新记录,我们不必为 “ID” 列规定值(会自动添加一个唯一的值):
INSERT INTO Persons (FirstName,LastName)
VALUES (‘Lars’,‘Monsen’)
上面的 SQL 语句会在 “Persons” 表中插入一条新记录。“ID” 列会被赋予一个唯一的值。“FirstName” 列会被设置为 “Lars”,“LastName” 列会被设置为 “Monsen”。

用于 SQL Server 的语法
下面的 SQL 语句把 “Persons” 表中的 “ID” 列定义为 auto-increment 主键字段:
CREATE TABLE Persons
(
ID int IDENTITY(1,1) PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
MS SQL Server 使用 IDENTITY 关键字来执行 auto-increment 任务。
在上面的实例中,IDENTITY 的开始值是 1,每条新记录递增 1。
提示:要规定 “ID” 列以 10 起始且递增 5,请把 identity 改为 IDENTITY(10,5)。
要在 “Persons” 表中插入新记录,我们不必为 “ID” 列规定值(会自动添加一个唯一的值):
INSERT INTO Persons (FirstName,LastName)
VALUES (‘Lars’,‘Monsen’)
上面的 SQL 语句会在 “Persons” 表中插入一条新记录。“ID” 列会被赋予一个唯一的值。“FirstName” 列会被设置为 “Lars”,“LastName” 列会被设置为 “Monsen”。

用于 Access 的语法
下面的 SQL 语句把 “Persons” 表中的 “ID” 列定义为 auto-increment 主键字段:
CREATE TABLE Persons
(
ID Integer 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。
提示:要规定 “ID” 列以 10 起始且递增 5,请把 autoincrement 改为 AUTOINCREMENT(10,5)。
要在 “Persons” 表中插入新记录,我们不必为 “ID” 列规定值(会自动添加一个唯一的值):
INSERT INTO Persons (FirstName,LastName)
VALUES (‘Lars’,‘Monsen’)
上面的 SQL 语句会在 “Persons” 表中插入一条新记录。“ID” 列会被赋予一个唯一的值。“FirstName” 列会被设置为 “Lars”,“LastName” 列会被设置为 “Monsen”。

用于 Oracle 的语法
在 Oracle 中,代码稍微复杂一点。
您必须通过 sequence 对象(该对象生成数字序列)创建 auto-increment 字段。
请使用下面的 CREATE SEQUENCE 语法:
CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10
上面的代码创建一个名为 seq_person 的 sequence 对象,它以 1 起始且以 1 递增。该对象缓存 10 个值以提高性能。cache 选项规定了为了提高访问速度要存储多少个序列值。

要在 “Persons” 表中插入新记录,我们必须使用 nextval 函数(该函数从 seq_person 序列中取回下一个值):
INSERT INTO Persons (ID,FirstName,LastName)
VALUES (seq_person.nextval,‘Lars’,‘Monsen’)
上面的 SQL 语句会在 “Persons” 表中插入一条新记录。“ID” 列会被赋值为来自 seq_person 序列的下一个数字。"FirstName"列 会被设置为 “Lars”,“LastName” 列会被设置为 “Monsen”。

SQL 视图(Views)
视图是可视化的表。

本章讲解如何创建、更新和删除视图。

SQL CREATE VIEW 语句
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
您可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,也可以呈现数据,就像这些数据来自于某个单一的表一样。

SQL CREATE VIEW 语法
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
注释:视图总是显示最新的数据!每当用户查询视图时,数据库引擎通过使用视图的 SQL 语句重建数据。

SQL CREATE VIEW 实例
样本数据库 Northwind 拥有一些被默认安装的视图。

视图 “Current Product List” 会从 “Products” 表列出所有正在使用的产品(未停产的产品)。这个视图使用下面的 SQL 创建:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No

我们可以像这样查询上面这个视图:
SELECT * FROM [Current Product List]

Northwind 样本数据库的另一个视图会选取 “Products” 表中所有单位价格高于平均单位价格的产品:
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)

我们可以像这样查询上面这个视图:
SELECT * FROM [Products Above Average Price]

Northwind 样本数据库的另一个视图会计算在 1997 年每个种类的销售总数。请注意,这个视图会从另一个名为 “Product Sales for 1997” 的视图那里选取数据:
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName

我们可以像这样查询上面这个视图:
SELECT * FROM [Category Sales For 1997]

我们也可以向查询添加条件。现在,我们仅仅需要查看 “Beverages” 类的销售总数:
SELECT * FROM [Category Sales For 1997]
WHERE CategoryName=‘Beverages’

SQL 更新视图
您可以使用下面的语法来更新视图:

SQL CREATE OR REPLACE VIEW 语法
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
现在,我们希望向 “Current Product List” 视图添加 “Category” 列。我们将通过下列 SQL 更新视图:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No
SQL Server
ALTER VIEW [ schema_name . ] view_name [ ( column [ ,…n ] ) ]
[ WITH <view_attribute> [ ,…n ] ]
AS select_statement
[ WITH CHECK OPTION ] [ ; ]

<view_attribute> ::=
{
[ ENCRYPTION ]
[ SCHEMABINDING ]
[ VIEW_METADATA ]
}
schema_name: 视图所属架构的名称。
view_name: 要更改的视图。
column: 将成为指定视图的一部分的一个或多个列的名称(以逗号分隔)。

SQL 撤销视图
您可以通过 DROP VIEW 命令来删除视图。

SQL DROP VIEW 语法
DROP VIEW view_name

SQL Date 函数
SQL 日期(Dates)
Note当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。
只要您的数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间部分,情况就有点复杂了。
在讨论日期查询的复杂性之前,我们先来看看最重要的内建日期处理函数。
MySQL Date 函数
下面的表格列出了 MySQL 中最重要的内建日期函数:

SQL Server Date 函数
下面的表格列出了 SQL Server 中最重要的内建日期函数:

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 - 格式:唯一的数字
注释:当您在数据库中创建一个新表时,需要为列选择数据类型!

如需了解所有可用的数据类型,请访问我们完整的 数据类型参考手册。

SQL 日期处理
Note如果不涉及时间部分,那么我们可以轻松地比较两个日期!
假设我们有如下的 “Orders” 表:

现在,我们希望从上表中选取 OrderDate 为 “2008-11-11” 的记录。
我们使用下面的 SELECT 语句:
SELECT * FROM Orders WHERE OrderDate=‘2008-11-11’

结果集如下所示:

现在,假设 “Orders” 表如下所示(请注意 “OrderDate” 列中的时间部分):

如果我们使用和上面一样的 SELECT 语句:

SELECT * FROM Orders WHERE OrderDate=‘2008-11-11’

SELECT * FROM Orders WHERE OrderDate=‘2008-11-11 00:00:00’

那么我们将得不到结果!因为表中没有"2008-11-11 00:00:00"日期。如果没有时间部分,默认时间为 00:00:00。
提示:如果您希望使查询简单且更易维护,那么请不要在日期中使用时间部分!

SQL NULL 值
NULL 值代表遗漏的未知数据。
默认地,表的列可以存放 NULL 值。
本章讲解 IS NULL 和 IS NOT NULL 操作符。

SQL NULL 值
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 值的处理方式与其他值不同。
NULL 用作未知的或不适用的值的占位符。
Note注释:无法比较 NULL 和 0;它们是不等价的。

SQL 的 NULL 值处理
请看下面的 “Persons” 表:

假如 “Persons” 表中的 “Address” 列是可选的。这意味着如果在 “Address” 列插入一条不带值的记录,“Address” 列会使用 NULL 值保存。
那么我们如何测试 NULL 值呢?
无法使用比较运算符来测试 NULL 值,比如 =、< 或 <>。
我们必须使用 IS NULL 和 IS NOT NULL 操作符。

SQL IS NULL
我们如何仅仅选取在 “Address” 列中带有 NULL 值的记录呢?
我们必须使用 IS NULL 操作符:
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL
结果集如下所示:

SQL IS NOT NULL
我们如何仅仅选取在 “Address” 列中不带有 NULL 值的记录呢?
我们必须使用 IS NOT NULL 操作符:
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL
结果集如下所示:

SQL NULL 函数
SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
请看下面的 “Products” 表:

假如 “UnitsOnOrder” 是可选的,而且可以包含 NULL 值。

我们使用下面的 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通用数据类型
数据类型定义列中存放的值的种类。
SQL通用数据类型
数据库表中的每一列都必须具有名称和数据类型。
SQL开发人员必须在创建SQL表时决定表中的每个列将要存储的数据的类型。数据类型是一个标签,是可用的SQL了解每个列的期望存储什么类型的数据的指南,它也标识了SQL如何与存储的数据进行交互。
下面的表格列出了SQL中通用的数据类型:
SQL 用于各种数据库的数据类型
Microsoft Access、MySQL 和 SQL Server 所使用的数据类型和范围。
Microsoft Access 数据类型


  1. GFs ↩︎

  2. A-H ↩︎

更多推荐

SQL语句详细