2020-06-26

MySQL之小白的自述 五

CREATE INDEX (重点)

索引 (Index) 可以帮助我们从表格中快速地找到需要的资料。举例来说,假设我们要在一本
园艺书中找如何种植青椒的讯息。若这本书没有索引的话,那我们是必须要从头开始读,直
到我们找到有关种直青椒的地方为止。若这本书有索引的话,我们就可以先去索引找出种植
青椒的信息是在哪一页,然后直接到那一页去阅读。很明显地,运用索引是一种有效且省时的方式。

从数据库表格中寻找资料也是同样的原理。如果一个表格没有索引的话,数据库系统就需要
将整个表格的资料读出 (这个过程叫做’table scan’)。若有适当的索引存在,数据库系统就可
以先由这个索引去找出需要的资料是在表格的什么地方,然后直接去那些地方抓资料。这样子速度就快多了。

因此,在表格上建立索引是一件有利于系统效率的事。一个索引可以涵盖一或多个栏位。建立索引的语法如下:

CREATE INDEX “INDEX_NAME” ON “TABLE_NAME” (COLUMN_NAME)

现在假设我们有以下这个表格,

TABLE Customer
(First_Name char(50),
Last_Name char(50),
Address char(50),
City char(50),
Country char(25),
Birth_Date date)

若我们要在 Last_Name 这个栏位上建一个索引,我们就打入以下的指令,

CREATE INDEX IDX_CUSTOMER_LAST_NAME
on CUSTOMER (Last_Name)

我们要在 City 及 Country 这两个栏位上建一个索引,我们就打入以下的指令,

CREATE INDEX IDX_CUSTOMER_LOCATION on CUSTOMER (City, Country) 索引的命名并没有一个固定的方式。通常会用的方式是在名称前加一个字首,例如 “IDX_” ,来避免与数据库中的其他物件混淆。另外,在索引名之内包括表格名及栏位名也
是一个好的方式。

请读者注意,每个数据库会有它本身的 CREATE INDEX 语法,而不同数据库的语法会有
不同。因此,在下指令前,请先由数据库使用手册中确认正确的语法。

ALTER TABLE

在表格被建立在数据库中后,我们常常会发现,这个表格的结构需要有所改变。常见的改变
如下:

加一个栏位 删去一个栏位 改变栏位名称 改变栏位的资料种类 以上列出的改变并不是所有可能的改变。ALTER TABLE 也可以被用来作其他的改变,例如
改变主键定义。

ALTER TABLE 的语法如下:

ALTER TABLE “table_name”
[改变方式]

[改变方式] 的详细写法会依我们想要达到的目标而有所不同。再以上列出的改变中,[改变
方式] 如下:

加一个栏位: ADD “栏位 1” “栏位 1 资料种类” 删去一个栏位: DROP “栏位 1”
改变栏位名称: CHANGE “原本栏位名” “新栏位名” “新栏位名资料种类” 改变栏位的资料种类: MODIFY “栏位 1” “新资料种类”
以下我们用在 CREATE TABLE 一页建出的 customer 表格来当作例子:

customer 表格
栏位名称 资料种类
First_Name char(50)
Last_Name char(50)
Address char(50)
City char(50)
Country char(25)
Birth_Date date
第一,我们要加入一个叫做 “gender” 的栏位。这可以用以下的指令达成:

ALTER table customer add Gender char(1)

这个指令执行后的表格架构是:

customer 表格
栏位名称 资料种类
First_Name char(50)
Last_Name char(50)
Address char(50)
City char(50)
Country char(25)
Birth_Date date
Gender char(1)
接下来,我们要把 “Address” 栏位改名为 “Addr”。这可以用以下的指令达成:

ALTER table customer change Address Addr char(50)

这个指令执行后的表格架构是:

customer 表格
栏位名称 资料种类
First_Name char(50)
Last_Name char(50)
Addr char(50)
City char(50)
Country char(25)
Birth_Date date
Gender char(1)
再来,我们要将 “Addr” 栏位的资料种类改为 char(30)。这可以用以下的指令达成:

ALTER table customer modify Addr char(30)

这个指令执行后的表格架构是:

customer 表格
栏位名称 资料种类
First_Name char(50)
Last_Name char(50)
Addr char(30)
City char(50)
Country char(25)
Birth_Date date
Gender char(1)
最后,我们要删除 “Gender” 栏位。这可以用以下的指令达成:

ALTER table customer drop Gender

这个指令执行后的表格架构是:

customer 表格
栏位名称 资料种类
First_Name char(50)
Last_Name char(50)
Addr char(30)
City char(50)
Country char(25)
Birth_Date date

DROP TABLE

有时候我们会决定我们需要从数据库中清除一个表格。事实上,如果我们不能这样做的话,
那将会是一个很大的问题,因为数据库管理师 (Database Administrator – DBA) 势必无法对数据库做有效率的管理。还好,SQL 有提供一个 DROP TABLE 的语法来让我们清除表格。
DROP TABLE 的语法是:

DROP TABLE “表格名”

我们如果要清除在上一页中建立的顾客表格,我们就键入:

DROP TABLE customer.

