SQL必知必会 14~18章

注:这一系列的文章是《SQL必知必会》第四版的读书笔记。

14.组合查询

利用UNION操作符将多条SELECT语句组合成一个结果集。

14.1 组合查询

主要有两种情况需要使用组合查询:

(1)在一个查询中从不同的表返回结构数据

(2)对一个表执行多个查询,按一个查询返回数据

14.2 创建组合查询

14.2.1 使用UNION

给出每条SELECT语句,在各条语句之间放上关键字UNION。

输入:

SELECT cust_name,cust_contact,cust_email

FROM Customers

WHERE cust_state IN ('IL','IN','MI')

UNION

SELECT cust_name,cust_contact,cust_email

FROM Customers

WHERE cust_name='Fun4All';

14.2.2 UNION规则

(1)UNION必须由两条及以上的SELECT语句组成,语句之间用关键字UNION分隔。

(2)UNION中的每个查询必须包含相同的列、表达式或聚集函数。

(3)列数据类型必须兼容。类型不必完全相同,但必须是DBMS可以隐含转换的类型。

14.2.3 包含或取消重复的行

UNION从查询结果集中自动去除了重复的行。若想返回所有的匹配行,可使用UNION ALL而不是UNION。

输入:

SELECT cust_name,cust_contact,cust_email

FROM Customers

WHERE cust_state IN ('IL','IN','MI')

UNION ALL

SELECT cust_name,cust_contact,cust_email

FROM Customers

WHERE cust_name='Fun4All';

14.2.4 对组合查询结果排序

在用UNION组合查询时,只能使用一条ORDER BY子句,必须位于最后一条SELECT语句之后。

输入:

SELECT cust_name,cust_contact,cust_email

FROM Customers

WHERE cust_state IN ('IL','IN','MI')

UNION

SELECT cust_name,cust_contact,cust_email

FROM Customers

WHERE cust_name='Fun4All'

ORDER BY cust_name,cust_contact;

15.插入数据

利用SQL的INSERT语句将数据插入表中。

15.1 数据插入

15.1.1 插入完整的行

输入:

INSERT INTO Customers(cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country,cust_contact,cust_email)

VALUES('1000000006','Toy Land','123 Any Street','New York','NY','11111','USA',NULL,NULL);

使用列的列表更加安全。

15.1.2 插入部分行

输入:

INSERT INTO Customers(cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country)

VALUES('1000000006','Toy Land','123 Any Street','New York','NY','11111');

如果表的定义允许,可以在INSERT操作中省略某些列。省略的列必须满足以下某个条件:

(1)该列定义为允许NULL值

(2)在表定义中给出默认值。

15.1.3 插入检索出的数据

输入:

INSERT INTO Customers(cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country)

SELECT cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country

FROM CustNew;

15.2 从一个表复制到另一个表

以MySQL为例。

输入:

CREATE TABLE CustCopy AS

SELECT * FROM Customers;

16.更新和删除数据

利用UPDATE和DELETE语句进一步操作表数据。

16.1 更新数据

有两种使用UPDATE的方式:

(1)更新表中的特定行

(2)更新表中的所有行

要注意WHERE子句,避免错误的更新表中的所有行。

输入:

UPDATE Customers

SET cust_contact='Sam Roberts',cust_email='sam@toyland.com'

WHERE cust_id='1000000006';

删除某个列的值,可设置它为NULL。

输入:

UPDATE Customers

SET cust_email=NULL

WHERE cust_id='1000000005';

16.2 删除数据

有两种使用DELETE的方式:

(1)从表中删除特定的行

(2)从表中删除所有行

同样要注意WHERE子句,避免误删除所有行。

输入:

DELETE FROM Customers

WHERE cust_id='1000000006';

DELETE删除整行,而不是删除列。DELETE能删除表中的所有行,但是DELETE不删除表本身。

16.3 更新和删除的指导原则

(1)除非确实打算更新或删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句。

