★SQL CREATE INDEX 语句-------用于在表中创建索引。在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
在表中创建索引,以便更加快速高效地查询数据。
用户无法看到索引,它们只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
CREATE INDEX 语法:
在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name
ON table_name (column_name) 注释:"column_name" 规定需要索引的列。
eg:
CREATE INDEX PersonIndex
ON Person (LastName) (注:创建一个简单的索引,名为 "PersonIndex",在 Person 表的 LastName 列)
如果希望以降序索引某个列中的值,可以在列名称之后添加保留字 DESC:
eg:
CREATE INDEX PersonIndex
ON Person (LastName DESC)
假如希望索引不止一个列,可以在括号中列出这些列的名称,用逗号隔开:
eg:
CREATE INDEX PersonIndex
ON Person (LastName, FirstName)
CREATE UNIQUE INDEX 语法:
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
★SQL DROP语句-----用于删除索引、表和数据库
一、DROP INDEX-----用于删除表中的索引
1.用于 Microsoft SQLJet (以及 Microsoft Access) 的语法:
DROP INDEX index_name ON table_name
2.用于 MS SQL Server 的语法:
DROP INDEX table_name.index_name
3.用于 IBM DB2 和 Oracle 语法:
DROP INDEX index_name
4.用于 MySQL 的语法:
ALTER TABLE table_name DROP INDEX index_name
二、DROP TABLE-----用于删除表(表的结构、属性以及索引也会被删除)
DROP TABLE 表名称
三、TRUNCATE TABLE-----用于除去表内的数据,但并不删除表本身,仅仅删除表格中的数据
TRUNCATE TABLE 表名称
四、DROP DATABASE------用于删除数据库
DROP DATABASE 数据库名称
★SQL ALTER TABLE 语句------用于在已有的表中添加、修改或删除列。
一、在表中添加列:
ALTER TABLE table_name
ADD column_name datatype
eg:
ALTER TABLE Persons
ADD Birthday date(表 "Persons" 中添加一个名为 "Birthday" 的新列,新列 "Birthday" 的类型是 date,可以存放日期。数据类型规定列中可以存放的数据的类型。)
二、删除表中的列:
ALTER TABLE table_name
DROP COLUMN column_name
eg:
ALTER TABLE Person
DROP COLUMN Birthday(删除 "Person" 表中的 "Birthday" 列)
注释:某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name)
三、改变表中列的数据类型:
ALTER TABLE table_name
ALTER COLUMN column_name datatype
eg:
ALTER TABLE Persons
ALTER COLUMN Birthday year(改变 "Persons" 表中 "Birthday" 列的数据类型,"Birthday" 列的数据类型是 year,可以存放 2 位或 4 位格式的年份)
★SQL AUTO INCREMENT 字段-------在新记录插入表中时会自动生成一个唯一的数字。
我们通常希望在每次插入新记录时,自动地创建主键字段的值,为此我们可以在表中创建一个 auto-increment 字段来实现。
1.用于MySQL的语法:
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)
) (把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键)
MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。
默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。
要让 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"。
2.用于 SQL Server 的语法:
CREATE TABLE Persons
(
P_Id int PRIMARY KEY IDENTITY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
) (把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键)
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"。
3.用于 Access 的语法:
CREATE TABLE Persons
(
P_Id int PRIMARY KEY AUTOINCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
) (把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键)
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"。
4.用于 Oracle 的语法
在 Oracle 中,代码稍微复杂一点。必须通过 sequence 对创建 auto-increment 字段(该对象生成数字序列)。
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"。
★SQL VIEW(视图)-------视图是可视化的表。
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。
一、CREATE VIEW ——创建视图
语法:
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
eg:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No (视图 "Current Product List" 会从 Products 表列出所有正在使用的产品。)
查询视图 "Current Product List" :
SELECT * FROM [Current Product List]
eg:
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products) (视图“Products Above Average Price”会选取 Products 表中所有单位价格高于平均单位价格的产品)
查询“Products Above Average Price”视图:
SELECT * FROM [Products Above Average Price]
eg:
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName (视图“Category Sales For 1997”会计算在 1997 年每个种类的销售总数。请注意,这个视图会从另一个名为 "Product Sales for 1997" 的视图那里选取数据)
查询“Category Sales For 1997”视图:
SELECT * FROM [Category Sales For 1997]
同时可以向查询添加条件。如:仅仅查看 "Beverages" 类的全部销量:
SELECT * FROM [Category Sales For 1997]
WHERE CategoryName='Beverages'
二、更新视图:
语法:
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
eg:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No ( "Current Product List" 视图添加 "Category" 列。)
三、撤销视图:
语法:
DROP VIEW view_name
★SQL Date 函数
有关时间日期的函数与用法请参考:Date函数
★SQL NULL 值
NULL 值是遗漏的未知数据。默认地,表的列可以存放 NULL 值。
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 值的处理方式与其他值不同。
NULL 用作未知的或不适用的值的占位符。
注释:无法比较 NULL 和 0;它们是不等价的。
假如 "Persons" 表中的 "Address" 列是可选的。这意味着如果在 "Address" 列插入一条不带值的记录,"Address" 列会使用 NULL 值保存。
那么我们如何测试 NULL 值呢?无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>。我们必须使用 IS NULL 和 IS NOT NULL 操作符。
1.IS NULL 操作符:
eg:
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL (选取在 "Address" 列中带有 NULL 值的记录)
提示:请始终使用 IS NULL 来查找 NULL 值。
2.IS NOT NULL 操作符:
eg:
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL (在 "Address" 列中不带有 NULL 值的记录)
★SQL NULL 函数
如果表的某些列中的值是NULL,则不利于计算,因此如果值是NULL,我们需要返回0参与计算,在不同的数据库中所用软件有所不同,下面一一举例说明。
1.在SQL Server / MS Access中:
eg:
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
2.在Oracle中:
eg:
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products
3.在MySQL中:
eg:
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products
eg:
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products
微软的ISNULL() 函数用于规定如何处理 NULL 值。而NVL(), IFNULL() 和 COALESCE() 函数也可以达到相同的结果。
★SQL 数据类型
Microsoft Access、MySQL 以及 SQL Server 所使用的数据类型和范围。请参考:SQL数据类型:SQL数据类型