sql server 基础教程B.docx
- 文档编号:8571473
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:58
- 大小:38.66KB
sql server 基础教程B.docx
《sql server 基础教程B.docx》由会员分享,可在线阅读,更多相关《sql server 基础教程B.docx(58页珍藏版)》请在冰豆网上搜索。
sqlserver基础教程B
SQLjoin用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
Join和Key
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。
我们就需要执行join。
数据库中的表可通过键将彼此联系起来。
主键(PrimaryKey)是一个列,在这个列中的每一行的值都是唯一的。
在表中,每个主键的值都是唯一的。
这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
请看"Persons"表:
Id_P
LastName
FirstName
Address
City
1
Adams
John
OxfordStreet
London
2
Bush
George
FifthAvenue
NewYork
3
Carter
Thomas
ChanganStreet
Beijing
请注意,"Id_P"列是Persons表中的的主键。
这意味着没有两行能够拥有相同的Id_P。
即使两个人的姓名完全相同,Id_P也可以区分他们。
接下来请看"Orders"表:
Id_O
OrderNo
Id_P
1
77895
3
2
44678
3
3
22456
1
4
24562
1
5
34764
65
请注意,"Id_O"列是Orders表中的的主键,同时,"Orders"表中的"Id_P"列用于引用"Persons"表中的人,而无需使用他们的确切姓名。
请留意,"Id_P"列把上面的两个表联系了起来。
引用两个表
我们可以通过引用两个表的方式,从两个表中获取数据:
谁订购了产品,并且他们订购了什么产品?
SELECTPersons.LastName,Persons.FirstName,Orders.OrderNo
FROMPersons,Orders
WHEREPersons.Id_P=Orders.Id_P
结果集:
LastName
FirstName
OrderNo
Adams
John
22456
Adams
John
24562
Carter
Thomas
77895
Carter
Thomas
44678
SQLJOIN-使用Join
除了上面的方法,我们也可以使用关键词JOIN来从两个表中获取数据。
如果我们希望列出所有人的定购,可以使用下面的SELECT语句:
SELECTPersons.LastName,Persons.FirstName,Orders.OrderNo
FROMPersons
INNERJOINOrders
ONPersons.Id_P=Orders.Id_P
ORDERBYPersons.LastName
结果集:
LastName
FirstName
OrderNo
Adams
John
22456
Adams
John
24562
Carter
Thomas
77895
Carter
Thomas
44678
不同的SQLJOIN
除了我们在上面的例子中使用的INNERJOIN(内连接),我们还可以其他几种连接。
下面列出了您可以使用的JOIN类型,以及它们之间的差异。
∙JOIN:
如果表中有至少一个匹配,则返回行
∙LEFTJOIN:
即使右表中没有匹配,也从左表返回所有的行
∙RIGHTJOIN:
即使左表中没有匹配,也从右表返回所有的行
∙FULLJOIN:
只要其中一个表中存在匹配,就返回行
∙SQLINNERJOIN关键字
∙在表中存在至少一个匹配时,INNERJOIN关键字返回行。
∙INNERJOIN关键字语法
∙SELECTcolumn_name(s)
∙FROMtable_name1
∙INNERJOINtable_name2
∙ONtable_name1.column_name=table_name2.column_name
∙注释:
INNERJOIN与JOIN是相同的。
∙原始的表(用在例子中的):
∙"Persons"表:
Id_P
LastName
FirstName
Address
City
1
Adams
John
OxfordStreet
London
2
Bush
George
FifthAvenue
NewYork
3
Carter
Thomas
ChanganStreet
Beijing
∙"Orders"表:
Id_O
OrderNo
Id_P
1
77895
3
2
44678
3
3
22456
1
4
24562
1
5
34764
65
∙内连接(INNERJOIN)实例
∙现在,我们希望列出所有人的定购。
∙您可以使用下面的SELECT语句:
∙SELECTPersons.LastName,Persons.FirstName,Orders.OrderNo
∙FROMPersons
∙INNERJOINOrders
∙ONPersons.Id_P=Orders.Id_P
∙ORDERBYPersons.LastName
∙结果集:
LastName
FirstName
OrderNo
Adams
John
22456
Adams
John
24562
Carter
Thomas
77895
Carter
Thomas
44678
∙INNERJOIN关键字在表中存在至少一个匹配时返回行。
如果"Persons"中的行在"Orders"中没有匹配,就不会列出这些行。
∙SQLLEFTJOIN关键字
∙LEFTJOIN关键字会从左表(table_name1)那里返回所有的行,即使在右表(table_name2)中没有匹配的行。
∙LEFTJOIN关键字语法
∙SELECTcolumn_name(s)
∙FROMtable_name1
∙LEFTJOINtable_name2
∙ONtable_name1.column_name=table_name2.column_name
∙注释:
在某些数据库中,LEFTJOIN称为LEFTOUTERJOIN。
∙原始的表(用在例子中的):
∙"Persons"表:
Id_P
LastName
FirstName
Address
City
1
Adams
John
OxfordStreet
London
2
Bush
George
FifthAvenue
NewYork
3
Carter
Thomas
ChanganStreet
Beijing
∙"Orders"表:
Id_O
OrderNo
Id_P
1
77895
3
2
44678
3
3
22456
1
4
24562
1
5
34764
65
∙左连接(LEFTJOIN)实例
∙现在,我们希望列出所有的人,以及他们的定购-如果有的话。
∙您可以使用下面的SELECT语句:
∙SELECTPersons.LastName,Persons.FirstName,Orders.OrderNo
∙FROMPersons
∙LEFTJOINOrders
∙ONPersons.Id_P=Orders.Id_P
∙ORDERBYPersons.LastName
∙结果集:
LastName
FirstName
OrderNo
Adams
John
22456
Adams
John
24562
Carter
Thomas
77895
Carter
Thomas
44678
Bush
George
∙LEFTJOIN关键字会从左表(Persons)那里返回所有的行,即使在右表(Orders)中没有匹配的行。
∙SQLRIGHTJOIN关键字
∙RIGHTJOIN关键字会右表(table_name2)那里返回所有的行,即使在左表(table_name1)中没有匹配的行。
∙RIGHTJOIN关键字语法
∙SELECTcolumn_name(s)
∙FROMtable_name1
∙RIGHTJOINtable_name2
∙ONtable_name1.column_name=table_name2.column_name
∙注释:
在某些数据库中,RIGHTJOIN称为RIGHTOUTERJOIN。
∙原始的表(用在例子中的):
∙"Persons"表:
Id_P
LastName
FirstName
Address
City
1
Adams
John
OxfordStreet
London
2
Bush
George
FifthAvenue
NewYork
3
Carter
Thomas
ChanganStreet
Beijing
∙"Orders"表:
Id_O
OrderNo
Id_P
1
77895
3
2
44678
3
3
22456
1
4
24562
1
5
34764
65
∙右连接(RIGHTJOIN)实例
∙现在,我们希望列出所有的定单,以及定购它们的人-如果有的话。
∙您可以使用下面的SELECT语句:
∙SELECTPersons.LastName,Persons.FirstName,Orders.OrderNo
∙FROMPersons
∙RIGHTJOINOrders
∙ONPersons.Id_P=Orders.Id_P
∙ORDERBYPersons.LastName
∙结果集:
LastName
FirstName
OrderNo
Adams
John
22456
Adams
John
24562
Carter
Thomas
77895
Carter
Thomas
44678
34764
∙RIGHTJOIN关键字会从右表(Orders)那里返回所有的行,即使在左表(Persons)中没有匹配的行。
∙SQLFULLJOIN关键字
∙只要其中某个表存在匹配,FULLJOIN关键字就会返回行。
∙FULLJOIN关键字语法
∙SELECTcolumn_name(s)
∙FROMtable_name1
∙FULLJOINtable_name2
∙ONtable_name1.column_name=table_name2.column_name
∙注释:
在某些数据库中,FULLJOIN称为FULLOUTERJOIN。
∙原始的表(用在例子中的):
∙"Persons"表:
Id_P
LastName
FirstName
Address
City
1
Adams
John
OxfordStreet
London
2
Bush
George
FifthAvenue
NewYork
3
Carter
Thomas
ChanganStreet
Beijing
∙"Orders"表:
Id_O
OrderNo
Id_P
1
77895
3
2
44678
3
3
22456
1
4
24562
1
5
34764
65
∙全连接(FULLJOIN)实例
∙现在,我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。
∙您可以使用下面的SELECT语句:
∙SELECTPersons.LastName,Persons.FirstName,Orders.OrderNo
∙FROMPersons
∙FULLJOINOrders
∙ONPersons.Id_P=Orders.Id_P
∙ORDERBYPersons.LastName
∙结果集:
LastName
FirstName
OrderNo
Adams
John
22456
Adams
John
24562
Carter
Thomas
77895
Carter
Thomas
44678
Bush
George
34764
∙FULLJOIN关键字会从左表(Persons)和右表(Orders)那里返回所有的行。
如果"Persons"中的行在表"Orders"中没有匹配,或者如果"Orders"中的行在表"Persons"中没有匹配,这些行同样会列出。
∙SQLUNION操作符
∙UNION操作符用于合并两个或多个SELECT语句的结果集。
∙请注意,UNION内部的SELECT语句必须拥有相同数量的列。
列也必须拥有相似的数据类型。
同时,每条SELECT语句中的列的顺序必须相同。
∙SQLUNION语法
∙SELECTcolumn_name(s)FROMtable_name1
∙UNION
∙SELECTcolumn_name(s)FROMtable_name2
∙注释:
默认地,UNION操作符选取不同的值。
如果允许重复的值,请使用UNIONALL。
∙SQLUNIONALL语法
∙SELECTcolumn_name(s)FROMtable_name1
∙UNIONALL
∙SELECTcolumn_name(s)FROMtable_name2
∙另外,UNION结果集中的列名总是等于UNION中第一个SELECT语句中的列名。
∙下面的例子中使用的原始表:
∙Employees_China:
E_ID
E_Name
01
Zhang,Hua
02
Wang,Wei
03
Carter,Thomas
04
Yang,Ming
∙Employees_USA:
E_ID
E_Name
01
Adams,John
02
Bush,George
03
Carter,Thomas
04
Gates,Bill
∙使用UNION命令
∙实例
∙列出所有在中国和美国的不同的雇员名:
∙SELECTE_NameFROMEmployees_China
∙UNION
∙SELECTE_NameFROMEmployees_USA
∙结果
E_Name
Zhang,Hua
Wang,Wei
Carter,Thomas
Yang,Ming
Adams,John
Bush,George
Gates,Bill
∙注释:
这个命令无法列出在中国和美国的所有雇员。
在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。
UNION命令只会选取不同的值。
∙UNIONALL
∙UNIONALL命令和UNION命令几乎是等效的,不过UNIONALL命令会列出所有的值。
∙SQLStatement1
∙UNIONALL
∙SQLStatement2
∙使用UNIONALL命令
∙实例:
∙列出在中国和美国的所有的雇员:
∙SELECTE_NameFROMEmployees_China
∙UNIONALL
∙SELECTE_NameFROMEmployees_USA
∙结果
E_Name
Zhang,Hua
Wang,Wei
Carter,Thomas
Yang,Ming
Adams,John
Bush,George
Carter,Thomas
Gates,Bill
SQLSELECTINTO语句可用于创建表的备份复件。
SELECTINTO语句
SELECTINTO语句从一个表中选取数据,然后把数据插入另一个表中。
SELECTINTO语句常用于创建表的备份复件或者用于对记录进行存档。
SQLSELECTINTO语法
您可以把所有的列插入新表:
SELECT*
INTOnew_table_name[INexternaldatabase]
FROMold_tablename
或者只把希望的列插入新表:
SELECTcolumn_name(s)
INTOnew_table_name[INexternaldatabase]
FROMold_tablename
SQLSELECTINTO实例-制作备份复件
下面的例子会制作"Persons"表的备份复件:
SELECT*
INTOPersons_backup
FROMPersons
IN子句可用于向另一个数据库中拷贝表:
SELECT*
INTOPersonsIN'Backup.mdb'
FROMPersons
如果我们希望拷贝某些域,可以在SELECT语句后列出这些域:
SELECTLastName,FirstName
INTOPersons_backup
FROMPersons
SQLSELECTINTO实例-带有WHERE子句
我们也可以添加WHERE子句。
下面的例子通过从"Persons"表中提取居住在"Beijing"的人的信息,创建了一个带有两个列的名为"Persons_backup"的表:
SELECTLastName,Firstname
INTOPersons_backup
FROMPersons
WHERECity='Beijing'
SQLSELECTINTO实例-被连接的表
从一个以上的表中选取数据也是可以做到的。
下面的例子会创建一个名为"Persons_Order_Backup"的新表,其中包含了从Persons和Orders两个表中取得的信息:
SELECTPersons.LastName,Orders.OrderNo
INTOPersons_Order_Backup
FROMPersons
INNERJOINOrders
ONPersons.Id_P=Orders.Id_P
CREATEDATABASE语句
CREATEDATABASE用于创建数据库。
SQLCREATEDATABASE语法
CREATEDATABASEdatabase_name
SQLCREATEDATABASE实例
现在我们希望创建一个名为"my_db"的数据库。
我们使用下面的CREATEDATABASE语句:
CREATEDATABASEmy_db
可以通过CREATETABLE来添加数据库表。
CREATETABLE语句
CREATETABLE语句用于创建数据库中的表。
SQLCREATETABLE语法
CREATETABLE表名称
(
列名称1数据类型,
列名称2数据类型,
列名称3数据类型,
....
)
数据类型(data_type)规定了列可容纳何种数据类型。
下面的表格包含了SQL中最常用的数据类型:
数据类型
描述
∙integer(size)
∙int(size)
∙smallint(size)
∙tinyint(size)
仅容纳整数。
在括号内规定数字的最大位数。
∙decimal(size,d)
∙numeric(size,d)
容纳带有小数的数字。
"size"规定数字的最大位数。
"d"规定小数点右侧的最大位数。
char(size)
容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。
在括号中规定字符串的长度。
varchar(size)
容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。
在括号中规定字符串的最大长度。
date(yyyymmdd)
容纳日期。
SQLCREATETABLE实例
本例演示如何创建名为"Person"的表。
该表包含5个列,列名分别是:
"Id_P"、"LastName"、"FirstName"、"Address"以及"City":
CREATETABLEPersons
(
Id_Pint,
LastNamevarchar(255),
FirstNamevarchar(255),
Addressvarchar(255),
Cityvarchar(255)
)
Id_P列的数据类型是int,包含整数。
其余4列的数据类型是varchar,最大长度为255个字符。
空的"Persons"表类似这样:
Id_P
LastName
FirstName
Address
City
可使用INSERTINTO语句向空表写入数据。
SQLDEFAULT约束
DEFAULT约束用于向列中插入默认值。
如果没有规定其他的值,那么会将默认值添加到所有的新纪录。
SQLDEFAULTConstraintonCREATETABLE
下面的SQL在"Persons"表创建时为"City"列创建DEFAULT约束:
MySQL/SQLServer/Oracle/MSAccess:
CREATETABLEPersons
(
Id_PintNOTNULL,
LastNamevarchar(255)NOTNULL,
FirstNamevarchar(255),
Addressvarchar(255),
Cityvarchar(255)DEFAULT'Sandnes'
)
通过使用类似GETDATE()这样的函数,DEFAULT约束也可以用于插入系统值:
CREATETABLEOrders
(
Id_OintNOTNULL,
OrderNointNOTNULL,
Id_Pint,
OrderDatedateDEFAULTGETDATE()
)
SQLDEFAULTConstraintonALTERTABLE
如果在表已存在的情况下为"C
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sql server 基础教程B 基础教程