表格是数据库中储存资料的基本架构.在绝大部份的情况下,数据库厂商不可能知道您需要如何储存您的资料,所以通常您会需要自己在数据库中建立表格.虽然许多数据库工具可以让您在不需用到 SQL 的情况下建立表格,不过由于表格是一个最基本的架构,我们决定包括 CREATE TABLE的语法在这个网站中. 在我们跳入 CREATE TABLE 的语法之前,我们最好先对表格这个东西有些多一点的了解.表格被分为栏位 (column) 及列位 (row).每一列代表一笔资料,而每一栏代表一笔资料的一部份.举例来说,…
视观表 (View) 可以被当作是虚拟表格.它跟表格的不同是,表格中有实际储存资料,而视观表是建立在表格之上的一个架构,它本身并不实际储存资料. 建立一个视观表的语法如下: CREATE VIEW "VIEW_NAME" AS "SQL 语句"; "SQL 语句" 可以是任何一个我们在这个教材中有提到的 SQL. 来看一个例子.假设我们有以下的表格: Customer 表格 栏位名称 资料种类 First_Name char(50) Last_N…
在表格被建立在资料库中后,我们常常会发现,这个表格的结构需要有所改变.常见的改变如下: 加一个栏位 删去一个栏位 改变栏位名称 改变栏位的资料种类 以上列出的改变并不是所有可能的改变.ALTER TABLE 也可以被用来作其他的改变,例如改变主键定义. ALTER TABLE 的语法如下: ALTER TABLE "table_name" [改变方式]; [改变方式] 的详细写法会依我们想要达到的目标而有所不同.再以上列出的改变中,[改变方式] 如下: 加一个栏位: ADD "…
索引 (Index) 可以帮助我们从表格中快速地找到需要的资料.举例来说,假设我们要在一本园艺书中找如何种植青椒的讯息.若这本书没有索引的话,那我们是必须要从头开始读,直到我们找到有关种直青椒的地方为止.若这本书有索引的话,我们就可以先去索引找出种植青椒的资讯是在哪一页,然后直接到那一页去阅读.很明显地,运用索引是一种有效且省时的方式. 从资料库表格中寻找资料也是同样的原理.如果一个表格没有索引的话,资料库系统就需要将整个表格的资料读出 (这个过程叫做'table scan').若有适当的索引存…
主键 (Primary Key) 中的每一笔资料都是表格中的唯一值.换言之,它是用来独一无二地确认一个表格中的每一行资料.主键可以是原本资料内的一个栏位,或是一个人造栏位 (与原本资料没有关系的栏位).主键可以包含一或多个栏位.当主键包含多个栏位时,称为组合键 (Composite Key). 主键可以在建置新表格时设定 (运用 CREATE TABLE 语句),或是以改变现有的表格架构方式设定 (运用 ALTER TABLE). 以下举几个在建置新表格时设定主键的方式: MySQL: CREA…
本教程参考http://www.1keydata.com/cn/sql/ 目的是让初学者了解linux下Mysql的操作,但是我仍想侧重于SQL语句的讲解 sql语句的学习将按照下图的流程: 当然在这之前我们需要简单了解下linux下mysql的安装,以及基本操作. 关于如何安装和使用linux下mysql请参考:http://blog.csdn.net/u013018721/article/details/34889367 转载请注明:vpoet…
到目前为止,我们学到了将如何把资料由表格中取出.但是这些资料是如果进入这些表格的呢? 这就是这一页 (INSERT INTO) 和下一页 (UPDATE) 要讨论的. 基本上,我们有两种作法可以将资料输入表格中内.一种是一次输入一笔,另一种是一次输入好几笔.我们先来看一次输入一笔的方式. 依照惯例,我们先介绍语法.一次输入一笔资料的语法如下: INSERT INTO "表格名" ("栏位1", "栏位2", ...) VALUES ("…
有时候我们会决定我们需要从数据库中清除一个表格.事实上,如果我们不能这样做的话,那将会是一个很大的问题,因为数据库管理师 (Database Administrator -- DBA) 势必无法对数据库做有效率的管理.还好,SQL 有提供一个 DROP TABLE 的语法来让我们清除表格. DROP TABLE 的语法是: DROP TABLE "表格名"; 我们如果要清除在SQL CREATE 中建立的顾客表格,我们就打入: DROP TABLE Customer; 有时候我们会需要…
UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起. UNION ALL 和UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复. UNION ALL 的语法如下: [SQL 语句 1] UNION ALL [SQL 语句 2]; 我们用和上一页同样的例子来显示出 UNION ALL 和 UNION 的不同.同样假设我们有以下两个表格, Store_Information 表格 Store_Name Sales Txn_Da…
UNION 指令的目的是将两个 SQL 语句的结果合并起来.从这个角度来看, UNION 跟 JOIN有些许类似,因为这两个指令都可以由多个表格中撷取资料. UNION 的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类.另外,当我们用 UNION 这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT). UNION 的语法如下: [SQL 语句 1] UNION [SQL 语句 2]; 假设我们有以下的两个表格, Store_Information 表格 S…
我们可以在一个 SQL 语句中放入另一个 SQL 语句.当我们在 WHERE 子句或 HAVING 子句中插入另一个 SQL 语句时,我们就有一个 subquery 的架构. Subquery 的作用是什么呢?第一,它可以被用来连接表格.另外,有的时候 subquery 是唯一能够连接两个表格的方式. Subquery 的语法如下: SELECT "栏位1"  FROM "表格"  WHERE "栏位2" [比较运算素]  (SELECT &qu…
在上一页中,我们看到 WHERE 指令可以被用来由表格中有条件地选取资料. 这个条件可能是简单的 (像上一页的例子),也可能是复杂的.复杂条件是由二或多个简单条件透过 AND 或是 OR的连接而成.一个 SQL 语句中可以有无限多个简单条件的存在. 复杂条件的语法如下: SELECT "栏位名"  FROM "表格名"  WHERE "简单条件"  {[AND|OR] "简单条件"}+; {}+ 代表{}之内的情况会发生一或多…
我们有时候可能会需要修改表格中的资料.在这个时候,我们就需要用到 UPDATE 指令.这个指令的语法是: UPDATE "表格名" SET "栏位1" = [新值] WHERE "条件"; 最容易了解这个语法的方式是透过一个例子.假设我们有以下的表格: Store_Information 表格 Store_Name Sales Txn_Date Los Angeles 1500 05-Jan-1999 San Diego 250 07-Jan-1…
SQL是用来做什么的呢?一个最常用的方式是将资料从数据库中的表格内选出.从这一句回答中,我们马上可以看到两个关键字: 从 (FROM) 数据库中的表格内 选出 (SELECT).(表格是一个数据库内的结构,它的目的是储存资料.在 表格处理这一部分中,我们会提到如何使用 SQL 来设定表格.) 我们由这里可以看到最基本的 SQL 架构: SELECT "栏位名" FROM "表格名"; 我们用以下的例子来看看实际上是怎么用的.假设我们有以下这个表格: Store_In…
SQL 中的 TRIM 函数是用来移除掉一个字串中的字头或字尾.最常见的用途是移除字首或字尾的空白.这个函数在不同的资料库中有不同的名称: MySQL: TRIM( ), RTRIM( ), LTRIM( ) Oracle: RTRIM( ), LTRIM( ) SQL Server: RTRIM( ), LTRIM( ) 各种 trim 函数的语法如下: TRIM ( [ [位置] [要移除的字串] FROM ] 字串): [位置] 的可能值为 LEADING (起头), TRAILING (…
SQL 中的 substring 函数是用来抓出一个栏位资料中的其中一部分.这个函数的名称在不同的资料库中不完全一样: MySQL: SUBSTR( ), SUBSTRING( ) Oracle: SUBSTR( ) SQL Server: SUBSTRING( ) 最常用到的方式如下 (在这里我们用 SUBSTR( ) 为例): SUBSTR (str, pos) 由 <str> 中,选出所有从第 <pos> 位置开始的字元.请注意,这个语法不适用于 SQL Server 上.…
有的时候,我们有需要将由不同栏位获得的资料串连在一起.每一种资料库都有提供方法来达到这个目的: MySQL: CONCAT( ) Oracle: CONCAT( ), || SQL Server: + CONCAT( ) 的语法如下: CONCAT (字串1, 字串2, 字串3, ...) 将字串1.字串2.字串3,等字串连在一起.请注意,Oracle 的 CONCAT( ) 只允许两个参数:换言之,一次只能将两个字串串连起来.不过,在Oracle中,我们可以用 '||' 来一次串连多个字串.…
之前我们看到的左连接 (left join),又称内部连接 (inner join).在这个情况下,要两个表格内都有同样的值,那一笔资料才会被选出.那如果我们想要列出一个表格中每一笔的资料,无论它的值在另一个表格中有没有出现,那该怎么办呢?在这个时候,我们就需要用到 SQL OUTER JOIN(外部连接) 的指令. 外部连接的语法是依数据库的不同而有所不同的.举例来说,在 Oracle 上,我们会在 WHERE子句中要选出所有资料的那个表格之后加上一个 "(+)" 来代表说这个表格中…
现在我们介绍连接 (Join) 的概念.要了解连接,我们需要用到许多我们之前已介绍过的指令.我们先假设我们有以下的两个表格, Store_Information 表格 Store_Name Sales Txn_Date Los Angeles 1500 05-Jan-1999 San Diego 250 07-Jan-1999 Los Angeles 300 08-Jan-1999 Boston 700 08-Jan-1999 Geography 表格 Region_Name Store_Nam…
接下来,我们讨论 alias (别名) 在 SQL 上的用处.最常用到的别名有两种: 栏位别名及表格别名. 简单地来说,栏位别名的目的是为了让 SQL 产生的结果易读.在之前的例子中,每当我们有营业额总合时,栏位名都是 SUM(Sales). 虽然在这个情况下没有什么问题,可是如果这个栏位不是一个简单的总合,而是一个复杂的计算,那栏位名就没有这么易懂了.若我们用栏位别名的话,就可以确认结果中的栏位名是简单易懂的. 第二种别名是表格别名.要给一个表格取一个别名,只要在 FROM 子句中的表格名后空…
那我们如何对函数产生的值来设定条件呢?举例来说,我们可能只需要知道哪些店的营业额有超过 $1,500.在这个情况下,我们不能使用 WHERE 的指令.那要怎么办呢?很幸运地,SQL 有提供一个 HAVING 的指令,而我们就可以用这个指令来达到这个目标. HAVING 子句通常是在一个 SQL 句子的最后.一个含有 HAVING 子句的 SQL 并不一定要包含 GROUP BY 子句.HAVING 的语法如下: SELECT "栏位1", SUM("栏位2")  F…
既然数据库中有许多资料都是已数字的型态存在,一个很重要的用途就是要能够对这些数字做一些运算,例如将它们总合起来,或是找出它们的平均值.SQL 有提供一些这一类的函数.它们是: AVG (平均) COUNT (计数) MAX (最大值) MIN (最小值) SUM (总合) 运用函数的语法是: SELECT "函数名"("栏位名")  FROM "表格名"; 举例来说,若我们要由我们的示范表格中求出 Sales 栏位的总合, Store_Infor…
到目前为止,我们已学到如何藉由 SELECT 及WHERE 这两个指令将资料由表格中抓出.不过我们尚未提到这些资料要如何排列.这其实是一个很重要的问题.事实上,我们经常需要能够将抓出的资料做一个有系统的显示.这可能是由小往大 (ascending) 或是由大往小 (descending).在这种情况下,我们就可以运用 ORDER BY这个指令来达到我们的目的. ORDER BY 的语法如下: SELECT "栏位名"  FROM "表格名"  [WHERE &quo…
在 SQL 中,在两个情况下会用到 IN 这个指令:这一页将介绍其中之一 -- 与 WHERE 有关的那一个情况.在这个用法下,我们事先已知道至少一个我们需要的值,而我们将这些知道的值都放入IN 这个子句. IN 指令的 语法为下: SELECT "栏位名"  FROM "表格名"  WHERE "栏位名" IN ('值一', '值二', ...); 在括弧内可以有一或多个值,而不同值之间由逗点分开.值可以是数目或是文字.若在括弧内只有一个值,那…
SELECT 指令让我们能够读取表格中一个或数个栏位的所有资料.这将把所有的资料都抓出,无论资料值有无重复.在资料处理中,我们会经常碰到需要找出表格内的不同资料值的情况.换句话说,我们需要知道这个表格/栏位内有哪些不同的值,而每个值出现的次数并不重要.这要如何达成呢?在 SQL 中,这是很容易做到的.我们只要在 SELECT 后加上一个 DISTINCT 就可以了.DISTINCT 的语法如下: SELECT DISTINCT "栏位名"  FROM "表格名";…
我们现在回到函数上.记得我们用 SUM 这个指令来算出所有的 Sales (营业额)吧!如果我们的需求变成是要算出每一间店 (Store_Name) 的营业额 (Sales),那怎么办呢?在这个情况下,我们要做到两件事:第一,我们对于 Store_Name 及 Sales 这两个栏位都要选出.第二,我们需要确认所有的 Sales 都要依照各个 Store_Name 来分开算.这个语法为: SELECT "栏位1", SUM("栏位2")  FROM "表格…
在上一页有提到,COUNT 是函数之一.由于它的使用广泛,我们在这里特别提出来讨论.基本上,COUNT 让我们能够数出在表格中有多少笔资料被选出来.它的语法是: SELECT COUNT("栏位名")  FROM "表格名"; 举例来说,若我们要找出我们的示范表格中有几笔 store_name 栏不是空白的资料时, Store_Information 表格 Store_Name Sales Txn_Date Los Angeles 1500 05-Jan-1999…
LIKE 是另一个在 WHERE 子句中会用到的指令.基本上,LIKE 能让我们依据一个套式 (pattern) 来找出我们要的资料.相对来说,在运用 IN 的时候,我们完全地知道我们需要的条件:在运用 BETWEEN 的时候,我们则是列出一个范围. LIKE 的语法如下: SELECT "栏位名"  FROM "表格名"  WHERE "栏位名" LIKE {套式}; {套式} 经常包括野卡 (wildcard). 以下是几个例子: 'A_Z'…
IN 这个指令可以让我们依照一或数个不连续 (discrete) 的值的限制之内抓出数据库中的值,而BETWEEN 则是让我们可以运用一个范围 (range) 内抓出数据库中的值.BETWEEN 这个子句的语法如下: SELECT "栏位名"  FROM " 表格名"  WHERE "栏位名" BETWEEN '值一' AND '值二'; 这将选出栏位值包含在值一及值二之间的每一笔资料. 举例来说,若我们要由 Store_Information …
我们并不一定每一次都要将表格内的资料都完全抓出.在许多时候,我们会需要选择性地抓资料.就我们的例子来说,我们可能只要抓出营业额超过 $1,000 的资料.要做到这一点,我们就需要用到 WHERE 这个指令.这个指令的语法如下: SELECT "栏位名"  FROM "表格名"  WHERE "条件"; 若我们要由以下的表格抓出营业额超过 $1,000 的资料, Store_Information 表格 Store_Name Sales Txn_D…