SQL常用语句精简示例1.docx
《SQL常用语句精简示例1.docx》由会员分享,可在线阅读,更多相关《SQL常用语句精简示例1.docx(15页珍藏版)》请在冰豆网上搜索。
SQL常用语句精简示例1
/******************************************************************
*Fname:
SQL基本常用语句
*Author:
流云
*Date:
2012-05-03
*******************************************************************/
注:
橙色-说明蓝色-语法黑色-示例红色-关键字粉紫-函数名绿浅-二级标题深绿加粗-大标题
Store_Information表格Geography表格
store_nameSalesDateregion_name(区)store_name
LosAngeles$1500Jan-05-1999EastBoston
SanDiego$250Jan-07-1999EastNewYork
LosAngeles$300Jan-08-1999WestLosAngeles
Boston$700Jan-08-1999WestSanDiego
一,SQL指令
1,SELECT"栏位名"FROM"表格名"
SELECTstore_nameFROMStore_Information
2,去掉某字段的重复记录
SELECTDISTINCT"栏位名"FROM"表格名"
Eg:
SELECTDISTINCTstore_nameFROMStore_Information
3,SELECT"栏位名"FROM"表格名"WHERE"条件"
Eg:
SELECTstore_nameFROMStore_InformationWHERESales>1000
4,SELECT"栏位名"FROM"表格名"WHERE"简单条件"{[AND|OR]"简单条件"}+
Eg:
SELECTstore_nameFROMStore_InformationWHERESales>1000OR(Sales<500ANDSales>275)
5,IN这个指令可以让我们依照一或数个不连续(discrete)的值的限制之内抓出资料库中的值
SELECT"栏位名"FROM"表格名"WHERE"栏位名"IN('值一','值二',...)
Eg:
SELECT*FROMStore_InformationWHEREstore_nameIN('LosAngeles','SanDiego')
6,BETWEEN则是让我们可以运用一个范围(range)内抓出资料库中的值
SELECT"栏位名"FROM"表格名"WHERE"栏位名"BETWEEN'值一'AND'值二'
Eg:
SELECT*FROMStore_InformationWHEREDateBETWEEN'Jan-06-1999'AND'Jan-10-1999'
7,SELECT"栏位名"FROM"表格名"WHERE"栏位名"LIKE{模式}
模式:
“_”代表一个字符(汉字2个"_"),"%"代表任意字符
Eg:
SELECT*FROMStore_InformationWHEREstore_nameLIKE'%AN%'
8,排序
SELECT"栏位名"FROM"表格名"[WHERE"条件"]ORDERBY"栏位名"[ASC,DESC]
若我们对这两个栏位都选择由小往大的话,那这个子句就会造成结果是依据"栏位一"由小往大排。
若有好几笔资料"栏位一"的值相等,那这几笔资料就依据"栏位二"由小往大排。
ORDERBY"栏位一"[ASC,DESC],"栏位二"[ASC,DESC]
Eg:
SELECTstore_name,Sales,DateFROMStore_InformationORDERBYSalesDESC
二,函数
AVG(平均)COUNT(计数)MAX(最大值)MIN(最小值)SUM(总合)
1,SELECT"函数名"("栏位名")FROM"表格名"
Eg:
SELECTSUM(Sales)FROMStore_Information
SELECTCOUNT(store_name)FROMStore_InformationWHEREstore_nameisnotNULL
注:
isnotNULL:
这个栏位不是空白
找出我们的表格中有多少个不同的store_name
Eg:
SELECTCOUNT(DISTINCTstore_name)FROMStore_Information
2,SELECT"栏位1",SUM("栏位2")FROM"表格名"GROUPBY"栏位1"
要算出每一间店(store_name)的营业额(sales)
Eg:
SELECTstore_name,SUM(Sales)FROMStore_InformationGROUPBYstore_name
3,对函数产生的值来设定条件
SELECT"栏位1",SUM("栏位2")FROM"表格名"GROUPBY"栏位1"HAVING(函数条件)
注:
如果被SELECT的只有函数栏,那就不需要GROUPBY子句。
Eg:
SELECTstore_name,SUM(sales)FROMStore_InformationGROUPBYstore_nameHAVINGSUM(sales)>1500
result:
store_nameSUM(Sales)
LosAngeles$1800
4,SELECT"表格别名"."栏位1""栏位别名"FROM"表格名""表格别名"(alias)
Eg:
SELECTA1.store_nameStore,SUM(A1.Sales)"TotalSales"FROMStore_InformationA1GROUPBYA1.store_name
5,要知道每一区的营业额((leftjoin/innerjoin)
Eg:
SELECTA1.region_nameREGION,SUM(A2.Sales)SALES
FROMGeographyA1,Store_InformationA2
WHEREA1.store_name=A2.store_name
GROUPBYA1.region_name
result:
REGIONSALES
East$700
West$2050
6,那如果我们想要列出一个表格中每一笔的资料,无论它的值在另一个表格中有没有出现,那该怎么办呢?
在这个时候,
我们就需要用到SQLOUTERJOIN(外部连接)的指令。
Eg:
SELECTA1.store_name,SUM(A2.Sales)SALES
FROMGeorgraphyA1,Store_InformationA2
WHEREA1.store_name=A2.store_name(+)
GROUPBYA1.store_name(Oracle)
result:
store_nameSALES
Boston$700
NewYork
LosAngeles$1800
SanDiego$250
7,需要将由不同栏位获得的资料串连在一起connect
MySQL:
CONCAT()Oracle:
CONCAT(),||SQLServer:
+
CONCAT(字符串1,字符串2,字符串3,...)
MySQL/Oracle:
1,SELECTCONCAT(region_name,store_name)FROMGeographyWHEREstore_name='Boston';
result:
'EastBoston'
2,Oracle:
SELECTregion_name||''||store_nameFROMGeographyWHEREstore_name='Boston';
result:
'EastBoston'
3,SQLServer:
SELECTregion_name+''+store_nameFROMGeographyWHEREstore_name='Boston';
result:
'EastBoston'
8,substring函数是用来抓出一个栏位资料中的其中一部分
MySQL:
SUBSTR(),SUBSTRING()Oracle:
SUBSTR()SQLServer:
SUBSTRING()
SUBSTR(str,pos):
由中,选出所有从第位置开始的字符。
Eg:
SELECTSUBSTR(store_name,3)FROMGeographyWHEREstore_name='LosAngeles';
result:
'sAngeles'
SELECTSUBSTR(store_name,2,4)FROMGeographyWHEREstore_name='SanDiego';
result:
'anD'
9,SQL中的TRIM函数是用来移除掉一个字符串中的字头或字尾。
最常见的用途是移除字首或字尾的空白,把[要移除的字符串]从字符串的起头、
结尾,或是起头及结尾移除。
如果我们没有列出[要移除的字符串]是什么的话,那空白就会被移除。
MySQL:
TRIM(),RTRIM(),LTRIM()Oracle:
RTRIM(),LTRIM()SQLServer:
RTRIM(),LTRIM()
SELECTLTRIM('Sample');
result:
'Sample'
三,表格处理
CUSTOMER表格ORDERS表格
SID主键Order_ID主键
Last_NameOrder_Date
First_NameCustomer_SID外来键
Amount
1,CREATETABLE"表格名"("栏位1""栏位1资料种类","栏位2""栏位2资料种类",...)
Eg:
CREATETABLEcustomer(First_Namechar(50),
Last_Namechar(50),
Addresschar(50),
Citychar(50),
Countrychar(25),
Birth_Datedate);
2,NOTNULL,UNIQUE,CHECK,PrimaryKey主键,ForeignKey外来键
在没有做出任何限制的情况下,一个栏位是允许有NULL值得。
Eg:
CREATETABLECustomer(SIDintegerNOTNULL,
Last_Namevarchar(30)NOTNULL,
First_Namevarchar(30));
UNIQUE限制是保证一个栏位中的所有资料都是有不一样的值。
Eg:
CREATETABLECustomer(SIDintegerUnique,
Last_Namevarchar(30),
First_Namevarchar(30);
CHECK限制是保证一个栏位中的所有资料都是符合某些条件(CHECK限制目前尚未被执行于MySQL数据库上)。
Eg:
CREATETABLECustomer(SIDintegerCHECK(SID>0),
Last_Namevarchar(30),
First_Namevarchar(30));
主键
MySQL:
Eg:
CREATETABLECustomer(SIDinteger,
Last_Namevarchar(30),
First_Namevarchar(30),
PRIMARYKEY(SID));
SQLServer/Oracle:
Eg:
CREATETABLECustomer(SIDintegerPRIMARYKEY,
Last_Namevarchar(30),
First_Namevarchar(30));
3,设定主键:
ALTERTABLECustomerADDPRIMARYKEY(SID);
外来键是一个(或数个)指向另外一个表格主键的栏位。
外来键的目的是确定资料的参考完整性。
以下列出几个在建置ORDERS表格时指定外来键的方式:
MySQL:
Eg:
CREATETABLEORDERS
(Order_IDinteger,
Order_Datedate,
Customer_SIDinteger,
Amountdouble,
PrimaryKey(Order_ID),
ForeignKey(Customer_SID)referencesCUSTOMER(SID));
Oracle/SQLServer:
Eg:
CREATETABLEORDERS
(Order_IDintegerprimarykey,
Order_Datedate,
Customer_SIDintegerreferencesCUSTOMER(SID),
Amountdouble);
4,以下的例子则是藉着改变表格架构来指定外来键。
这里假设ORDERS表格已经被建置,而外来键尚未被指定:
MySQL:
Eg:
ALTERTABLEORDERSADDFOREIGNKEY(customer_sid)REFERENCESCUSTOMER(sid);
Oracle:
Eg:
ALTERTABLEORDERSADD(CONSTRAINTfk_orders1)FOREIGNKEY(customer_sid)REFERENCESCUSTOMER(sid);
SQLServer:
Eg:
ALTERTABLEORDERSADDFOREIGNKEY(customer_sid)REFERENCESCUSTOMER(sid);
5,CREATEVIEW"VIEW_NAME"AS"SQL语句""SQL语句"可以是任何一个我们学过的SQL。
创建一个名为V_Customer的视图表
Eg:
CREATEVIEWV_CustomerASSELECTFirst_Name,Last_Name,CountryFROMCustomer
我们也可以用视观表来连接两个表格。
在这个情况下,使用者就可以直接由一个视观表中找出她要的信息,
而不需要由两个不同的表格中去做一次连接的动作可以直接从连接后的视图中使用SELECT*FROMV_REGION_SALES获取资料
CREATEINDEX"INDEX_NAME"ON"TABLE_NAME"(COLUMN_NAME)
CREATEINDEXIDX_CUSTOMER_LAST_NAMEonCUSTOMER(Last_Name)
CREATEINDEXIDX_CUSTOMER_LOCATIONonCUSTOMER(City,Country)
三,操作表结构
1,ALTERTABLE
加一个栏位:
ADD"栏位1""栏位1资料种类"
Eg:
ALTERtablecustomeraddGenderchar
(1)
删去一个栏位:
DROP"栏位1",要删除"Gender"栏位
Eg:
ALTERtablecustomerdropGender
改变栏位名称:
CHANGE"原本栏位名""新栏位名""新栏位名资料种类"
我们要把"Address"栏位改名为"Addr"。
Eg:
ALTERtablecustomerchangeAddressAddrchar(50)
改变栏位的资料种类:
MODIFY"栏位1""新资料种类"
要将"Addr"栏位的资料种类改为char(30)。
Eg:
ALTERtablecustomermodifyAddrchar(30)
2,DROPTABLE从数据库中删除一个表格
DROPTABLE"表格名"
Eg:
DROPTABLEcustomer.
3,TABLE删除表中的数据,保留表
TRUNCATETABLE"表格名"
Eg:
TRUNCATETABLEcustomer.
四,操作表数据
1,INSERTINTO"表格名"("栏位1","栏位2",...)VALUES("值1","值2",...)
Eg:
INSERTINTOStore_Information(store_name,Sales,Date)VALUES('LosAngeles',900,'Jan-10-1999')
INSERTINTO能够让我们一次输入多笔的资料。
这整句SQL也可以含WHERE、GROUPBY、及HAVING等子句,以及表格连接及别名等等。
INSERTINTO"表格1"("栏位1","栏位2",...)SELECT"栏位3","栏位4",...FROM"表格2"
2,"表格名"SET"栏位1"=[新值]WHERE{条件}
Eg:
UPDATEStore_InformationSETSales=500WHEREstore_name="LosAngeles"ANDDate="Jan-08-1999"
我们也可以同时修改好几个栏位
UPDATE"表格"SET"栏位1"=[值1],"栏位2"=[值2]WHERE{条件}
3,DELETEFROM"表格名"WHERE{条件}
Eg:
DELETEFROMStore_InformationWHEREstore_name="LosAngeles"
四,进阶SQL
Store_Information表格Internet_Sales表格
store_nameSalesDateDateSales
LosAngeles$1500Jan-05-1999Jan-07-1999$250
SanDiego$250Jan-07-1999Jan-10-1999$535
LosAngeles$300Jan-08-1999Jan-11-1999$320
Boston$700Jan-08-1999Jan-12-1999$750
1,UNION的一个限制是两个SQL语句所产生的栏位需要是同样的资料种类。
另外,当我们用UNION这个指令时,
我们只会看到不同的资料值(类似SELECTDISTINCT)。
[SQL语句1]UNION[SQL语句2]
Eg:
SELECTDateFROMStore_InformationUNIONSELECTDateFROMInternet_Sales
result:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999
2,UNIONALL取出两个SQL语句取出结果的并集
[SQL语句1]UNIONALL[SQL语句2]
Eg:
SELECTDateFROMStore_InformationUNIONALLSELECTDateFROMInternet_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
3,取两个SQL语句取出结果的交集
[SQL语句1]INTERSECT[SQL语句2]
Eg:
SELECTDateFROMStore_InformationINTERSECTSELECTDateFROMInternet_Sales
结果:
Date
Jan-07-1999
注:
UNION和INTERSECT的SQL必须有相同的字段数,一个表中没有字段可以加一个相同的字段名并且赋值为空
4,MINUS如果第二个SQL语句所产生的结果并没有存在于第一个SQL语句所产生的结果内,那这笔资料就被抛弃,
不同的值只会被列出一次。
也就是第一个结果里面有的第二个里面没有的结果
[SQL语句1]MINUS[SQL语句2]
Eg:
SELECTDateFROMStore_InformationMINUSSELECTDateFROMInternet_Sales
Date
Jan-05-1999
Jan-08-1999
5,子查询:
在WHERE子句或HAVING子句中插入另一个SQL语句时
SELECT"栏位1"FROM"表格"WHERE"栏位2"[比较运算素](SELECT"栏位1"FROM"表格"WHERE[条件])
运用subquery来找出所有在西部的店的营业额。
(表一)
Eg:
SELECTSUM(Sales)FROMStore_Information
WHEREStore_nameIN
(SELECTstore_nameFROMGeography
WHEREregion_name='West')
结果:
SUM(Sales)
2050
6,内部查询本身与外部查询没有关系。
这一类的子查询称为『简单子查询』(SimpleSubquery)。
如果内部查询是要利用到外部查询提到的表格中的栏位,那这个字查询就被称为『相关子查询』(CorrelatedSubquery)。
以下是一个相关子查询的例子:
SELECTSUM(a1.Sales)FROMStore_Informationa1
WHEREa1.Store_nameIN
(SELECTstore_nameFROMGeographya2
WHEREa2.store_name=a1.store_name)
7,EXISTS是用来测试内查询有没有产生任何结果。
如果有的话,系统就会执行外查询中的SQL。
若是没有的话,那整个SQL语句就不会产生任何结果。
SELECT"栏位1