一、数据的插入(INSERT语句的使用方法)
1、什么是INSERT
首先通过CREATE TABLE语句创建表,但创建的表中没有数据;再通过INSERT语句向表中插入数据。
sql">--创建表ProductIns
CREATE TABLE ProductIns
(product_id CHAR(4) NOT NULL,product_name VARCHAR(100) NOT NULL,product_type VARCHAR(32) NOT NULL,sale_price INTEGER DEFAULT 0,purchase_price INTEGER ,regist_date DATE ,PRIMARY KEY (product_id));
2、INSERT语句的基本语法
INSERT INTO <表名> (列1,列2,列3,……) VALUES (值1,值2,值3,……);
sql">INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0001', 'T恤衫' ,'衣服', 1000, 500, '2009-09-20');
列清单为(列1,列2,列3,……);
值清单为(值1,值2,值3,……)。
列清单与值清单的列数必须保持一致, 通常执行一次INSERT语句会插入一行数据;但也就二将多条VALUE子句通过都好进行分隔排列。
sql">-- 多行INSERT(Oracle除外)
INSERT INTO ProductIns VALUES ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11'),('0003', '运动T恤', '衣服', 4000, 2800, NULL),('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');
3、列清单的省略
sql">-- 包含列清单
INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');-- 省略列清单
INSERT INTO ProductIns VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
4、插入NULL
sql">INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20');
5、插入默认值
通过显性的方式插入默认值
sql">INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0007', '擦菜板', '厨房用具', DEFAULT, 790, '2009-04-28');
sql">postgres=# SELECT * FROM ProductIns WHERE product_id = '0007';product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------0007 | 擦菜板 | 厨房用具 | 0 | 790 | 2009-04-28
通过隐性的方式插入默认值
sql">-- 可通过对sale_price列和值的省略设定默认值
INSERT INTO ProductIns (product_id, product_name, product_type, purchase_price, regist_date) VALUES ('0007', '擦菜板', '厨房用具', 790, '2009-04-28');
若未设定默认值,则自动设定为NULL;但遇到该列设定为NOT NULL则会报错。
6、从其他表中复制数据
sql">-- 用来插入数据的商品复制表
CREATE TABLE ProductCopy
(product_id CHAR(4) NOT NULL,product_name VARCHAR(100) NOT NULL,product_type VARCHAR(32) NOT NULL,sale_price INTEGER ,purchase_price INTEGER ,regist_date DATE ,PRIMARY KEY (product_id));
sql">-- 将商品表中的数据复制到商品复制表中
INSERT INTO ProductCopy (product_id, product_name, product_type, sale_price, purchase_price, regist_date)
SELECT product_id, product_name, product_type, sale_price, purchase_price, regist_dateFROM Product;-- 打印商品复制表
SELECT * FROM ProductCopy;
sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------0001 | T恤 | 衣服 | 1000 | 500 | 2009-09-200002 | 打孔器 | 办公用品 | 500 | 320 | 2009-09-110003 | 运动T恤 | 衣服 | 4000 | 2800 |0004 | 菜刀 | 厨房用具 | 3000 | 2800 | 2009-09-200005 | 高压锅 | 厨房用具 | 6800 | 5000 | 2009-01-150006 | 叉子 | 厨房用具 | 500 | | 2009-09-200007 | 擦菜板 | 厨房用具 | 880 | 790 | 2008-04-280008 | 圆珠笔 | 办公用品 | 100 | | 2009-11-11
多种多样的SELECT语句
sql">-- 根据商品种类进行汇总的表
CREATE TABLE ProductType
(product_type VARCHAR(32) NOT NULL,sum_sale_price INTEGER ,sum_purchase_price INTEGER ,PRIMARY KEY (product_type));
sql">INSERT INTO ProductType (product_type, sum_sale_price, sum_purchase_price)
SELECT product_type, SUM(sale_price), SUM(purchase_price)FROM ProductGROUP BY product_type;-- 确认插入的数据行
SELECT * FROM ProductType;
sql"> product_type | sum_sale_price | sum_purchase_price
--------------+----------------+--------------------衣服 | 5000 | 3300办公用品 | 600 | 320厨房用具 | 11180 | 8590
二、数据的删除(DELETE语句的使用方法)
1、DROP TABLE语句和DELETE语句
DROP TABLE 语句 可以将表完全删除;
DELETE 语句 会留下表(容器),而删除表中的全部数据。
2、DELETE语句的基本语法
sql">DELETE FROM Product;
sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
3、指定删除对象的DELETE语句(搜索型DELETE)
DELETE FROM <表名>
WHERE <条件>;
sql">DELETE FROM ProductWHERE sale_price >= 4000;-- 确认删除后的结果
SELECT * FROM Product;
删之前的数据:
sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------0001 | T恤 | 衣服 | 1000 | 500 | 2009-09-200002 | 打孔器 | 办公用品 | 500 | 320 | 2009-09-110003 | 运动T恤 | 衣服 | 4000 | 2800 |0004 | 菜刀 | 厨房用具 | 3000 | 2800 | 2009-09-200005 | 高压锅 | 厨房用具 | 6800 | 5000 | 2009-01-150006 | 叉子 | 厨房用具 | 500 | | 2009-09-200007 | 擦菜板 | 厨房用具 | 880 | 790 | 2008-04-280008 | 圆珠笔 | 办公用品 | 100 | | 2009-11-11
删之后的数据:
sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------0001 | T恤 | 衣服 | 1000 | 500 | 2009-09-200002 | 打孔器 | 办公用品 | 500 | 320 | 2009-09-110004 | 菜刀 | 厨房用具 | 3000 | 2800 | 2009-09-200006 | 叉子 | 厨房用具 | 500 | | 2009-09-200007 | 擦菜板 | 厨房用具 | 880 | 790 | 2008-04-280008 | 圆珠笔 | 办公用品 | 100 | | 2009-11-11
(6 行记录)
三、数据的更新(UPDATE语句的使用方法)
1、UPDATE语句的基本语法
UPDATE <表名>
SET <列名>=<表达式>;
sql">-- 将登记的数据更新为"2009-10-10"
UPDATE ProductSET regist_date = '2009-10-10';-- 确认更新的数据
SELECT * FROM Product ORDER BY product_id;
sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------0001 | T恤 | 衣服 | 1000 | 500 | 2009-10-100002 | 打孔器 | 办公用品 | 500 | 320 | 2009-10-100004 | 菜刀 | 厨房用具 | 3000 | 2800 | 2009-10-100006 | 叉子 | 厨房用具 | 500 | | 2009-10-100007 | 擦菜板 | 厨房用具 | 880 | 790 | 2009-10-100008 | 圆珠笔 | 办公用品 | 100 | | 2009-10-10
2、指定条件的UPDATE语句(搜索型UPDATE)
UPDATE <表名>
SET <列名>=<表达式>
WHERE <条件>;
sql">-- 将商品种类为厨房用具的记录的销售单价更新为原来的10倍
UPDATE ProductSET sale_price = sale_price * 10WHERE product_type = '厨房用具';-- 确认更新内容
SELECT * FROM Product ORDER BY product_id;
sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------0001 | T恤 | 衣服 | 1000 | 500 | 2009-10-100002 | 打孔器 | 办公用品 | 500 | 320 | 2009-10-100004 | 菜刀 | 厨房用具 | 30000 | 2800 | 2009-10-100006 | 叉子 | 厨房用具 | 5000 | | 2009-10-100007 | 擦菜板 | 厨房用具 | 8800 | 790 | 2009-10-100008 | 圆珠笔 | 办公用品 | 100 | | 2009-10-10
3、使用NULL进行更新
sql">-- 将商品编号为0008的数据(圆珠笔)的登记日期更新为NULL
UPDATE ProductSET regist_date = NULLWHERE product_id = '0008';-- 确认更新的内容
SELECT * FROM Product ORDER BY product_id;
sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------0001 | T恤 | 衣服 | 1000 | 500 | 2009-10-100002 | 打孔器 | 办公用品 | 500 | 320 | 2009-10-100004 | 菜刀 | 厨房用具 | 30000 | 2800 | 2009-10-100006 | 叉子 | 厨房用具 | 5000 | | 2009-10-100007 | 擦菜板 | 厨房用具 | 8800 | 790 | 2009-10-100008 | 圆珠笔 | 办公用品 | 100 | |
4、多列更新
下列三种更新方式都可以达到一个目标
sql">-- 能够正确执行的繁琐的UPDATE语句
UPDATE ProductSET sale_price = sale_price * 10WHERE product_type = '厨房用具';UPDATE ProductSET purchase_price = purchase_price / 2WHERE product_type = '厨房用具';-- 确认更新的内容
SELECT * FROM Product ORDER BY product_id;
sql">-- 使用逗号对列进行分隔排列
UPDATE ProductSET sale_price = sale_price * 10,purchase_price = purchase_price / 2WHERE product_type = '厨房用具';-- 确认更新的内容
SELECT * FROM Product ORDER BY product_id;
sql">-- 将引用()括起来
UPDATE ProductSET (sale_price, purchase_price) = (sale_price * 10, purchase_price / 2)WHERE product_type = '厨房用具';-- 确认更新内容
SELECT * FROM Product ORDER BY product_id;
sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------0001 | T恤 | 衣服 | 1000 | 500 | 2009-10-100002 | 打孔器 | 办公用品 | 500 | 320 | 2009-10-100004 | 菜刀 | 厨房用具 | 300000 | 1400 | 2009-10-100006 | 叉子 | 厨房用具 | 50000 | | 2009-10-100007 | 擦菜板 | 厨房用具 | 88000 | 395 | 2009-10-100008 | 圆珠笔 | 办公用品 | 100 | |
四、事务
1、什么是事务
事务就是需要再同一个处理单元中执行的一系列更新处理的集合。
2、创建事务
事务开始语句;
DML语句1;
DML语句2;
DML语句3;
……
事务结束语句(COMMIT或者ROLLBACK);
sql">--SQL Server, PostgreSQL
BEGIN TRANSACTION;-- 将运动T恤的销售单价降低1000日元UPDATE ProductSET sale_price = sale_price - 1000WHERE product_name = 'T恤';-- 将T恤衫的销售单价上浮1000日元UPDATE ProductSET sale_price = sale_price + 1000WHERE product_name = 'T恤';COMMIT;SELECT *FROM ProductORDER BY product_id;
COMMIT——提交处理
ROLLBACK——取消处理
3、ACID特性
1、原子性 包含的事务或全部执行或全部不执行;
2、一致性 事务中处理要满足数据库提前设置的约束;
3、隔离性 确保不同事务之间湖北干扰;
4、持久性 在事务结束后,DBMS能够保证该时间点的数据状态会被保存的特性。