【SQL高级】,不得不掌握的SQL语句,SQLserver MySQL

一、SQL SELECT TOP, LIMIT, ROWNUM 子句

SELECT TOP 子句用于指定要返回的记录数量。

SELECT TOP子句在包含数千条记录的大型表上很有用。返回大量记录会影响性能。

注:并不是所有的数据库系统都支持SELECT TOP子句。MySQL支持LIMIT子句来选择有限数量的记录,而Oracle使用ROWNUM。

1、SQL Server / MS Access 语法

SELECT TOP number|percent column_name(s)
FROM table_name
WHERE condition;

2、MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的

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;

3、SQL SELECT TOP 实例

以下SQL语句从"Customers" 表中选择前两条记录:

SELECT TOP 2 * FROM Customers;

4、SQL SELECT TOP PERCENT 实例

以下SQL语句从 "Customers" 表中选择前50%的记录:

SELECT TOP 50 PERCENT * FROM Customers;

5、SQL TOP,LIMIT和ROWNUM示例

以下SQL语句从"Customers"表中选择前三个记录:

SELECT TOP 3 * FROM Customers;

 以下SQL语句显示了使用LIMIT子句的等效示例:

SELECT * FROM Customers LIMIT 3;

 以下SQL语句显示了使用ROWNUM的等效示例:

SELECT * FROM Customers WHERE ROWNUM <= 3;

6、SQL TOP PERCENT示例

以下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;

二、SQL LIKE 运算符

在WHERE子句中使用LIKE运算符来搜索列中的指定模式。

 有两个通配符与LIKE运算符一起使用:

  • - 百分号表示零个,一个或多个字符

  • _ - 下划线表示单个字符

 注意: MS Access使用问号(?)而不是下划线(_)。百分号和下划线也可以组合使用!

1、SQL LIKE 语法

SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;

 提示:可以使用AND或OR运算符组合任意数量的条件。

2、SQL LIKE 运算符实例

 以下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 Wildcards 通配符

 通配符用于替换字符串中的任何其他字符。

 通配符与 SQL LIKE运算符一起使用。在 WHERE 子句中使用LIKE运算符来搜索列中的指定模式。

 有两个通配符与 LIKE 运算符一起使用:

  • - 百分号表示零个,一个或多个字符

  • _ - 下划线表示单个字符

 注意:

  • MS Access 使用星号(*)通配符而不是百分比符号(%)通配符。

  • MS Access 使用问号(?)而不是下划线(_)。

 在MS Access和SQL Server中,你也可以使用:

  • [ charlist ] - 定义要匹配的字符的集合和范围

  • [^ charlist ]或[!charlist ] - 定义不匹配字符的集合和范围

1、使用 SQL [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]%';

2、使用[!charlist]通配符

以下两个 SQL 语句选择所有客户的城市不以“b”,“s”或“p”开头:

SELECT * FROM Customers
WHERE City LIKE '[!bsp]%';

要么:

SELECT * FROM Customers
WHERE City NOT LIKE '[bsp]%';

四、SQL BETWEEN运算符

 BETWEEN运算符用于选取介于两个值之间的数据范围内的值。值可以是数字,文本或日期。

 BETWEEN运算符是包含性的:包括开始和结束值,且开始值需小于结束值。

1、SQL 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;

2、带有 IN 的 BETWEEN 操作符实例

 以下SQL语句选择价格在10到20之间但CategoryID不是1、2或3的所有产品

SELECT * FROM Products        
WHERE (Price BETWEEN 10 AND 20)        
AND NOT CategoryID IN (1,2,3);        

3、带有文本值的 BETWEEN 操作符实例

 以下SQL语句选择所有带有ProductName BETWEEN'Carnarvon Tigers'和'Mozzarella di Giovanni'的产品:

SELECT * FROM Products        
WHERE ProductName BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni'       
ORDER BY ProductName;      

4、带有文本值的 NOT BETWEEN 操作符实例

 以下SQL语句选择ProductName不是BETWEEN'Carnarvon Tigers'和'Mozzarella di Giovanni'的所有产品:

SELECT * FROM Products        
WHERE ProductName NOT BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni' 
ORDER BY ProductName;  

5、带有日期值的 BETWEEN 操作符实例

 以下 SQL 语句选取 OrderDate 介于 '04-July-1996' 和 '09-July-1996' 之间的所有订单:

