您的位置
主页 > 国际新闻 » 正文

《MySQL必知必会》19~23章

来源:www.tuxbandhk.com 点击:944

第19章~第23章

第19章

INSERT用于在数据库表中插入(或添加)行。有几种方法可以“插入完整的行”插入一部分行“插入多行”插入一些查询的结果“使用MySQL的安全机制为每个表或用户插入完整的行”。在用于插入新行的表名和值

的格式下,每列必须提供一个值,并且顺序应该与定义列的顺序相同。如果没有值,则填充空值(假设允许该列为空)。如果一个列自动增加了MySQL,也指定了null,但是这种语法是不安全的(表的结构以后可能会改变)。我们应该尽最大努力避免使用

safer method

VALUES来按照之前指定的顺序填写值(不需要原始表的顺序)。即使表的结构发生变化,该方法也可以正常工作,因为cust_id的值是不必要的。因此,如果满足下列条件之一,并且

列被定义为在INSERT语句中允许空值(无值或空值),则可以省略

字符。

在表定义中给出了一个默认值,表示如果没有给出值,将使用默认值。

如果数据检索更重要,您可以在插入和插入之间添加关键字LOW_PRIORITY来降低插入的优先级。

使用多条INSERT语句可以多次插入多行,或者只要每条INSERT语句中的列名和顺序相同,每组值都可以用一对括号括起来,并用逗号分隔,格式如下

。这种方法比使用多个INSERT语句

来插入检索到的数据要快。它由一个INSERT语句和一个SELECT语句组成。例如,我们希望将表中的客户列表合并到客户表中,而不必一次读取一行并再次插入(假设有一个名为custnew的表,其结构与客户相同)。应该注意的是,CUST _新表中的客户id不能与客户或MySQL中的客户id重复,后者是在将该列值导入另一个表时生成的)

如果该表为空,则不插入,这是合法的,或者在INSERT和SELECT中可以省略cust_id列,并且MySQL生成的值的列名

INSERT和SELECT不一定相同。MySQL使用列的位置,SELECT中的第一列将用于填充INSERT指定的第一列.这对于从具有不同列名的表中导入数据非常有用。

在插入选择中,选择语句可以包含WHERE子句来过滤插入的数据。

第20章

更新(修改)可以使用表格中的数据。您可以更新特定行或更新所有行

UPDATE主要由更新的表、列名和新值组成,并确定更新行的过滤条件。注意WHERE子句的重要性

如果客户现在有一个电子邮件地址,它需要被更新

如果没有WHERE子句,所有行都将被更新

更多列将被更新

子查询也可以在UPDATE

中使用为了避免在更新多行时在一行或多行中出现错误,取消整个操作(在取消之前更新的行被恢复到它们的原始值)您可以写UPDATE IGNORE CUSTOMERS.

要删除列的值,可以将其设置为空(如果允许为空)

删除特定行或所有行,也不要省略WHERE子句。

如果没有WHERE子句,表中的每个customer

DELETE将被删除,以删除整行而不是整列,UPDATE将用于删除该列,但DELETE不会删除表本身

TRUNCATE TABLE语句将用于删除所有行。更快(实际上是删除原始表并重建一个表,而不是逐行删除它)

更新并删除策略

除非您真的打算修改每一行,否则您必须使用WHERE子句

来确保每一个表都有一个主键。尽可能多地使用

WHERE子句。您可以首先使用选择来测试所使用的WHERE是否过滤了正确的行。确保正确性

使用强制引用完整性的数据库,这样MySQL就不允许删除包含与其他表相关联的数据的行

MySQL没有撤消按钮,请小心使用UPDATE和DELETE

第21章

CREATE TABLE可用于创建表。事实上,当使用交互工具时,接口工具会生成相应的MySQL语句并执行

来创建一个新表。您需要给出表的名称、表列的名称和定义,或者您可以给出更多信息。

缩进大小和列之间的间距没有指定

表名紧接在CREATE TABLE之后。表的定义是圆括号

创建新表时,指定的表名不能存在。为防止意外覆盖现有表,请先手动删除该表。您可以在表名后面给出“如果不存在”。检查表名是否存在,并在表名不存在时创建

符号。如果指定了NOT NULL,则在插入时必须有一个值。空值是默认设置。如果未指定NOT NULL,如果您指定' '(两个单引号之间没有字符),则在NOT NULL列中允许这样做。

如果主键使用多列,这些列的组合值必须是唯一的。创建表时,用逗号分隔列

主键也可以在创建表后定义。只有不允许为空的列

AUTO_INCREMENT可以用来告诉MySQL,当添加一行时,该列将自动递增,因此每行被分配一个唯一的cust_id,每个表只允许一个AUTO_INCREMENT列,并且它必须被索引(例如,通过使其成为主键)

overwrite AUTO_INCREMENT。您可以简单地在INSERT语句中指定一个值。只要它以前没有出现过,这个值就会取代自动生成的值。随后的增量将开始使用手动插入的值

语句返回最后一个AUTO _ INVATION值

如果在插入行时没有给出值,MySQL允许指定此时使用的默认值

使用数量1而不给出数量。但是,函数不允许用作默认值。只有constant

MySQL有一个专门管理和处理数据的内部引擎。当使用诸如创建表或选择之类的语句时,引擎处理请求。MySQL有多个具有不同功能和特征的引擎。如果ENGINE=语句被忽略,那么使用默认的引擎(很可能是MyISAM)

