SQL查询语句练习(一)

一、单表查询

1. 查询订购日期在1996年7月1日至1996年7月15日之间的订单的订购日期、订单ID、客户ID和雇员ID等字段的值

SELECT 订购日期,订单ID,客户ID,雇员ID FROM `订单` 
WHERE 订购日期 BETWEEN '1996-07-01' AND '1996-07-15'

在这里插入图片描述


2.查询供应商的ID、公司名称、地区、城市和电话字段的值。条件是“地区等于华北”并且“联系人头衔等于销售代表”

SELECT 供应商ID,公司名称,地区,城市,电话 FROM `供应商`
WHERE 地区 = '华北' AND 联系人职务 = '销售代表'

在这里插入图片描述


3. 查询供应商的ID、公司名称、地区、城市和电话字段的值。其中的一些供应商位于华东或华南地区,另外一些供应商所在的城市是天津

SELECT 供应商ID,公司名称,地区,城市,电话 FROM `供应商`
WHERE (地区='华东' OR 地区='华南')
OR (城市 = '天津')

在这里插入图片描述


4. 查询位于“华东”或“华南”地区的供应商的ID、公司名称、地区、城市和电话字段的值

SELECT 供应商ID,公司名称,地区,城市,电话 FROM `供应商`
WHERE (地区='华东' OR 地区='华南')

在这里插入图片描述


二、多表查询


1. 查询订购日期在1996年7月1日至1996年7月15日之间的订单的订购日期、订单ID、相应订单的客户公司名称、负责订单的雇员的姓氏和名字等字段的值,并将查询结果按雇员的“姓氏”和“名字”字段的升序排列,“姓氏”和“名字”值相同的记录按“订单 ID”的降序排列

我初步答案是:

SELECT 订购日期, 订单ID, 公司名称, 姓氏, 名字
FROM 订单, 客户, 雇员
WHERE 订单.`雇员ID` = 雇员.`雇员ID`
AND 订单.`客户ID` = 客户.`客户ID`
AND 订单.订购日期 BETWEEN '1996-07-01' AND '1996-07-15'
ORDER BY 姓氏, 名字, 订单ID DESC

在这里插入图片描述

但这是就出现问题了,姓氏这一块并没有按理论上的升序排列。

在这里插入图片描述
经过查询和S同学的帮助,发现是以下原因。

如果存储汉字的字段编码使用的是GBK字符集,因为GBK内码编码时本身就采用了拼音排序的方法,直接在查询语句后面添加ORDER BY name ASC,查询结果将按照姓氏的升序排序;如果存储姓名的字段采用的是utf8字符集,需要在排序的时候对字段进行转码,对应的代码是ORDER BY convert(name using gbk) ASC,同样,查询的结果也是按照姓氏的升序排序。

而姓氏和名字采用的是utf8字符集

在这里插入图片描述

故出现了以上问题。

最后答案如下:

SELECT 订购日期, 订单ID, 公司名称, 姓氏, 名字
FROM 订单, 客户, 雇员
WHERE 订单.`雇员ID` = 雇员.`雇员ID`
AND 订单.`客户ID` = 客户.`客户ID`
AND 订单.订购日期 BETWEEN '1996-07-01' AND '1996-07-15'
ORDER BY convert(姓氏 using gbk)ASC, convert(名字 using gbk)ASC, convert(订单ID using gbk)DESC 

在这里插入图片描述


2. 查询“10248”和“10254”号订单的订单ID、运货商的公司名称、订单上所订购的产品的名称

SELECT 订单.订单ID, 公司名称, 产品名称
FROM 订单
LEFT JOIN 运货商 ON 订单.`运货商` = 运货商.`运货商ID`
LEFT JOIN 订单明细 ON 订单.`订单ID` = 订单明细.`订单ID`
LEFT JOIN 产品 ON 订单明细.`产品ID` = 产品.`产品ID`
WHERE 订单.订单ID IN (10248, 10254)

在这里插入图片描述


3. 查询“10248”和“10254”号订单的订单ID、订单上所订购的产品的名称、数量、单价和折扣

此处由于需要查询的是订单上所订购产品的单价,故在SELECT时是订单明细.单价,而非 产品.单价

SELECT 订单.订单ID, 产品名称, 单位数量, 订单明细.单价, 折扣
FROM 订单
LEFT JOIN 订单明细 ON 订单.`订单ID` = 订单明细.`订单ID`
LEFT JOIN 产品 ON 订单明细.`产品ID` = 产品.`产品ID`
WHERE 订单.订单ID IN (10248, 10254)

在这里插入图片描述


4. 查询“10248”和“10254”号订单的订单ID、订单上所订购的产品的名称及其销售金额

