sql教程二

一、select语句

    在数据库操作中使用最多的无疑使select语句。

    select最基础的最用是从数据库表中提取信息。

    为了能够详细讲解select语句,我们首先必须要使用前面两个语句创建数据库表并插入数据:

Create table store_information(

         Store_namechar(50),

         Salesfloat,

         datedate

);

INSERT INTOStore_Information (store_name, sales, date) VALUES ('Los Angeles', 1500, '1999-01-05');

INSERT INTOStore_Information (store_name, sales, date) VALUES ('San Diego', 250, '1999-01-07');

INSERT INTOStore_Information (store_name, sales, date) VALUES ('Los Angeles', 300, '1999-01-08');

INSERT INTOStore_Information (store_name, sales, date) VALUES ('Boston', 700, '1999-01-08');

插入数据后表的内容如下:

mysql> select * from store_information;

+-------------+-------+------------+

| store_name  | sales | date       |

+-------------+-------+------------+

| Los Angeles |  1500 | 1999-01-05 |

| San Diego   |  250 | 1999-01-07 |

| Los Angeles |   300 | 1999-01-08 |

| Boston      |  700 | 1999-01-08 |

+-------------+-------+------------+

4 rows in set (0.00 sec)

 

1.1、最基本的select语句结构为:SELECT "栏位名" FROM "表格名"

    例如要选出所有店名(stor_name),我们只需输入:

SELECT store_name FROM Store_Information

结果为: store_name

Los Angeles

San Diego

Los Angele

Boston

 

1.2、(ditinct)在做项目时,我们会经常碰到需要找出表格内的不同值的情况。换句话说,我们需要知道这个表格/栏位内有哪些不同的值,而每个值出现的次数并不重要。这要如何达成呢?在 SQL 中,这是很容易做到的。我们只要在 SELECT 后加上一个DISTINCT就可以了。DISTINCT 的语法如下:

    SELECT DISTINCT"栏位名" FROM "表格名"

举例来说,若要在上述表格中找出所有不同的店名时,只需输入命令:

         SELECT DISTINCT store_name FROM Store_Information

结果为:

    store_name

    Los Angeles

    San Diego

    Boston

 

1.3、(where) 我们并不一定每一次都要将表格内的资料都完全抓出。在许多时候,我们会需要选择性地抓资料。就我们的例子来说,我们可能只要抓出营业额超过$1,000的资料。要做到这一点,我们就需要用到WHERE 这个指令。这个指令的语法如下:

    SELECT"栏位名"FROM "表格名"WHERE "条件"

若我们要在上述建立的表格中抓出营业额超过 $1,000 的资料,只需输入命令:

     SELECTstore_name FROM Store_Information WHERE Sales > 1000

结果为: store_name

Los Angeles


3.4、(AND、OR)在上一页中,我们看到 WHERE 指令可以被用来由表格中有条件地选取资料。 这个条件可能是简单的,也可能是复杂的。复杂条件是由二或多个简单条件透过AND或是 OR 的连接而成。复杂条件的语法如下:

SELECT"栏位名"FROM "表格名"WHERE "简单条件"{[AND|OR] "简单条件"}

    {}代表{}之内的情况会发生一或多次。在这里的意思就是 AND 加简单条件及 OR加简单条件的情况可以发生一或多次。另外,我们可以用 () 来代表条件的先后次序。 

    举例来说,我们若要在 Store_Information表格中选出所有 Sales 高于 $1,000 或是 Sales 在 $500 及$275 之间的资料的话,只需输入命令:

       SELECT store_name FROM Store_Information WHERE Sales > 1000 OR (Sales< 500 AND Sales > 275)

    结果为:

store_name

        Los Angeles

        Los Angeles

 

1.5、(IN)在 SQL 中,在两种情况下会用到IN这个指令,这一次讲解与 WHERE 有关的那一种情况。在这个用法下,我们事先已知道至少一个我们需要的值,而我们将这些知道的值都放入IN 这个子句。 IN 指令的语法为下:

SELECT"栏位名"FROM "表格名" WHERE"栏位名" IN('值一', '值二', ...)

    在括弧内可以有一或多个值,而不同值之间由逗点分开。值可以是数目或是文字。若在括弧内只有一个值,那这个子句就等于:WHERE "栏位名" = '值一'

    举例来说,若我们要在 Store_Information 表格中找出所有含盖 LosAngeles 或 San Diego 的资料,只需输入命令:

SELECT * FROM Store_Information WHEREstore_name IN ('Los Angeles', 'San Diego')


1.6、(Between)BETWEEN 使我们可以运用一个范围 (range) 内抓出数据库中的值。BETWEEN这个子句的语法如下:

     SELECT "栏位名" FROM " 表格名" WHERE "栏位名" BETWEEN '值一' AND '值二'

    举例来说,若我们要由 Store_Information 表格中找出所有介于 600 及 2000 中的资料,我们只需输入命令:

SELECT * FROM Store_Information WHERE salesBETWEEN 600 AND 2000;


1.7、(Like)LIKE 能让我们依据一个套式 (pattern) 来找出我们要的资料。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' 都符合这个套式。

举例来说,使用的形如:  

SELECT * FROM Store_InformationWHERE store_name LIKE '%AN%'


1.8、(Order by)我们经常需要能够将抓出的资料做一个有系统的显示。这可能是由小往大 (ascending)或是由大往小(descending)。在这种情况下,我们就可以运用ORDER BY这个指令来达到我们的目的。ORDER BY 的语法如下:

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

    Asc表示由小往大,desc代表由大往小,默认是asc。

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

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

SELECT store_name, Sales, Date FROM Store_InformationORDER BY Sales DESC


