【SQL实验】高级查询(包含导入ACCESS数据的详细操作)

完整代码在文章末尾【 文中可能会有不准确或待完善之处,恳请各位读者不吝批评指正,共同促进学习交流**】**


下载samp2.mdb,打开SSMS(集成管理器),**使用菜单操作:**新建一个"书籍管理"的数据库,并将素材的中的ACCESS数据导入到该数据库

右键点击"数据库"节点,选择"新建数据库"。

在弹出的窗口中,设置数据库名称为"书籍管理",点击"确定"完成创建

将Access数据库数据导入到SQL Server

导入数据的详细操作:

右键点击"书籍管理"数据库,选择"任务" > "导入数据"

确保已下载Samp2.mdb文件

浏览选择Samp2.mdb文件作为数据库文件路径

根据需要选择导入的表,并设置对应的映射关系 。后面就是一直next


数据库结构如下:

tBook(书籍号,书籍名称,类别,定价,作者名,出版社编号,出版社名称)

tDetail(订单明细号,订单号,书籍号,数量,售出单价)

tEmployee(雇员号,姓名,性别,出生日期,职务,照片,简历)

tOrder(订单号,客户号,雇员号,订购日期)

导入数据成功后后我们查看一下具体内容,方便后面写代码

题目:

答案不唯一,有多种解题方式

  1. 查询女雇员的雇员号、姓名和年龄

GetDate()则是内置函数,返回当前的日期和时间

YEAR函数用于提取日期中的年份

其他方式:

复制代码
DATEDIFF(YEAR, 出生日期, '2023-10-23')

DATEDIFF(YEAR, 出生日期, GETDATE())

DATEDIFF 函数用于计算两个日期之间的差异

  1. 查询2季度订购的订单号、雇员姓名和职务
  • DATEPART 函数:一个时间提取函数,用于从一个日期或时间字段中提取特定的时间单位(如年、月、日、季度等)。

  • quarter 参数:表示从日期中提取"季度"信息。一个年份通常被划分为四个季度,每个季度对应三个月:第一季度:1 月至 3 月 第二季度:4 月至 6 月 第三季度:7 月至 9 月 第四季度:10 月至 12 月

  • DATEPART(quarter, 订购日期) = 2 :该条件会提取 订购日期 中的季度值,并筛选出季度为 2 的记录,即所有在第二季度(4 月至 6 月)订购的订单。

复制代码
MONTH(tOrder.订购日期) IN (4,5,6)
  1. 查询经理经手的雇员号、订单号、书籍号和订购日期,以雇员号升序排列,雇员号相同,以订单号降序排列

    SELECT tOrder.雇员号, tOrder.订单号, tDetail.书籍号, tOrder.订购日期
    FROM tOrder
    JOIN tEmployee
    ON tOrder.雇员号 = tEmployee.雇员号
    JOIN tDetail
    ON tOrder.订单号 = tDetail.订单号
    WHERE tEmployee.职务 = '经理'
    ORDER BY
    tOrder.雇员号 ASC,
    tOrder.订单号 DESC;

根据题目需求,需要查询四个字段 ,数据分布在tOrdertEmployeetDetail三张表中,因此需要连接这三张表,再添加条件筛选,设置排序条件

ASC升序排序 DESC降序排序

  1. 查询每笔订单明细的明细号、书籍名、总价(注:总价=单价*数量)

    SELECT tDetail.订单明细号, tBook.书籍名称, tDetail.售出单价 * tDetail.数量 AS 总价
    FROM tDetail
    JOIN tBook ON tDetail.书籍号 = tBook.书籍号;

  1. 查询下订单数最多的客户号和订单数

    SELECT top 1 客户号, COUNT(订单号) AS 订单数
    FROM tOrder
    GROUP BY 客户号
    ORDER BY 订单数 DESC;

TOP 1:仅返回查询结果中的第一条记录

COUNT(订单号) :计算每个客户对应的订单数量,忽略空值

  1. 查询按出生日期月份的升序显示名称为2个字雇员的姓名、性别、职称和出生日期的月份

    SELECT 姓名, 性别, 职务, MONTH(出生日期) AS 出生月份
    FROM tEmployee
    WHERE LEN(姓名) = 2 -- 一个汉字算一个字符
    ORDER BY 出生月份 ASC;

