实验-子查询

子查询


在这里插入图片描述

1. 查询每门被选修的课程信息,输出课程号,课程名

题目

查询每门被选修的课程信息,输出课程号,课程名,结果按课程号降序排列。

其中课程表course结构为

在这里插入图片描述

选修表sc结构为

在这里插入图片描述

代码

select distinct sc.cno,cname from course,sc
where course.cno=sc.cno
order by sc.cno desc;

2、查询每门课程被选修的情况,输出课程号,课程名,被选修次数

题目

查询每门课程被选修的情况,输出课程号,课程名,被选修次数,结果按选修次数降序课程号降序排列。

其中课程表course结构为

在这里插入图片描述

选修表sc结构为

在这里插入图片描述

代码

select distinct course.cno,course.cname,count(*) from course,sc
where course.cno=sc.cno
group by sc.cno 
order by count(*) desc, sc.cno desc;

题解

  1. 首先是从哪些表中查询数据,这里是从两张表 COURSE 和 SC 中查询。

    FROM course, sc

  2. 接下来,需要指定查询的条件,这里的条件是 COURSE 表和 SC 表中的 CNO 字段相等。

    WHERE course.cno = sc.cno

  3. 然后,将查询结果按照课程号进行分组,以便统计每个课程的选课人数。

    GROUP BY sc.cno

  4. 接下来,需要选取要查询的列,包括课程号、课程名称和选课人数。

    SELECT DISTINCT course.cno, course.cname, COUNT(*)

注意这里使用了 DISTINCT 关键字去除重复行。

  1. 然后,需要对查询结果进行排序,按照选课人数降序排列,如果选课人数相同,则按照课程号升序排列。

    ORDER BY count(*) DESC, sc.cno ASC

  2. 最后,得到所有课程的课程号、课程名称和选课人数,按照选课人数从多到少排序,如果选课人数相同,则按照课程号从小到大排序。

3、查询每门课程被选修的情况(包括从未被选修过的课程)

题目

查询每门课程被选修的情况(包括从未被选修过的课程),输出课程号,课程名,被选修次数,结果按选修次数升序课程号升序排列。

其中课程表course结构为
在这里插入图片描述

选修表sc结构为

在这里插入图片描述

代码

select course.cno,cname,count(sno) 
from course left join sc
on  course.cno=sc.cno 
group by course.cno
order by count(sno) asc ,course.cno asc

题解

  1. 使用 LEFT JOIN 关键字将 COURSE 表和 SC 表联结起来。

    FROM course LEFT JOIN sc ON course.cno = sc.cno

这里使用了 LEFT JOIN,即使 SC 表中没有与 COURSE 表中的某些记录匹配的记录,也会返回 COURSE 表中的所有记录。

  1. 使用 GROUP BY 关键字按照课程号分组。

    GROUP BY course.cno

该语句将查询结果按照 COURSE.CNO 字段的值进行分组。

  1. 使用 COUNT 函数统计每组中的记录数量。

    COUNT(sno)

该函数用于统计每组中的记录数量。

  1. 使用 ORDER BY 关键字按照记录数量升序排列,并以每组中的第一个记录的 CNO 升序排列。

    ORDER BY count(sno) ASC, course.cno ASC

    该语句将查询结果按照记录数量升序排列,如果记录数量相同,则按照 COURSE.CNO 的升序排列。

  2. 使用 SELECT 关键字选取要查询的列。

    SELECT course.cno, cname, COUNT(sno)

    该语句选取了 COURSE.CNO、COURSE.CNAME 和 COUNT(SNO) 三个列。

因此,最终查询结果将会是每个课程的课程号、课程名和选课人数。注意,由于使用了 LEFT JOIN,即使某些课程没有被选课,它们也会被包含在查询结果中,其选课人数为 0。最后,查询结果将按照选课人数从少到多排序,如果选课人数相同,则按照课程号从小到大排序。

4、查询 2016 年没有下订单的客户

题目

查询 2016 年没有下订单的客户,输出客户编号和客户名称,结果按客户名称升序排列。

