仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 802|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL编程:SQL server教程:SQL语法

[复制链接]
若相依 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:15:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
线上或者测试环境经常出现的误操作总是让DBA同学那么闹心。</p>Select用处:
从指定表中掏出指定的列的数据
语法:
SELECTcolumn_name(s)FROMtable_name
注释:
从数据库当选取材料列,并同意从一或多个材料表中,拔取一或多个材料列或材料行。SELECT报告式的完全语法相称庞大,但次要子句可择要为:
SELECTselect_list
[INTOnew_table]
FROMtable_source
[WHEREsearch_condition]
[GROUPBYgroup_by_expression]
[HAVINGsearch_condition]
[ORDERBYorder_expression[ASCDESC]]
例:
“Persons”表中的数占有
LastName
FirstName
Address
City

Ola
Timoteivn10
Sandnes

Svendson
Tove
Borgvn23
Sandnes

Pettersen
Kari
Storgt20
Stavanger

选出字段名”LastName”、”FirstName”的数据
SELECTLastName,FirstNameFROMPersons

前往了局:
LastName
FirstName

Hansen
Ola

Svendson
Tove

Pettersen
Kari

选出一切字段的数据
SELECT*FROMPersons

前往了局:

LastName
FirstName
Address
City

Hansen
Ola
Timoteivn10
Sandnes

Svendson
Tove
Borgvn23
Sandnes

Pettersen
Kari
Storgt20
Stavanger

Where
用处:
被用来划定一种选择查询的尺度
语法:
SELECTcolumnFROMtableWHEREcolumnconditionvalue

注重:在某些SQL的版本中不等号能被写作为!=
SELECT语句前往WHERE子句中前提为true的数据
例:

SELECT*FROMPersonsWHERECity=Sandnes

"Persons"表中的数占有:
LastName
FirstName
Address
City
Year

Hansen
Ola
Timoteivn10
Sandnes
1951

Svendson
Tove
Borgvn23
Sandnes
1978

Svendson
Stale
Kaivn18
Sandnes
1980

Pettersen
Kari
Storgt20
Stavanger
1960


LastName
FirstName
Address
City
Year
Hansen
Ola
Timoteivn10
Sandnes
1951
Svendson
Tove
Borgvn23
Sandnes
1978
Svendson
Stale
Kaivn18
Sandnes
1980
And&Or
用处:
在WHERE子句中AND和OR被用来毗连两个大概更多的前提
注释:
AND在分离两个布尔表达式时,只要在两个表达式都为TRUE时才传回TRUE
OR在分离两个布尔表达式时,只需个中一个前提为TRUE时,OR便传回TRUE
例:
"Persons"表中的原始数据:
LastName
FirstName
Address
City

Hansen
Ola
Timoteivn10
Sandnes

Svendson
Tove
Borgvn23
Sandnes

Svendson
Stephen
Kaivn18
Sandnes

表中
SELECT*FROMPersons
WHEREFirstName=Tove
ANDLastName=Svendson
LastName
FirstName
Address
City
Svendson
Tove
Borgvn23
Sandnes
运算子来查找表中FirstNameLastName为”Svendson”的数据
SELECT*FROMPersons
WHEREfirstname=Tove
ORlastname=Svendson


LastName
FirstName
Address
City
Svendson
Tove
Borgvn23
Sandnes
Svendson
Stephen
Kaivn18
Sandnes
你也能分离AND和OR(利用括号构成庞大的表达式),如:
SELECT*FROMPersonsWHERE
(FirstName=ToveORFirstName=Stephen)
ANDLastName=Svendson


LastName
FirstName
Address
City
Svendson
Tove
Borgvn23
Sandnes
Svendson
Stephen
Kaivn18
Sandnes

Between…And
用处:
指定需前往数据的局限
语法:
SELECTcolumn_nameFROMtable_name
WHEREcolumn_name
BETWEENvalue1ANDvalue2

例:
“Persons”
LastName
FirstName
Address
City

Hansen
Ola
Timoteivn10
Sandnes

Nordmann
Anna
Neset18
Sandnes

Pettersen
Kari
Storgt20
Stavanger

Svendson
Tove
Borgvn23
Sandnes

前往LastName为从”Hansen”到”Pettersen”的数据:
SELECT*FROMPersonsWHERELastName
BETWEENHansenANDPettersen

前往了局:
LastName
FirstName
Address
City

