21、向表中插入数据
INSERT INTO 表名 (列1,列2,...)VALUES(值1,值2,.......);
前面我们还写过一种写法,就是列清单的省略写法。当我们对表进行全列插入时,就可以省略表名后的列清单。VALUES字句的值会默认按照从左到右的顺序赋值给每一列。
INSERT INTO 表名 VALUES(值1,值2,.....);
22、插入的值为NULL,就是在插入语句后面的值里,将值改为NULL,前提是插入NULL的那一列的约束不能是NOT NULL,否则会出错。
插入默认值,即在建表时候,在列的约束里写 DEFAULT 关键字和值。例如 : 列名 数据类型 DEFAULT 0 ,
插入时候,对应列的值写DEFAULT时,插入的值即为默认值0.
23、数据的删除
之前DROP Table 表名 ; 是将表完全删除,在这里我们学习的是删除表中的数据(行),用的是DELETE关键字。
DELETE FROM 表名 ; 将表中的全部数据行删除。
24、指定删除对象的DELETE 语句
DELETE FROM 表名 WHERE 条件 ;
25、删除表中的全部数据(不推荐使用,但是比DELETE FROM 表名 ;方式快)
它不是标准SQL,但是很多数据库产品有这个关键字。比如Oracle,SQL Server,PostgreSQL,MySQL,DB2。
TRUNCATE 表名 ;
26、数据的更新 UPDATE的使用方法
改变表中数据的UPDATE语句。 UPDATE 表名 SET 列名= 表达式 ;
27、指定条件的UPDATE语句
改变表中数据的UPDATE语句。 UPDATE 表名 SET 列名= 表达式 WHERE 条件 ;
28.事务:事务是指同一个处理工作单元执行的一系列更新处理的集合。其实在默认模式(自动提交)下,每条SQL语句就是一个事务。比如我们前面见过的UPDATE INSERT DELETE。 数据库里的事务具有ACID四个特性。
原子性(Atomicity) 事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。(就是假如我们要将 张三 ,23 改为 李四,24 。但是更改的时候只有名字或者年龄改了,而没有同时更改,没有达到我们的要求。所以SQL语句就会被取消,回滚到更改之前的状态。)
一致性 (Consistency) 事务在完成时,必须使所有的数据都保持一致状态。(假如我们的SQL语句里要往列A,插入一个值为NULL,但是列A 的约束是NOT NULL, 所以就会出错,这个语句就会被取消,不会执行,就会回滚,当前数据行还是插入NULL值之前的状态)
隔离性 (Isolation) 由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为隔离性。(就是不同事务之间是互不干扰的,假如A事务要添加一个东西,但是还没有COMMIT,在A添加的同时B事务也要添加同一个东西,但是它不知道A添加了,它是看不见A的操作的,因为A还没有提交。它们所能看到的,都是各自在开始事务前看到的。)
持久性(Durability)事务完成之后,它对于系统的影响是永久性的。即使由于系统故障导致数据丢失,数据库也能通过某种手段恢复。(常见的方法,就是把执行SQL语句的记录保存在硬盘等存储介质中,就是我们所说的日志),当发生故障,我们可以通过日志来恢复到故障发生前的状态。
29、视图
视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
(表中保存的是实际数据,这些数据被保存到数据库中,而数据库里的数据往往保存在我们的计算机的存储设备-硬盘当中。但是视图中保存的是一些SELECT 语句,这些语句用来从表中取出数据并创建一张临时表。 它并不会保存数据,因为这些数据都是已经保存好的,存在的。只是视图临时拿来给我们看。)
30、视图的创建方法
CREATE VIEW 视图名称 (视图列名1 ,视图列名2 ,....)AS SELECT语句 ;
看书上的例子 : 创建视图ProductSum
CREATE VIEW ProductSum (product_type,cnt_product) /*这2个就是视图的列名*/
AS SELECT product_type ,COUNT(*) FROM 表名 GROUP BY product_type ; /*我们发现视图里的主体是SELECT语句 视图里的2个列里的内容和 SELECT语句查询出来的2个列的内容是一样的。 */
我们下次要执行这样的查询.SELECT product_type ,COUNT(*) FROM 表名 ;,其实就可以用视图替代了。如下:
SELECT product_type,cnt_product FROM 视图名 /*在这里就是ProductSum*/
31、多重视图 。在视图的基础上再建立视图。例如
CREATE VIEW ProcuctSumJim(product_type,cnt_product) AS SELECT product_type,cnt_product FROM ProductSum ;
ProductSum是我们建立的视图,我们在它基础上又建立了视图ProcuctSumJim,虽然语法上没有错误,但是尽量避免创建多重视图,因为对于多数DBMS来说,多重视图会降低SQL的性能。
32、视图的限制
32.1 :定义视图时不能使用ORDER BY 子句 。注意是定义。
32.2 :对视图进行更新。
因为视图本质上是从表派生出来的。假如我们原表可以更新,那么视图中的数据也可以更新。可是我们更新了视图,视图发生了改变,而原表没有进行相应的更新的话,就无法保证数据的一致性了。
只要能保证,视图和原表同时进行更新,那么视图就可以更新。当遇到视图已经更新,但是原表更新遇到了问题(假如视图更新了它所用到的2列,原表照理来说也要更新对应的2列,但是原表里有好多列,我们只知道2列,其他列的值我们都不清楚),数据库就遇到了麻烦。就不能更新。
33、删除视图
DROP VIEW 视图名称 (视图列1,视图列2,......);
在PostgreSQL里删除多重视图需要用CASCADE 。 例如 : DROP VIEW ProductSum CASCADE ;