(2)保证每个表都有主键。

(3)在UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。

(4)使用强制实施引用完整性的数据库,这样DBMS将不允许删除其数据与其他表相关联的行。

(5)如果DBMS允许数据库管理员施加约束,防止执行不带WHERE子句的UPDATE或DELETE语句,则应该使用它。

17.创建和操纵表

创建、更改和删除表的基本知识。

17.1 创建表

一般有两种创建表的方法:

(1)多数DBMS都具有交互式创建和管理数据库表的工具。

(2)表也可以直接用SQL语句操纵。

输入:

CREATE TABLE Products{

    prod_id        CHAR(10)        NOT NULL,

    vend_id        CHAR(10)        NOT NULL,

    prod_name  CHAR(10)        NOT NULL,

    prod_price   DECIMAL(8,2)  NOT NULL,

    prod_desc   TEXT(1000)      NULL

} ;

指定默认值:

输入:

CREATE TABLE OrderItems{

    prod_id        CHAR(10)         NOT NULL,

    order_num   INTEGER         NOT NULL,

    order_item   INTEGER         NOT NULL,

    quantity        INTEGER         NOT NULL        DEFAULT 1,

    item_price    DECIMAL(8,2)  NOT NULL

} ;

17.2 更新表

输入:

ALTER  TABLE  Vendors

ADD  vend_phone  CHAR(20);

17.3 删除表

输入:

DROP TABLE CustCopy;

18.使用视图

什么是视图,怎么工作,什么时候使用,利用视图简化SQL操作。

18.1 视图

视图是虚拟的表,只包含使用时动态检索数据的查询。

18.1.1 为什么使用视图

(1)重用SQL语句

(2)简化复杂的SQL操作

(3)使用表的一部分而不是整个表

(4)保护数据。

(5)更改数据格式和表示。

18.1.2 视图的规则和限制

(1)视图必须唯一命名

(2)创建视图必须具有足够的访问权限

(3)视图可以嵌套。

(4)许多DBMS禁止在视图查询中使用ORDER BY子句。

(5)有些DBMS要求对返回的所有列进行命名。

(6)视图不能索引,也不能有关联的触发器或默认值。

(7)有些DBMS把视图作为只读的查询。

18.2 创建视图

18.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';

18.2.2 用视图重新格式化检索出的数据

18.2.3 用视图过滤不想要的数据

输入:

CREATE VIEW CustomerEmailList AS

SELECT cust_id,cust_name,cust_email

FROM Customers

WHERE cust_email IS NOT NULL;


SELECT *

FROM CustomerEmailList;

18.2.4 使用视图与计算字段

输入:

CREATE VIEW OrderItemsExpanded AS

SELECT order_num,prod_id,quantity,item_price,quantity*item_price AS expanded_price

FROM OrderItems;


SELECT *

FROM OrderItemsExpanded

WHERE order_num=20008;

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

推荐阅读更多精彩内容

  • 1.表中的任何列都可以作为主键, 只要它满足以下条件:任意两行都不具有相同的主键值;每一行都必须具有一个主键值( ...
    Cherryjs阅读 559评论 0 0
  • 注:这一系列的文章是《SQL必知必会》第四版的读书笔记。 1.了解SQL 1.1 数据库基础 数据库:保存有组织的...
    zuyuxia阅读 561评论 0 0
  • 注:这一系列的文章是《SQL必知必会》第四版的读书笔记。 7.创建计算字段 什么是计算字段,怎么创建计算字段,以及...
    zuyuxia阅读 312评论 0 0
  • 数据库入门 数据库: 保存有组织的数据的容器(通常是一个文件或一组文件).数据库软件应该称为 DBMS(DataB...
    Mjericho阅读 470评论 0 0
  • 寄语 在初次导入微信SDK时很多小伙伴都会遇到各种问题,在这里我记录一下我遇到的一些问题 整理一下,欢迎补充!以方...
    Monster_Lai阅读 3,172评论 0 0