数据更新
前言
系统学习SQL的笔记,用于记录学习过程。
思维导图
数据的插入(INSERT语句的使用方法)
什么是INSERT
用创建表CREATE TABLE语句创建出来的表,可以任务是一个空空如也的箱子。只有把数据装入到这个箱子后,它才能够称为数据库。用来装入数据的SQL语句就是INSERT语句。
INSERT语句的基本语法
语法4.1 INSERT语句
INSERT INTO <表名> (列 1, 列 2, 列 3, …… ) VALUES (值 1, 值 2, 值 3, …… );
先创建ProductIns表用于后序的语句练习
代码示例4.2 创建 ProductIns表的CREATE TABLE语句
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 ));
使用INSERT语句
代码示例4.3 向表中插入一行数据
INSERT INTO ProductIns ( product_id, product_name, product_type, sale_price, purchase_price ,regist_date ) VALUES ( '0001', '体恤衫', '衣服', 1000, 500, '2009-09-20' );
由于product_id列和product_name列是字符型,所以插入的数据需要像’0001’用单引号括起来,日期型的regist_date也需要用单引号括起来。
将列名和值用逗号隔开,分别括在()内,这种形式成为清单。在代码示例4.3中的INSERT包含如下两个清单。
列清单→(product_id, product_name, product_type, sale_price, purchase_price, regist_date)
值清单→(‘0001’, ‘T恤衫’, ‘衣服’, 1000, 500,‘2009-09-20’)注意:表名后面的列清单和VALUES子句中的值清单的列数必须保持一致,列数不一致时会出错。一般执行一次INSERT语句会插入一条数据。但是有很多RDBMS都支持一次插入多行数据。
代码示例4.4 INSERT插入多行数据
INSERT INTO ProductIns VALUES ( '0002', '打孔器', '办公用品', 500, 320, '2009-09-11' ), ('0003','运动T恤','衣服',4000,2800,NULL ), ('0004','菜刀','厨房用具',3000,2800,'2009-09-20' );
注意:该语法适用于DB2、SQL、SQL Server、PostgreSQL和MySQL,但不适用于Oracle。Oracle有特定的多行插入语法。
列清单的省略
对表进行全列INSERT时,可以省略表名后的列清单,这时VALUES子句的值会默认按照从左到右的顺序赋给每一列。
代码示例4.5 省略列清单
INSERT INTO ProductIns VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
插入NULL
INSERT语句想要给某一列赋予NULL值时,可以直接在VALUES子句的值清单中写入NULL。
插入默认值
可以向表中插入默认值,首先需要在创建表的时候设置DEFAULT约束来设定默认值。
如在代码示例4.2 中的sale_price列默认值设置为0.如果在创建表的同时设置了默认值,就可以再INSERT语句中自动为列赋值了。
默认值的使用方法通常由显示和隐式两种。
通过显示方法插入默认值
在VALUES子句中制定DEFAULT关键字
代码示例4.5 通过显示方式设定默认值
INSERT INTO ProductIns ( product_id, product_name, product_type, sale_price, purchase_price, regist_date ) VALUES ( '0007', '擦菜板', '厨房用具', DEFAULT, 790, '2009-04-28' );
这样一来,RDBMS就会在插入记录是自动把默认值赋值给对应的列。
通过隐式方法插入默认值
插入默认值时也可以不使用DEFAULT关键字,只要在列清单和VALUES中省略设定的默认值的列就可以了。
代码示例4.6 通过隐式方法设定默认值
INSERT INTO ProductIns ( product_id, product_name, product_type, purchase_price, regist_date ) VALUES ( '0008', '擦菜板', '厨房用具', 790, '2009-04-28' );
注意:省略INSERT语句中的列名,就会自动设定为该列的默认值(没有默认值时会设定为NULL)。
从他表中复制数据
要插入数据,除了使用VALUES子句制定具体的数据之外,还可以从其他表中复制数据。
先创建一张表
代码示例4.7 创建ProductCopy表的CREATE TABLE语句
-- 用来插入数据的商品复制表 CREATE TABLE ProductCopy ( 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 ));
ProductCopy(商品复制)表的结构与之前使用的ProductIns(商品)表完全一样,只是更改了一下表名而已。
接下来将ProductIns表中的数据插入到ProductCopy表中。
代码示例4.8 INSERT…SELECT语句
-- 将商品表中的数据复制到商品复制表中 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_date FROM ProductIns;
这样就将ProductIns表中的所有数据插入到了ProductCopy表中。,INSERT … SELECT
语句可以在需要进行数据备份时使用
注意:INSERT语句的SELECT语句中,可以使用WHERE子句或者GROUP BY子句等任何SQL语法(但使用ORDER BY子句并不会产生任何效果)。
数据的删除(DELETE语句的使用方法)
DROP TABLE语句与DELETE语句
① DROP TABLE语句可以将表完全删除
② DELETE语句会留下表(容器),而删除表中的全部数据
DELETE语句的基本语法
语法4-2 保留数据表,仅删除全部数据行的DELETE语句
DELETE FROM <表名>;
代码示例4.9 清空Product表
DELETE FROM Product;
注意:DELETE语句的删除对象并不是表或者列,而是记录(行)。
指定删除对象的DELETE语句(搜索型DELETE)
想要删除部分数据行时,可以像SELECT语句那样使用WHERE子句制定删除条件。这种指定了删除对象的DELETE语句成为搜索型DELETE。
语法4.3 删除部分数据行的搜索型DELETE
DELETE FROM <表名> WHERE <条件>;
以Product表为例进行DELETE语句的操作。