InnoDB是一个可靠的事务引擎。它不支持全文搜索

Memory,这在功能上相当于MyISAM,但是数据存储在内存(而不是磁盘)中,这非常快,适用于临时表

MyISAM。它具有极高的性能,支持全文搜索,但不支持事务

引擎类型可以混合。例如,一个表使用MyISAM,另一个表使用InnoDB,但是有一个缺陷,即外键不能跨引擎,即一个引擎的表不能引用具有不同引擎的表的外键。

ALTER TABLE可用于更新表

以将名为vend_phone的列添加到供应商表中。必须清楚它的数据类型

删除新添加的列

您也可以定义外键

如果您对单个表进行多次更改,您可以使用单个ALTER TABLE语句。每个更改都用逗号分隔

复杂表结构更改通常需要手动删除过程,并且应该在使用ALTER TABLE更改表之前进行备份。对数据库表的更改不能在删除表(整个表而不是其内容)时撤消,也不能撤消。永久删除

rename tables

rename multiple tables

第22章

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

如果整个查询被打包到一个名为productcustomers的虚拟表中,将

用作视图会容易得多。它在表中不包含任何列或数据。它包含一个SQL查询

可以像表一样使用。它可以执行选择操作,过滤排序数据,连接到其他表或视图,等等。

使用视图可以简化操作,并且在编写查询后可以重复使用多次。它只使用桌子的一部分。“受保护数据的命名”视图的使用规则和限制应该是唯一的。然而,对于

视图的数量没有限制。视图可以嵌套。从其他视图中检索数据的查询可以用来构造视图

ORDER BY。如果视图的SELECT语句也包含orderby,则原始的ORDER BY将被覆盖。

视图将使用CREATE VIEW语句

创建,并将使用SHOW CREATE VIEW视图名。查看创建视图

DROP VIEW视图名的语句;当删除视图

以更新视图时,您可以在创建之前使用拖放,也可以直接创建或替换视图。如果要更新的视图不存在,第二条update语句将创建一个视图。如果它确实存在,它将替换

view。最常见的应用程序之一是隐藏复杂的SQL。这通常包括加入

此视图以返回已订购任何产品的所有客户的列表

execute

以列出已订购任何产品的客户

以检索产品TNT2

的客户。检索到的数据可以用视图重新格式化

此语句使用与前面的SELECT语句相同的查询创建视图,以检索数据来创建所有邮件标签

您可以使用视图来过滤不需要的数据,例如过滤没有电子邮件的客户。

现在您可以像使用其他表格一样使用这个视图。

如果在使用视图时也有WHERE子句,则

视图将自动与视图中的WHERE子句合并。

视图对于简化计算字段的使用特别有用。

视图可更新以检索订单的详细信息。您可以使用INSERT、UPDATE和DELETE来更新视图的基表。如果向视图添加或删除行,实际上是向其基表添加或删除行,但并非所有视图都可以更新。如果视图定义有以下操作,则不能更新视图

group (GROUP BY和having)

join

subquery

join

aggregate函数(Min(),Count(),Sum())

distinct

export(calculate)column

chapter 23

存储过程。简单地说,保存一个或多个MySQL语句的集合以备后用

使用存储过程的优点:简单、安全, 高性能

MySQL调用存储过程调用的执行,并使用call接受存储过程的名称,任何需要传递给它的参数

存储过程都可以显示结果。 您还可以创建一个存储过程来返回产品的平均价格,而不显示结果

如果存储过程接受参数,它可以在()中列出。开始和结束用于限制存储过程主体。此创建的过程不返回数据,而是为以后在命令行模式中使用

而创建的,因为代码中有两个分号,所以会出现错误,并且分隔符可以临时更改,除了\ for。任何字符都可以用作语句分隔符

使用此过程

存储过程实际上是一个函数

存储过程被创建并存储在服务器上以供使用,直到被删除。删除如下语句

注意没有()

如果您不确定要删除的过程是否存在,则使用“删除过程如果存在”的常规存储过程不会显示结果。相反,结果被传递给指定的变量

下面是修改后的productpricing版本(如果它已经存在,需要先删除它)

在SELECT语句中,INTO子句和FROM子句的顺序可以颠倒。

此存储过程接受3个参数,每个参数必须具有指定的类型,此处使用十进制,关键字OUT表示相应的参数用于传递存储过程中的值。MySQL还支持输入(传递到存储过程)、输入输出(传递输入和输出)、选择语句来检索值,并通过输入

获取三个值

将它们保存到相应的变量中,以显示检索到的产品的平均价格

获取三个值

使用输入和输出参数。Ordertotal接受订单号,并返回order

INTO子句的总数。其后可以是

在选择

显示总计

之后调用新的存储过程。为了获得另一个订单的总显示,再次调用存储过程并重新显示变量

创建智能存储过程

IF语句,以检查是否需要将增值税增加到局部变量总计。最后,没有必要用另一个SELECT语句将总数保存到ototal

COMMENT值。如果在显示过程状态的结果中显示

test,则存储过程

BOOLEAN值为真,如果它为非零(包括负数),0为假

IF。也支持ELSEIF和ELSE(前者使用THEN子句。后者不使用)

来显示用于创建存储过程的CREATE语句

来获取存储过程的列表,包括详细信息,如上面的语句中列出所有存储过程的时间和对象,您可以使用LIKE进行筛选