作为一名程序员数据库有多重要我就不多说了,操作数据库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版)》。如有错误,欢迎留言指正。