数据库系统原理实验2

singlemouse 发布于 2023-11-05 603 次阅读


Table of Contents

实验2 SQL 查询语句

2.1 单表查询

2.1.1 实验目的与要求

(1) 掌握SQL查询语句的基本概念。

(2) 掌握SQL Server查询语句的基本语法。

(3) 熟练使用SQL的SELECT语句对单表进行查询。

(4) 熟练掌握并运用SQL Server所提供的函数。

(5) 熟练使用SQL语句进行单表聚合操作。

2.1.2 实验内容

在订单数据库OrderDB中,完成如下的查询:

(1) 查询名字中含有“有限”的客户名称和所在地。

(2) 查询出姓“张”并且姓名的最后一个字为“梅”的员工。

(3) 查询住址中含有“上海”或“南昌”的女员工,并显示其姓名、所属部门、职务、住址、出生日期和性别,其中如果出生日期为空,显示“不详”,否则按格式“yyyy-mm-dd”显示,性别用“男”和“女”显示。

(4) 选取编号不在C20150001~C20150004之间的客户编号、客户名称、客户地址。

(5) 在订单主表中选取订单金额最高的前10%的订单数据。

(6) 计算出一共销售了几种商品。

(7) 计算OrderDetail表中每种商品的销售数量、平均销售单价和总销售金额,并且依据销售金额由大到小排序输出。

(8) 按客户编号统计每个客户2015年3月的订单总金额。

(9) 统计至少销售了10件以上的商品编号和销售数量。

(10) 统计在业务科工作且在1987年或1988年出生的员工人数和平均工资。

2.1.3 SQL语句

(1)

select customerName,address
from Customer
where customerName like '%有限%'

(2)

select employeeName
from Employee
where employeeName like '张_梅' or employeeName like '张__梅'

(3)

select employeeName,department,headShip,address,
    case birthday when null then '不详'
                  else FORMAT(birthday,'yyyy-MM-dd')
    end as birthday,
    性别 = case sex when 'M' then '男'
                    when 'F' then '女'
           end
from Employee
where address like '%南昌%' or employeeName like '%上海%'

(4)

select customerNo,customerName,address
from Customer
where customerNo not between 'C20150001' and 'C20150004'

(5)

update OrderMaster set orderSum=sum2
from OrderMaster a,(select   
          orderNo,sum(quantity*price) sum2
                 from OrderDetail
                 group by orderNo) b
where a.orderNo=b.orderNo
select top 10 percent
    orderNo,customerNo,salerNo,orderDate,orderSum,invoiceNo
from OrderMaster
order by orderSum desc

(6)

select count(distinct productNo) as TotalProductCount
from OrderDetail;

(7)

select 
    productNo,
    sum(quantity) as totalQuantity,
    avg(price) as averagePrice,
    sum(quantity * price) as totalAmount
from OrderDetail
group by productNo
order by totalAmount desc;

(8)

select
    customerNo,
    sum(orderSum) as totalorderSum
from OrderMaster
where year(orderDate) = 2015 and month(orderDate) = 3
group by customerNo

(9)

select
    productNo,
    sum(quantity) as totalquantity
from OrderDetail
group by productNo
having sum(quantity) >= 10

(10)

select
    count(*) as employeeCount,
    avg(salary) as avgsalary
from Employee
where department = '业务科' and (year(birthday) = 1987 or year(birthday) = 1988)

2.1.4 运行结果

(1)

(2)

(3)

(4)

(5)

(6)

(7)

(8)

(9)

(10)

2.2 多表查询

2.2.1 实验目的与要求

(1) 熟练掌握SQL语句的使用。

(2) 熟练使用SQL语句进行连接操作。

2.2.2 实验内容

在订单数据库OrderDB中,完成如下的查询:

(1) 找出同一天进入公司服务的员工。

(2) 在Employee表中查询薪水超过员工平均薪水的员工信息。

(3) 查询没有订购商品的客户编号和客户名称。

(4) 使用子查询查找“酷睿四核I7-7700k”的销售情况,要求显示相应的销售员的姓名、性别,销售日期、销售数量和金额,其中性别用“男”、“女”表示。

(5) 查找每个员工的销售记录,要求显示销售员的编号、姓名、性别、商品名称、数量、单价、金额和销售日期,其中性别使用“男”和“女”表示,日期使用“yyyy-mm-dd”格式显示。