SELECT * FROM Orders        
WHERE OrderDate BETWEEN #07/04/1996# AND #07/09/1996#;        

6、注意:

在不同的数据库中,BETWEEN 操作符会产生不同的结果! 有的选取介于两个值之间但不包括两个测试值的字段。有的选取介于两个值之间且包括两个测试值的字段;有的选取介于两个值之间且包括第一个测试值但不包括最后一个测试值的字段。

五、SQL通用数据类型

数据类型定义了存储在列中的值的类型。

 数据库表中的每一列都需要有一个名称和数据类型。

 SQL 开发人员必须在创建 SQL 表时决定表中的每个列将要存储的数据的类型。数据类型是一个标签,是便于 SQL 了解每个列期望存储什么类型的数据的指南,它也标识了 SQL 如何与存储的数据进行交互。

1、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 数据

2、SQL 数据类型快速参考手册

不同的数据库为数据类型定义提供了不同的选择。下表显示了不同数据库平台上某些数据类型的通用名称:

数据类型AccessSQLServerOracleMySQLPostgreSQL
booleanYes/NoBitByteN/ABoolean
integerNumber (integer)IntNumberInt IntegerInt Integer
floatNumber (single)Float RealNumberFloatNumeric
currencyCurrencyMoneyN/AN/AMoney
string (fixed)N/ACharCharCharChar
string (variable)Text (<256) Memo (65k+)VarcharVarchar Varchar2VarcharVarchar
binary objectOLE Object MemoBinary (fixed up to 8K) Varbinary (<8K) Image (<2GB)Long RawBlob TextBinary Varbinary

六、SQL 语句快速参考

SQL 语句语法
AND / ORSELECT column_name(s) FROM table_name WHERE condition AND|OR condition
ALTER TABLEALTER 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
BETWEENSELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
CREATE DATABASECREATE DATABASE database_name
CREATE TABLECREATE TABLE table_name ( column_name1 data_type, column_name2 data_type, column_name2 data_type, ... )
CREATE INDEXCREATE INDEX index_name ON table_name (column_name) CREATE UNIQUE INDEX index_name ON table_name (column_name)
CREATE VIEWCREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
DELETEDELETE 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 DATABASEDROP DATABASE database_name
DROP INDEXDROP 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 TABLEDROP TABLE table_name
GROUP BYSELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name
HAVINGSELECT 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
INSELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,..)
INSERT INTOINSERT INTO table_name VALUES (value1, value2, value3,....) INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,....)
INNER JOINSELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name
LEFT JOINSELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
RIGHT JOINSELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
FULL JOINSELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name
LIKESELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
ORDER BYSELECT column_name(s) FROM table_name ORDER BY column_name [ASC|DESC]
SELECTSELECT column_name(s) FROM table_name
SELECT *SELECT * FROM table_name
SELECT DISTINCTSELECT DISTINCT column_name(s) FROM table_name
SELECT INTOSELECT * 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 TOPSELECT TOP number|percent column_name(s) FROM table_name
TRUNCATE TABLETRUNCATE TABLE table_name
UNIONSELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2
UNION ALLSELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2
UPDATEUPDATE table_name SET column1=value, column2=value,... WHERE some_column=some_value
WHERESELECT column_name(s) FROM table_name WHERE column_name operator value

七、JOIN连接

SQL join 用于把来自两个或多个表的行结合起来。

1、SQL JOIN

 SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。

 简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。

2、不同的 SQL JOIN

不同的 SQL JOIN 类型:

  • INNER JOIN:如果表中有至少一个匹配,则返回行

  • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行

  • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行

  • FULL JOIN:只要其中一个表中存在匹配,则返回行

  • SELF JOIN:用于将表连接到自己,就好像该表是两个表一样,临时重命名了SQL语句中的至少一个表

  • CARTESIAN JOIN:从两个或多个连接表返回记录集的笛卡儿积

3、INNER 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);

4、LEFT JOIN(左连接)

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)中没有匹配。

5、RIGHT JOIN(右连接)

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。

6、FULL 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"中的匹配项,那么这些行也会列出。

7、Self JOIN(自连接)

自联接是一种常规联接,但表本身是连接的。

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 运算符

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语句返回的行。

