SQL CREATE INDEX 语句(索引,在不读取整张表的情况下,索引使得数据库应用程序可以更快地查找数据)
更新一个包含索引的表笔更新一个不包含索引的表需要更多的时间,这是由于索引本身也需要更新时间。
因此,最理想的索引是创建在被搜索列上的。
允许重复行
CREATE INDEX index_name
ON table_name (column_name)
不允许重复行
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
创建降序索引
CREATE INDEX PersonIndex ON Person (LastName DESC)
创建包含多列的索引
CREATE INDEX PersonINdex ON Person (LastName, FirstName)
SQL撤销索引、表以及数据库
SQL DROP INDEX 语句
用于Microsoft SQLJet(以及Microsoft Acess)的语法:
DROP INDEX index_name ON table_name
用于MS SQL Server的语法:
DROP INDEX table_name.index_name
用于IBM DB2 和 Oracle语法:
DROP INDEX index_name
用于MYSQL的语法:
ALER TABLE table_name DROP INDEX index_name
SQL DROP TABLE 语句
DROP TABLE 表名称
SQL DROP DATABASE 语句
DROP TABLE 数据库名称
SQL TRUNCATE(本意截断,我觉得应该翻译为清空) TABLE语句
truncate table 表名称
SQL ALTER TABLE语句
用于在已有表中进行添加、修改、删除列。
在表中添加列
ALTER TABLE table_name ADD column_name datatype
删除表中的列
ALTER TABLE table_name DROP COLUMN column_name
更新表中列的数据类型
ALTER TABLE table_name ALTER COLUMN column_name datatype
SQL AUTO INCREMENT 字段
用于MySQL的语法(让P_ID自增):
CREATE TABLE Persons(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
City varchar(255),
PRIMARY KEY(P_Id)
)
为序列添加起始值
ALERT TABLE Persons AUTO_INCREMENT=100
不必为“P_Id”列规定值
INSERT INTO Persons (FirstName,LastName)
VALUES ('Bill','Gates')
用于SQL Server的语法:
CREATE TABLE Persons(
P_Id int PRIMARY KEY IDENTITY(初始值,递增值),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
City varchar(255),
)
用于Access的语法
CREATE TABLE Persons(
P_Id int PRIMARY KEY AUTOINCREMENT(初始值,递增值),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
City varchar(255),
)
用于Oracle的语法:
CREATE SEQUENCE seq_person
MINVALUE 1
START SWITH 1
INCREMENT BY 1
CACHE 10
更新记录的时候的区别:
INSERT INTO Persons (P_Id,FirstName,LastName)
VALUES(seq_persons.nextval,'Lars','Monsen')
SQL VIEW(视图)
什么是视图?
在SQL中,视图是基于SQL语句的结果集可视化的表。
创建视图
CREATE VIEW view_name AS
SELECT clumn_name(s)
FROM tabel_name
WHERE condition
更新视图
SQL CRAETE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
SQL撤销视图
DROP VIEW Syntax(有秩序的排序)
DROP VIEW view_name
SQL Date 函数
MySQL Date 函数
下面的表格列出了 MySQL 中最重要的内建日期函数:
函数 | 描述 |
---|---|
NOW() | 返回当前的日期和时间 |
CURDATE() | 返回当前的日期 |
CURTIME() | 返回当前的时间 |
DATE() | 提取日期或日期/时间表达式的日期部分 |
EXTRACT() | 返回日期/时间按的单独部分 |
DATE_ADD() | 给日期添加指定的时间间隔 |
DATE_SUB() | 从日期减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的天数 |
DATE_FORMAT() | 用不同的格式显示日期/时间 |
SQL Server Date 函数
下面的表格列出了 SQL Server 中最重要的内建日期函数:
函数 | 描述 |
---|---|
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 - 格式: 唯一的数字
SQL 日期处理
如果不涉及时间部分,那么我们可以轻松地比较两个日期!
假设我们有下面这个 "Orders" 表:
OrderId | ProductName | OrderDate |
---|---|---|
1 | computer | 2008-12-26 |
2 | printer | 2008-12-26 |
3 | electrograph | 2008-11-12 |
4 | telephone | 2008-10-19 |
现在,我们希望从上表中选取 OrderDate 为 "2008-12-26" 的记录。
我们使用如下 SELECT 语句:
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
结果集:
OrderId | ProductName | OrderDate |
---|---|---|
1 | computer | 2008-12-26 |
3 | electrograph | 2008-12-26 |
现在假设 "Orders" 类似这样(请注意 "OrderDate" 列中的时间部分):
OrderId | ProductName | OrderDate |
---|---|---|
1 | computer | 2008-12-26 16:23:55 |
2 | printer | 2008-12-26 10:45:26 |
3 | electrograph | 2008-11-12 14:12:08 |
4 | telephone | 2008-10-19 12:56:10 |
如果我们使用上面的 SELECT 语句:
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
SQL NULL值
空值运算符的运算不能只用常规的运算符,必须是IS NULL 或者 IS NOT NULL来实现。
SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
如果我们执行是下面的语句
SELECT ProductName,UnitPrice*(UnitsINStock+UnitsONOrder) FROM Products
如果UnitsOnOrder里面n包含空值,那么你将会得到空值。
SQL Server / MS Access
SELECT ProductName,UnitPrice*(UnitsINStock+ISNULL(UnitsOnOder,0)) FROM Products
Oracle
SELECT ProductName,UnitPrice*(UnitsINStock+NVL(UnitsOnOder,0)) FROM Products
MySQL
SELECT ProductName,UnitPrice*(UnitsINStock+IFNULL(UnitsOnOder,0)) FROM Products
或者
SELECT ProductName,UnitPrice*(UnitsINStock+COALESCE(UnitsOnOder,0)) FROM Products