其中客户表customer结构为

在这里插入图片描述

订单表`order`结构为

在这里插入图片描述

代码

select customer_id,customer_name from customer
where not exists(select * from `order` where
        year(order_date)=2016 and customer_id = customer.customer_id)
order by customer_name

题解

  1. 使用 FROM 关键字指定要查询的数据来源。

    FROM customer

    该语句将 CUSTOMER 表作为查询的数据来源。

  2. 使用 WHERE 关键字指定查询的条件。

    WHERE NOT EXISTS (SELECT * FROM `order` WHERE YEAR(order_date) = 2016 AND customer_id = customer.customer_id)

    该语句使用 NOT EXISTS 子句来排除在 2016 年没有下过订单的客户。子查询中查询订单表 (ORDER) 中的订单日期 (ORDER_DATE) 并判断是否为 2016 年,以及订单表中的客户 ID (CUSTOMER_ID) 是否与主查询中的客户 ID 相等,如果子查询中没有查询到符合条件的记录,则返回主查询中的记录。

  3. 使用 ORDER BY 关键字按照客户名字升序排列。

    ORDER BY customer_name

    该语句将查询结果按照 CUSTOMER_NAME 字段的值进行升序排列。

  4. 使用 SELECT 关键字选取要查询的列。

    SELECT customer_id, customer_name

    该语句选取了 CUSTOMER_ID 和 CUSTOMER_NAME 两个列。

因此,最终查询结果将是在 2016 年至少下过一次订单的客户列表,按照客户名字升序排列。注意,使用了 NOT EXISTS 子句来排除在 2016 年没有下过订单的客户,而不是使用 INNER JOIN 或 LEFT JOIN 等连接操作,这是一种常见的查询优化技巧

5、查询销售数量总数超过600的产品信息

题目

查询销售数量总数超过600的产品信息,输出产品号,产品名称。

其中客户表customer表结构为
在这里插入图片描述

订单表`order`表结构为
在这里插入图片描述

订单详情表order_detail表结构为

在这里插入图片描述

产品表product表结构为

在这里插入图片描述

代码

select product.product_id,product.product_name 
from product,order_detail
where  product.product_id = order_detail.product_id
group by product.product_id
having sum(buy_number)>600

题解

  1. 使用 FROM 关键字指定要查询的数据来源。

    FROM product, order_detail

    该语句将 PRODUCT 表和 ORDER_DETAIL 表作为查询的数据来源。

  2. 使用 WHERE 关键字指定查询的条件。

    WHERE product.product_id = order_detail.product_id

    该语句用于指定 PRODUCT 表和 ORDER_DETAIL 表的连接条件,即连接字段为 PRODUCT_ID。

  3. 使用 GROUP BY 关键字按照产品 ID 分组。

    GROUP BY product.product_id

    该语句将查询结果按照 PRODUCT_ID 字段的值进行分组。

  4. 使用 HAVING 关键字筛选出购买数量之和大于 600 的产品。

    HAVING SUM(order_detail.buy_number) > 600

    该语句使用 HAVING 子句来筛选出购买数量之和大于 600 的产品。SUM(order_detail.buy_number) 表示计算 ORDER_DETAIL 表中 BUY_NUMBER 列的总和。

  5. 使用 SELECT 关键字选取要查询的列。

    SELECT product.product_id, product.product_name

    该语句选取了 PRODUCT_ID 和 PRODUCT_NAME 两个列。

因此,最终查询结果将是购买数量之和大于 600 的产品列表,包括产品 ID 和产品名称两列。注意,由于使用了 GROUP BY 子句,每个产品只会出现一次,如果一个产品在多个订单中出现,它们的购买数量会被合并计算。

6、查询一次订购了4,7,8号产品的订单号

题目

查询一次订购了4,7,8号产品的订单号。

其中客户表cutomer表结构为

在这里插入图片描述

订单表`order`表结构为

在这里插入图片描述

订单详情表order_detail表结构为

在这里插入图片描述

