sql语句录

本文介绍了SQL查询的基础知识,包括SELECT、WHERE、ORDER BY、LIKE、COUNT、GROUP BY、HAVING、JOIN、UNION、INTERSECT、alias、substring、TRIM、CREATETABLE和INDEX等常用指令的使用方法和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  like

LIKE 是另一个在 WHERE 子句中会用到的指令。基本上,LIKE 能让我们依据一个套式 (pattern) 来找出我们要的资料。相对来说,在运用 IN 的时候,我们完全地知道我们需要的条件;在运用 BETWEEN 的时候,我们则是列出一个范围。 LIKE 的语法如下:

SELECT "栏位名"
FROM "表格名"
WHERE "栏位名" LIKE {套式}

{套式} 经常包括野卡 (wildcard). 以下是几个例子:

  • 'A_Z': 所有以 'A' 起头,另一个任何值的字原,且以 'Z' 为结尾的字串。 'ABZ' 和 'A2Z' 都符合这一个模式,而 'AKKZ' 并不符合 (因为在 A 和 Z 之间有两个字原,而不是一个字原)。

  • 'ABC%': 所有以 'ABC' 起头的字串。举例来说,'ABCD' 和 'ABCABC' 都符合这个套式。

  • '%XYZ': 所有以 'XYZ' 结尾的字串。举例来说,'WXYZ' 和 'ZZXYZ' 都符合这个套式。

  • '%AN%': 所有含有 'AN' 这个套式的字串。举例来说, 'LOS ANGELES' 和 'SAN FRANCISCO' 都符合这个套式。

    我们将以上最后一个例子用在我们的 Store_Information 表格上:

    Store_Information 表格

    store_nameSalesDate
    LOS ANGELES$1500Jan-05-1999
    SAN DIEGO$250Jan-07-1999
    SAN FRANCISCO$300Jan-08-1999
    BOSTON$700Jan-08-1999

    我們就打入,

    SELECT *
    FROM Store_Information
    WHERE store_name LIKE '%AN%'

  • select *

  • from Store_Information

  • where store_name like '%AN%'
    結果:

    store_nameSalesDate
    LOS ANGELES$1500Jan-05-1999
    SAN FRANCISCO$300Jan-08-1999
    SAN DIEGO$250Jan-07-1999

     

     ORDER BY

    到目前为止,我们已学到如何藉由 SELECT WHERE这两个指令将资料由表格中抓出。不过我们尚未提到这些资料要如何排列。这其实是一个很重要的问题。事实上,我们经常需要能够将抓出的资料做一个有系统的显示。这可能是由小往大 (ascending) 或是由大往小(descending)。在这种情况下,我们就可以运用 ORDER BY这个指令来达到我们的目的。

    ORDER BY 的语法如下:

    SELECT "栏位名"
    FROM "表格名"
    [WHERE "条件"]
    ORDER BY "栏位名" [ASC, DESC]

    [] 代表 WHERE 是一定需要的。不过,如果 WHERE 子句存在的话,它是在 ORDER BY 子句之前。 ASC 代表结果会以由小往大的顺序列出,而 DESC 代表结果会以由大往小的顺序列出。如果两者皆没有被写出的话,那我们就会用 ASC

    我们可以照好几个不同的栏位来排顺序。在这个情况下, ORDER BY 子句的语法如下(假设有两个栏位):

    ORDER BY "栏位一" [ASC, DESC], "栏位二" [ASC, DESC]

    若我们对这两个栏位都选择由小往大的话,那这个子句就会造成结果是依据 "栏位一" 由小往大排。若有好几笔资料 "栏位一" 的值相等,那这几笔资料就依据 "栏位二" 由小往大排。

    举例来说,若我们要依照 Sales 栏位的由大往小列出 Store_Information 表格中的资料,

    Store_Information 表格

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$250Jan-07-1999
    San Francisco$300Jan-08-1999
    Boston$700Jan-08-1999

    我们就打入,

    SELECT store_name, Sales, Date
    FROM Store_Information
    ORDER BY Sales DESC

    select *

    from Store_Information

    order by sales desc

    结果:

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    Boston$700Jan-08-1999
    San Francisco$300Jan-08-1999
    San Diego$250Jan-07-1999

    在以上的例子中,我们用栏位名来指定排列顺序的依据。除了栏位名外,我们也可以用栏位的顺序 (依据 SQL 句中的顺序)。在 SELECT 后的第一个栏位为 1,第二个栏位为 2,以此类推。在上面这个例子中,我们打以下这一句 SQL 可以达到完全一样的效果:

    SELECT store_name, Sales, Date
    FROM Store_Information
    ORDER BY 2 DESC

     

     

     SUM

    我们现在回到函数上。记得我们用 SUM 这个指令来算出所有的 Sales (营业额)吧!如果我们的需求变成是要算出每一间店 (store_name) 的营业额 (sales),那怎么办呢?在这个情况下,我们要做到两件事:第一,我们对于 store_name 及 Sales 这两个栏位都要选出。第二,我们需要确认所有的 sales 都要依照各个 store_name 来分开算。这个语法为:

    SELECT "栏位1", SUM("栏位2")
    FROM "表格名"
    GROUP BY "栏位1"

    在我们的示范上,

    Store_Information 表格

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$250Jan-07-1999
    Los Angeles$300Jan-08-1999
    Boston$700Jan-08-1999

    我们就打入,

    SELECT store_name, SUM(Sales)
    FROM Store_Information
    GROUP BY store_name

    selcet store_name, sum(sales)

    from Store_Information

    group by store_name

    结果:

    store_nameSUM(Sales)
    Los Angeles$1800
    San Diego$250
    Boston$700

    当我们选不只一个栏位,且其中至少一个栏位有包含函数的运用时,我们就需要用到 GROUP BY 这个指令。在这个情况下,我们需要确定我们有 GROUP BY 所有其他的栏位。换句话说,除了有包括函数的栏位外,我 们都需要将其放在 GROUP BY 的子句中。

     COUNT

    在上一页有提到,COUNT 是函数之一。由于它的使用广泛,我们在这里特别提出来讨论。基本上,COUNT 让我们能够数出在表格中有多少笔资料被选出来。它的语法是:

    SELECT COUNT("栏位名")
    FROM "表格名"

    举例来说,若我们要找出我们的示范表格中有几笔 store_name 栏不是空白的资料时,

    Store_Information 表格

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$250Jan-07-1999
    Los Angeles$300Jan-08-1999
    Boston$700Jan-08-1999

    我们就打入,

    SELECT COUNT(store_name)
    FROM Store_Information
    WHERE store_name is not NULL

    结果:

    Count(store_name)
    4

    "is not NULL" 是 "这个栏位不是空白" 的意思。

    COUNT DISTINCT 经常被合起来使用,目的是找出表格中有多少笔不同的资料 (至于这些资料实际上是什么并不重要)。 举例来说,如果我们要找出我们的表格中有多少个不同的 store_name,我们就打入,

    SELECT COUNT(DISTINCT store_name)
    FROM Store_Information

    结果:

    Count(DISTINCT store_name)
    3

     HAVING

    那我们如何对函数产生的值来设定条件呢?举例来说,我们可能只需要知道哪些店的营业额有超过 $1,500。在这个情况下,我们不能使用 WHERE 的指令。那要怎么办呢?很幸运地,SQL 有提供一个 HAVING 的指令,而我们就可以用这个指令来达到这个目标。 HAVING 子句通常是在一个 SQL 句子的最后。一个含有 HAVING 子句的 SQL 并不一定要包含 GROUP BY 子句。HAVING 的语法如下:

    SELECT "栏位1", SUM("栏位2")
    FROM "表格名"
    GROUP BY "栏位1"
    HAVING (函数条件)

    请读者注意: GROUP BY 子句并不是一定需要的。

    在我们Store_Information 表格这个例子中,

    Store_Information 表格

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$250Jan-07-1999
    Los Angeles$300Jan-08-1999
    Boston$700Jan-08-1999

    我们打入,

    SELECT store_name, SUM(sales)
    FROM Store_Information
    GROUP BY store_name
    HAVING SUM(sales) > 1500

    结果:

    store_nameSUM(Sales)
    Los Angeles
    $1800

     

     

     alias

    接下来,我们讨论 alias (别名) 在 SQL 上的用处。最常用到的别名有两种: 栏位别名及表格别名。

    简单地来说,栏位别名的目的是为了让 SQL 产生的结果易读。在之前的例子中, 每当我们有营业额总合时,栏位名都是 SUM(sales)。 虽然在这个情况下没有什么问题,可是如果这个栏位不是一个简单的总合,而是一个复杂的计算, 那栏位名就没有这么易懂了。若我们用栏位别名的话,就可以确认结果中的栏位名是简单易懂的。

    第二种别名是表格别名。要给一个表格取一个别名,只要在 FROM 子句 中的表格名后空一格,然后再列出要用的表格别名就可以了。这在我们要用 SQL 由数个不同的表格中 获取资料时是很方便的。这一点我们在之后谈到连接 (join) 时会看到。

    我们先来看一下栏位别名和表格别名的语法:

    SELECT "表格别名"."栏位1" "栏位别名"
    FROM "表格名" "表格别名"

    基本上,这两种别名都是放在它们要替代的物件后面,而它们中间由一个空白分开。我们 继续使用 Store_Information这个表格来做例子:

    Store_Information 表格

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$250Jan-07-1999
    Los Angeles$300Jan-08-1999
    Boston$700Jan-08-1999

    我们用跟 SQL GROUP BY 那一页 一样的例子。这里的不同处是我们加上了栏位别名以及表格别名:

    SELECT A1.store_name Store, SUM(A1.Sales) "Total Sales"
    FROM Store_Information A1
    GROUP BY A1.store_name

    结果:

    StoreTotal Sales
    Los Angeles$1800
    San Diego$250
    Boston$700

    在结果中,资料本身没有不同。不同的是栏位的标题。这是运用栏位别名的结果。在第二个栏位上,原本我们的标题是 "Sum(Sales)",而现在我们有一个很清楚的 "Total Sales"。很明显地,"Total Sales" 能够比 "Sum(Sales)" 更精确地阐述这个栏位的含意。用表格别名的好处在这里并没有显现出来,不过这在下一页 (SQL Join) 就会很清楚了。


     join

    现在我们介绍连接(join)的概念。要了解连接,我们需要用到许多我们之前已介绍过的指令。 我们先假设我们有以下的两个表格,

    Store_Information 表格

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$250Jan-07-1999
    Los Angeles$300Jan-08-1999
    Boston$700Jan-08-1999

    Geography 表格
    region_namestore_name
    EastBoston
    EastNew York
    WestLos Angeles
    WestSan Diego

    而我们要知道每一区 (region_name) 的营业额 (sales)。 Geography 这个表格告诉我们每一区有哪些店,而 Store_Information 告诉我们每一个店的营业额。 若我们要知道每一区的营业额,我们需要将这两个不同表格中的资料串联起来。当我们仔细了解这两个 表格后,我们会发现它们可经由一个相同的栏位,store_name,连接起来。我们先将 SQL 句列出, 之后再讨论每一个子句的意义:

    SELECT A1.region_name REGION, SUM(A2.Sales) SALES
    FROM Geography A1, Store_Information A2
    WHERE A1.store_name = A2.store_name
    GROUP BY A1.region_name

    结果:

    REGIONSALES
    East$700
    West$2050

    在第一行中,我们告诉 SQL 去选出两个栏位:第一个栏位是 Geography 表格中的 Region_name 栏位 (我们取了一个别名叫做 REGION);第二个栏位是 Store_Information 表格中的 sales 栏位 (别名为 SALES)。请注意在这里我们有用到表格别名:Geography 表格的别名是 A1,Store_Information 表格的别名是 A2。若我们没有用表格别名的话, 第一行就会变成

    SELECT Geography.region_name REGION, SUM(Store_Information.Sales) SALES

    很明显地,这就复杂多了。在这里我们可以看到表格别名的功用:它能让 SQL 句容易被了解,尤其是这个 SQL 句含盖好几个不同的表格时。

    接下来我们看第三行,就是 WHERE 子句。 这是我们阐述连接条件的地方。在这里,我们要确认 Geography 表格中 Store_name 栏位的值与 Store_Information 表格中 store_name 栏位的值是相等的。这个 WHERE 子句是一个连接的灵魂人物,因为它的角色是确定两个表格之间的连接是正确的。如果 WHERE子句是错误的,我们就极可能得到一个笛卡儿连接 (Cartesian join)。笛卡儿连接会造成我们得到所有两个表格每两行之间所有可能的组合。在这个例子中,笛卡儿连接会让我们得到 4 x 4 = 16 行的结果。


     left join

    之前我们看到的左连接 (left join),又称内部连接 (inner join)。在这个情况下,要两个表格内都有同样的值,那一笔资料才会被选出。那如果我们想要列出一个表格中每一笔的资料,无论它的值在另一个表格中有没有出现,那该怎么办呢?在这个时候,我们就需要用到 SQL OUTER JOIN (外部连接) 的指令。

    外部连接的语法是依数据库的不同而有所不同的。举例来说,在 Oracle 上,我们会在 WHERE 子句中要选出所有资料的那个表格之后加上一个 "(+)" 来代表说这个表格中的所有资料我们都要。

    假设我们有以下的两个表格:

    Store_Information 表格

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$250Jan-07-1999
    Los Angeles$300Jan-08-1999
    Boston$700Jan-08-1999

    Geography 表格
    region_namestore_name
    EastBoston
    EastNew York
    WestLos Angeles
    WestSan Diego

    我们需要知道每一间店的营业额。如果我们用一个普通的连接,我们将会漏失掉 'New York'这个店,因为它并不存在于 Store_Information 这个表格。所以,在这个情况下,我们需要用外部连接来串联这两个表格:

    SELECT A1.store_name, SUM(A2.Sales) SALES
    FROM Georgraphy A1, Store_Information A2
    WHERE A1.store_name = A2.store_name (+)
    GROUP BY A1.store_name

    我们在这里是使用了 Oracle 的外部连接语法。

    结果:

    store_nameSALES
    Boston$700
    New York 
    Los Angeles$1800
    San Diego$250

    请注意: 当第二个表格没有相对的资料时,SQL 会传回 NULL 值。在这一个例子中, 'New York' 并不存在于 Store_Information 表格,所以它的 "SALES" 栏位是 NULL。

     

    subquery

    我们可以在一个 SQL 语句中放入另一个 SQL 语句。当我们在 WHERE 子句或 WHERE 子句或 HAVING 子句中插入另一个 SQL 语句时,我们就有一个 subquery 的架构。 Subquery 的作用是什么呢?第一,它可以被用来连接表格。另外,有的时候 subquery 是唯一能够连接两个表格的方式。

    Subquery 的语法如下:

    SELECT "栏位1"
    FROM "表格"
    WHERE "栏位2" [比较运算素]
    (SELECT "栏位1"
    FROM "表格"
    WHERE [条件])

    [比较运算素] 可以是相等的运算素,例如 =, >, <, >=, <=. 这也可以是一个对文字的运算素,例如 "LIKE."

    我们就用刚刚在阐述 SQL 连接时用过的例子:

    Store_Information 表格

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$250Jan-07-1999
    Los Angeles$300Jan-08-1999
    Boston$700Jan-08-1999

    Geography 表格
    region_namestore_name
    EastBoston
    EastNew York
    WestLos Angeles
    WestSan Diego

    我们要运用 subquery 来找出所有在西部的店的营业额。我们可以用下面的 SQL 来达到我们的目的:

    SELECT SUM(Sales) FROM Store_Information
    WHERE Store_name IN
    (SELECT store_name FROM Geography
    WHERE region_name = 'West')

    结果:

    SUM(Sales)
    2050

    在这个例子中,我们并没有直接将两个表格连接起来,然后由此直接算出每一间西区店面的营业额。我们做的是先找出哪些店是在西区的,然后再算出这些店的营业额总共是多少。

    UNION 指令的目的是将两个 SQL 语句的结果合并起来。从这个角度来看, UNION JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。 UNION 的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。

    UNION 的语法如下:

    [SQL 语句 1]
    UNION
    [SQL 语句 2]

    假设我们有以下的两个表格,

    Store_Information 表格

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$250Jan-07-1999
    Los Angeles$300Jan-08-1999
    Boston$700Jan-08-1999

    Internet Sales 表格
    DateSales
    Jan-07-1999$250
    Jan-10-1999$535
    Jan-11-1999$320
    Jan-12-1999$750

    而我们要找出来所有有营业额 (sales) 的日子。要达到这个目的,我们用以下的 SQL 语句:

    SELECT Date FROM Store_Information
    UNION
    SELECT Date FROM Internet_Sales

    结果:

    Date
    Jan-05-1999
    Jan-07-1999
    Jan-08-1999
    Jan-10-1999
    Jan-11-1999
    Jan-12-1999

    有一点值得注意的是,如果我们在任何一个 SQL 语句 (或是两句都一起) 用 "SELECT DISTINCT Date" 的话,那我们会得到完全一样的结果。

     

     UNION ALL

    UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALL UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。

    UNION ALL 的语法如下:

    [SQL 语句 1]
    UNION ALL
    [SQL 语句 2]

    我们用和上一页同样的例子来显示出 UNION ALLUNION 的不同。同样假设我们有以下两个表格,

    Store_Information 表格

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$250Jan-07-1999
    Los Angeles$300Jan-08-1999
    Boston$700Jan-08-1999

    Internet Sales 表格
    DateSales
    Jan-07-1999$250
    Jan-10-1999$535
    Jan-11-1999$320
    Jan-12-1999$750

    而我们要找出有店面营业额以及网络营业额的日子。要达到这个目的,我们用以下的 SQL 语句:

    SELECT Date FROM Store_Information
    UNION ALL
    SELECT Date FROM Internet_Sales

    select Date

    from Store_Information

    union all

    select Date

    from Internet_Sales

    结果:

    Date
    Jan-05-1999
    Jan-07-1999
    Jan-08-1999
    Jan-08-1999
    Jan-07-1999
    Jan-10-1999
    Jan-11-1999
    Jan-12-1999

     

    INTERSECT

    UNION 指令类似, INTERSECT 也是对两个 SQL 语句所产生的结果做处理的。不同的地方是, UNION 基本上是一个 OR (如果这个值存在于第一句或是第二句,它就会被选出),而 INTERSECT 则比较像 AND ( 这个值要存在于第一句和第二句才会被选出)。 UNION 是联集,而 INTERSECT 是交集。

    INTERSECT 的语法如下:

    [SQL语句 1]
    INTERSECT
    [SQL语句 2]

    假设我们有以下的两个表格,

    Store_Information 表格

    store_nameSalesDate
    Los Angeles$1500Jan-05-1999
    San Diego$250Jan-07-1999
    Los Angeles$300Jan-08-1999
    Boston$700Jan-08-1999

    Internet Sales 表格
    DateSales
    Jan-07-1999$250
    Jan-10-1999$535
    Jan-11-1999$320
    Jan-12-1999$750

    而我们要找出哪几天有店面交易和网络交易。要达到这个目的,我们用以下的 SQL 语句:

    SELECT Date FROM Store_Information
    INTERSECT
    SELECT Date FROM Internet_Sales

    select Date

    from Store_Information

    Intersect

    select Date from Internet_Sales

     

    结果:

    Date
    Jan-07-1999

    请注意,在 INTERSECT 指令下,不同的值只会被列出一次。

     

    有的时候,我们有需要将由不同栏位获得的资料串连在一起。每一种资料库都有提供方法来达到这个目的:

    • MySQL: CONCAT()
    • Oracle: CONCAT(), ||
    • SQL Server: +

    CONCAT() 的语法如下:

    CONCAT(字串1, 字串2, 字串3, ...): 将字串1、字串2、字串3,等字串连在一起。请注意,Oracle的CONCAT()只允许两个参数;换言之,一次只能将两个字串串连起来。不过,在Oracle中,我们可以用'||'来一次串连多个字串。

    来看几个例子。假设我们有以下的表格:

    Geography 表格

    region_namestore_name
    EastBoston
    EastNew York
    WestLos Angeles
    WestSan Diego

    例子1:

    MySQL/Oracle:
    SELECT CONCAT(region_name,store_name) FROM Geography
    WHERE store_name = 'Boston';

    select concat(region_name,store_name) from geography

    where store_name='Boston';

    结果

    'EastBoston'

    例子2:

    Oracle:
    SELECT region_name || ' ' || store_name FROM Geography
    WHERE store_name = 'Boston';

    select region_name ||' '|| store_name from geography

    where store_name='Boston' ;

    结果

    'East Boston'

    例子3:

    SQL Server:
    SELECT region_name + ' ' + store_name FROM Geography
    WHERE store_name = 'Boston';

    select region_name +' '+store_nanme from geography

    where store_name='Boston';

    结果

    'East Boston' 


     substring

    SQL 中的 substring 函数是用来抓出一个栏位资料中的其中一部分。这个函数的名称在不同的资料库中不完全一样:

    • MySQL: SUBSTR(), SUBSTRING()
    • Oracle: SUBSTR()
    • SQL Server: SUBSTRING()

    最常用到的方式如下 (在这里我们用SUBSTR()为例):

    SUBSTR(str,pos): 由<str>中,选出所有从第<pos>位置开始的字元。请注意,这个语法不适用于SQL Server上。

    SUBSTR(str,pos,len): 由<str>中的第<pos>位置开始,选出接下去的<len>个字元。

    假设我们有以下的表格:

    Geography 表格

    region_namestore_name
    EastBoston
    EastNew York
    WestLos Angeles
    WestSan Diego

    例1:

    SELECT SUBSTR(store_name, 3)
    FROM Geography
    WHERE store_name = 'Los Angeles';

    select substr(store_name,3)

    from Geography

    where store_name="Los Angeles"

    结果:

    's Angeles'

    例2:

    SELECT SUBSTR(store_name,2,4)
    FROM Geography
    WHERE store_name = 'San Diego';

    select substr(store_name,2,4)

    from Geography

    where stroe_name='San Diego' ;

    结果:

    'an D' 

    TRIM

    SQL 中的 TRIM 函数是用来移除掉一个字串中的字头或字尾。最常见的用途是移除字首或字尾的空白。这个函数在不同的资料库中有不同的名称:

    • MySQL: TRIM(), RTRIM(), LTRIM()
    • Oracle: RTRIM(), LTRIM()
    • SQL Server: RTRIM(), LTRIM()

    各种 trim 函数的语法如下:

    TRIM([[位置] [要移除的字串] FROM ] 字串): [位置] 的可能值为 LEADING (起头), TRAILING (结尾), or BOTH (起头及结尾)。 这个函数将把 [要移除的字串] 从字串的起头、结尾,或是起头及结尾移除。如果我们没有列出 [要移除的字串] 是什么的话,那空白就会被移除。

    LTRIM(字串): 将所有字串起头的空白移除。

    RTRIM(字串): 将所有字串结尾的空白移除。

    例1:

    SELECT TRIM('   Sample   ');

    结果:

    'Sample'

    例2:

    SELECT LTRIM('   Sample   ');

    结果:

    'Sample   '

    例3:

    SELECT RTRIM('   Sample   ');

    结果:

    '   Sample' 

    CREATE TABLE

    表格是数据库中储存资料的基本架构。在绝大部份的情况下,数据库厂商不可能知道您需要如何储存您的资料,所以通常您会需要自己在数据库中建立表格。虽然许多数据库工具可以让您在不需用到 SQL 的情况下建立表格,不过由于表格是一个最基本的架构,我们决定包括 CREATE TABLE 的语法在这个网站中。

    在我们跳入 CREATE TABLE 的语法之前,我们最好先对表格这个东西有些多一点的了解。表格被分为栏位 (column) 及列位 (row)。每一列代表一笔资料,而每一栏代表一笔资料的一部份。举例来说,如果我们有一个记载顾客资料的表格,那栏位就有可能包括姓、名、地址、城市、国家、生日...等等。当我们对表格下定义时,我们需要注明栏位的标题,以及那个栏位的资料种类。

    那,资料种类是什么呢?资料可能是以许多不同的形式存在的。它可能是一个整数 (例如 1),、一个实数(例如 0.55)、一个字串 (例如 'sql')、一个日期/时间 (例如 '2000-JAN-25 03:22:22')、或甚至是 以二进法 (binary) 的状态存在。当我们在对一个表格下定义时,我们需要对每一个栏位的资料种类下定义。(例如 '姓' 这个栏位的资料种类是 char(50)━━代表这是一个 50 个字符的字串)。我们需要注意的一点是不同的数据库有不同的资料种类,所以在对表格做出定义之前最好先参考一下数据库本身的说明。

    CREATE TABLE 的语法是:

    CREATE TABLE "表格名"
    ("栏位 1" "栏位 1 资料种类",
    "栏位 2" "栏位 2 资料种类",
    ... )

    若我们要建立我们上面提过的顾客表格,我们就打入以下的 SQL:

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

    索引 (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)

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

    CREATE INDEX IDX_CUSTOMER_LOCATION
    on CUSTOMER (City, Country)

    索引的命名并没有一个固定的方式。通常会用的方式是在名称前加一个字首,例如 "IDX_" ,来避免与资料库中的其他物件混淆。另外,在索引名之内包括表格名及栏位名也是一个好的方式。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值