由于相乘后销售金额小数点位数不同,故考虑通过ROUND取两位小数

SELECT 订单.订单ID, 产品名称, ROUND(订单明细.数量 * 订单明细.单价 * (1 - 折扣),2) AS 销售金额
FROM 订单
LEFT JOIN 订单明细 ON 订单.`订单ID` = 订单明细.`订单ID`
LEFT JOIN 产品 ON 订单明细.`产品ID` = 产品.`产品ID`
WHERE 订单.订单ID IN (10248, 10254)

在这里插入图片描述


三、综合查询

1. 查询所有运货商的公司名称和电话

SELECT 公司名称, 电话 
FROM 运货商

在这里插入图片描述


2. 查询所有客户的公司名称、电话、传真、地址、联系人姓名和联系人头衔

SELECT 公司名称, 电话, 传真, 地址, 联系人姓名, 联系人职务 
FROM 客户

在这里插入图片描述


3. 查询单价介于10至30元的所有产品的产品ID、产品名称和库存量

SELECT 产品ID, 产品名称, 库存量
FROM 产品
WHERE 单价 BETWEEN 10 AND 30

在这里插入图片描述


4. 查询单价大于20元的所有产品的产品名称、单价以及供应商的公司名称、电话

SELECT 产品名称, 单价, 公司名称, 电话
FROM 产品
LEFT JOIN 供应商 ON 产品.`供应商ID` = 供应商.`供应商ID`
WHERE 单价 > 20

在这里插入图片描述


5. 查询上海和北京的客户在1996年订购的所有订单的订单ID、所订购的产品名称和数量

初步答案为:

SELECT 订单.订单ID, 产品名称, 数量
FROM 订单
LEFT JOIN 订单明细 ON 订单.`订单ID` = 订单明细.`订单ID`
LEFT JOIN 客户 ON 订单.`客户ID` = 客户.`客户ID`
LEFT JOIN 产品 ON 订单明细.`产品ID` = 产品.`产品ID`
WHERE (订单.订购日期 >= '1996' AND 订单.订购日期 < '1997')
AND (客户.`城市` = '上海' OR 客户.`城市` = '北京')

非常冗杂 😦

通过查SQL语法实现了一定的优化 😃

如下:

SELECT 订单.订单ID, 产品名称, 数量
FROM 订单
LEFT JOIN 订单明细 ON 订单.`订单ID` = 订单明细.`订单ID`
LEFT JOIN 客户 ON 订单.`客户ID` = 客户.`客户ID`
LEFT JOIN 产品 ON 订单明细.`产品ID` = 产品.`产品ID`
WHERE YEAR(订单.订购日期) = '1996'
AND 客户.`城市` IN ('上海', '北京')

在这里插入图片描述


6. 查询华北客户的每份订单的订单ID、产品名称和销售金额

SELECT 订单.订单ID, 产品名称, ROUND(订单明细.单价 * 订单明细.数量 * (1 - 折扣),2) AS 销售金额
FROM 订单
LEFT JOIN 订单明细 ON 订单.`订单ID` = 订单明细.`订单ID`
LEFT JOIN 客户 ON 订单.`客户ID` = 客户.`客户ID`
LEFT JOIN 产品 ON 订单明细.`产品ID` = 产品.`产品ID`
WHERE 客户.`地区` = '华北'

在这里插入图片描述


7. 按运货商公司名称,统计1997年由各个运货商承运的订单的总数量

SELECT 运货商.公司名称, COUNT(订单.运货商) AS 总数量
FROM 订单
LEFT JOIN 运货商 ON 订单.`运货商` = 运货商.运货商ID
WHERE YEAR(订单.发货日期) = '1997'
GROUP BY 公司名称

在这里插入图片描述


8. 统计1997年上半年的每份订单上所订购的产品的总数量

SELECT 订单.订单ID, SUM(订单明细.`数量`) AS 总数量(上半年)
FROM 订单
LEFT JOIN 订单明细 ON 订单.`订单ID` = 订单明细.`订单ID`
WHERE 订单.订购日期 BETWEEN '1997-01-01' AND '1997-07-01'
GROUP BY 订单.订单ID

在这里插入图片描述


9. 统计各类产品的平均价格

SELECT 产品.`类别ID`, ROUND(AVG(产品.`单价`),2) AS 平均价格
FROM 产品
GROUP BY 产品.类别ID

在这里插入图片描述


10. 统计各地区客户的总数量

SELECT 地区, COUNT(客户.地区) AS 客户总数量
FROM 客户
GROUP BY 客户.`地区`

在这里插入图片描述

🔗🔗🔗

数据和完整题目见(二)末

  • 12
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值