产品表product表结构为

在这里插入图片描述

代码

select `order`.order_id from `order`,order_detail
where `order`.order_id = order_detail.order_id
and order_detail.product_id in(4,7,8)
group by `order`.order_id
having count(DISTINCT product_id)>=3;

题解

  1. 使用 FROM 关键字指定要查询的数据来源。

    FROM order, order_detail

    该语句将 ORDER 表和 ORDER_DETAIL 表作为查询的数据来源。

  2. 使用 WHERE 关键字指定查询的条件。

    WHERE order.order_id = order_detail.order_id

    AND order_detail.product_id IN (4, 7, 8)

    该语句用于指定订单表和订单明细表的连接条件,即连接字段为 ORDER_ID,同时筛选出购买了编号为 4、7、8 的产品的订单。

  3. 使用 GROUP BY 关键字按照订单 ID 分组。

    GROUP BY order.order_id

    该语句将查询结果按照 ORDER_ID 字段的值进行分组。

  4. 使用 HAVING 关键字筛选出购买了至少三个以上的产品的订单。

    HAVING COUNT(DISTINCT product_id) >= 3

    该语句使用 HAVING 子句来筛选出购买了至少三个以上的产品的订单。COUNT(DISTINCT product_id) 表示计算订单中不同的产品数量。

  5. 使用 SELECT 关键字选取要查询的列。

    SELECT order.order_id

    该语句选取了 ORDER_ID 列。

    因此,最终查询结果将是购买了至少三个编号为 4、7、8 的产品的订单列表,包括订单 ID 列。注意,由于使用了 GROUP BY 子句,每个订单只会出现一次,如果一个订单中购买了多个编号为 4、7、8 的产品,它们的数量会被合并计算。

7、查询一次订购了4,7,8号产品的客户名及电话

题目

查询一次订购了4,7,8号产品的客户名及电话。

其中客户表cutomer表结构为

在这里插入图片描述

订单表`order`表结构为

在这里插入图片描述

订单详情表order_detail表结构为

在这里插入图片描述

产品表product表结构为

在这里插入图片描述

代码

SELECT customer_name,phone FROM customer
WHERE customer_id in (SELECT customer_id from `order` 
       where not exists(select * from order_detail od WHERE product_id in(4,7,8) 
AND NOT EXISTS(select * FROM order_detail
WHERE order_id=`order`.order_id and od.product_id = product_id)));

题解

  1. 使用 FROM 关键字指定要查询的数据来源。

    FROM customer

    该语句将 CUSTOMER 表作为查询的数据来源。

  2. 使用 WHERE 关键字指定查询的条件。

    该语句使用子查询来筛选出符合条件的客户 ID。首先,子查询中查询订单表 (ORDER) 中购买了编号为 4、7、8 的产品的订单,然后使用 NOT EXISTS 子句和子查询来排除购买了其他产品的订单,最后返回符合条件的订单所对应的客户 ID。

    WHERE customer_id IN (
      SELECT customer_id FROM `order`
      WHERE NOT EXISTS (
        SELECT * FROM order_detail od
        WHERE product_id IN (4, 7, 8) AND NOT EXISTS (
          SELECT * FROM order_detail
          WHERE order_id = `order`.order_id AND od.product_id = product_id
        )
      )
    )
    
  3. 使用 SELECT 关键字选取要查询的列。

    SELECT customer_name, phone

    该语句选取了 CUSTOMER_NAME 和 PHONE 两个列。

因此,最终查询结果将是购买了编号为 4、7、8 的产品但没有购买其他产品的客户列表,包括客户名称和电话号码两列。

8、统计查询订单金额超过该客户平均订单额(该客户订单金额平均值)的上海客户的订单情况

题目

统计查询订单金额超过该客户平均订单额(该客户订单金额平均值)的上海客户的订单情况,输出客户名、订单号、订单金额、该客户平均订单额(该客户订单金额平均值),结果按客户名升序订单号升序排列。

其中客户表cutomer表结构为

在这里插入图片描述

