作为一名程序员数据库有多重要我就不多说了,操作数据库SQL语句是必不可少的。这里总结一下常用的SQL语句,以备不时之需。

一、检索数据

1、检索单个列

SELECT prod_name FROM Products;

该语句利用 SELECT 语句从 Products 表中检索一个名为 prod_name的列。所需的列名写在 SELECT 关键字之后,FROM 关键字指出从哪个表中检索数据。

 2、检索多个列

要想从一个表中检索多个列,仍然使用相同的 SELECT 语句。唯一的不同是必须在 SELECT 关键字后给出多个列名,列名之间必须以逗号分隔。在选择多个列时,一定要在列名之间加上逗号,但最后一个列名后不加。如果在最后一个列名后加了逗号,将出现错误。

SELECT prod_id, prod_name, prod_price FROM Products;

3、检索所有列

SELECT * FROM Products;

4、检索不同的值

SELECT DISTINCT vend_id FROM Products;

SELECT DISTINCT vend_id 告诉 DBMS 只返回不同(具有唯一性)的vend_id 行(如果此列多行数据一样,则只返回一行)。如果使用 DISTINCT 关键字,它必须直接放在列名的前面。

注意:不能部分使用 DISTINCT

DISTINCT 关键字作用于所有的列,不仅仅是跟在其后的那一列。例如,你指定 SELECT DISTINCT vend_id, prod_price,除非指定的两列完全相同,否则所有的行都会被检索出来。

5、限制结果

 各种数据库中的这一 SQL 实现并不相同。

(1)在 SQL Server 和 Access 中使用 SELECT 时,可以使用 TOP 关键字来限制最多返回多少行。

SELECT TOP 5 prod_name FROM Products;

上面代码使用 SELECT TOP 5 语句,只检索前 5 行数据。

(2)如果你使用的是 DB2,很可能习惯使用下面这一 DBMS 特定的 SQL 语句。

SELECT prod_name FROM Products FETCH FIRST 5 ROWS ONLY;

(3)如果你使用 Oracle,需要基于 ROWNUM(行计数器)来计算行。

SELECT prod_name FROM Products WHERE ROWNUM <=5;

(4)如果你使用 MySQL、MariaDB、PostgreSQL 或者 SQLite,需要使用 LIMIT子句。

SELECT prod_name FROM Products LIMIT 5;

上述代码使用SELECT语句来检索单独的一列数据。LIMIT 5指示MySQL等 DBMS 返回不超过 5 行的数据。

为了得到后面的 5 行数据,需要指定从哪儿开始以及检索的行数,像下面这样。

SELECT prod_name FROM Products LIMIT 5 OFFSET 5;

LIMIT 5 OFFSET 5 指示 MySQL 等 DBMS 返回从第 5 行起的 5 行数据。第一个数字是指从哪儿开始,第二个数字是检索的行数。

注意:第一个被检索的行是第 0 行,而不是第 1 行。因此,LIMIT 1 OFFSET1 会检索第 2 行,而不是第 1 行。

6、注释

SELECT prod_name -- 这是一条注释 FROM Products;

注释使用-- (两个连字符)嵌在行内。-- 之后的文本就是注释;

下面是另一种形式的行内注释(虽然这种形式很少得到支持);

# 这是一条注释
SELECT prod_name FROM Products;

在一行的开始处使用#,这一整行都将作为注释。

/* SELECT prod_name, vend_id 
FROM Products; */ 
SELECT prod_name 
FROM Products;

注释从/*开始,到*/结束,/*和*/之间的任何内容都是注释。这种方式常用于给代码加注释。

二、插入数据

1、插入完整的行

INSERT INTO Customers(cust_id, 
 cust_name, 
 cust_address, 
 cust_city, 
 cust_state, 
 cust_zip, 
 cust_country, 
 cust_contact, 
 cust_email) 
VALUES('1000000006', 
 'Toy Land', 
 '123 Any Street', 
 'New York', 
 'NY', 
 '11111', 
 'USA', 
 NULL, 
 NULL);

在插入行时,DBMS 将用 VALUES 列表中的相应值填入列表中的对应项。VALUES 中的第一个值对应于第一个指定列名,第二个值对应于第二个列名,如此等等。

2、插入部分行

INSERT INTO Customers(cust_id, 
 cust_name, 
 cust_address, 
 cust_city, 
 cust_state, 
 cust_zip, 
 cust_country) 
VALUES('1000000006', 
 'Toy Land', 
 '123 Any Street', 
 'New York', 
 'NY', 
 '11111', 
 'USA');

在上面的例子中,没有给 cust_contact 和 cust_email 这两列提供值。这表示没必要在 INSERT 语句中包含它们。因此,这里的 INSERT语句省略了这两列及其对应的值。

注意:如果表的定义允许,则可以在 INSERT 操作中省略某些列。省略的列必须满足以下某个条件。

 (1)该列定义为允许 NULL 值(无值或空值)。

(2)在表定义中给出默认值。这表示如果不给出值,将使用默认值。

3、插入检索出的数据