(6) 分别使用左外连接、右外连接、完整外部连接查询单价高于400元的商品编号、商品名称、订货数量和订货单价,并分析比较检索的结果。

(7) 查询单价高于400元的商品编号、商品名称、订货总数量和订货总价。

(8) 查询OrderMaster表中订单金额最高的订单号及订单金额。

(9) 查找订购总金额在5000元以上的客户编号、客户名称和订购总金额。

(10) 查询每种商品的总销售数量及总销售金额,要求显示出商品编号、商品名称、总数量及总金额,并按商品号从小到大排列。

2.2.3 SQL语句

(1)

select *
from Employee
where convert(date, hireDate) IN (
    select convert(date, hireDate)
    from Employee
    group by convert(date, hireDate)
    having count(*) > 1
)
order by hireDate;

(2)

select *
from Employee
where salary > ( 
        select avg(salary) 
        from Employee)

(3)

select customerNo,customerName
from Customer
where customerNo not in(
    select customerNo
    from OrderMaster
)

(4)

select a.employeeName,  
    性别 = case a.sex when 'M' then '男'
               when 'F' then '女'
    end, b.orderDate, c.quantity, 
    金额 = c.quantity*c.price
from Employee a, OrderMaster b, OrderDetail c
where a.employeeNo=b.salerNo and b.orderNo=c.orderNo and  
             c.productNo=d.productNo and productName='酷睿四核I7-7700k'
order by a.employeeNo

(5)

select a.employeeNo,a.employeeName,  
    性别 = case a.sex when 'M' then '男'
               when 'F' then '女'
    end, d.productName,c.quantity,c.price,
    金额 = c.price*c.quantity,
    销售日期 = case b.orderDate when null then '不详'
                  else FORMAT(b.orderDate,'yyyy-MM-dd')
    end
from Employee a, OrderMaster b, OrderDetail c, Product d
where a.employeeNo=b.salerNo and b.orderNo=c.orderNo and  
             c.productNo=d.productNo

(6)

左外连接:

SELECT p.productNo, p.productName, od.quantity, od.price
FROM Product p
LEFT JOIN OrderDetail od ON p.productNo = od.productNo
WHERE p.productPrice > 400

右外连接:

SELECT p.productNo, p.productName, od.quantity, od.price
FROM OrderDetail od
RIGHT JOIN Product p ON od.productNo = p.productNo
WHERE p.productPrice > 400

全外连接:

SELECT p.productNo, p.productName, od.quantity, od.price
FROM OrderDetail od
FULL OUTER JOIN Product p ON od.productNo = p.productNo
WHERE p.productPrice > 400

(7)

SELECT p.productNo, p.productName, SUM(od.quantity) AS totalQuantity, SUM(od.price * od.quantity) AS totalPrice
FROM Product p
JOIN OrderDetail od ON p.productNo = od.productNo
WHERE p.productPrice > 400
GROUP BY p.productNo, p.productName

(8)

select top 1 a.orderNo,sum(b.price * b.quantity) as totalPrice
from OrderMaster a
join OrderDetail b on a.orderNo = b.orderNo
group by a.orderNo
order by totalPrice desc

(9)

select a.customerNo,a.customerName,sum(c.price * c.quantity) as totalPrice
from Customer a,OrderMaster b,OrderDetail c 
where a.customerNo = b.customerNo and b.orderNo = c.orderNo
group by a.customerNo,a.customerName
having sum(c.price * c.quantity) >= 5000

(10)

select d.productNo,d.productName,sum(c.quantity) as totalQuantity,sum(c.price * c.quantity) as totalPrice
from OrderMaster b,OrderDetail c,Product d
where d.productNo = c.productNo and b.orderNo = c.orderNo
group by d.productNo,d.productName
order by productNo

2.2.4 运行结果

(1)

(2)

(3)

(4)

(5)

(6)

左外连接

右外连接

全外连接

(7)

(8)

(9)

(10)

2.3 复杂查询

2.3.1 实验目的与要求

(1) 熟练掌握存在量词(选学)、查询表的使用方法。

(2) 熟练使用SQL语句进行复杂的数据汇总操作。

2.3.2 实验内容

在订单数据库OrderDB中,完成如下的查询:

(1) 在订单明细表中查询订单金额最高的订单。

(2) 找出至少被订购3次的商品编号、订单编号、订货数量和订货金额,并按订货数量的降序排序输出。