九、SELECT INTO 语句

 使用 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;

十、INSERT INTO SELECT 语句

 使用SQL,您可以将信息从一个表中复制到另一个表中。

 INSERT INTO SELECT 语句从表中复制数据,并将数据插入现有的表中。目标表中的任何现有行都不会受到影响。

1、SQL INSERT INTO SELECT 语法

 我们可以将所有列从一个表中复制到另一个已经存在的表中:

INSERT INTO table2              
SELECT * FROM table1;    

 或者我们可以把想要的列复制到另一个现有的表中:

INSERT INTO table2               
(column_name(s))              
SELECT column_name(s)             
FROM table1;   

2、SQL INSERT INTO SELECT 实例

 把 "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';

十一、撤销索引、撤销表以及撤销数据库

1、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      

2、DROP TABLE 语句

 DROP TABLE 语句用于删除表。

DROP TABLE table_name      

3、DROP DATABASE 语句

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

DROP DATABASE database_name    

4、TRUNCATE TABLE 语句

只需要删除表中的数据,而不删除表本身,使用TRUNCATE TABLE语句:

TRUNCATE TABLE table_name   

十二、CREATE DATABASE 语句

CREATE DATABASE 语句用于创建数据库。在RDBMS中,数据库名称始终应该是唯一的。

在创建任何数据库之前,请确保拥有管理权限。

1、SQL CREATE DATABASE 语法

CREATE DATABASE dbname;

2、SQL CREATE DATABASE 实例

 下面的 SQL 语句创建一个名为 "my_db" 的数据库:

CREATE DATABASE my_db;

 创建数据库后,可以在数据库列表中检查它。

SHOW DATABASES;

十三、CREATE TABLE 语句

 CREATE TABLE 语句用于创建数据库中的表。表由行和列组成,每个表都必须有个表名。

1、SQL 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 参数规定表中列的最大长度。

2、SQL CREATE TABLE 实例

 现在我们想要创建一个名为 "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 语句用于在现有表中添加、删除或修改列。

1、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        

2、SQL ALTER TABLE 实例

在 "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 字段

自动增量(auto-increment)字段 , 在新记录插入表中时生成一个唯一的数字。

1、用于 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')        

2、用于 SQL Server 的语法

 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"。

3、用于 Access 的语法

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"。

4、语法 for Oracle

 在 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"。

十六、CREATE VIEW、REPLACE VIEW、 DROP VIEW 语句

视图,一种可视化的虚拟表, 允许用户执行以下操作:

  • 以用户或者某些类型的用户感觉自然或者直观的方式来组织数据;

  • 限制对数据的访问,从而使得用户仅能够看到或者修改(某些情况下)他们需要的数据;

  • 从多个表中汇总数据,以产生报表。

视图可以包含表中的所有列,或者仅包含选定的列。视图可以创建自一个或者多个表,这取决于创建该视图的 SQL 语句的写法。

1、CREATE VIEW 语句

在 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'        

2、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 OR REPLACE VIEW [Current Product List] AS                
SELECT ProductID,ProductName,Category                
FROM Products                
WHERE Discontinued=No        

3、SQL 撤销视图

可以通过 DROP VIEW 命令来删除视图,SQL DROP VIEW 语法

DROP VIEW view_name     

4、WITH CHECK OPTION

 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 字段不能为空。

十七、SQL Server 和 MySQL 中的 Date 函数

1、MySQL Date 函数

 下表列出了 MySQL 中最重要的内置日期函数:

函数描述
NOW()返回当前的日期和时间
CURDATE()返回当前的日期
CURTIME()返回当前的时间
DATE()提取日期或日期/时间表达式的日期部分
EXTRACT()返回日期/时间的单独部分
DATE_ADD()向日期添加指定的时间间隔
DATE_SUB()从日期减去指定的时间间隔
DATEDIFF()返回两个日期之间的天数
DATE_FORMAT()用不同的格式显示日期/时间

2、SQL Server Date 函数

 下表列出了SQL 服务器中最重要的内置日期函数:

函数描述
GETDATE()返回当前的日期和时间
DATEPART()返回日期/时间的单独部分
DATEADD()在日期中添加或减去指定的时间间隔
DATEDIFF()返回两个日期之间的时间
CONVERT()用不同的格式显示日期/时间

3、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 - 格式:唯一的数字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值