SQL必知必会笔记(下)
十六、更新和删除数据
1.更新数据
两种方式:更新表中的特定行,更新表中的所有行
update语句
三部分:要更新的表,列名和它们的新值,确定要更新哪些行的过滤条件
UPDATE Customers
SET cust_contact = 'Sam Roberts',
cust_email = 'sam@gmail.com'
WHERE cust_id = '10086';
要删除某列的值,可设置其为NULL。
2.删除数据
两种方式:从表中删除特定的行;从表中删除所有行
DELETE语句
两部分:要删除数据的表名,要过滤的行名
DELETE FROM Customers
WHERE cust_id = '10086';
不要遗忘where子句,否则会删除表中所有数据
使用TRUNCATE TABLE语句,可以快速删除所有行
3.更新和删除的指导原则
保证每个表都有主键,尽可能像使用where子句那样使用它。
在update或delete语句使用where子句之前,应先用select进行测试,保证它过滤的是正确的记录。
使用强制实施引用完整性的数据库,这样DBMS将不允许删除其数据与其他表相关的行。
十七、创建和操纵表
1.创建表
两种方式:
使用交互式创建和管理数据库表的工具;直接使用SQL语句操纵。
1.1表创建基础
必要信息:新表名字;表列的名字和定义;指定表位置
CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
prod_name CHAR(10) NOT NULL,
prod_price DECIMAL(8,2) NOT NULL,
prod_desc VARCHAR(1000) NULL
);
注:对于MySQL,varchar必须替换成text。
创建表语句不能覆盖已存在的表。
1.2使用NULL值
在不指定NOT NULL时,多数DBMS认为指定的是NULL。
允许NULL值的列不能作为唯一标识。
空字符串''在NOT NULL列中是允许的。
1.3指定默认值
在列定义中用关键字DEFAULT指定。
默认值常用于日期或时间戳列。如MySQL中获得系统日期的函数为CURRENT_DATE()
2.更新表
必要信息:要更改的表名;要做哪些更改。
ALTER TABLE Vendors
ADD vend_phone CHAR(20);
注:更改无法撤销,应该在进行改动前做完整的备份。
复杂表结构更改涉及步骤:
创建新表
使用INSERT SELECT从旧表复制数据到新表
检验新表
重命名旧表(或删除)
用旧表原名重命名新表
根据需要重新创建触发器、存储过程、索引和外键
3.删除表
DROP TABLE CustCopy;
注:删除表没有确认,也不能撤销。
十八、使用视图
1.视图
视图是虚拟的表,包含的不是数据而是使用时动态检索数据的查询。视图提供了一种封装select语句的层次,可用来简化数据处理,重新格式化或保护基础数据。
1.1为什么使用视图
视图的常见应用:
重用SQL语句,简化SQL操作;
使用表的一部分而不是整个表;
授予用户访问表的特定部分的权限,从而保护数据;
更改数据格式和表示。
1.2视图的规则和限制
视图必须唯一命名
视图可以嵌套,即可以利用从其他视图中检索数据的数据的查询来构造视图,但这样可能会严重降低查询的性能,所以使用前需要全面测试。
视图不能索引,也不能有关联的触发器或默认值。
有些DBMS要求对返回的所有列进行命名,如果列是计算字段,则需要使用别名。
2.创建视图
2.1利用视图简化复杂的联结
CREATE VIEW ProductCustomers AS
SELECT cust_name, cust_contact, prod_id
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num;
这样就用视图联结了三张表,
如要检索订购了某产品的顾客,可用以下查询
SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01';
2.2用视图重新格式化检索出的数据
REATE VIEW VendorLocations AS
SELECT RTRIM(vend_name)+'('+RTRIM(vend_coutry)+')'
AS vend_title
FROM Vendors;
创建视图完成后,就可以通过检索数据创建新的邮件标签
SELECT *
FROM VendorLocations;
输出
vend_title
Bear Emporium(USA)
Fun Games(England)
Jouets et ours(France)
...
2.3用视图过滤不想要的数据
创建视图
CREATE VIEW CustomerEmailList AS
SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust_email IS NOT NULL;
使用视图
SELECT *
FROM CustomerEmailList;
2.4使用视图与计算字段
CREATE VIEW OrderItemsExpanded AS
SELECT order_num,
prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems;
检索订单201809的详细内容
SELECT *
FROM OrderItemsExpanded
WHERE order_num = 201809;
十九、使用存储过程
1.存储过程
存储过程就是为以后使用而保存的一条或多条SQL语句。可将其视为批文件,事实上它们的作用不仅限于批处理。
2.为什么要使用存储过程
简化复杂的操作,提高工作性能;
保证数据的一致性、降低出错可能性;
简化对变动的管理,通过存储过程限制对基础数据的访问,减少数据讹误的机会;
提高代码灵活性和可移植性。
3.执行存储过程
EXECUTE接受存储过程名和需要传递给它的任何参数。
EXECUTE AddNewProduct('JS011',
'Stuffed Eiffel Tower',
659);
三个参数匹配存储过程中3个预期变量,不包括主键。
存储过程:
验证传递的数据,保证3个参数都有值
生成用作主键的唯一ID
将新产品插入Products表,在合适的列中存储生成的主键和传递的数据。
4.创建存储过程
声明一个变量来保存存储过程返回的任何值,然后执行存储过程,载使用SELECT语句显示返回的值。
CREATE PROCEDURE MilingListCount
AS
DECLARE @cnt INTEGER
SELECT @cnt = COUNT(*)
FROM Customers
WHERE NOT cust_email IS NULL;
RETURN @cnt;
注:SQLServer中所有局部变量名都以@起头。
调用例子:
DECLARE @ReturnValue INT
EXECUTE @ReturnValue=MailingListCount;
SELECT @ReturnValue;
第20课、管理事务处理
1.事务处理
通过确保成批的SQL操作要么完全执行,要么完全不执行,来维护数据库的完整性。
事务(transaction)指一组SQL语句;
回退(rollback)指撤销指定SQL语句的过程;
提交(commit)指将未储存的SQL语句结果写入数据库表;
保留点(savepoint)指事务处理中设置的临时占位符(placeholder),可以对它发布回退。
2.控制事务处理
SQL Sever
BEGIN TRANSACTION
...
COMMIT TRANSACTION
MySQL
START TRANSACTION
...
2.1 使用ROLLBACK回退
可以回退INSERT、UPDATE、DELETE,不能回退CREATE、DROP。
2.2 使用COMMIT提交
保证整个事务操作完整可靠。
2.3 使用保留点
创建占位符
SQL Sever
SAVE TRANSACTION delete1;
MySQL
SAVEPOINT delete1;
回退到保留点
SQL Sever
ROLLBACK TRANSACTION delete1;
MySQL
ROLLBACK TO delete1;
第21课、使用游标
1.游标
是一个存储在DBMS服务器上的数据库查询,不是SELECT语句,而是被检索出来的结果集。
作用:
能够标记游标为只读,使数据能读取,但不能更新和删除。
能控制可以执行的定向操作。
规定范围,使游标对创建它的特定/所有请求可访问。
指示DBMS对检索出的数据进行复制,使数据在游标打开和访问期间不变化。
2.使用游标
先声明,再使用,结束使用后关闭或释放。
2.1创建游标
创建一个游标来检索没有电邮地址的所有顾客
DECLARE CustCursor CURSOR
FOR
SELECT * FROM Customers
WHERE cust_email IS NULL
2.2使用游标
打开游标,同时执行了查询
OPEN CURSOR CustCursor
访问游标数据
FETCH指出要检索哪些行,从何处检索它们以及将它们放于何处(如变量名)。
2.3关闭游标
CLOSE CustCursor
再次使用它时不需要再声明,只需要OPEN它即可。
第22课、高级SQL特性
1.约束
关系数据库存储分解为多个表的数据,每个表存储相应的数据。利用键来建立从一个表到另一个表的引用。引用完整性(referential integrity)由此而来。
1.1主键
主键是一种特殊的约束,用来保证一列(或一组列)的值是唯一的,而且永不改动。
1.2外键
外键是表中的一列,其值必须在另一表的主键中。外键是保证引用完整性的极其重要部分。
1.3唯一约束
用来保证一列(或一组列)中的数据是唯一的。
与主键不同,唯一约束不能用来定义外键,表可以包含多个唯一约束,但每个表只允许一个主键。
1.4检查约束
用来保证一列(或一组列)中的数据满足一些指定条件。
2.索引
索引用来排序数据以加快搜索和排序操作的速度。
但降低了数据插入、修改和删除的性能。所以需要经常更新的内容不适合作为索引。
3.触发器
触发器是特殊的存储过程,它在特定的数据库活动发生时自动执行。
触发器可以与特定表上的INSERT、UPDATE、DELETE操作相关联。
4.数据库安全
利用管理机制授予或限制对数据的访问。