Sqlserver学习笔记
-----------------------接Part 2-------------------
13.使用compute对查询结果集中的所有记录进行汇总统计,并显示所有参加汇总的记录的详细信息。
格式:
COMPUTE聚合函数[列名] --聚合函数,例如SUM(),AVG(),COUNT()等
结合GROUP BY使用
示例:
SELECT*FROM std_table
GROUP BY专业方向
COMPUTESUM(高考分数)
SELECT专业方向,COUNT(*)系部总人数
FROMstd_table
GROUPBY专业方向
COMPUTECOUNT(专业方向)
SELECT专业方向,COUNT(*)系部总人数
FROMstd_table
GROUPBY专业方向
COMPUTESUM(COUNT(*))
SELECT专业方向,AVG(高考分数)高考平均分
FROMstd_table
GROUPBY专业方向
COMPUTEAVG(AVG(高考分数))
EXECSP_RENAME'专业.系部名称','系部代码'
14. UNION操作
UNION操作符用于合并两个或多个SELECT语句的结果集。
请注意,UNION内部的SELECT语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT语句中的列的顺序必须相同。【原因:sql union只是将两个结果联结起来一起显示,并不是联结两个表】
注释:默认地,UNION操作符选取不重复的记录。如果允许重复的值,请使用UNION ALL。
另外,UNION结果集中的列名总是等于UNION中第一个SELECT语句中的列名。
--UNION和NNION ALL
--UNION操作符用于合并两个或多个SELECT语句的结果集
SELECT学号FROM学生
UNION
SELECT专业代码FROM专业
SELECT学号FROM学生
UNION ALL
SELECT专业代码FROM专业
--对比:NNION ALL保留了重复值
SELECT专业代码FROM专业
UNION ALL
SELECT学号FROM学生
15复合连接条件查询(多表查询)
SELECT学生.学号,学生.姓名,班级.班级名称
FROM学生
JOIN班级ON学生.班级代码=班级.班级代码
SELECT学生.学号,学生.姓名,班级.班级名称,专业.专业名称,系部.系部名称
FROM学生
JOIN班级ON学生.班级代码=班级.班级代码
JOIN专业ON学生.专业代码=班级.专业代码
JOIN系部ON系部.系部代码=班级.系部代码
--先建立如下表
CREATETABLE person
(
id INTPRIMARYKEY,
lastNAME VARCHAR(10)NOTNULL,
firstName VARCHAR(10)NOTNULL,
addr VARCHAR(20)NOTNULL,
city VARCHAR(10)
)
CREATETABLE orders
(
id INTPRIMARYKEY,
orderNo CHAR(6)NOTNULL,
idP INTFOREIGNKEYREFERENCES person(id)
)
INSERTINTO person
VALUES(1,'Lai','fy','none','none')
INSERTINTO person
VALUES(2,'Lai','ll','none','none')
INSERTINTO person
VALUES(3,'Lai','zy','none','none')
INSERTINTO person
VALUES(4,'Lai','fj','none','none')
INSERTINTO orders
VALUES(1,'111', 1)
INSERTINTO orders
VALUES(2,'zzz', 2)
INSERTINTO orders
VALUES(3,'zzz',NULL)
INSERTINTO orders
VALUES(4,'zzz',NULL)
--给上述两个表中插入数据后,做如下查询语句
--left join可以写成left outer join,,,其它的以此类推
--列出所有人的订购(INNER JOIN --->内连接)
SELECTperson.lastName, person.firstName, orders.orderNo
FROMperson
INNERJOIN orders
ONperson.id = orders.idp
ORDERBY person.lastName
--注:INNER JOIN和JOIN效果一样,只要表中有一个匹配,则返回记录行
--列出所有的人,以及他们的订购,如果有的话(LEFT OUTER JOIN-->左外连接)
SELECTperson.lastName, person.firstName, orders.orderNo
FROMperson
LEFTOUTERJOIN orders
ONperson.id = orders.idp
--注:LEFT OUTER JOIN会返回左表所有的行,即使在右表中没有匹配值的行
--列出所有的订单,以及订购他们的人,如果有的话(RIGHT OUTER JOIN-->右外连接)
SELECTperson.lastName, person.firstName, orders.orderNo
FROMperson
RIGHTOUTERJOIN orders
ONperson.id = orders.idp
--注:RIGHT OUTER JOIN会返回右表所有的行,即使在左表中没有匹配值的行
--列出所有的人,以及他们的定单;同时列出所有的定单,以及定购它们的人(FULL JOIN--->完全连接)
SELECTperson.lastName, person.firstName, orders.orderNo
FROMperson
FULLJOIN orders
ONperson.id = orders.idp
16嵌套查询
SELECT*FROM学生
WHERE班级代码IN
(
SELECT班级代码FROM班级WHERE专业代码IN
(
SELECT专业代码FROM专业WHERE系部代码IN
(
SELECT系部代码FROM系部WHERE系部代码IN(1, 2, 5)
)
)
)