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.数据库安全

利用管理机制授予或限制对数据的访问。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容

  • 第三课: 排序检索数据 distinct关键字:distinct 列名1,列名2,列名3DISTINCT 关键字会...
    VictorBXv阅读 1,480评论 0 8
  • 表 存储在表中的数据是同一种类型的数据或清单。 数据库中的表有为一个名字来标识自己。 表具有一些特性,这些特性定义...
    蛐蛐囍阅读 1,317评论 0 7
  • 你唱歌好听,你身高和我搭得刚刚好,你会照顾人,你会因为爱的人是我而卑躬屈膝道歉,你会捏我脸上的肉,你会喜欢我高高...
    杏宝阅读 285评论 1 0
  • 小幸福
    夏夏cappuccino阅读 135评论 0 0
  • 理想的工作? 躺在床上刷着朋友圈的我脑海里居然会突然蹦出这么有深度的问题...... 是的,一包薯片引起的。 因为...
    fayeeechan阅读 92评论 0 0