SQL语句教程采用.docx
- 文档编号:6898064
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:40
- 大小:1.16MB
SQL语句教程采用.docx
《SQL语句教程采用.docx》由会员分享,可在线阅读,更多相关《SQL语句教程采用.docx(40页珍藏版)》请在冰豆网上搜索。
SQL语句教程采用
SQL指令
SELECT
DISTINCT
WHERE
ANDORINBETWEENLIKEORDERBY
函数
COUNTGROUPBYHAVINGALIAS
表格链接
外部链接
CONCATENATE
SUBSTRING
TRIM
表格处理
CREATETABLE
CONSTRAINT
NOTNULL
UNIQUE
CHECK
主键
外来键
CREATEVIEW
CREATEINDEX
ALTERTABLE
DROPTABLETRUNCATETABLEINSERTINTOUPDATE
DELETEFROM进阶SQL
UNIONUNIONALLINTERSECTMINUS
子查询
EXISTS
CASE
算排名
算中位数
算总合百分比
算累积总合百分比
SQL语法
无论您是一位SQL的新手,或是一位只是需要对SQL复习一下的资料仓储业界老将,您就来对地方了。
这个SQL教材网站列出常用的SQL指令,包含以下几个部分:
♦SQL指令:
SQL如何被用来储存、读取、以及处理数据库之中的资料。
♦表格处理:
SQL如何被用来处理数据库中的表格。
♦进阶SQL:
介绍SQL进阶概念,以及如何用SQL来执行一些较复杂的运算。
♦SQL语法:
这一页列出所有在这个教材中被提到的SQL语法。
对于每一个指令,我们将会先列出及解释这个指令的语法,然后用一个例子来让读者了解这个指令是如何被运用的。
当您读完了这个网站的所有教材后,您将对SQL的语法会有一个大致上的了解。
另外,您将能够正确地运用SQL来由数据库中获取信息。
笔者本身的经验是,虽然要对SQL有很透彻的了解并不是一朝一夕可以完成的,可是要对SQL有个基本的了解并不难。
希望在看完这个网站后,您也会有同样的想法。
SQL指令
修改表名:
alter table test rename test1; --修改表名
添加表列:
alter table test add column name varchar(10); --添加表列
删除表列:
alter table test drop column name; --删除表列
修改表列类型:
alter table test modify address char(10) --修改表列类型或alter table test change address address char(40)
SELECT
是用来做什么的呢?
一个最常用的方式是将资料从数据库中的表格内选出。
从这一句回答中,我们马上可以看到两个关键字:
从(FROM)数据库中的表格内选出(SELECT)。
(表格是一个数据库内的结构,它的目的是储存资料。
在表格处理这一部分中,我们会提到如何使用SQL来设定表格。
)我们由这里可以看到最基本的SQL架构:
SELECT"栏位名"FROM"表格名"
我们用以下的例子来看看实际上是怎么用的。
假设我们有以下这个表格:
store_name
Sales
Date
LosAngeles
$1500
Jan-05-1999
SanDiego
$250
Jan-07-1999
LosAngeles
$300
Jan-08-1999
Boston
$700
Jan-08-1999
更改上表中的第1列的列名:
alter table test change column address address1 varchar(30)--修改表列名
更改列名后如下:
若要选出所有的店名(store_Name),我们就打入:
SELECTstore_nameFROMStore_Information
结果:
store_name
LosAngeles
SanDiego
LosAngeles
Boston
我们一次可以读取好几个栏位,也可以同时由好几个表格中选资料。
DISTINCT
SELECT指令让我们能够读取表格中一个或数个栏位的所有资料。
这将把所有的资料都抓出,无论资料值有无重复。
在资料处理中,我们会经常碰到需要找出表格内的不同资料值的情况。
换句话说,我们需要知道这个表格/栏位内有哪些不同的值,而每个值出现的次数并不重要。
这要如何达成呢?
在SQL中,这是很容易做到的。
我们只要在SELECT后加上一个DISTINCT就可以了。
DISTINCT的语法如下:
SELECTDISTINCT"栏位名"
FROM"表格名"
举例来说,若要在以下的表格,Store_Information,找出所有不同的店名时,
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
我们就键入,
SELECTDISTINCTstore_nameFROMStore_Information
结果:
store_name
LosAngeles
SanDiego
Boston
WHERE
我们并不一定每一次都要将表格内的资料都完全抓出。
在许多时候,我们会需要选择性地抓资料。
就我们的例子来说,我们可能只要抓出营业额超过$1,000的资料。
要做到这一点,我们就需要用到WHERE这个指令。
这个指令的语法如下:
SELECT"栏位名"
FROM"表格名"
WHERE"条件"
若我们要由以下的表格抓出营业额超过$1,000的资料,
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
我们就键入,
SELECTstore_name
FROMStore_Information
WHERESales>1000
结果:
store_nameLosAngeles
ANDOR
在上一页中,我们看到WHERE指令可以被用来由表格中有条件地选取资料。
这个条件可能是简单的(像上一页的例子),也可能是复杂的。
复杂条件是由二或多个简单条件透过AND或是OR的连接而成。
一个SQL语句中可以有无限多个简单条件的存在。
复杂条件的语法如下:
SELECT"栏位名"
FROM"表格名"WHERE"简单条件"
{[AND|OR]"简单条件"}+
{}+代表{}之内的情况会发生一或多次。
在这里的意思就是AND加简单条件及OR加简单条件的情况可以发生一或多次。
另外,我们可以用()来代表条件的先后次序。
举例来说,我们若要在Store_Information表格中选出所有Sales高于$1,000或是Sales
在$500及$275之间的资料的话,
Store_Information表格
store_name
Sales
Date
LosAngeles
$1500
Jan-05-1999
SanDiego
$250
Jan-07-1999
SanFrancisco
$300
Jan-08-1999
Boston
$700
Jan-08-1999
我们就键入,
SELECTstore_name
FROMStore_Information
WHERESales>1000
OR(Sales<500ANDSales>275)
结果:
store_nameLosAngelesSanFrancisco
IN
SELECT*FROMstore_informationWHEREstore_nameIN('LosAngeles','SanDiego')
执行结果如下:
SELECT*FROMstore_informationWHEREstore_name='LosAngeles'ORstore_name='SanDiego'
执行结果如下:
Between
SELECT*FROMstore_informationWHEREdatetBETWEEN'2015-07-06'AND'2015-07-10'
执行结果如下:
SELECT*FROMstore_informationWHEREsalesBETWEEN400AND2000
执行结果如下:
LIKE
LIKE是另一个在WHERE子句中会用到的指令。
基本上,LIKE能让我们依据一个模式(pattern)来找出我们要的资料.相对来说,在运用IN的时候,我们完全地知道我们需要的条件;在运用BETWEN的时候,我们则是列出一个范围。
LIKE的语法如下:
SELECT“栏位名“FROM“表格名”WHERE“栏位名”LIKE{模式}
{模式}经常包括野卡(wildcard)。
SELECT*FROMstore_informationWHEREstore_nameLIKE'%AN%'
执行结果如下:
ORDERBY
到目前为止,我们已经学到如何藉由SELECT及WHERE这两个指令将资料由表格中抓出。
不过我们尚未提到这些资料要如何排练。
这其实是一个很重要的问题。
事实上,我们经常需要能够将抓出的资料做一个有联系的显示。
这可能是由小往大(ascending)或是由大往小(descending)。
在这种情况下,我们就可以运用ORDERBY这个指令来达到我们的目的.
ORDERBY语法如下:
SELECT“栏位名”FROM“表格名”[WHERE“条件”]ORDERBY“栏位名”[ASC,DESC]
SELECTstore_name,sales,datetFROMstore_informationORDERBYsalesDESC
执行结果如下:
SELECTstore_name,sales,datetFROMstore_informationORDERBY3DESC
函数
既然数据可中有许多资料都是以数字的型态存在,一个很重要的用途就是对这些数字做一些运算,例如将它们总会起来,或是找出它们的平均值。
SQL提供了一些函数如下:
AVG(平均)
COUNT(计数)
MAX(最大值)
MIN(最小值)
SUM(总合)
运用函数的语法是:
SELECT“函数名”(“栏位名”)FROM“表格名”
例如:
SELECTCOUNT(sales)FROMstore_information
执行结果如下:
SELECTSUM(sales)FROMstore_information
执行结果如下:
SELECTMAX(sales)FROMstore_information
执行结果如下:
SELECTMIN(sales)FROMstore_information
执行结果如下:
SELECTAVG(sales)FROMstore_information
执行结果如下:
COUNT
在上一页有提到,COUNT是函数之一。
由于它的使用广泛,我们在这里特别提出来讨论。
基本上,COUNT让我们能够数出表格中有多少笔资料被选出来。
它的语法是:
SELECTCOUNT(“栏位名”)FROM“表格名”
例如:
SELECTCOUNT(store_name)FROMstore_informationWHEREstore_nameISNOTNULL
执行结果如下:
GROUPBY
我们现在回到函数上。
记得我们用SUM这个指令来计算出所有的sales(营业额)吧!
如果我们的需求变成是要算出每一间店(store_name)的营业额,那么怎么算呢?
这个情况下,我们要做到两件事:
第一,我们对于store_name及sales这两个栏位都要选出。
第二我们需要确认所有的sales都要依照各个store_name来分开算。
这个语法为:
SELECT“栏位1”,SUM(“栏位2”)FROM“表格名”GROUPBY“栏位1”
例如:
SELECTstore_name,SUM(sales)FROMstore_informationGROUPBYstore_name
执行结果如下:
HAVING
那我们如何对函数产生的值来设定条件呢?
举例来说,我们可能只需要知道哪些店的营业额有超过$1500。
在这个情况下,我们不能使用WHERE的指令。
那要怎么办呢?
很幸运地,SQL有提供一个HAVING的指令,而我们就可以用这个指令来达到这个目标。
HAVING子句通常是在一个SQL句子的最后,一个含有HAVING子句的SQL并不一定要包含GROUPBY子句。
HAVING子句的语法如下:
SELECT“栏位1”,SUM(“栏位2”)FROM“表格名”GROUPBY“栏位1”HAVING(函数条件)
例如:
SELECTstore_name,SUM(sales)FROMstore_informationGROUPBYstore_nameHAVINGSUM(sales)>1500
执行结果如下:
ALIAS
接下来,我们讨论alias(别名)在SQL上的用处。
最常用到的别名有两种:
栏位别名及表格别名。
简单地来说,栏位别名的目的是为了让SQL产生的结果易读。
在之前的例子中,每当我们有营业额总合时,栏位名都是SUM(sales)。
虽然在这个情况下没有什么问题,可是如果这个栏位不是一个简单的总合,而是一个复杂的计算,那栏位名就没有这么易懂了。
若我们用栏位别名的话,就可以确认结果中的栏位名是简单易懂的。
第二种别名是表格别名。
要给一个表格取一个别名,只要在FROM子句中的表格名后空一格,然后再列出要用的表格别名就可以了。
这在我们要用SQL由数个不同的表格中获取资料时是很方便的。
这一点我们在之后谈到连接(join)时会看到.
我们先来看一下栏位别名合表格别名的语法:
SELECT“表格别名”“栏位1”“栏位别名”FROM“表格名”“表格别名”
例如:
SELECTA1.store_namestore,SUM(A1.sales)"Totalsales"FROMstore_informationA1GROUPBYA1.store_name
执行结果如下:
表格链接
SELECTA1.region_name,SUM(A2.sales)salesFROMgeographyA1,store_informationA2
WHEREA1.store_name=A2.store_name
GROUPBYA1.region_name
执行结果如下:
删掉上面SQL语句中的sales
SELECTA1.region_name,SUM(A2.sales)FROMgeographyA1,store_informationA2
WHEREA1.store_name=A2.store_name
GROUPBYA1.region_name
执行结果如下:
SELECTA1.region_nameregion,SUM(A2.sales)salesFROMgeographyA1,store_informationA2
WHEREA1.store_name=A2.store_name
GROUPBYA1.region_name
执行结果如下:
没有别名的情况:
SELECTgeography.region_name,SUM(store_information.sales)FROMgeography,store_information
WHEREgeography.store_name=store_information.store_name
GROUPBYgeography.region_name
执行结果如下:
CONCATENATE
有时候,我们有需要将由不同栏位获得的资料串联在一起,每种数据库都有提供方法来达到这个目的:
MySQL:
CONCAT()
Oracle:
CONCAT(),||
SQLServer:
+
CONCAT()的语法如下:
CONCAT(字符串1,字符串2,字符串3,...):
将字符串1、字符串2、字符串3,等字符串连在一起。
请注意,Oracle的CONCATO()只允许两个参数;换言之,一次只能将两个字符串串连起来。
不过,在Oracle中,我们可以用’||’来一次串连多个字符串。
表geography
region_name
Store_name
East
Boston
East
NewYork
West
LosAngeles
West
SanDiego
表store_information
Store_name
sales
datat
LosAngeles
1500
2015-07-05
SanDiego
250
2015-07-07
LosAngeles
300
2015-07-08
Boston
700
2015-07-08
MySQL/Oracle
SELECTCONCAT(region_name,store_name)FROMgeographyWHEREstore_name='Boston';
执行结果如下:
SUBSTRING
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)FROMgeographyWHEREstore_name='LosAngeles';
执行结果如下:
例2:
SELECTSUBSTR(store_name,2,4)FROMgeographyWHEREstore_name='SanDiego';
执行结果如下:
TRIM
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'
表格处理
CREATETABLE
表格是数据库中储存资料的基本架构。
在绝大部份的情况下,数据库厂商不可能知道您需要
如何储存您的资料,所以通常您会需要自己在数据库中建立表格。
虽然许多数据库工具可以
让您在不需用到SQL的情况下建立表格,不过由于表格是一个最基本的架构,我们决定包
括CREATETABLE的语法在这个网站中。
在我们跳入CREATETABLE的语法之前,我们最好先对表格这个东西有些多一点的了解。
表格被分为栏位(column)及列位(row)。
每一列代表一笔资料,而每一栏代表一笔资料的
一部份。
举例来说,如果我们有一个记载顾客资料的表格,那栏位就有可能包括姓、名、地
址、城市、国家、生日‧‧‧等等。
当我们对表格下定义时,我们需要注明栏位的标题,以及那
个栏位的资料种类。
那,资料种类是什么呢?
资料可能是以许多不同的形式存在的。
它可能是一个整数(例如
1),、一个实数(例如0.55)、一个字符串(例如'sql')、一个日期/时间(例如'2000-JAN-25
03:
22:
22')、或甚至是以二进法(binary)的状态存在。
当我们在对一个表格下定义时,我们
需要对每一个栏位的资料种类下定义。
(例如'姓'这个栏位的资料种类是char(50)──代
表这是一个50个字符的字符串)。
我们需要注意的一点是不同的数据库有不同的资料种类,
所以在对表格做出定义之前最好先参考一下数据库本身的说明。
CREATETABLE的语法是:
CREATETABLE"表格名"
("栏位1""栏位1资料种类",
"栏位2""栏位2资料种类",
...)
若我们要建立我们上面提过的顾客表格,我们就键入以下的SQL:
CREATETABLEcustomer
(First_Namechar(50),
Last_Namechar(50),
Addresschar
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL 语句 教程 采用
![提示](https://static.bdocx.com/images/bang_tan.gif)