订单表`order`表结构为

在这里插入图片描述

代码

select customer_name,order_id,total_money,avgsum
from customer,`order`,(SELECT customer_id,avg(total_money) as avgsum from `order` group by customer_id) as a1 
where city='上海' and customer.customer_id = `order`.customer_id and a1.customer_id = `order`.customer_id
group by order_id
having total_money>avgsum
order by customer_name,order_id;

题解

  1. 使用 FROM 关键字指定要查询的数据来源。

    FROM customer, `order`, (
      SELECT customer_id, AVG(total_money) AS avgsum FROM `order` GROUP BY customer_id
    ) AS a1
    

    该语句将 CUSTOMER 表、ORDER 表和子查询的结果作为查询的数据来源。子查询用于计算每个客户的平均订单金额,并将其命名为 avgsum。

  2. 使用 WHERE 关键字指定查询的条件。

    WHERE city = '上海'
      AND customer.customer_id = `order`.customer_id
      AND a1.customer_id = `order`.customer_id
    

    该语句用于指定查询条件,包括限定城市为上海,订单表和客户表的连接条件,以及将子查询结果和订单表连接的条件。

  3. 使用 GROUP BY 关键字按照订单 ID 分组。

    GROUP BY order_id

    该语句将查询结果按照 ORDER_ID 字段的值进行分组。

  4. 使用 HAVING 关键字筛选出订单金额高于该客户的平均订单金额的订单。

    HAVING total_money > avgsum

    该语句使用 HAVING 子句来筛选出订单金额高于该客户的平均订单金额的订单。total_money 表示订单总金额,avgsum 表示客户的平均订单金额。

  5. 使用 SELECT 关键字选取要查询的列。

    SELECT customer_name, order_id, total_money, avgsum

    该语句选取了 CUSTOMER_NAME、ORDER_ID、TOTAL_MONEY 和 AVGSUM 四个列。

  6. 使用 ORDER BY 关键字按照客户名称和订单 ID 进行排序。

    ORDER BY customer_name, order_id

    该语句将查询结果按照客户名称和订单 ID 进行排序,以便更好地展示数据。

因此,最终查询结果将是在上海市下单且订单金额高于该客户的平均订单金额的订单列表,包括客户名称、订单 ID、订单总金额和客户平均订单金额四列,并按照客户名称和订单 ID 进行排序。

9、 查询一次订购了4,7,8号三种商品的订单信息

题目

查询一次订购了4,7,8号三种商品的订单信息,输出订单号、订单日期。

其中客户表cutomer表结构为

在这里插入图片描述

订单表`order`表结构为

在这里插入图片描述

订单详情表order_detail表结构为

在这里插入图片描述

产品表product表结构为

在这里插入图片描述

代码

SELECT o.order_id, o.order_date
FROM `order` o
left JOIN order_detail od ON o.order_id = od.order_id
WHERE od.product_id IN (4, 7, 8)
GROUP BY o.order_id, o.order_date
HAVING COUNT(DISTINCT od.product_id) = 3;

题解

  1. 使用 FROM 关键字指定要查询的数据来源。

    FROM `order` o
    LEFT JOIN order_detail od ON o.order_id = od.order_id
    

    该语句将 ORDER 表和 ORDER_DETAIL 表作为查询的数据来源,并使用 LEFT JOIN 连接这两个表。LEFT JOIN 表示左连接,它保证了即使订单表中没有对应的订单详情,也能查询到该订单。

  2. 使用 WHERE 关键字指定查询的条件。

    WHERE od.product_id IN (4, 7, 8)

    该语句用于指定查询条件,限定了产品的编号为 4、7、8。

  3. 使用 GROUP BY 关键字按照订单 ID 和订单日期分组。

    GROUP BY o.order_id, o.order_date

    该语句将查询结果按照 ORDER_ID 和 ORDER_DATE 两个字段的值进行分组,以便后续使用 HAVING 子句来筛选符合条件的订单。

  4. 使用 HAVING 关键字筛选出购买了编号为 4、7、8 的所有产品的订单。

    HAVING COUNT(DISTINCT od.product_id) = 3

    该语句使用 HAVING 子句来筛选符合条件的订单。COUNT(DISTINCT od.product_id) 表示订单中购买了多少个不同的产品,如果等于 3,说明订单中购买了编号为 4、7、8 的所有产品。

  5. 使用 SELECT 关键字选取要查询的列。

    SELECT o.order_id, o.order_date

    该语句选取了 ORDER_ID 和 ORDER_DATE 两个列。

