实验三 单表查询
1 实验目的与要求
(1) 掌握SQL查询语句的基本概念.
(2) 掌握SQL Server查询语句的基本语法。
(3) 熟练使用SQL的SELECT语句对单表进行查询。
(4) 熟练掌握并运用SQL Server所提供的函数。
(5) 熟练使用SQL语句进行单表聚合操作。
2 实验内容
在订单数据库OrderDB中,完成如下的查询:
(1) 查询员工的姓名、职务和薪水。
(2) 查询名字中含有“有限”的客户名称和所在地。
(3) 查询出姓“张”并且姓名的最后一个字为“梅”的员工.
(4) 查询住址中含有“上海”或“南昌”的女员工,并显示其姓名、所属部门、职务、住址、出生日期和性别,其中如果出生日期为空,显示“不详”,否则按格式“yyyy-mm-dd\"
显示,性别用“男\"和“女\"显示。
(5) 查询出职务为“职员”或职务为“科长”的女员工的信息.
(6) 选取编号不在C20050001~C20050004之间的客户编号、客户名称、客户地址。
(7) 在表OrderMaster中挑出销售金额大于等于5000元的订单。
先统计订单主表中的订单金额,使用命令:
(8) 在订单主表中选取订单金额最高的前10%的订单数据.
(9) 计算出一共销售了几种商品。
(10) 计算OrderDetail表中每种商品的销售数量、平均销售单价和总销售金额,并且依据销售金额由大到小排序输出。
(11) 按客户编号统计每个客户2008年2月的订单总金额。
(12) 统计至少销售了10件以上的商品编号和销售数量。
(13) 统计在业务科工作且在1973年或1967年出生的员工人数和平均工资。
(14) 实验问题:
① 给出SQL语句实现分组聚集操作的执行过程。
② WHERE和HAVING子句都是用于指定查询条件的,请给出你对这两个子句的理解,用实例说明。
③ 在分组聚集操作中,为什么在查询列中,除了集聚函数运算,其它表达式必须包含在GROUP BY子句中.
④ 分析条件BETWEEN .。。 AND、AND、OR等关键字的使用方法。
⑤ 请总结SQL语句中的单表查询语句的使用方法。
(1) 查询员工的姓名、职务和薪水。
select employeeName48, headship48,salary48
from Employee48
(2) 查询名字中含有“有限”的客户名称和所在地。
select customerName48,address48
from Customer48
where customerName48 like '%有限%'
(3) 查询出姓“张”并且姓名的最后一个字为“梅”的员工。
select employeeName48
from Employee48
where employeeName48 like '%张_梅%'
(4) 查询住址中含有“上海”或“南昌”的女员工,并显示其姓名、所属部门、职务、
住址、出生日期和性别,其中如果出生日期为空,显示“不详\",否则按格式“yyyy-mm-dd”显示,性别用“男”和“女\"显示.
select employeeName48,department48, headship48,address48,birthday48,
CASE sex48
WHEN 'M’ THEN '男'
WHEN ’F' THEN '女'
END sex48,
isnull(convert(char(10),birthday48,120),’不详')birthday48
from Employee48
where address48 like ’%上海%’or address48 like ’%南昌%’
(5) 查询出职务为“职员\"或职务为“科长”的女员工的信息。
select *
from employee48
where (headship48=’科长' or headship48=’职员’) and sex48='F'
(6) 选取编号不在C20050001~C20050004之间的客户编号、客户名称、客户地址。
select customerNo48,customerName48,address48
from customer48
where customerNo48 not in(’C20050001’,’C20050004')
(7) 在表OrderMaster中挑出销售金额大于等于5000元的订单。
更新订单脚本
update OrderMaster48 set orderSum48=sum2
from OrderMaster48 a,(select orderNo48,sum(quantity48*price48) sum2
from OrderDetail48
group by orderNo48) b
where a.orderNo48=b.orderNo48
挑出订单
select *
from OrderMaster48
where orderSum48〉=’5000'
(8) 在订单主表中选取订单金额最高的前10%的订单数据.
select top 10 percent *
from OrderMaster48
order by orderSum48 desc
(9) 计算出一共销售了几种商品。
select count(distinct productNo48) account48
from OrderDetail48
(10) 计算OrderDetail表中每种商品的销售数量、平均销售单价和总销售金额,并且依据销售金额由大到小排序输出.
select productNo48,sum(quantity48) quantity48,avg(price48) avgprice48,sum(quantity48*price48) 总销售金额
from OrderDetail48
group by productNo48
order by 总销售金额desc
(11) 按客户编号统计每个客户2008年2月的订单总金额。
select b。customerNo48,customerName48,sum(orderSum48) ordersum
from customer48 a ,ordermaster48 b
where a.customerNo48=b.customerNo48
and year(orderDate48)=’2008'
and month(orderDate48)=’2'
group by b.customerNo48,customerName48
(12) 统计至少销售了10件以上的商品编号和销售数量。
select productNo48,sum(quantity48) total_quantity
from OrderDetail48
group by productNo48
having sum(quantity48)>=10
(13) 统计在业务科工作且在1973年或1967年出生的员工人数和平均工资。
select count(employeeName48) aoount48,avg(salary48) avgsalary48
from employee48
where department48=’业务科' and (year(birthday48)=’1973'year(birthday48)='1967')
(14) 实验问题:
① 给出SQL语句实现分组聚集操作的执行过程。
答:1:首先执行FROM语句,查找到各表数据
or
2:其次执行WHERE语句,对数据进行筛选以及表与表的连接
3:然后执行GROUP BY语句,将数据划分组
4:使用聚集函数进行计算
5:使用HAVING语句进行筛选分组
② WHERE和HAVING子句都是用于指定查询条件的,请给出你对这两个子句的理解,用实例说明.
答:
WHERE子句:作用于整个查询对象,对元组进行过滤,不可以和函数一起用。
HAVING子句:仅作用于分组,对分组进行过滤。必须与GROUP BY配合使用。
举例:
WHERE:(1) 查询所有业务部门的员工姓名、职称、薪水。
SELECT employeeName48,headShip48,salary48
FROM employee48
WHERE department48='业务科'
HAVING:查询最高分在80以上的每个同学的平均分和最高分
SELECT studentNo,avg(score) 平均分,max(score) 最高分
FROM Score
GROUP BY studentNo
HAVING max(score)>=80
③ 在分组聚集操作中,为什么在查询列中,除了集聚函数运算,其它表达式必须包含在GROUP BY子句中。
答:
如果查询列除集聚函数外的表达式不包含在GROUP BY子句中,则聚合没有意义,如在订单数据库中,查询每个客户的客户编号、订单编号和订单总额
SELECT customerNo48,orderNo48,sum(orderSum)
FROM OrderMaster48
GROUP BY customerNo48
只按客户号分组的话,语义变得不明确,因为一个客户可能有多张订单,按客户号分组但是订单总额不知道分配到那张订单去,所以,除了集聚函数运算,其他表达式必须包含
在GROUP BY 子句中。
④ 分析条件BETWEEN 。。. AND、AND、OR等关键字的使用方法.
答:BETWEEN 。.. AND是介于两个值之间的时候的查询条件;
AND 连接两个条件,同时成立;
OR 连接两个条件,一方成立即可。
⑤ 请总结SQL语句中的单表查询语句的使用方法。
⒈查询所有列
SELECT * FROM [表名]
2。查询指定列
SELECT [字段列表] FROM [表名]
3。 消除重复元组:
SELECT Distinct [字段列表] FROM [表名]
4。查询经过计算的列
SELECT 【字段及字段表达式】 FROM 【表名】
5. 指定查询结果的查询
SELECT TOP n [PERCENT] 【字段列表】 FROM 【表名】
6。给属性取别名
①:SELECT 【字段名】1 as ''A'' 名】
②:SELECT ”A\"=字段名1 FROM 【表名】
③:SELECT 字段名1 ”A” FROM 【表名】
7。选择查询
SELECT 【字段名列表】 FROM 【表名】 WHERE 【条件表达式】条件表达式运算符:
比较运算:=,〈,<=,>,>=,!〈,!〉,!=,〈>
逻辑查询:or,AND,not
范围查询:between… AND,not between …AND
FROM 【表
集合查询:IN,not IN
字符匹配查询:ike,not LIKE
空值查询:is null,is not null
8。排序查询
SELECT 【字段名1】,【字段名2】 FROM 【表名】
WHERE 【条件表达式】
ORDER BY 【字段表达式1】,【字段表达式2】 [ASC][DESC]
9。分组查询
①SELECT 字段名列表 FROM 表名 [WHERE 条件表达式]
GROUP BY 字段名
②SELECT 字段名列表 FROM 表名 [WHERE条件表达式]
GROUP BY 字段名 HAVING 筛选表达式
10.聚合查询
SELECT count([ALL| DISTINCT]{*|字段名列表}) FROM 表名
[WHERE 条件表达式]
SELECT sum| avg| max| min ([ALL| DISTINCT]〈字段名列表〉)
FROM 表名
[WHERE 条件表达式]
⑤分析哪几种情况需要使用自表连接。
当同表中的某个元组变量与表中的另外的元组变量相关时,可以使用自表连接,从而得到一些特殊的数据或者是说带特定条件的数据。自表连接一般是用来判断并筛选单一表中的一些数据。
因篇幅问题不能全部显示,请点此查看更多更全内容