MONTH 函数用于提取日期字段 中的月份部分

LEN 函数用于计算字符串的长度

当使用 NVARCHARNCHAR 数据类型时,SQL Server 采用 Unicode(通常是 UTF-16)的方式存储字符,大多数汉字在这种编码中占用两个字节 的存储空间。在 SQL Server 中,当使用**LEN() 函数** 来计算包含汉字的字符串的长度时,如果字符是 NVARCHARNCHAR 类型( Unicode 类型),LEN() 函数会返回字符串中字符的总数,而不是字节数


完整代码:

复制代码
-- 1. 查询女雇员的雇员号、姓名和年龄
select 雇员号,姓名,YEAR(GetDate()) - YEAR(出生日期) AS 年龄
from  tEmployee
where 性别 = '女';


-- 2. 查询2季度订购的订单号、雇员姓名和职务
SELECT tOrder.订单号, tEmployee.姓名, tEmployee.职务
FROM tOrder
JOIN tEmployee  
ON tOrder.雇员号 = tEmployee.雇员号
WHERE DATEPART(quarter, 订购日期) = 2;

-- 3. 查询经理经手的雇员号、订单号、书籍号和订购日期,以雇员号升序排列,雇员号相同,以订单号降序排列
SELECT tOrder.雇员号, tOrder.订单号, tDetail.书籍号, tOrder.订购日期
FROM tOrder
JOIN tEmployee 
ON tOrder.雇员号 = tEmployee.雇员号
JOIN tDetail 
ON tOrder.订单号 = tDetail.订单号
WHERE tEmployee.职务 = '经理'
ORDER BY 
    tOrder.雇员号 ASC, 
    tOrder.订单号 DESC;

	-- 4. 查询每笔订单明细的明细号、书籍名、总价(总价=单价*数量)
SELECT tDetail.订单明细号, tBook.书籍名称, tDetail.售出单价 * tDetail.数量 AS 总价
FROM tDetail
JOIN tBook ON tDetail.书籍号 = tBook.书籍号;

-- 5. 查询下订单数最多的客户号和订单数
SELECT top 1 客户号, COUNT(订单号) AS 订单数
FROM tOrder
GROUP BY 客户号
ORDER BY 订单数 DESC;

-- 6. 查询按出生日期月份升序显示名称为2个字雇员的姓名、性别、职称和出生日期的月份
SELECT 姓名, 性别, 职务, MONTH(出生日期) AS 出生月份
FROM tEmployee
WHERE LEN(姓名) = 2  -- 一个汉字算一个字符
ORDER BY 出生月份 ASC;
相关推荐
oioihoii6 分钟前
C++23中if consteval / if not consteval (P1938R3) 详解
java·数据库·c++23
带娃的IT创业者10 分钟前
《AI大模型趣味实战》基于RAG向量数据库的知识库AI问答助手设计与实现
数据库·人工智能
husterlichf1 小时前
MYSQL 常用数值函数 和 条件函数 详解
数据库·sql·mysql
我的golang之路果然有问题1 小时前
快速了解redis,个人笔记
数据库·经验分享·redis·笔记·学习·缓存·内存
卡皮巴拉爱吃小蛋糕2 小时前
MySQL的MVCC【学习笔记】
数据库·笔记·mysql
农民也会写代码2 小时前
dedecms织梦arclist标签noflag属性过滤多个参数
开发语言·数据库·sql·php·dedecms
m0_748232922 小时前
你还在手动画ER图吗?让SQL自动生成ER图,轻松解决作业难题!
数据库·sql·oracle
清流君2 小时前
【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作
数据库·人工智能·笔记·mysql·ue5·数字孪生
邂逅岁月2 小时前
MySQL表的增删改查初阶(下篇)
数据库·sql·mysql
Python_金钱豹2 小时前
Text2SQL零代码实战!RAGFlow 实现自然语言转 SQL 的终极指南
前端·数据库·sql·安全·ui·langchain·机器人