INSERT INTO Customers(cust_id, 
 cust_contact, 
 cust_email, 
 cust_name, 
 cust_address, 
 cust_city, 
 cust_state, 
 cust_zip, 
 cust_country) 
SELECT cust_id, 
 cust_contact, 
 cust_email, 
 cust_name, 
 cust_address, 
 cust_city, 
 cust_state, 
 cust_zip, 
 cust_country 
FROM CustNew;

这个例子使用 INSERT SELECT 从 CustNew 中将所有数据导入Customers。SELECT 语句从 CustNew 检索出要插入的值,而不是列出它们。SELECT 中列出的每一列对应于 Customers 表名后所跟的每一列。这条语句将插入多少行呢?这依赖于 CustNew 表有多少行。如果这个表为空,则没有行被插入(也不产生错误,因为操作仍然是合法的)。如果这个表确实有数据,则所有数据将被插入到 Customers。

4、从一个表复制到另一个表

SELECT * 
INTO CustCopy 
FROM Customers;

这条 SELECT 语句创建一个名为 CustCopy 的新表,并把 Customers 表的整个内容复制到新表中。因为这里使用的是 SELECT *,所以将在CustCopy 表中创建(并填充)与 Customers 表的每一列相同的列。要想只复制部分的列,可以明确给出列名,而不是使用*通配符。

MariaDB、MySQL、Oracle、PostgreSQL 和 SQLite 使用的语法稍有不同:

CREATE TABLE CustCopy AS 
SELECT * FROM Customers;

三、更新数据

1、更新表中的特定行(只更新一列);

UPDATE Customers 
SET cust_email = 'kim@thetoystore.com' 
WHERE cust_id = '1000000005';

UPDATE 语句总是以要更新的表名开始。在这个例子中,要更新的表名为Customers。SET 命令用来将新值赋给被更新的列。在这里,SET 子句设置 cust_email 列为指定的值:SET cust_email = 'kim@thetoystore.com'。UPDATE 语句以 WHERE 子句结束,它告诉 DBMS 更新哪一行。没有 WHERE子句,DBMS 将会用这个电子邮件地址更新 Customers 表中的所有行。

2、更新表中的特定行(更新多列);

UPDATE Customers 
SET cust_contact = 'Sam Roberts', 
 cust_email = 'sam@toyland.com' 
WHERE cust_id = '1000000006';

四:删除数据

DELETE FROM Customers 
WHERE cust_id = '1000000006';

DELETE FROM 要求指定从中删除数据的表名,WHERE 子句过滤要删除的行。在这个例子中,只删除顾客 1000000006。如果省略 WHERE 子句,它将删除表中每个顾客。

五:创建和操纵表

1、创建表

CREATE TABLE Products 
( 
 prod_id CHAR(10) NOT NULL, 
 vend_id CHAR(10) NOT NULL, 
 prod_name CHAR(254) NOT NULL, 
 prod_price DECIMAL(8,2) NOT NULL, 
 prod_desc VARCHAR(1000) NULL 
);

从上面的例子可以看到,表名紧跟 CREATE TABLE 关键字。实际的表定义(所有列)括在圆括号之中,各列之间用逗号分隔。这个表由 5 列组成。每列的定义以列名(它在表中必须是唯一的)开始,后跟列的数据类型。整条语句以圆括号后的分号结束。

下面SQL语句是指定默认值:

CREATE TABLE OrderItems 
( 
 order_num INTEGER NOT NULL, 
 order_item INTEGER NOT NULL, 
 prod_id CHAR(10) NOT NULL, 
 quantity INTEGER NOT NULL DEFAULT 1, 
 item_price DECIMAL(8,2) NOT NULL 
);

NULL 值就是没有值或缺值。允许 NULL 值的列也允许在插入行时不给出该列的值。不允许 NULL 值的列不接受没有列值的行,换句话说,在插入或更新行时,该列必须有值。

每个表列要么是 NULL 列,要么是 NOT NULL 列,这种状态在创建时由表的定义规定。

CREATE TABLE Vendors 
( 
 vend_id CHAR(10) NOT NULL, 
 vend_name CHAR(50) NOT NULL, 
 vend_address CHAR(50) , 
 vend_city CHAR(50) , 
 vend_state CHAR(5) , 
 vend_zip CHAR(10) , 
 vend_country CHAR(50) 
);

这条语句创建本书中使用的 Vendors 表。供应商 ID 和供应商名字列是必需的,因此指定为 NOT NULL。其余五列全都允许 NULL 值,所以不指定 NOTNULL。NULL 为默认设置,如果不指定 NOT NULL,就认为指定的是 NULL。

2、更新表

ALTER TABLE Vendors 
ADD vend_phone CHAR(20);

这条语句给 Vendors 表增加一个名为 vend_phone 的列,其数据类型为 CHAR。

ALTER TABLE Vendors 
DROP COLUMN vend_phone;

3、删除表

DROP TABLE CustCopy;

总结:

先总结这么多,我也不是专门搞数据库的,总结这些平常应该够用了,以后遇到更复杂的再总结。这些代码都是看的书上的《SQL必知必会(第4版)》。如有错误,欢迎留言指正。