计算机软件及应用SQL语句超详细教程.docx
- 文档编号:11111145
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:26
- 大小:25.92KB
计算机软件及应用SQL语句超详细教程.docx
《计算机软件及应用SQL语句超详细教程.docx》由会员分享,可在线阅读,更多相关《计算机软件及应用SQL语句超详细教程.docx(26页珍藏版)》请在冰豆网上搜索。
计算机软件及应用SQL语句超详细教程
我们可以在一个SQL语句中放入另一个SQL语句。
当我们在WHERE子句或WHERE子句或HAVING子句中插入另一个SQL语句时,我们就有一个subquery的架构。
Subquery的作用是什么呢?
第一,它可以被用来连接表格。
另外,有的时候subquery是唯一能够连接两个表格的方式。
Subquery的语法如下:
SELECT"栏位1"
FROM"表格"
WHERE"栏位2"[比较运算素]
(SELECT"栏位1"
FROM"表格"
WHERE[条件])
[比较运算素]可以是相等的运算素,例如=,>,<,>=,<=.这也可以是一个对文字的运算素,例如"LIKE."
我们就用刚刚在阐述SQL连接时用过的例子:
Store_Information表格
store_name
Sales
Date
LosAngeles
$1500
Jan-05-1999
SanDiego
$250
Jan-07-1999
LosAngeles
$300
Jan-08-1999
Boston
$700
Jan-08-1999
Geography表格
region_name
store_name
East
Boston
East
NewYork
West
LosAngeles
West
SanDiego
我们要运用subquery来找出所有在西部的店的营业额。
我们可以用下面的SQL来达到我们的目的:
SELECTSUM(Sales)FROMStore_Information
WHEREStore_nameIN
(SELECTstore_nameFROMGeography
WHEREregion_name='West')
结果:
SUM(Sales)
2050
在这个例子中,我们并没有直接将两个表格连接起来,然后由此直接算出每一间西区店面的营业额。
我们做的是先找出哪些店是在西区的,然后再算出这些店的营业额总共是多少。
UNION指令的目的是将两个SQL语句的结果合并起来。
从这个角度来看,UNION跟JOIN有些许类似,因为这两个指令都可以由多个表格中撷取资料。
UNION的一个限制是两个SQL语句所产生的栏位需要是同样的资料种类。
另外,当我们用UNION这个指令时,我们只会看到不同的资料值(类似SELECTDISTINCT)。
UNION的语法如下:
[SQL语句1]
UNION
[SQL语句2]
假设我们有以下的两个表格,
Store_Information表格
store_name
Sales
Date
LosAngeles
$1500
Jan-05-1999
SanDiego
$250
Jan-07-1999
LosAngeles
$300
Jan-08-1999
Boston
$700
Jan-08-1999
InternetSales表格
Date
Sales
Jan-07-1999
$250
Jan-10-1999
$535
Jan-11-1999
$320
Jan-12-1999
$750
而我们要找出来所有有营业额(sales)的日子。
要达到这个目的,我们用以下的SQL语句:
SELECTDateFROMStore_Information
UNION
SELECTDateFROMInternet_Sales
结果:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999
有一点值得注意的是,如果我们在任何一个SQL语句(或是两句都一起)用"SELECTDISTINCTDate"的话,那我们会得到完全一样的结果。
UNIONALL这个指令的目的也是要将两个SQL语句的结果合并在一起。
UNIONALL和UNION不同之处在于UNIONALL会将每一笔符合条件的资料都列出来,无论资料值有无重复。
UNIONALL的语法如下:
[SQL语句1]
UNIONALL
[SQL语句2]
我们用和上一页同样的例子来显示出UNIONALL和UNION的不同。
同样假设我们有以下两个表格,
Store_Information表格
store_name
Sales
Date
LosAngeles
$1500
Jan-05-1999
SanDiego
$250
Jan-07-1999
LosAngeles
$300
Jan-08-1999
Boston
$700
Jan-08-1999
InternetSales表格
Date
Sales
Jan-07-1999
$250
Jan-10-1999
$535
Jan-11-1999
$320
Jan-12-1999
$750
而我们要找出有店面营业额以及网络营业额的日子。
要达到这个目的,我们用以下的SQL语句:
SELECTDateFROMStore_Information
UNIONALL
SELECTDateFROMInternet_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
和UNION指令类似,INTERSECT也是对两个SQL语句所产生的结果做处理的。
不同的地方是,UNION基本上是一个OR(如果这个值存在于第一句或是第二句,它就会被选出),而INTERSECT则比较像AND(这个值要存在于第一句和第二句才会被选出)。
UNION是联集,而INTERSECT是交集。
INTERSECT的语法如下:
[SQL语句1]
INTERSECT
[SQL语句2]
假设我们有以下的两个表格,
Store_Information表格
store_name
Sales
Date
LosAngeles
$1500
Jan-05-1999
SanDiego
$250
Jan-07-1999
LosAngeles
$300
Jan-08-1999
Boston
$700
Jan-08-1999
InternetSales表格
Date
Sales
Jan-07-1999
$250
Jan-10-1999
$535
Jan-11-1999
$320
Jan-12-1999
$750
而我们要找出哪几天有店面交易和网络交易。
要达到这个目的,我们用以下的SQL语句:
SELECTDateFROMStore_Information
INTERSECT
SELECTDateFROMInternet_Sales
结果:
Date
Jan-07-1999
请注意,在INTERSECT指令下,不同的值只会被列出一次。
MINUS指令是运用在两个SQL语句上。
它先找出第一个SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果中。
如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。
如果第二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料就被抛弃。
MINUS的语法如下:
[SQL语句1]
MINUS
[SQL语句2]
我们继续使用一样的例子:
Store_Information表格
store_name
Sales
Date
LosAngeles
$1500
Jan-05-1999
SanDiego
$250
Jan-07-1999
LosAngeles
$300
Jan-08-1999
Boston
$700
Jan-08-1999
InternetSales表格
Date
Sales
Jan-07-1999
$250
Jan-10-1999
$535
Jan-11-1999
$320
Jan-12-1999
$750
而我们要知道有哪几天是有店面营业额而没有网络营业额的。
要达到这个目的,我们用以下的SQL语句:
SELECTDateFROMStore_Information
MINUS
SELECTDateFROMInternet_Sales
结果:
Date
Jan-05-1999
Jan-08-1999
"Jan-05-1999","Jan-07-1999",and"Jan-08-1999"是"SELECTDateFROMStore_Information"所产生的结果。
在这里面,"Jan-07-1999"是存在于"SELECTDateFROMInternet_Sales"所产生的结果中。
因此"Jan-07-1999"并不在最后的结果中。
请注意,在MINUS指令下,不同的值只会被列出一次。
有的时候,我们有需要将由不同栏位获得的资料串连在一起。
每一种资料库都有提供方法来达到这个目的:
∙MySQL:
CONCAT()
∙Oracle:
CONCAT(),||
∙SQLServer:
+
CONCAT()的语法如下:
CONCAT(字串1,字串2,字串3,...):
将字串1、字串2、字串3,等字串连在一起。
请注意,Oracle的CONCAT()只允许两个参数;换言之,一次只能将两个字串串连起来。
不过,在Oracle中,我们可以用'||'来一次串连多个字串。
来看几个例子。
假设我们有以下的表格:
Geography表格
region_name
store_name
East
Boston
East
NewYork
West
LosAngeles
West
SanDiego
例子1:
MySQL/Oracle:
SELECTCONCAT(region_name,store_name)FROMGeography
WHEREstore_name='Boston';
结果:
'EastBoston'
例子2:
Oracle:
SELECTregion_name||''||store_nameFROMGeography
WHEREstore_name='Boston';
结果:
'EastBoston'
例子3:
SQLServer:
SELECTregion_name+''+store_nameFROMGeography
WHEREstore_name='Boston';
结果:
'EastBoston'
SQLSubstring函数>>
SQL中的substring函数是用来抓出一个栏位资料中的其中一部分。
这个函数的名称在不同的资料库中不完全一样:
∙MySQL:
SUBSTR(),SUBSTRING()
∙Oracle:
SUBSTR()
∙SQLServer:
SUBSTRING()
最常用到的方式如下(在这里我们用SUBSTR()为例):
SUBSTR(str,pos):
由
请注意,这个语法不适用于SQLServer上。
SUBSTR(str,pos,len):
由
假设我们有以下的表格:
Geography表格
region_name
store_name
East
Boston
East
NewYork
West
LosAngeles
West
SanDiego
例1:
SELECTSUBSTR(store_name,3)
FROMGeography
WHEREstore_name='LosAngeles';
结果:
'sAngeles'
例2:
SELECTSUBSTR(store_name,2,4)
FROMGeography
WHEREstore_name='SanDiego';
结果:
'anD'
SQL中的TRIM函数是用来移除掉一个字串中的字头或字尾。
最常见的用途是移除字首或字尾的空白。
这个函数在不同的资料库中有不同的名称:
∙MySQL:
TRIM(),RTRIM(),LTRIM()
∙Oracle:
RTRIM(),LTRIM()
∙SQLServer:
RTRIM(),LTRIM()
各种trim函数的语法如下:
TRIM([[位置][要移除的字串]FROM]字串):
[位置]的可能值为LEADING(起头),TRAILING(结尾),orBOTH(起头及结尾)。
这个函数将把[要移除的字串]从字串的起头、结尾,或是起头及结尾移除。
如果我们没有列出[要移除的字串]是什么的话,那空白就会被移除。
LTRIM(字串):
将所有字串起头的空白移除。
RTRIM(字串):
将所有字串结尾的空白移除。
例1:
SELECTTRIM(' Sample ');
结果:
'Sample'
例2:
SELECTLTRIM(' Sample ');
结果:
'Sample '
例3:
SELECTRTRIM(' Sample ');
结果:
' Sample'
表格是数据库中储存资料的基本架构。
在绝大部份的情况下,数据库厂商不可能知道您需要如何储存您的资料,所以通常您会需要自己在数据库中建立表格。
虽然许多数据库工具可以让您在不需用到SQL的情况下建立表格,不过由于表格是一个最基本的架构,我们决定包括CREATETABLE的语法在这个网站中。
在我们跳入CREATETABLE的语法之前,我们最好先对表格这个东西有些多一点的了解。
表格被分为栏位(column)及列位(row)。
每一列代表一笔资料,而每一栏代表一笔资料的一部份。
举例来说,如果我们有一个记载顾客资料的表格,那栏位就有可能包括姓、名、地址、城市、国家、生日...等等。
当我们对表格下定义时,我们需要注明栏位的标题,以及那个栏位的资料种类。
那,资料种类是什么呢?
资料可能是以许多不同的形式存在的。
它可能是一个整数(例如1),、一个实数(例如0.55)、一个字串(例如'sql')、一个日期/时间(例如'2000-JAN-2503:
22:
22')、或甚至是以二进法(binary)的状态存在。
当我们在对一个表格下定义时,我们需要对每一个栏位的资料种类下定义。
(例如'姓'这个栏位的资料种类是char(50)━━代表这是一个50个字符的字串)。
我们需要注意的一点是不同的数据库有不同的资料种类,所以在对表格做出定义之前最好先参考一下数据库本身的说明。
CREATETABLE的语法是:
CREATETABLE"表格名"
("栏位1""栏位1资料种类",
"栏位2""栏位2资料种类",
...)
若我们要建立我们上面提过的顾客表格,我们就打入以下的SQL:
CREATETABLEcustomer
(First_Namechar(50),
Last_Namechar(50),
Addresschar(50),
Citychar(50),
Countrychar(25),
Birth_Datedate)
视观表(Views)可以被当作是虚拟表格。
它跟表格的不同是,表格中有实际储存资料,而视观表是建立在表格之上的一个架构,它本身并不实际储存资料。
建立一个视观表的语法如下:
CREATEVIEW"VIEW_NAME"AS"SQL语句"
"SQL语句"可以是任何一个我们在这个教材中有提到的SQL。
来看一个例子。
假设我们有以下的表格:
TABLECustomer
(First_Namechar(50),
Last_Namechar(50),
Addresschar(50),
Citychar(50),
Countrychar(25),
Birth_Datedate)
若要在这个表格上建立一个包括First_Name,Last_Name,和Country这三个栏位的视观表,我们就打入,
CREATEVIEWV_Customer
ASSELECTFirst_Name,Last_Name,Country
FROMCustomer
现在,我们就有一个叫做V_Customer的视观表:
ViewV_Customer
(First_Namechar(50),
Last_Namechar(50),
Countrychar(25))
我们也可以用视观表来连接两个表格。
在这个情况下,使用者就可以直接由一个视观表中找出她要的资讯,而不需要由两个不同的表格中去做一次连接的动作。
假设有以下的两个表格:
Store_Information表格
store_name
Sales
Date
LosAngeles
$1500
Jan-05-1999
SanDiego
$250
Jan-07-1999
LosAngeles
$300
Jan-08-1999
Boston
$700
Jan-08-1999
Geography表格
region_name
store_name
East
Boston
East
NewYork
West
LosAngeles
West
SanDiego
我们就可以用以下的指令来建一个包括每个地区(region)销售额(sales)的视观表:
CREATEVIEWV_REGION_SALES
ASSELECTA1.region_nameREGION,SUM(A2.Sales)SALES
FROMGeographyA1,Store_InformationA2
WHEREA1.store_name=A2.store_name
GROUPBYA1.region_name
这就给我们有一个名为V_REGION_SALES的视观表。
这个视观表包含不同地区的销售哦。
如果我们要从这个视观表中获取资料,我们就打入,
SELECT*FROMV_REGION_SALES
结果:
REGION
SALES
East
$700
West
$2050
索引(Index)可以帮助我们从表格中快速地找到需要的资料。
举例来说,假设我们要在一本园艺书中找如何种植青椒的讯息。
若这本书没有索引的话,那我们是必须要从头开始读,直到我们找到有关种直青椒的地方为止。
若这本书有索引的话,我们就可以先去索引找出种植青椒的资讯是在哪一页,然后直接到那一页去阅读。
很明显地,运用索引是一种有效且省时的方式。
从资料库表格中寻找资料也是同样的原理。
如果一个表格没有索引的话,资料库系统就需要将整个表格的资料读出(这个过程叫做'tablescan')。
若有适当的索引存在,资料库系统就可以先由这个索引去找出需要的资料是在表格的什么地方,然后直接去那些地方抓资料。
这样子速度就快多了。
因此,在表格上建立索引是一件有利于系统效率的事。
一个索引可以涵盖一或多个栏位。
建立索引的语法如下:
CREATEINDEX"INDEX_NAME"ON"TABLE_NAME"(COLUMN_NAME)
现在假设我们有以下这个表格,
TABLECustomer
(First_Namechar(50),
Last_Namechar(50),
Addresschar(50),
Citychar(50),
Countrychar(25),
Birth_Datedate)
若我們要在Last_Name這個欄位上建一個索引,我們就打入以下的指令,
CREATEINDEXIDX_CUSTOMER_LAST_NAME
onCUSTOMER(Last_Name)
若我们要在Last_Name这个栏位上建一个索引,我们就打入以下的指令,
CREATEINDEXIDX_CUSTOMER_LOCATION
onCUSTOMER(City,Country)
索引的命名并没有一个固定的方式。
通常会用的方式是在名称前加一个字首,例如"IDX_",来避免与资料库中的其他物件混淆。
另外,在索引名之内包括表格名及栏位名也是一个好的方式。
请读者注意,每个资料库会有它本身的CREATEINDEX语法,而不同资料库的语法会有不同。
因此,在下指令前,请先由资料库使用手册中确认正确的语法。
在表格被建立在资料库中后,我们常常会发现,这个表格的结构需要有所改变。
常见的改变如下:
∙加一个栏位
∙删去一个栏位
∙改变栏位名称
∙改变栏位的资料种类
以上列出的改变并不是所有可能的改变。
ALTERTABLE也可以被用来作其他的改变,例如改变主键定义。
ALTERTABLE的语法如下:
ALTERTABLE"table_name"
[改变方式]
[改变方式]的详细写法会依我们想要达到的目标而有所不同。
再以上列出的改变中,[改变方式]如下:
∙加一个栏位:
ADD"栏位1""栏位1资料种类"
∙删去一个栏位:
DROP"栏位1"
∙改变栏位名称:
CHANGE"原本栏位名""新栏位名""新栏位名资料种类"
∙改变栏位的资料种类:
MODIFY"栏位1""新资料种类"
以下我们用在CREATETABLE一页建出的customer表格来当作例子:
customer表格
栏位名称
资料种类
First_Name
char(5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件 应用 SQL 语句 详细 教程