因此,最终查询结果将是购买了编号为 4、7、8 的所有产品的订单列表,包括订单 ID 和订单日期两列。

2008数据库实验 1.SQL SEVER 2000的系统工具、使用交互方式建库、建表 2.T—SQL的简单查询、连接查询 3.子查询及组合 4.数据控制、数据导入/导出、数据备份和恢复 实验1 SQL SEVER 2000的系统工具、使用交互方式建库、建表实验 实验目的和要求:了解SQL SEVER 2000的功能及组成,熟练掌握利用SQL SEVER 2000企业管理器和查询分析器创建数据库、表、索引和修改表结构及向数据库输入数据、修改数据和删除数据的操作方法和步骤,掌握定义数据约束条件的操作。 实验内容和步骤: (1)熟悉SQL SEVER 2000的界面和操作。 (3)熟悉企业管理器和查询分析器的界面和操作。 (3)创建数据库和查看数据库属性。 (4)创建表、确定表的主码和约束条件。 (5)查看和修改表的结构。 (6)向数据库输入数据,观察违反列级约束时出现的情况。 (7)修改数据。 (8)删除数据,观察违反表级约束时出现的情况。 实验2 T—SQL的简单查询、连接查询 实验目的和要求:,了解SQL语句的数据定义与数据更新功能,了解SQL语句的查询功能,掌握SQL中的数据定义语句的用法,熟练掌握SQL中的插入、修改和删除语句的操作,熟练掌握使用SQL语句进行数据库的简单查询、连接查询实验内容和步骤: (1)在SQL SEVER 2000的查询分析器里,用SQL语句建库、建表并插入记录。 (2)修改表结构,包括修改属性列的数据类型,增加新的属性列,删除已有的属性列。 (3)使用单个元组和多元组插入。 (4)简单查询操作,包括投影、选择、数据排序、模糊匹配查询等。如果结果不正确,要进行修改,直至正确为止。 (5)连接查询操作,包括等值连接、自然连接、一般连接、自身连接、外连接。 实验3 子查询及组合 实验目的和要求:了解SQL语句的查询功能,理解视图的概念。熟练掌握使用SQL语句进行数据库的嵌套查询及组合查询的操作;掌握视图创建语句和视图的使用方法,加深对视图作用的理解。 实验内容和步骤: (1)在DBMS的交互式环境里,用SQL语句建库、建表并插入记录。 (2)使用In、比较符和Exists操作符进行嵌套查询操作。 (3)分组查询,包括分组条件表达、选择组条件表达的方法。 (4)集合查询。 (5)使用视图创建语句建视图,通过视图查询数据 (6)带子查询的修改和删除 (7)通过视图修改和删除数据 实验4 数据控制、数据的导入/导出、数据库备份和恢复 实验目的和要求:掌握数据控制(安全性)的方法,了解SQL SEVER 2000的数据备份和恢复机制,掌握SQL SEVER 2000中数据库备份和恢复的方法。 实验内容和步骤: (1)使用SQL对数据进行安全性控制,包括授权和权利收回。 (2)查看授权和权利收回后的结果 (3)SQL SEVER 2000工具对表中的数据导出到其它格式的文件。 (4)将其它格式的文件数据导入到数据库中。 (5)使用SQL SEVER 2000工具创建一个数据库的备份(海量备份、增量备份)。 (6)使用SQL SEVER 2000工具及所创建的数据库备份恢复这个数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会喷火的小火龙

你的鼓励是我最大的创作动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值