1.9、(函数)SQL 提供一些的函数。它们是:AVG (平均) ,COUNT(计数) ,MAX (最大值),MIN (最小值), SUM (总合),运用函数的语法是:

SELECT"函数名"("栏位名")FROM "表格名"

    举例来说,若我们要由我们的示范表格中求出 Sales 栏位的总合,只需输入:

      SELECT SUM(Sales) FROM Store_Information;

    除了函数的运用外,SQL 也可以做简单的数学运算,例如加(+)和减(-)。对于文字类的资料,SQL 也有好几个文字处理方面的函数,例如文字相连 (concatenation),文字修整 (trim),以及子字串 (substring)。不同的数据库对这些函数有不同的语法,所以最好是参考您所用数据库的信息,来确定在那个数据库中,这些函数是如何被运用的。

 

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

SELECTCOUNT("栏位名")FROM "表格名"

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

SELECT COUNT(store_name) FROM Store_Information WHERE store_name is notNULL

    COUNT 和 DISTINCT 经常被合起来使用,目的是找出表格中有多少笔不同的资料:

SELECT COUNT(DISTINCT store_name) FROM Store_Information

 

1.11、(Group By)Groupby的语法为:

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

    对于Store_Information表,如果我们需要算出每一间店的收入,只需输入命令:

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

 

1.12、(HAVING)如果我们需要对函数产生的结果设定条件,我们就需要使用having语句,HAVING 的语法如下:

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

   举例来说,我们可能只需要知道哪些店的营业额有超过$1,500,我们只用输入命令:

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

 

1.13、(ALIAS)有两种别名机制,栏位别名及表格别名,别名机制的使用方法是:

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

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

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

 

1.14、(连接)为了讲述连接,我们需要新建一个数据库表geography:

Create tablegeography(

     Region_name varchar(10),

     Store_name varchar(20)

);

INSERT INTO geography(region_name, store_name) VALUES (‘EAST’,‘Boston’);

INSERT INTO geography(region_name, store_name) VALUES (‘EAST’,‘New York’);

INSERT INTO geography(region_name, store_name) VALUES (‘WEST’,‘Los Angeles’);

INSERT INTO geography(region_name, store_name) VALUES (‘WEST’,‘San Diego’);

    这样我们就有了两张表geography和store_information,为了得到每个地区的总收入,我们可以使用命令:

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

 

1.15、(subquery)我们可以在一个sql语句中放入另一个sql语句,subquery的语法如下:

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

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

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

SELECTSUM(Sales) FROM Store_Information WHERE Store_name IN (SELECT store_name FROMGeography WHERE region_name = 'West')

 

1.16(UNION)UNION 指令的目的是将两个 SQL 语句的结果合并起来。另外,当我们用UNION这个指令时,我们只会看到不同的资料值。

UNION 的语法如下:

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

    为了举例union用法,我们新建数据库表Internet_Sales:

Create table Internet_Sales(

     Date date,

     Sales int

);

  INSERT INTOInternet_Sales (date, sales) VALUES ('1999-02-05', 250);

INSERT INTOInternet_Sales (date, sales) VALUES ('1999-02-25', 250);

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

SELECTDate FROM Store_Information UNION SELECT Date FROM Internet_Sales

 

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

 UNION ALL 的语法如下:

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

 

1.18、(concatenate)有时候我们需要将不同栏位获得的资料连在一起,mysql提供的函数是CONCAT(),CONCAT的语法如下:

CONCAT(字串1, 字串2, 字串3, ...): 将字串1、字串2、字串3等字符串连在一起。

    例如对于表geography使用语句:

SELECTCONCAT(region_name,store_name) FROM Geography WHERE store_name = 'Boston';

得到的结果:EASTBoston

 

1.19、(substring)SQL中的substring 函数是用来抓出一个栏位资料中的其中一部分。

最常用的方式如下:

SUBSTR(str, pos):其中,选出所有从第pos位置开始的字元。

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

举两个例子如下:

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

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

 

1.20、(trim) SQL 中的TRIM函数是用来移除掉一个字串中的字头或字尾。最常见的用途是移除字首或字尾的空白

 例1: SELECT TRIM('Sample '); 结果: 'Sample'

 例2: SELECT LTRIM(' Sample'); 结果: 'Sample '

 例3: SELECT RTRIM(' Sample'); 结果: ' Sample'


二、create view

    视观表 (Views) 可以被当作是虚拟表格。它跟表格的不同是,表格中有实际储存资料,而视观表是建立在表格之上的一个架构,它本身并不实际储存资料。

建立一个视观表的语法如下: 

CREATEVIEW "VIEW_NAME" AS "SQL 语句"

    我们也可以用视观表来连接两个表格。在这个情况下,使用者就可以直接由一个视观表中找出她要的资讯,而不需要由两个不同的表格中去做一次连接的动作。

我们可以用以下的指令来建一个包括每个地区 (region) 销售额 (sales) 的视观表:

  CREATE VIEWV_REGION_SALES AS SELECT A1.region_name REGION, SUM(A2.Sales) SALES FROMGeography A1, Store_Information A2 WHERE A1.store_name = A2.store_name GROUP BYA1.region_name

这就给我们有一个名为 V_REGION_SALES的视观表。这个视观表包含不同地区的销售哦。如果我们要从这个视观表中获取资料,我们就打入:

SELECT * FROMV_REGION_SALES


三、Update 

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

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

    例如更新san diego的销售额,可以输入

UPDATEStore_Information SET Sales = 500 WHERE store_name = " San Diego"


四、Delete

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

    它的语法是: 

DELETEFROM "表格名" WHERE {条件}

    当我们需要将有关 Los Angeles 的资料全部去除。在这里我们可以用以下的 SQL来达到这个目的: 

DELETE FROM Store_InformationWHERE store_name = "Los Angeles"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值