TRUNCATE TABLE

有时候我们会需要清除一个表格中的所有资料。要达到者个目的,一种方式是我们在 上一
页看到 的 DROP TABLE 指令。不过这样整个表格就消失,而无法再被用了。另一种方式就是运用 TRUNCATE TABLE 的指令。在这个指令之下,表格中的资料会完全消失,可是表格本身会继续存在。 TRUNCATE TABLE 的语法为下:

TRUNCATE TABLE “表格名”

所以,我们如果要清除在 SQL Create Table 那一页建立的顾客表格之内的资料,我们就键入:

TRUNCATE TABLE customer.

INSERT INTO

到目前为止,我们学到了将如何把资料由表格中取出。但是这些资料是如果进入这些表格的呢?这就是这一页 (INSERT INTO) 和下一页 (UPDATE) 要讨论的。
基本上,我们有两种作法可以将资料输入表格中内。一种是一次输入一笔,另一种是一次输入好几笔。我们先来看一次输入一笔的方式。

依照惯例,我们先介绍语法。一次输入一笔资料的语法如下:

INSERT INTO “表格名” (“栏位 1”, “栏位 2”, …) VALUES (“值 1”, “值 2”, …)

假设我们有一个架构如下的表格:

Store_Information 表格

Column Name Data Type
store_name char(50)
Sales float
Date datetime
而我们要加以下的这一笔资料进去这个表格:在 January 10, 2018,Los Angeles 店有 $900 的营业额。我们就打入以下的 SQL 语句:

INSERT INTO Store_Information (store_name, Sales, Date)
VALUES (‘Los Angeles’, 900, ‘Jan-10-2018’)

第二种 INSERT INTO 能够让我们一次输入多笔的资料。跟上面刚的例子不同的是,现在我
们要用 SELECT 指令来指明要输入表格的资料。如果您想说,这是不是说资料是从另一个表格来的,那您就想对了。一次输入多笔的资料的语法是:

INSERT INTO “表格 1” (“栏位 1”, “栏位 2”, …) SELECT “栏位 3”, “栏位 4”, …
FROM “表格 2”

以上的语法是最基本的。这整句 SQL 也可以含有 WHERE、 GROUP BY、及 HAVING 等
子句,以及表格连接及别名等等。

举例来说,若我们想要将 1998 年的营业额资料放入 Store_Information 表格,而我们知道资料的来源是可以由 Sales_Information 表格取得的话,那我们就可以键入以下的 SQL:

INSERT INTO Store_Information (store_name, Sales, Date)
SELECT store_name, Sales, Date
FROM Sales_Information
WHERE Year(Date) = 1998

在这里,我用了 SQL Server 中的函数来由日期中找出年。不同的数据库会有不同的语法。举个例来说,在 Oracle 上,您将会使用 WHERE to_char(date,‘yyyy’)=1998。

UPDATE

我们有时候可能会需要修改表格中的资料。在这个时候,我们就需要用到 UPDATE 指令。
这个指令的语法是:

UPDATE “表格名”
SET “栏位 1” = [新值]
WHERE {条件}

最容易了解这个语法的方式是透过一个例子。假设我们有以下的表格:

Store_Information 表格

store_name Sales Date
Los Angeles $1500 Jan-05-2018
San Diego $250 Jan-07-2018
Los Angeles $300 Jan-08-2018
Boston $700 Jan-08-2018
我们发现说 Los Angeles 在 01/08/2018 的营业额实际上是 $500,而不是表格中所储存的
$300,因此我们用以下的 SQL 来修改那一笔资料:

UPDATE Store_Information
SET Sales = 500
WHERE store_name = “Los Angeles”
AND Date = “Jan-08-2018”

现在表格的内容变成:

Store_Information 表格 store_name Sales Date Los Angeles $1500 Jan-05-2018
San Diego $250 Jan-07-2018
Los Angeles $500 Jan-08-2018
Boston $700 Jan-08-2018

在这个例子中,只有一笔资料符合 WHERE 子句中的条件。如果有多笔资料符合条件的话,
每一笔符合条件的资料都会被修改的。

我们也可以同时修改好几个栏位。这语法如下:

UPDATE “表格”
SET “栏位 1” = [值 1], “栏位 2” = [值 2]
WHERE {条件}

DELETE FROM

在某些情况下,我们会需要直接由数据库中去除一些资料。这可以藉由 DELETE FROM 指
令来达成。它的语法是:

DELETE FROM “表格名”
WHERE {条件}

以下我们用个实例说明。假设我们有以下这个表格:

Store_Information 表格

store_name Sales Date
Los Angeles $1500 Jan-05-2018
San Diego $250 Jan-07-2018
Los Angeles $300 Jan-08-2018
Boston $700 Jan-08-2018
而我们需要将有关 Los Angeles 的资料全部去除。在这里我们可以用以下的 SQL 来达到这个目的:

DELETE FROM Store_Information
WHERE store_name = “Los Angeles”

现在表格的内容变成:

Store_Information 表格

store_name Sales Date
San Diego $250 Jan-07-2018
Boston $700 Jan-08-2018

你可能感兴趣的:(笔记)