Hansen
Ola
Timoteivn10


Nordmann
Anna
Neset18
Sandnes

Pettersen
Kari
Storgt20
Stavanger

为了显现指定局限以外的数据,也能够用NOT操纵符:
SELECT*FROMPersonsWHERELastName
NOTBETWEENHansenANDPettersen

前往了局:
LastName
FirstName
Address
City

Svendson
Tove
Borgvn23
Sandnes

Distinct
用处:
DISTINCT关头字被用作前往独一的值
语法:
SELECTDISTINCTcolumn-name(s)FROMtable-name

注释:
当column-name(s)中存在反复的值时,前往了局仅留下一个
例:
“Orders”表中的原始数据
Company
OrderNumber

Sega
3412

W3Schools
2312

Trio
4678

W3Schools
6798

用DISTINCT关头字前往Company字段中独一的值:
SELECTDISTINCTCompanyFROMOrders

前往了局:
Company

Sega

W3Schools

Trio

Orderby
用处:
指定了局集的排序
语法:
SELECTcolumn-name(s)FROMtable-nameORDERBY{order_by_expression[ASCDESC]}

注释:
指定了局集的排序,能够依照ASC(递增体例排序,从最低值到最高值)大概DESC(递加体例排序,从最高值到最低值)的体例举行排序,默许的体例是ASC
例:
“Orders”表中的原始数据:
Company
OrderNumber

Sega
3412

ABCShop
5678

W3Schools
2312

W3Schools
6798

依照Company字段的升序体例前往了局集:
SELECTCompany,OrderNumberFROMOrders
ORDERBYCompany

前往了局:
Company
OrderNumber

ABCShop
5678

Sega
3412

W3Schools
6798

W3Schools
2312

依照Company字段的降序体例前往了局集:
SELECTCompany,OrderNumberFROMOrders
ORDERBYCompanyDESC

前往了局:
Company
OrderNumber

W3Schools
6798

W3Schools
2312

Sega
3412

ABCShop
5678

Groupby
用处:
对了局集举行分组,常与汇总函数一同利用。
语法:
SELECTcolumn,SUM(column)FROMtableGROUPBYcolumn

例:
“Sales”表中的原始数据:
Company
Amount

W3Schools
5500

IBM
4500

W3Schools
7100

Amout的算计:
SELECTCompany,SUM(Amount)FROMSales
GROUPBYCompany

前往了局:
Company
SUM(Amount)

W3Schools
12600

IBM
4500

Having
用处:
指定群组或汇总的征采前提。
语法:
SELECTcolumn,SUM(column)FROMtable
GROUPBYcolumn
HAVINGSUM(column)conditionvalue

注释:
HAVING一般与GROUPBY子句同时利用。不利用GROUPBY时,HAVING则与WHERE子句功效类似。
例:
“Sales”表中的原始数据:
Company
Amount

W3Schools
5500

IBM
4500

W3Schools
7100

依照Company字段举行分组,求出每一个Company的Amout的算计在10000
SELECTCompany,SUM(Amount)FROMSales
GROUPBYCompanyHAVINGSUM(Amount)>10000
前往了局:
Company
SUM(Amount)

W3Schools
12600

