连接查询
内连接查询是典型的、常用的连接查询,根据两个表共同的列进行匹配,特别是两个表存在的外键关系通常使用内连接查询。
内连接查询会使用 "=" "<>" 等运算判断数据值是否相等
内连接查询使用inner join...on关键字或者where子句来进行表之间的关联
1.使用INNER JOIN...ON关键字
可以把两个符合连接条件的数据抽取出来形成第3个表。通过inner join...on关键字生成的表数据通常会比两个园表中任一表的数据量少。或者等于数据量较小的那个表数据量
使用inner join... on关键字实现查询图书信息和图书分类名称的T-SQL语句如下(A.B.C代表别名(AS可以省略))
select c.categoryName, b.Bname, B.bprice, B.bAuthor
from bookInfo AS b
inner join bookcategory As c on b.cid = c.Categorycode
语句参数说明如下。
inner join:用来连接两个表
inner:可以省略
on:用来设置两个表之间的关联条件
AS:指定表的"别名"。查询的列名在用到的两个或多个表中不重复,则对这一列的引用不必用表面限定
注意:内连接查询所返回的查询结果是从两个以上表的组合中筛选出符合连接条件的数据,如果数据无法满足连接条件,则将其忽略。在内连接查询中,参与连接的表的地位是平等的
2.在where子句中指定连接条件
使用where子句也可以实现连接,在from后面罗列要连接查询的表面以'',''分隔,然后在where子句中规定连接过滤条件
查询图书分类名称、图书名称、图书价格和图书作者的T-SQL语句示例如下
select bookcategory.CategorgName, bookInfo.BName, bookInfo,BPrice, bookInfo.BAuthor
from BookInfo, bookCategory
where BookInfo.CId = bookcategory.CategorCode
在上述语句中,from后面紧跟了两个表名,在查询列中用"表名,列名"来区分各表的列,然后在where子句规定连接条件
外连接查询
外连接查询可分为主表和从表,主表的数据会被完全显示,而从表中只显示满足连接条件的数据。这样,外连接查询的数据一般会比主表和从表中数据量最小的表中的数据多
外连接查询根据连接反向不同,可以划分为左连接、右连接和全连接(从左至右)
left join..on right join..on full join...on
如果左外连接left join...on 则位于from关键字左端的表为主表,另一端为从表。若是外连接,则反之。若是完全连接,则没有主从表关系
1.左外连接查询
左外连接查询使用left join...on或left outer join..on关键字进行表与表之间的关联若左表的某行在右表中没有匹配记录,则在相关的结果集行中右表所有选择列均为null
图书管理系统不仅要统计每位用户的借书情况,还要显示没有借过图书的用户。以用户信息为主表、图书借出信息表为从表(A.B.C代表别名(AS可以省略))
select U.UserName, B.BorrowDate, B.BId From UserInfo AS U
left outer join BorrowInfo AS B on B.UserID = U.UserId
2.右外连接查询
右外连接查询使用 right join...on或 right outer join...on关键字,若右表中存在左表无法匹配的记录,则以null值填充
select U.UserName,B.BorrowDate,B.Bid from UserInfo As U
right outer join BorrowInfo AS B on B.UserId = U.UserId
3.完全连接查询
完全连接查询使用full join..on或 full outer join..on关键字 完全连接查询会从两个连接表中获取数据。若右对应关系,则会填上对应数据;否则,以null值填充。完全连接表生成的数据量会比两个连接表生成的数据量大
select U.UserName, B.borrowDate,B.Bid from UserInfo As U
full join BorrowInfo As B on b.UserId = U.UserId
分组查询
聚合函数
函数名称 | 说明 |
---|---|
SUM | 返回表达式中所有数值的和 |
AVG | 返回表达式中所有数值的平均值 |
MIN | 返回表达式中的最小值 |
MAX | 返回表达式中最大值 |
COUNT | 返回查询记录的总个数 |
DISTINCT | 返回一个集合,并从指定的集合中删除重复项 |
1.SUM函数
SUM函数用于返回表达式中所有数值的和。SUM函数只能用于数字列,若参与计算记录在该列上的值为空值(NULL)则该条记录在计算中忽略
使用SUM函数统计图书分类编号为1的所有图书总价
select SUM(BPrice) AS 图书总价 From bookInfo where CId = 1
注意:SUM函数返回的结果是一个数值,因此它不能直接与可能返回多行的列一起使用。
select SYM(BPrice) AS 图书总价,BName AS 图书名称 From BookInfo where CId = 1
返回错误:选择列表中的列'BookInfo.BName'无效 ,因为该列没有包含在聚合函数或group by 子句中
2.AVG函数
AVG函数用于返回表达式中所有数值的平均值,该列值为空(NULL)的记录将被忽略
使用AVG函数统计图书分类编号为1的所有图书价格的平均值
select AVG(BPrice) AS 平均价格 from BookInfo where CId = 1
3.MIN函数
MIN函数返回表达式中的最小值,出现空值,则记录将被忽略。MIN函数可以用于数值、字符串和日期类型的数据列。
使用MAX函数查询图书信息表中价格最低的图书信息
select MIN(BPrice) AS 最低价格 from BookInfo
4.MAX函数
MAX函数用于返回表达式中最大值,出现空值,则将被忽略
使用MAX函数查询图书信息表中价格最高的图书信息
select MAX(BPrice) AS 图书总家, BName AS 图书名称 from BookInfo
5.COUNT函数
COUNT函数返回提供的组或记录集中的技数。COUNT函数可以用于text、image、ntext外的任何类型列。另外,也可以使用星号(*)作为COUNT函数的参数
使用COUNT(*)统计图书信息表的图书总数
select COUNT(*) AS 总数 from BookInfo
6.DISTINCT函数
DISTNCT函数对指定的结果集去重时,会先排除该结果集中的重复值,然后返回结果集
select DISTINCT(CId) AS 不重复图书分类编号 from BookInfo
使用GROUP BY子于进行分组查询
可以利用GROUP BY子句实现对数据的分组。GROUP BY 子句结合聚合函数,根据一个人或多个列对结果集进行分组,然后由聚合函数进行分组统计
查询每一个用户Id对应的借书数量。
select UserId AS 用户 ID, COUNT(USerId) AS 借书数量 from borrowInfo group by userId
使用HAVING子句进行分组筛选
HAVING用于指定搜索条件,通常在GROUP BY子句中使用
根据用户Id对应用户信息分组后,在此借出上使用HAVING子句添加过滤条件,筛选出借书数量超过1本的用户的用户Id
select UserId from BorrowInfo group by userId having count(Bid)>1
提示:在select语句中,where、group by、having子句和聚合函数的执行次序如下:where子句从数据源筛掉不符合搜索条件的记录;group by子句将记录分到各组中;having子句从筛选分组后不符合搜索条件的记录