1、 表格处理: SQL 如何被用来处理数据库中的表格。 进阶 SQL: 介绍 SQL 进阶概念,以及如何用 SQL 来执行一些较复杂的运算。 SQL 语法: 这一页列出所有在这个教材中被提到的 SQL 语法。对于每一个指令,我们将会先列出及解释这个指令的语法,然后用一个例子来让读者了解这 个指令是如何被运用的。当您读完了这个网站的所有教材后,您将对 SQL 的语法会有一个 大致上的了解。另外,您将能够正确地运用 SQL 来由数据库中获取信息。笔者本身的经验 是,虽然要对 SQL 有很透彻的了解并不是一朝一夕可以完成的,可是要对 SQL 有个基本 的了解并不难。希望在看完这个网站后,您也会有同样的
2、想法。修改表名:altertabletestrenametest1;-修改表名添加表列:addcolumnnamevarchar(10);-添加表列删除表列:dropname;-删除表列修改表列类型:modifyaddresschar(10)-修改表列类型 或 alterchangechar(40)是用来做什么的呢?一个最常用的方式是将资料从数据库中的表格内选出。从这一句回答 中,我们马上可以看到两个关键字: 从 (FROM) 数据库中的表格内选出 (SELECT)。(表 格是一个数据库内的结构,它的目的是储存资料。在表格处理这一部分中,我们会提到如何 使用 SQL 来设定表格。) 我们由这里
3、可以看到最基本的 SQL 架构:SELECT 栏位名 FROM 表格名我们用以下的例子来看看实际上是怎么用的。假设我们有以下这个表格:store_nameSalesDateLos Angeles$1500Jan-05-1999San Diego$250Jan-07-1999$300Jan-08-1999Boston$700更改上表中的第1列的列名:address1varchar(30)-修改表列名更改列名后如下:若要选出所有的店名 (store_Name),我们就打入:SELECT store_name FROM Store_Information结果:我们一次可以读取好几个栏位,也可以同时由
4、好几个表格中选资料。SELECT 指令让我们能够读取表格中一个或数个栏位的所有资料。这将把所有的资料都抓 出,无论资料值有无重复。在资料处理中,我们会经常碰到需要找出表格内的不同资料值的 情况。换句话说,我们需要知道这个表格/栏位内有哪些不同的值,而每个值出现的次数并 不重要。这要如何达成呢?在 SQL 中,这是很容易做到的。我们只要在 SELECT 后加上 一个 DISTINCT 就可以了。DISTINCT 的语法如下:SELECT DISTINCT FROM 举例来说,若要在以下的表格,Store_Information,找出所有不同的店名时,Store_Information 表格我们就
5、键入,SELECT DISTINCT store_name FROM Store_Information我们并不一定每一次都要将表格内的资料都完全抓出。在许多时候,我们会需要选择性地抓 资料。就我们的例子来说,我们可能只要抓出营业额超过 $1,000 的资料。要做到这一点, 我们就需要用到 WHERE 这个指令。这个指令的语法如下:WHERE 条件若我们要由以下的表格抓出营业额超过 $1,000 的资料,SELECT store_nameFROM Store_InformationWHERE Sales 1000store_name Los AngelesAND OR在上一页中,我们看到 WH
6、ERE 指令可以被用来由表格中有条件地选取资料。 这个条件 可能是简单的 (像上一页的例子),也可能是复杂的。复杂条件是由二或多个简单条件透过 AND 或是 OR 的连接而成。一个 SQL 语句中可以有无限多个简单条件的存在。复杂条件的语法如下: WHERE 简单条件AND|OR + 代表之内的情况会发生一或多次。在这里的意思就是 AND 加简单条件及 OR 加简 单条件的情况可以发生一或多次。另外,我们可以用 () 来代表条件的先后次序。举例来说,我们若要在 Store_Information 表格中选出所有 Sales 高于 $1,000 或是 Sales在 $500 及 $275 之间的
7、资料的话,San FranciscoOR (Sales 275)store_name Los Angeles San FranciscoINSELECT * FROM store_information WHERE store_name IN (Los Angeles ,San Diego)执行结果如下:SELECT * FROM store_information WHERE store_name = OR store_name = BetweenSELECT * FROM store_information WHERE datet BETWEEN 2015-07-06 AND 2015-0
8、7-10SELECT * FROM store_information WHERE sales BETWEEN 400 AND 2000LIKELIKE是另一个在WHERE子句中会用到的指令。基本上,LIKE能让我们依据一个模式(pattern)来找出我们要的资料.相对来说,在运用IN的时候,我们完全地知道我们需要的条件;在运用BETWEN的时候,我们则是列出一个范围。LIKE的语法如下:SELECT “栏位名“ FROM “表格名” WHERE “栏位名” LIKE 模式模式经常包括野卡(wildcard)。SELECT * FROM store_information WHERE stor
9、e_name LIKE %AN%ORDER BY到目前为止,我们已经学到如何藉由SELECT及WHERE这两个指令将资料由表格中抓出。不过我们尚未提到这些资料要如何排练。这其实是一个很重要的问题。事实上,我们经常需要能够将抓出的资料做一个有联系的显示。这可能是由小往大(ascending)或是由大往小(descending)。在这种情况下,我们就可以运用ORDER BY这个指令来达到我们的目的.ORDER BY语法如下:SELECT “栏位名” FROM “表格名” WHERE “条件” ORDER BY “栏位名” ASC ,DESCSELECT store_name,sales,datet
10、 FROM store_information ORDER BY sales DESCSELECT store_name,sales,datet FROM store_information ORDER BY 3 DESC既然数据可中有许多资料都是以数字的型态存在,一个很重要的用途就是对这些数字做一些运算,例如将它们总会起来,或是找出它们的平均值。SQL提供了一些函数如下:AVG(平均)COUNT(计数)MAX(最大值)MIN(最小值)SUM(总合)运用函数的语法是:SELECT “函数名”(“栏位名”) FROM “表格名”例如:SELECT COUNT(sales) FROM store_
11、informationSELECT SUM(sales) FROM store_informationSELECT MAX(sales) FROM store_informationSELECT MIN(sales) FROM store_informationSELECT AVG(sales) FROM store_informationCOUNT在上一页有提到,COUNT是函数之一。由于它的使用广泛,我们在这里特别提出来讨论。基本上,COUNT让我们能够数出表格中有多少笔资料被选出来。它的语法是:SELECT COUNT(“栏位名”) FROM “表格名”SELECT COUNT(stor
12、e_name) FROM store_information WHERE store_name IS NOT NULLGROUP BY 我们现在回到函数上。记得我们用SUM这个指令来计算出所有的sales(营业额)吧!如果我们的需求变成是要算出每一间店(store_name)的营业额,那么怎么算呢?这个情况下,我们要做到两件事:第一,我们对于store_name及sales这两个栏位都要选出。第二我们需要确认所有的sales都要依照各个store_name来分开算。这个语法为:SELECT “栏位1”,SUM(“栏位2”) FROM “表格名” GROUP BY “栏位1”SELECT sto
13、re_name,SUM(sales) FROM store_information GROUP BY store_nameHAVING那我们如何对函数产生的值来设定条件呢?举例来说,我们可能只需要知道哪些店的营业额有超过1500。在这个情况下,我们不能使用WHERE的指令。那要怎么办呢?很幸运地,SQL有提供一个HAVING的指令,而我们就可以用这个指令来达到这个目标。HAVING子句通常是在一个SQL句子的最后,一个含有HAVING子句的SQL并不一定要包含GROUP BY子句。HAVING子句的语法如下:SELECT “栏位1” ,SUM(“栏位2”) FROM “表格名” GROUP B
14、Y “栏位1” HAVING(函数条件)SELECT store_name,SUM(sales) FROM store_information GROUP BY store_name HAVING SUM(sales)1500ALIAS接下来,我们讨论alias(别名)在SQL上的用处。最常用到的别名有两种:栏位别名及表格别名。简单地来说,栏位别名的目的是为了让SQL产生的结果易读。在之前的例子中,每当我们有营业额总合时,栏位名都是SUM(sales)。虽然在这个情况下没有什么问题,可是如果这个栏位不是一个简单的总合,而是一个复杂的计算,那栏位名就没有这么易懂了。若我们用栏位别名的话,就可以确
15、认结果中的栏位名是简单易懂的。第二种别名是表格别名。要给一个表格取一个别名,只要在FROM子句中的表格名后空一格,然后再列出要用的表格别名就可以了。这在我们要用SQL由数个不同的表格中获取资料时是很方便的。这一点我们在之后谈到连接(join)时会看到.我们先来看一下栏位别名合表格别名的语法:SELECT “表格别名” “栏位1” “栏位别名” FROM “表格名” “表格别名”SELECT A1.store_name store,SUM(A1.sales)Total sales FROM store_information A1 GROUP BY A1.store_nameSELECT A1.
16、region_name ,SUM(A2.sales) sales FROM geography A1,store_information A2 WHERE A1.store_name = A2.store_nameGROUP BY A1.region_name删掉上面SQL语句中的salesSELECT A1.region_name ,SUM(A2.sales) FROM geography A1,store_information A2 SELECT A1.region_name region ,SUM(A2.sales) sales FROM geography A1,store_info
17、rmation A2 没有别名的情况:SELECT geography.region_name, SUM(store_information.sales) FROM geography,store_information WHERE geography.store_name = store_information.store_nameGROUP BY geography.region_name有时候,我们有需要将由不同栏位获得的资料串联在一起,每种数据库都有提供方法来达到这个目的:MySQL:CONCAT()Oracle:CONCAT(),|SQL Server: +CONCAT()的语法如下
18、:CONCAT(字符串1,字符串2,字符串3,.):将字符串1、字符串2、字符串3,等字符串连在一起。请注意,Oracle的CONCATO()只允许两个参数;换言之,一次只能将两个字符串串连起来。不过,在Oracle中,我们可以用|来一次串连多个字符串。 表 geographyregion_nameStore_nameEastNew YorkWest表 store_informationsalesdatat2015-07-052502015-07-073002015-07-08700MySQL/OracleSELECT CONCAT(region_name,store_name)FROM ge
19、ography WHERE store_name = Boston;SQL中的substring函数是用来抓住一个栏位资料中的其中一部分。这个函数的名称在不同的数据库中不完全一样:SUBSTR( ),SUBSTRING( )SUBSTR( )SUBSTRING( )最常用到的方式如下(我们用SUBSTR( )为例):SUBSTR(str,pos):由中,选出所有从第位置开始的字符。请注意,这个语法不适用于 SQL Server上。SUBSTR(str,pos,len):中的第位置开始,选出接下去的格字符。假设我们有以下的表格:例1: SELECT SUBSTR(store_name,3) FR
20、OM geography WHERE store_name = 例2:SELECT SUBSTR(store_name,2,4) FROM geography WHERE store_name = SQL中的TRIM函数是用来移除掉一个字符串中的字头或字尾。最常见的用途是移除字首或字尾的空白。这个函数在不同的数据库中有不同的名称:TRIM(),RTRIM(),LTRIM()RTRIM(),LTRIM()各种trim函数的语法如下:TRIM(位置 要移除的字符串 FROM 字符串): 位置 的可能值为 LEADING (起头),TRAILING (结尾), or BOTH (起头及结尾)。 这个
21、函数将把 要移除的字符串 从字符串的起头、结尾,或是起头及结尾移除。如果我们没有列出 要移除的字符串 是什么的话,那空白就会被移除。LTRIM(字符串): 将所有字符串起头的空白移除。RTRIM(字符串): 将所有字符串结尾的空白移除。例 1:SELECT TRIM( Sample );Sample例 2:SELECT LTRIM(Sample 例 3:SELECT RTRIM( Sample表格是数据库中储存资料的基本架构。在绝大部份的情况下,数据库厂商不可能知道您需要如何储存您的资料,所以通常您会需要自己在数据库中建立表格。虽然许多数据库工具可以让您在不需用到 SQL 的情况下建立表格,不
22、过由于表格是一个最基本的架构,我们决定包括 CREATE TABLE 的语法在这个网站中。在我们跳入 CREATE TABLE 的语法之前,我们最好先对表格这个东西有些多一点的了解。表格被分为栏位 (column) 及列位 (row)。每一列代表一笔资料,而每一栏代表一笔资料的一部份。举例来说,如果我们有一个记载顾客资料的表格,那栏位就有可能包括姓、名、地址、城市、国家、生日等等。当我们对表格下定义时,我们需要注明栏位的标题,以及那个栏位的资料种类。那,资料种类是什么呢?资料可能是以许多不同的形式存在的。它可能是一个整数 (例如1),、一个实数 (例如 0.55)、一个字符串 (例如 sql)
23、、一个日期/时间 (例如 2000-JAN-2503: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
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1