4.1 INSERT
4.1 INSERT插入一行数据:
INSERT INTO ProductIns(product_id,product_name,product_type,sale_price,purchase_price,regist_date) VALUES('0001','T恤衫','衣服',1000,500,'2009-09-20');
INSERT 0 1
4.3 全列插入时,列清单可以省略
postgres=# INSERT INTO ProductIns VALUES('0004','菜刀','厨房用具',3000,2800,'2009-09-20');
INSERT 0 1
4.6显式插入默认值:
postgres=# INSERT INTO ProductIns VALUES('0007','擦菜板','厨房用具',DEFAULT,790,'2009-04-28');
4.7隐式插入默认值,省略插入默认值的那一列。
INSERT INTO ProductIns (product_id,product_name,product_type,purchase_price,regist_date) VALUES('0007','擦菜板','厨房用具',790,'2009-04-28');
注意:省略了没有设定默认值的列,就会设置为NULL,如果是NOT NULL类型,就会报错。
4.10将一个表的内容复制到另一个表
postgres=# INSERT INTO ProductCopy (product_id,product_name,product_type,sale_price,purchase_price,regist_date)
postgres-# SELECT product_id,product_name,product_type,sale_price,purchase_price,regist_date
postgres-# FROM Product;
INSERT 0 8
4.12插入部分数据并分组
postgres=# INSERT INTO ProductType(product_type,sum_sale_price,sum_purchase_price)
postgres-# SELECT product_type,SUM(sale_price),SUM(purchase_price)
postgres-# FROM product
postgres-# GROUP BY product_type;
INSERT 0 3
postgres=# SELECT * FROM ProductType;
product_type | sum_sale_price | sum_purchase_price
--------------+----------------+--------------------
衣服 | 5000 | 3300
办公用品 | 600 | 320
厨房用具 | 11180 | 8590
(3 行记录)
4.2DELETE
删除整个表:DROP
删除表内的数据:DELETE
4.13清空Product表:
postgres=# DELETE FROM Product;
DELETE 8
4.14 DELETE+WHERE删除特定行
postgres=# DELETE FROM Product
postgres-# WHERE sale_price>=4000;
DELETE 0
注:TRUNCATE舍弃,删除全表,不加条件,速度快。
4.3UPDATE更新
4.15 更新登记日期
postgres=# UPDATE Product
postgres-# SET regist_date='2009-10-10';
4.16 有条件的更新数据UPDATE+WHERE
postgres=# UPDATE Product
postgres-# SET sale_price=sale_price*10
postgres-# WHERE product_type='厨房用具';
注:UPDATE语句可以将数据更新为NULL
4.4事务
定义:一系列更新处理的集合
4.21更新商品信息的事务:
postgres=# BEGIN TRANSACTION;
BEGIN
postgres=# UPDATE Product
postgres-# SET sale_price=sale_price-1000
postgres-# WHERE product_name='运动T恤';
UPDATE 0
postgres=# UPDATE Product
postgres-# SET sale_price=sale_price+1000
postgres-# WHERE product_name='T恤衫';
UPDATE 0
postgres=# COMMIT;
COMMIT
4.22 事务回滚:
postgres=# BEGIN TRANSACTION;
BEGIN
postgres=# UPDATE Product
postgres-# SET sale_price=sale_price+1000
postgres-# WHERE product_name='T恤衫';
UPDATE 0
postgres=# ROLLBACK;
ROLLBACK
注:ROLLBACK回滚,放弃保存操作
事务的四种特性:ACID
atomicity原子性:事务要么全部执行,要么不执行
consistency一致性:满足约束条件
isolation隔离性:不同事务互不干扰
durability持久性:提前保存以免发生故障
练习:
4.1 除了Oracle,其他数据每条SQL语句都是一个事务,所以不用COMMIT也可以
postgres=# BEGIN TRANSACTION;
BEGIN
postgres=# INSERT INTO Product VALUES ('0001', 'T恤', '衣服', 1000, 500, '2009-09-20');
INSERT 0 1
postgres=# INSERT INTO Product VALUES ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11');
INSERT 0 1
postgres=# INSERT INTO Product VALUES ('0003', '运动T恤', '衣服', 4000, 2800, NULL);
INSERT 0 1
postgres=# SELECT * FROM Product;
product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
0001 | T恤 | 衣服 | 1000 | 500 | 2009-09-20
0002 | 打孔器 | 办公用品 | 500 | 320 | 2009-09-11
0003 | 运动T恤 | 衣服 | 4000 | 2800 |
(3 行记录)
4.4两个条件更新两次
postgres=# UPDATE ProductMagin
postgres-# SET sale_price=3000
postgres-# WHERE product_id='0003';
UPDATE 1
postgres=# UPDATE ProductMagin
postgres-# SET margin=sale_price-purchase_price
postgres-# WHERE product_id='0003';
UPDATE 1
postgres=# SELECT * FROM ProductMagin;
product_id | product_name | sale_price | purchase_price | margin
------------+--------------+------------+----------------+--------
0001 | T恤 | 1000 | 500 | 500
0002 | 打孔器 | 500 | 320 | 180
0003 | 运动T恤 | 3000 | 2800 | 200
(3 行记录)