(3) 查询订购的商品数量没有超过10个的客户编号和客户名称。

(4) 查找至少订购了3种商品的客户编号、客户名称、商品编号、商品名称、数量和金额。

(5) 查询单笔销售金额最高的销售员编号及其所有订单编号、订单日期和订单金额。

(6) 求每位客户订购的每种商品的总数量及平均单价,并按客户号、商品号从小到大排列。

(7) 查询业绩最好的业务员号、业务员名及其总销售金额。

(8) 用存在量词查找没有订货记录的客户名称(选做)。

(9) 查询至少包含了“手环”这类商品的订单的订单号、客户名称、商品名称、数量和单价。

(10) 查询既订购了“酷睿四核”商品,又订购了“华为手环”商品的客户编号、订单编号和订单金额。

2.3.3 SQL语句

(1)

select top 1 a.orderNo,sum(a.price * a.quantity) as totalPrice
from OrderDetail a
group by a.orderNo
order by totalPrice desc

(2)

select d.productNo,c.orderNo,sum(c.quantity) as totalquantity,sum(c.quantity*c.price) as totalprice
from OrderDetail c,Product d
group by d.productNo,c.orderNo,c.quantity
having sum(c.quantity)>=3
order by totalquantity desc

(3)

select a.customerNo,a.customerName
from Customer a,OrderDetail b,OrderMaster c
where a.customerNo = c.customerNo and b.orderNo = c.orderNo
group by a.customerNo,a.customerName
having sum(b.quantity) <= 10

(4)

select a.customerNo,a.customerName,d.productNo,d.productName,b.quantity,sum(b.price * b.quantity) as totalPrice
from Customer a,OrderDetail b,OrderMaster c,Product d
where a.customerNo = c.customerNo and b.orderNo = c.orderNo and b.productNo = d.productNo
group by a.customerNo,a.customerName,d.productNo,d.productName,b.quantity,b.price
having sum(b.quantity) >= 3

(5)

select top 1 om.salerNo,om.orderNo,om.orderDate,om.orderSum
from OrderMaster om
inner join (
    select salerNo, max(orderSum) as maxSum
    from OrderMaster
    group by salerNo
) t on om.salerNo = t.salerNo and om.orderSum = t.maxSum
order by om.orderSum desc

(6)

select c.customerNo,p.productNo,sum(od.quantity) as totalquantity,od.price
from OrderMaster om,Product p,OrderDetail od,Customer c
where om.orderNo = od.orderNo and c.customerNo = om.customerNo and p.productNo = od.productNo
group by c.customerNo,p.productNo,od.price
order by c.customerNo

(7)

select top 1 a.employeeNo,a.employeeName,sum(c.price*c.quantity) as totalprice
from Employee a, OrderMaster b, OrderDetail c, Product d
where a.employeeNo=b.salerNo and b.orderNo=c.orderNo and  
             c.productNo=d.productNo
group by a.employeeNo,a.employeeName
order by totalprice desc

(8)

存在量词选学,跳过

(9)

select om.orderNo, c.customerName, p.productName, od.quantity, od.price
from OrderMaster om,Customer c,OrderDetail od,Product p
where p.productName like '%手环%' and od.productNo = p.productNo and om.orderNo = od.orderNo and om.customerNo = c.customerNo

(10)

select c.customerNo,om.orderNo, sum(od.quantity*od.price) as orderSum
from OrderMaster om,Customer c,OrderDetail od , (select * from Product where productName like '%酷睿四核%')p1 
                                              , (select * from Product where productName like '%华为手环%')p2
where om.orderNo = od.orderNo and om.customerNo = c.customerNo 
                              and p1.productNo = od.productNo and od.productNo = p2.productNo
group by c.customerNo,om.orderNo

2.3.4 运行结果

(1)

(2)

(3)

(4)

(5)

(6)

(7)

(8)

存在量词选学,跳过

(9)

(10)

2.4. 总结

本次实验让我进一步了解了SQL的查询语句,即单表查询多表查询复杂查询,为以后更好地学习SQL打下了坚实基础。

           参考文献

[1] 数据库系统原理与设计(第三版) 万常选、廖国琼、吴京慧、刘喜平编著

[2] JOIN与INNER JOIN区别 .CSDN博主「豆虫儿

            致谢

此作者没有提供个人介绍
最后更新于 2023-11-05