SELECT TOP 子句用于指定要返回的记录数量。
SELECT TOP子句在包含数千条记录的大型表上很有用。返回大量记录会影响性能。
注:并不是所有的数据库系统都支持SELECT TOP子句。MySQL支持LIMIT子句来选择有限数量的记录,而Oracle使用ROWNUM。
SELECT TOP number|percent column_name(s) FROM table_name WHERE condition;
MySQL语法
SELECT column_name(s) FROM table_name WHERE condition LIMIT number; SELECT * FROM Persons LIMIT 5;
Oracle 语法
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number; SELECT * FROM Persons WHERE ROWNUM <=5;
以下SQL语句从"Customers" 表中选择前两条记录:
SELECT TOP 2 * FROM Customers;
以下SQL语句从 "Customers" 表中选择前50%的记录:
SELECT TOP 50 PERCENT * FROM Customers;
以下SQL语句从"Customers"表中选择前三个记录:
SELECT TOP 3 * FROM Customers;
以下SQL语句显示了使用LIMIT子句的等效示例:
SELECT * FROM Customers LIMIT 3;
以下SQL语句显示了使用ROWNUM的等效示例:
SELECT * FROM Customers WHERE ROWNUM <= 3;
以下SQL语句从"Customers"表中选择记录的前50%:
SELECT TOP 50 PERCENT * FROM Customers;
以下SQL语句从"Customers"表中选择国家为"Germany"的前三条记录:
SELECT TOP 3 * FROM Customers WHERE Country='Germany';
以下SQL语句显示了使用LIMIT子句的等效示例:
SELECT * FROM Customers WHERE Country='Germany' LIMIT 3;
以下SQL语句显示了使用ROWNUM的等效示例:
SELECT * FROM Customers WHERE Country='Germany' AND ROWNUM <= 3;
在WHERE子句中使用LIKE运算符来搜索列中的指定模式。
有两个通配符与LIKE运算符一起使用:
%
- 百分号表示零个,一个或多个字符
_
- 下划线表示单个字符
注意: MS Access使用问号(?
)而不是下划线(_
)。百分号和下划线也可以组合使用!
SELECT column1, column2, ... FROM table_name WHERE columnN LIKE pattern;
提示:可以使用AND或OR运算符组合任意数量的条件。
以下SQL语句选择以“a”开头的CustomerName的所有客户:
SELECT * FROM Customers WHERE CustomerName LIKE 'a%';
以下SQL语句选择客户名称以“a”结尾的所有客户:
SELECT * FROM Customers WHERE CustomerName LIKE '%a';
以下SQL语句选择客户名称在任何位置都具有“或”的所有客户:
SELECT * FROM Customers WHERE CustomerName LIKE '%or%';
以下SQL语句选择客户名称在第二位具有“r”的所有客户:
SELECT * FROM Customers WHERE CustomerName LIKE '_r%';
以下SQL语句选择客户名称以“a”开头且长度至少为3个字符的所有客户:
SELECT * FROM Customers WHERE CustomerName LIKE 'a_%_%';
以下SQL语句选择联系人名称以“a”开头并以“o”结尾的所有客户:
SELECT * FROM Customers WHERE ContactName LIKE 'a%o';
以下SQL语句选择客户名称不以“a”开头的所有客户:
SELECT * FROM Customers WHERE CustomerName NOT LIKE 'a%';
以下SQL语句选择客户名称以“a”开头,以“s”结尾的5位字符的所有客户:
SELECT * FROM Customers WHERE CustomerName LIKE 'a___s';
通配符用于替换字符串中的任何其他字符。
通配符与 SQL LIKE运算符一起使用。在 WHERE 子句中使用LIKE运算符来搜索列中的指定模式。
有两个通配符与 LIKE 运算符一起使用:
%
- 百分号表示零个,一个或多个字符
_
- 下划线表示单个字符
注意:
MS Access 使用星号(*
)通配符而不是百分比符号(%
)通配符。
MS Access 使用问号(?
)而不是下划线(_
)。
在MS Access和SQL Server中,你也可以使用:
[ charlist ] - 定义要匹配的字符的集合和范围
[^ charlist ]或[!charlist ] - 定义不匹配字符的集合和范围
以下 SQL 语句选择所有客户 City 以"b"、"s"或"p"开头:
SELECT * FROM Customers WHERE City LIKE '[bsp]%';
以下 SQL 语句选择“City”以“a”、“b”或“c”开头的所有客户:
SELECT * FROM Customers WHERE City LIKE '[a-c]%';
以下两个 SQL 语句选择所有客户的城市不以“b”,“s”或“p”开头:
SELECT * FROM Customers WHERE City LIKE '[!bsp]%';
要么:
SELECT * FROM Customers WHERE City NOT LIKE '[bsp]%';
BETWEEN运算符用于选取介于两个值之间的数据范围内的值。值可以是数字,文本或日期。
BETWEEN运算符是包含性的:包括开始和结束值,且开始值需小于结束值。
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2;
要否定BETWEEN运算符的结果,可以添加NOT运算符:
SELECT column_name(s) FROM table_name WHERE column_name NOT BETWEEN value1 AND value2;
以下SQL语句选择价格在10到20之间但CategoryID不是1、2或3的所有产品
SELECT * FROM Products WHERE (Price BETWEEN 10 AND 20) AND NOT CategoryID IN (1,2,3);
以下SQL语句选择所有带有ProductName BETWEEN'Carnarvon Tigers'和'Mozzarella di Giovanni'的产品:
SELECT * FROM Products WHERE ProductName BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni' ORDER BY ProductName;
以下SQL语句选择ProductName不是BETWEEN'Carnarvon Tigers'和'Mozzarella di Giovanni'的所有产品:
SELECT * FROM Products WHERE ProductName NOT BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni' ORDER BY ProductName;
以下 SQL 语句选取 OrderDate 介于 '04-July-1996' 和 '09-July-1996' 之间的所有订单:
SELECT * FROM Orders WHERE OrderDate BETWEEN #07/04/1996# AND #07/09/1996#;
在不同的数据库中,BETWEEN 操作符会产生不同的结果! 有的选取介于两个值之间但不包括两个测试值的字段。有的选取介于两个值之间且包括两个测试值的字段;有的选取介于两个值之间且包括第一个测试值但不包括最后一个测试值的字段。
数据类型定义了存储在列中的值的类型。
数据库表中的每一列都需要有一个名称和数据类型。
SQL 开发人员必须在创建 SQL 表时决定表中的每个列将要存储的数据的类型。数据类型是一个标签,是便于 SQL 了解每个列期望存储什么类型的数据的指南,它也标识了 SQL 如何与存储的数据进行交互。
数据类型 | 描述 |
---|---|
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 |
SQL 语句 | 语法 |
---|---|
AND / OR | SELECT column_name(s) FROM table_name WHERE condition AND|OR condition |
ALTER TABLE | ALTER TABLE table_name ADD column_name datatype ALTER TABLE table_name DROP COLUMN column_name |
AS (alias) | SELECT column_name AS column_alias FROM table_name SELECT column_name FROM table_name AS table_alias |
BETWEEN | SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2 |
CREATE DATABASE | CREATE DATABASE database_name |
CREATE TABLE | CREATE TABLE table_name ( column_name1 data_type, column_name2 data_type, column_name2 data_type, ... ) |
CREATE INDEX | CREATE INDEX index_name ON table_name (column_name) CREATE UNIQUE INDEX index_name ON table_name (column_name) |
CREATE VIEW | CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition |
DELETE | DELETE FROM table_name WHERE some_column=some_value DELETE FROM table_name (Note: Deletes the entire table!!) DELETE * FROM table_name (Note: Deletes the entire table!!) |
DROP DATABASE | DROP DATABASE database_name |
DROP INDEX | DROP INDEX table_name.index_name (SQL Server) DROP INDEX index_name ON table_name (MS Access) DROP INDEX index_name (DB2/Oracle) ALTER TABLE table_name DROP INDEX index_name (MySQL) |
DROP TABLE | DROP TABLE table_name |
GROUP BY | SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name |
HAVING | SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) operator value |
IN | SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,..) |
INSERT INTO | INSERT INTO table_name VALUES (value1, value2, value3,....) INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,....) |
INNER JOIN | SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name |
LEFT JOIN | SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name |
RIGHT JOIN | SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name |
FULL JOIN | SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name |
LIKE | SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern |
ORDER BY | SELECT column_name(s) FROM table_name ORDER BY column_name [ASC|DESC] |
SELECT | SELECT column_name(s) FROM table_name |
SELECT * | SELECT * FROM table_name |
SELECT DISTINCT | SELECT DISTINCT column_name(s) FROM table_name |
SELECT INTO | SELECT * INTO new_table_name [IN externaldatabase] FROM old_table_name SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_table_name |
SELECT TOP | SELECT TOP number|percent column_name(s) FROM table_name |
TRUNCATE TABLE | TRUNCATE TABLE table_name |
UNION | SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2 |
UNION ALL | SELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2 |
UPDATE | UPDATE table_name SET column1=value, column2=value,... WHERE some_column=some_value |
WHERE | SELECT column_name(s) FROM table_name WHERE column_name operator value |
SQL join 用于把来自两个或多个表的行结合起来。
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。
不同的 SQL JOIN 类型:
INNER JOIN:如果表中有至少一个匹配,则返回行
LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
FULL JOIN:只要其中一个表中存在匹配,则返回行
SELF JOIN:用于将表连接到自己,就好像该表是两个表一样,临时重命名了SQL语句中的至少一个表
CARTESIAN JOIN:从两个或多个连接表返回记录集的笛卡儿积
选择两个表中具有匹配值的记录。
SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
注释:INNER JOIN 与 JOIN 是相同的。
以下SQL语句将返回所有下订单的客户:
SELECT Customers.CustomerName, Orders.OrderID FROM Customers INNER JOIN Orders ON Customers.CustomerID=Orders.CustomerID ORDER BY Customers.CustomerName;
注释:如果表中至少有一个匹配项,INNER JOIN 关键字将返回一行。如果 "Customers" 表中的行与"Orders" 不匹配,则不会列出行。
加入三张表:以下SQL语句选择包含客户和货运单信息的所有订单:
SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName FROM ((Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID) INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);
SQL左链接LEFT JOIN关键字返回左表(表1)中的所有行,即使在右表(表2)中没有匹配。如果在正确的表中没有匹配,结果是NULL。
SQL LEFT JOIN 语法
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;
注释:在一些数据库中,LEFT JOIN称为LEFT OUTER JOIN。
以下SQL语句将选择所有客户以及他们可能拥有的任何订单:
SELECT Customers.CustomerName, Orders.OrderID FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID ORDER BY Customers.CustomerName;
注释:LEFT JOIN 关键字返回左表(Customers)中的所有行,即使在右边表(Orders)中没有匹配。
SQL右链接 RIGHT JOIN 关键字返回右表(table2)的所有行,即使在左表(table1)上没有匹配。如果左表没有匹配,则结果为NULL。
SQL RIGHT JOIN 语法
SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
注释:在一些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。
当左(表1)或右(表2)表记录匹配时,FULL OUTER JOIN关键字将返回所有记录。 注意: FULL OUTER JOIN可能会返回非常大的结果集!
SQL FULL OUTER JOIN 语法
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
SQL FULL OUTER JOIN 实例:以下SQL语句选择所有客户和所有订单:
SELECT Customers.CustomerName, Orders.OrderID FROM Customers FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID ORDER BY Customers.CustomerName;
注意:FULL OUTER JOIN关键字返回左表(Customers)中的所有行,以及右表(Orders)中的所有行。如果 "Customers"中的行中没有"Orders"中的匹配项,或者"Orders"中的行中没有 "Customers"中的匹配项,那么这些行也会列出。
自联接是一种常规联接,但表本身是连接的。
Self JOIN语法
SELECT column_name(s) FROM table1 T1, table1 T2 WHERE condition;
以下SQL语句匹配来自同一城市的客户:
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City FROM Customers A, Customers B WHERE A.CustomerID <> B.CustomerID AND A.City = B.City ORDER BY A.City;
UNION运算符用于组合两个或更多SELECT语句的结果集,而不返回任何重复的行。
UNION中的每个SELECT语句必须具有相同的列数
这些列也必须具有相似的数据类型
每个SELECT语句中的列也必须以相同的顺序排列
每个SELECT语句必须有相同数目的列表达式
但是每个SELECT语句的长度不必相同
SQL UNION 语法1
SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2;
注释:默认情况下,UNION 运算符选择一个不同的值。如果允许重复值,请使用 UNION ALL。
SQL UNION 语法2
SELECT column_name(s) FROM table1 [WHERE condition] UNION SELECT column_name(s) FROM table2 [WHERE condition];
给定的条件可以是基于您的需求的任何给定表达式。
SQL UNION ALL 语法1
UNION All运算符用于组合两个SELECT语句(包括重复行)的结果。
适用于UNION子句的相同规则将适用于UNION All操作符。
SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2;
注释:UNION结果集中的列名总是等于UNION中第一个SELECT语句中的列名。
SQL UNION ALL 语法2
SELECT column_name(s) FROM table1 [WHERE condition] UNION ALL SELECT column_name(s) FROM table2 [WHERE condition];
SQL UNION与WHERE
以下SQL语句从“客户”和“供应商”中选择所有不同的德国城市(只有不同的值):
SELECT City, Country FROM Customers WHERE Country='Germany' UNION SELECT City, Country FROM Suppliers WHERE Country='Germany' ORDER BY City;
另一个UNION示例:以下SQL语句列出了所有客户和供应商:
SELECT 'Customer' As Type, ContactName, City, Country FROM Customers UNION SELECT 'Supplier', ContactName, City, Country FROM Suppliers;
还有另外两个子句(即运算符),它们类似于UNION子句:
SQL INTERSECT子句 用于组合两个SELECT语句,但只返回与第二个SELECT语句中的一行相同的第一个SELECT语句中的行。
SQL EXCEPT子句 用于组合两个SELECT语句,并返回第一个SELECT语句中没有由第二个SELECT语句返回的行。
使用 SQL,您可以将信息从一个表中复制到另一个表中。
SELECT INTO 语句从一个表中复制数据,然后将数据插入到另一个新表中。
SQL SELECT INTO 实例:
创建 Customers 的备份复件
SELECT * INTO CustomersBackup2013 FROM Customers;
请使用 IN 子句来复制表到另一个数据库中:
SELECT * INTO CustomersBackup2013 IN 'Backup.mdb' FROM Customers;
只复制一些列插入到新表中:
SELECT CustomerName, ContactName INTO CustomersBackup2013 FROM Customers;
只复制德国的客户插入到新表中:
SELECT * INTO CustomersBackup2013 FROM Customers WHERE Country='Germany';
复制多个表中的数据插入到新表中:
SELECT Customers.CustomerName, Orders.OrderID INTO CustomersOrderBackup2013 FROM Customers LEFT JOIN Orders ON Customers.CustomerID=Orders.CustomerID;
使用SQL,您可以将信息从一个表中复制到另一个表中。
INSERT INTO SELECT 语句从表中复制数据,并将数据插入现有的表中。目标表中的任何现有行都不会受到影响。
我们可以将所有列从一个表中复制到另一个已经存在的表中:
INSERT INTO table2 SELECT * FROM table1;
或者我们可以把想要的列复制到另一个现有的表中:
INSERT INTO table2 (column_name(s)) SELECT column_name(s) FROM table1;
把 "Suppliers" 一栏复制到 "Customers" 一栏:
INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers;
只将德国供应商的副本插入 "Customers" :
INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country='Germany';
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 table_name
DROP DATABASE 语句用于删除数据库。
DROP DATABASE database_name
只需要删除表中的数据,而不删除表本身,使用TRUNCATE TABLE语句:
TRUNCATE TABLE table_name
CREATE DATABASE 语句用于创建数据库。在RDBMS中,数据库名称始终应该是唯一的。
在创建任何数据库之前,请确保拥有管理权限。
CREATE DATABASE dbname;
下面的 SQL 语句创建一个名为 "my_db" 的数据库:
CREATE DATABASE my_db;
创建数据库后,可以在数据库列表中检查它。
SHOW DATABASES;
CREATE TABLE 语句用于创建数据库中的表。表由行和列组成,每个表都必须有个表名。
CREATE TABLE table_name ( column_name1 data_type(size), column_name2 data_type(size), column_name3 data_type(size), .... );
column_name 参数规定表中列的名称。
data_type 参数规定列的数据类型(例如 varchar、integer、decimal、date 等等)。
size 参数规定表中列的最大长度。
现在我们想要创建一个名为 "Persons" 的表,包含五列:PersonID、LastName、FirstName、Address 和 City。
我们使用下面的 CREATE TABLE 语句:
CREATE TABLE Persons ( PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) );
PersonID列数据类型为int,包含一个整数。
LastName、FirstName、Address和City列具有包含字符的varchar数据类型,这些字段的最大长度为255个字符。
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
在 "Persons" 表中添加一个名为 "DateOfBirth" 的列,使用下面的 SQL 语句:
ALTER TABLE Persons ADD DateOfBirth date
改变 "Persons" 表中 "DateOfBirth" 列的数据类型,使用下面的 SQL 语句:
我们使用下面的 SQL 语句:
ALTER TABLE Persons ALTER COLUMN DateOfBirth year
删除 "Person" 表中的 "DateOfBirth" 列,使用下面的 SQL 语句:
我们使用下面的 SQL 语句:
ALTER TABLE Persons DROP COLUMN DateOfBirth
自动增量(auto-increment)字段 , 在新记录插入表中时生成一个唯一的数字。
以下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')
MS SQL Server使用IDENTITY关键字执行自动增量( auto-increment )任务。
以下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) )
在上面的示例中,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"。
MS Access使用 AUTOINCREMENT 关键字执行自动增量( auto-increment )任务。
以下 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) )
默认情况下,AUTOINCREMENT的起始值为1,每个新记录递增 1。
提示:指定“ID”栏以10开头,并递增5,将自动递增( autoincrement )更改为自动递增(105)( AUTOINCREMENT(10,5))。
要在 "Persons" 表中插入新记录,我们不需要为"ID"栏指定值(自动添加唯一值):
INSERT INTO Persons (FirstName,LastName) VALUES ('Lars','Monsen')
上面的 SQL 语句在 "Persons" 表中插入一个新记录。“ID”栏将得到唯一值。"FirstName"栏设置为"Lars","LastName"栏设置为"Monsen"。
在 Oracle 中,代码有点复杂。
必须使用序列( sequence )对象(该对象生成数字序列)创建自动增量( auto-increment )字段。
使用以下CREATSEQUENT语法:
CREATE SEQUENCE seq_person MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10
上面的代码创建了一个名为seq_pean的序列( sequence) 对象,它以1开头,以1递增。此对象缓存10个值以提高性能。缓存选项指定要存储多少序列值以提高访问速度。
要在"Persons" 表中插入新记录,我们必须使用nextval函数,该函数从seq_hor序列检索下一个值:
INSERT INTO Persons (ID,FirstName,LastName) VALUES (seq_person.nextval,'Lars','Monsen')
上面的SQL语句在 "Persons" 表中插入一个新记录。"ID" 列从 seq_person 序列中分配下一个数字。"FirstName"栏设置为"Lars","LastName"栏设置为"Monsen"。
视图,一种可视化的虚拟表, 允许用户执行以下操作:
以用户或者某些类型的用户感觉自然或者直观的方式来组织数据;
限制对数据的访问,从而使得用户仅能够看到或者修改(某些情况下)他们需要的数据;
从多个表中汇总数据,以产生报表。
视图可以包含表中的所有列,或者仅包含选定的列。视图可以创建自一个或者多个表,这取决于创建该视图的 SQL 语句的写法。
在 SQL 中,视图是基于 SQL 语句的结果集的可视化表。
数据库视图由 CREATE VIEW 语句创建。视图可以创建自单个表、多个表或者其他视图。
视图中的字段是一个或多个数据库中真实表中的字段。
在使用时视图可以被视为一个“虚拟表”。
要创建视图的话,用户必须有适当的系统权限。具体需要何种权限随数据库系统实现的不同而不同。
CREATE VIEW 语句的基本语法如下所示:
CREATE VIEW view_name AS SELECT column1, column2..... FROM table_name WHERE [condition];
和普通的 SQL SELECT 查询一样,可以在上面的 SELECT 语句中包含多个数据表。
注释:视图总是显示最新数据!每当用户查询视图时,数据库引擎就使用视图的 SQL 语句重新构建数据。
1.1、SQL CREATE VIEW 语法
CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
1.2、SQL CREATE VIEW 实例
"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 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 OR REPLACE VIEW [Current Product List] AS SELECT ProductID,ProductName,Category FROM Products WHERE Discontinued=No
可以通过 DROP VIEW 命令来删除视图,SQL DROP VIEW 语法
DROP VIEW view_name
WITH CHECK OPTION 是 CREATE VIEW 语句的一个可选项。
WITH CHECK OPTION 用于保证所有的 UPDATE 和 INSERT 语句都满足视图定义中的条件。
如果不能满足这些条件,UPDATE 或 INSERT 就会返回错误。
下面的例子创建的也是 CUSTOMERS_VIEW 视图,不过这次 WITH CHECK OPTION 是打开的:
CREATE VIEW CUSTOMERS_VIEW AS SELECT name, age FROM CUSTOMERS WHERE age IS NOT NULL WITH CHECK OPTION;
这里 WITH CHECK OPTION 使得视图拒绝任何 AGE 字段为 NULL 的条目,因为视图的定义中,AGE 字段不能为空。
下表列出了 MySQL 中最重要的内置日期函数:
函数 | 描述 |
---|---|
NOW() | 返回当前的日期和时间 |
CURDATE() | 返回当前的日期 |
CURTIME() | 返回当前的时间 |
DATE() | 提取日期或日期/时间表达式的日期部分 |
EXTRACT() | 返回日期/时间的单独部分 |
DATE_ADD() | 向日期添加指定的时间间隔 |
DATE_SUB() | 从日期减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的天数 |
DATE_FORMAT() | 用不同的格式显示日期/时间 |
下表列出了SQL 服务器中最重要的内置日期函数:
函数 | 描述 |
---|---|
GETDATE() | 返回当前的日期和时间 |
DATEPART() | 返回日期/时间的单独部分 |
DATEADD() | 在日期中添加或减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的时间 |
CONVERT() | 用不同的格式显示日期/时间 |
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 - 格式:唯一的数字