Join
用处:
当你要从两个大概以上的表当选取了局集时,你就会用到JOIN。
例:
“Employees”表中的数据以下,(个中ID
ID
Name
01
Hansen,Ola
02
Svendson,Tove
03
Svendson,Stephen
04
Pettersen,Kari
“Orders”表中的数据以下:
ID
Product

01
Printer

03
Table

03
Chair

用Employees的ID和Orders的ID相干联拔取数据:
SELECTEmployees.Name,Orders.Product
FROMEmployees,Orders
WHEREEmployees.ID=Orders.ID


Name
Product
Hansen,Ola
Printer
Svendson,Stephen
Table
Svendson,Stephen
Chair
大概你也能够用JOIN关头字来完成下面的操纵:
SELECTEmployees.Name,Orders.Product
FROMEmployees
INNERJOINOrders
ONEmployees.ID=Orders.ID

INNERJOIN的语法:
SELECTfield1,field2,field3
FROMfirst_table
INNERJOINsecond_table
ONfirst_table.keyfield=second_table.foreign_keyfield

注释:
INNERJOIN前往的了局集是两个表中一切相婚配的数据。
LEFTJOIN的语法:
SELECTfield1,field2,field3
FROMfirst_table
LEFTJOINsecond_table
ONfirst_table.keyfield=second_table.foreign_keyfield

用”Employees”表往左外联合”Orders”表往找出相干数据:
SELECTEmployees.Name,Orders.Product
FROMEmployees
LEFTJOINOrders
ONEmployees.ID=Orders.ID

前往了局:
Name
Product

Hansen,Ola
Printer

Svendson,Tove


Svendson,Stephen
Table

Svendson,Stephen
Chair

Pettersen,Kari


注释:
LEFTJOIN前往”first_table”中一切的行只管在”second_table”中没有相婚配的数据。
RIGHTJOIN的语法:
SELECTfield1,field2,field3
FROMfirst_table
RIGHTJOINsecond_table
ONfirst_table.keyfield=second_table.foreign_keyfield

用”Employees”表往右外联合”Orders”表往找出相干数据:
SELECTEmployees.Name,Orders.Product
FROMEmployees
RIGHTJOINOrders
ONEmployees.ID=Orders.ID

前往了局:
Name
Product

Hansen,Ola
Printer

Svendson,Stephen
Table

Svendson,Stephen
Chair

注释:
RIGHTJOIN前往”second_table”中一切的行只管在”first_table”中没有相婚配的数据。
Alias
用处:
可用在表、了局集大概列上,为它们取一个逻辑称号
语法:
给列取别号:
SELECTcolumnAScolumn_aliasFROMtable

给表取别号:
SELECTcolumnFROMtableAStable_alias

例:
“Persons”表中的原始数据:
LastName
FirstName
Address
City

Hansen
Ola
Timoteivn10
Sandnes

Svendson
Tove
Borgvn23
Sandnes

Pettersen
Kari
Storgt20
Stavanger

运转上面的SQL
SELECTLastNameASFamily,FirstNameASName
FROMPersons

前往了局:
Family
Name

Hansen
Ola

Svendson
Tove

Pettersen
Kari

运转上面的SQL
SELECTLastName,FirstName
FROMPersonsASEmployees

前往了局:
Employees中的数占有:
LastName
FirstName

Hansen
Ola

Svendson
Tove

Pettersen
Kari

InsertInto
用处:
在表中拔出新行
语法:
拔出一行数据
INSERTINTOtable_name
VALUES(value1,value2,....)

拔出一行数据在指定的字段上
INSERTINTOtable_name(column1,column2,...)
VALUES(value1,value2,....)

例:
“Persons”表中的原始数据:
LastName
FirstName
Address
City

Pettersen
Kari
Storgt20
Stavanger

运转上面的SQL拔出一行数据:
INSERTINTOPersons
VALUES(Hetland,Camilla,Hagabakka24,Sandnes)

拔出后”Persons”表中的数据为:
LastName
FirstName
Address
City

Pettersen
Kari
Storgt20
Stavanger

Hetland
Camilla
Hagabakka24
Sandnes

运转上面的SQL拔出一行数据在指定的字段上:
INSERTINTOPersons(LastName,Address)
VALUES(Rasmussen,Storgt67)

拔出后”Persons”表中的数据为:
LastName
FirstName
Address
City

Pettersen
Kari
Storgt20
Stavanger

Hetland
Camilla
Hagabakka24
Sandnes

Rasmussen

Storgt67


Update
用处:
更新表华夏无数据
语法:
UPDATEtable_nameSETcolumn_name=new_value
WHEREcolumn_name=some_value

例:
“Person”表中的原始数据:
LastName
FirstName
Address
City

Nilsen
Fred
Kirkegt56
Stavanger

Rasmussen

Storgt67


运转上面的SQL将Person表中LastName
UPDATEPersonSETFirstName=Nina
WHERELastName=Rasmussen
更新后”Person”表中的数据为:
LastName
FirstName
Address
City

Nilsen
Fred
Kirkegt56
Stavanger

Rasmussen
Nina
Storgt67


一样的,用UPDATE语句也能够同时更新多个字段:
UPDATEPerson
SETAddress=Stien12,City=Stavanger
WHERELastName=Rasmussen

更新后”Person”表中的数据为:
LastName
FirstName
Address
City

Nilsen
Fred
Kirkegt56
Stavanger

Rasmussen
Nina
Stien12
Stavanger

Delete
用处:
删除表中的数据
语法:
DELETEFROMtable_nameWHEREcolumn_name=some_value

例:
“Person”表中的原始数据:
LastName
FirstName
Address
City

Nilsen
Fred
Kirkegt56
Stavanger

Rasmussen
Nina
Stien12
Stavanger

删除Person表中LastName为”Rasmussen”的数据:
DELETEFROMPersonWHERELastName=Rasmussen

实行删除语句后”Person”表中的数据为:
LastName
FirstName
Address
City

Nilsen
Fred
Kirkegt56
Stavanger

CreateTable
用处:
创建新的材料表。
语法:
CREATETABLEtable_name
(
column_name1data_type,
column_name2data_type,
.......
)

例:
创立一张叫“Person”的表,该表有4个字段"LastName","FirstName","Address","Age"
CREATETABLEPerson
(
LastNamevarchar,
FirstNamevarchar,
Addressvarchar,
Ageint
)
假如想指定字段的最年夜存储长度,你能够如许:
CREATETABLEPerson
(
LastNamevarchar(30),
FirstNamevarchar(30),
Addressvarchar(120),
Ageint(3)
)

下表中列出了在SQL的一些数据范例:
DataType
Description

integer(size)
int(size)
smallint(size)
tinyint(size)
Holdintegersonly.Themaximumnumberofdigitsarespecifiedinparenthesis.

decimal(size,d)
numeric(size,d)
Holdnumberswithfractions.Themaximumnumberofdigitsarespecifiedin"size".Themaximumnumberofdigitstotherightofthedecimalisspecifiedin"d".

char(size)
Holdsafixedlengthstring(cancontainletters,numbers,andspecialcharacters).Thefixedsizeisspecifiedinparenthesis.

varchar(size)
Holdsavariablelengthstring(cancontainletters,numbers,andspecialcharacters).Themaximumsizeisspecifiedinparenthesis.

date(yyyymmdd)
Holdsadate

AlterTable
用处:
在已存在的表中增添后者移除字段
语法:
ALTERTABLEtable_name
ADDcolumn_namedatatype
ALTERTABLEtable_name
DROPCOLUMNcolumn_name

注重:某些数据库办理体系不同意移除表中的字段
例:
“Person”表中的原始数据:
LastName
FirstName
Address

Pettersen
Kari
Storgt20

在Person表中增添一个名为City的字段:
ALTERTABLEPersonADDCityvarchar(30)

增添后表中数据以下:
LastName
FirstName
Address
City

Pettersen
Kari
Storgt20


移除Person表华夏有的Address字段:
ALTERTABLEPersonDROPCOLUMNAddress

移除后表中数据以下:
LastName
FirstName
City

Pettersen
Kari


DropTable
用处:
在数据库中移除一个数据表界说及该数据表中的一切材料、索引、触发程序、前提束缚及权限指定。
语法:
DROPTABLEtable_name

CreateDatabase
用处:
创建新的数据库
语法:
CREATEDATABASEdatabase_name

DropDatabase
用处:
移除原本的数据库
语法:
DROPDATABASEdatabase_name

会萃函数
count
用处:
传回拔取的了局会合行的数量。
语法:
SELECTCOUNT(column_name)FROMtable_name

例:
“Persons”表华夏始数据以下:
Name
Age

Hansen,Ola
34

Svendson,Tove
45

Pettersen,Kari
19

拔取纪录总数:
SELECTCOUNT(Name)FROMPersons

实行了局:
3

sum
用处:
以表达式传回一切值的总和,或仅DISTINCT值。SUM仅可用于数值材料行。已疏忽Null值。
语法:
SELECTSUM(column_name)FROMtable_name

例:
“Persons”表华夏始数据以下:
Name
Age

Hansen,Ola
34

Svendson,Tove
45

Pettersen,Kari
19

拔取”Persons”表中一切人的岁数总和:
SELECTSUM(Age)FROMPersons

实行了局:
98

拔取”Persons”表中岁数凌驾20岁的人的岁数总和:
SELECTSUM(Age)FROMPersonsWHEREAge>20

实行了局:
79

avg
用处:
传回拔取的了局会合值的均匀值。已疏忽Null值。
语法:
SELECTAVG(column_name)FROMtable_name

例:
“Persons”表华夏始数据以下:
Name
Age

Hansen,Ola
34

Svendson,Tove
45

Pettersen,Kari
19

拔取”Persons”表中一切人的均匀岁数:
SELECTAVG(Age)FROMPersons

实行了局:
32.67

拔取”Persons”表中岁数凌驾20岁的人的均匀岁数:
SELECTAVG(Age)FROMPersonsWHEREAge>20

实行了局:
39.5

max
用处:
传回拔取的了局会合值的最年夜值。已疏忽Null值。
语法:
SELECTMAX(column_name)FROMtable_name

例:
“Persons”表华夏始数据以下:
Name
Age

Hansen,Ola
34

Svendson,Tove
45

Pettersen,Kari
19

拔取”Persons”表中的最年夜岁数:
SELECTMAX(Age)FROMPersons

实行了局:
45

min
用处:
传回拔取的了局会合值的最小值。已疏忽Null值。
语法:
SELECTMIN(column_name)FROMtable_name

例:
“Persons”表华夏始数据以下:
Name
Age

Hansen,Ola
34

Svendson,Tove
45

Pettersen,Kari
19

拔取”Persons”表中的最大年龄:
SELECTMIN(Age)FROMPersons

实行了局:
19

算术函数
abs
用处:
传回指定命值表达式(NumericExpression)的相对正值。
语法:
ABS(numeric_expression)

例:

1.00.01.0

ceil
用处:
传回年夜于即是给定命值表达式的最小整数。
语法:
CEIL(numeric_expression)

例:

124.00-123.00

floor
用处:
传回小于或即是给定命值表达式的最年夜整数。
语法:
FLOOR(numeric_expression)

例:

123.00-124.00

cos
用处:
在指定表达式中传回指定角度(以弪度为单元)的三角余弦值的数学函数。
语法:
COS(numeric_expression)

例:

-0.599465

cosh
用处:
传回以弧度为单元的角度值,其他弦为指定的float表达式,也称为反余弦。
语法:
COSH(numeric_expression)

例:

3.14159

sin
用处:
以近似的数值(float)表达式传回给定角度(以弧度)之三角正弦函数(TrigonometricSine)。
语法:
SIN(numeric_expression)

例:

0.929607

sinh
用处:
传回以弪度为单元的角度,其正弦为指定的float表达式(也称为归正弦)。
语法:
SINH(numeric_expression)

例:

-1.5708

tan
用处:
传回输出表达式的正切函数。
语法:
TAN(numeric_expression)

例:

1.6331778728383844E+16

tanh
用处:
传回以弪度为单元的角度,其正切为指定的float表达式(也称为归正切)。
语法:
TANH(numeric_expression)

例:

-1.54858

exp
用处:
传回给定的float表达式的指数(Exponential)值。
语法:
EXP(numeric_expression)

例:

2.69498e+164

log
用处:
传回给定的float表达式之天然对数。
语法:
LOG(numeric_expression)

例:

1.64396

power
用处:
传回给定表达式指定乘幂的值。
语法:
POWER(numeric_expression,v)

例:

64

sign
用处:
传回给定的表达式之正(+1)、零(0)或负(-1)号。
语法:
SIGN(numeric_expression)

例:

10-1

sqrt
用处:
传回给定表达式的平方。
语法:
SQRT(numeric_expression)

例:
SQRT(10)

实行了局:
100


修复过程包含最多4个阶段,在下面描述。在你开始前,你应该cd到数据库目录和检查表文件的权限,确保他们可被运行mysqld的Unix用户读取(和你,因为你需要存取你正在检查的文件)。如果它拒绝你修改文件,他们也必须是可被你写入的。
小妖女 该用户已被删除
沙发
发表于 2015-1-19 06:18:17 | 只看该作者
原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
再见西城 该用户已被删除
板凳
发表于 2015-1-26 19:33:13 | 只看该作者
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
再现理想 该用户已被删除
地板
发表于 2015-2-4 20:52:16 | 只看该作者
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
5#
发表于 2015-2-10 09:49:49 | 只看该作者
至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
admin 该用户已被删除
6#
发表于 2015-3-1 08:36:41 | 只看该作者
原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
第二个灵魂 该用户已被删除
7#
发表于 2015-3-10 13:11:04 | 只看该作者
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
山那边是海 该用户已被删除
8#
发表于 2015-3-17 08:10:41 | 只看该作者
需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
莫相离 该用户已被删除
9#
发表于 2015-3-24 03:59:22 | 只看该作者
然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-6 08:31

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表