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’
1
2
在这里插入图片描述

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

SELECT 供应商ID,公司名称,地区,城市,电话 FROM 供应商
WHERE 地区 = ‘华北’ AND 联系人职务 = ‘销售代表’
1
2
在这里插入图片描述

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

SELECT 供应商ID,公司名称,地区,城市,电话 FROM 供应商
WHERE (地区=‘华东’ OR 地区=‘华南’)
OR (城市 = ‘天津’)
1
2
3
在这里插入图片描述

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

SELECT 供应商ID,公司名称,地区,城市,电话 FROM 供应商
WHERE (地区=‘华东’ OR 地区=‘华南’)
1
2
在这里插入图片描述

二、多表查询

  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
1
2
3
4
5
6
在这里插入图片描述

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

在这里插入图片描述
经过查询和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
1
2
3
4
5
6
在这里插入图片描述

  1. 查询“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)
1
2
3
4
5
6
在这里插入图片描述

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

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

SELECT 订单.订单ID, 产品名称, 单位数量, 订单明细.单价, 折扣
FROM 订单
LEFT JOIN 订单明细 ON 订单.订单ID = 订单明细.订单ID
LEFT JOIN 产品 ON 订单明细.产品ID = 产品.产品ID
WHERE 订单.订单ID IN (10248, 10254)
1
2
3
4
5
在这里插入图片描述

  1. 查询“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
2
3
4
5
在这里插入图片描述

三、综合查询

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

SELECT 公司名称, 电话
FROM 运货商
1
2
在这里插入图片描述

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

SELECT 公司名称, 电话, 传真, 地址, 联系人姓名, 联系人职务
FROM 客户
1
2
在这里插入图片描述

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

SELECT 产品ID, 产品名称, 库存量
FROM 产品
WHERE 单价 BETWEEN 10 AND 30
1
2
3
在这里插入图片描述

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

SELECT 产品名称, 单价, 公司名称, 电话
FROM 产品
LEFT JOIN 供应商 ON 产品.供应商ID = 供应商.供应商ID
WHERE 单价 > 20
1
2
3
4
在这里插入图片描述

  1. 查询上海和北京的客户在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 客户.城市 = ‘北京’)
1
2
3
4
5
6
7
非常冗杂 😦

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

如下:

SELECT 订单.订单ID, 产品名称, 数量
FROM 订单
LEFT JOIN 订单明细 ON 订单.订单ID = 订单明细.订单ID
LEFT JOIN 客户 ON 订单.客户ID = 客户.客户ID
LEFT JOIN 产品 ON 订单明细.产品ID = 产品.产品ID
WHERE YEAR(订单.订购日期) = ‘1996’
AND 客户.城市 IN (‘上海’, ‘北京’)
1
2
3
4
5
6
7
在这里插入图片描述

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

SELECT 订单.订单ID, 产品名称, ROUND(订单明细.单价 * 订单明细.数量 * (1 - 折扣),2) AS 销售金额
FROM 订单
LEFT JOIN 订单明细 ON 订单.订单ID = 订单明细.订单ID
LEFT JOIN 客户 ON 订单.客户ID = 客户.客户ID
LEFT JOIN 产品 ON 订单明细.产品ID = 产品.产品ID
WHERE 客户.地区 = ‘华北’
1
2
3
4
5
6
在这里插入图片描述

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

SELECT 运货商.公司名称, COUNT(订单.运货商) AS 总数量
FROM 订单
LEFT JOIN 运货商 ON 订单.运货商 = 运货商.运货商ID
WHERE YEAR(订单.发货日期) = ‘1997’
GROUP BY 公司名称
1
2
3
4
5
在这里插入图片描述

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

SELECT 订单.订单ID, SUM(订单明细.数量) AS 总数量(上半年)
FROM 订单
LEFT JOIN 订单明细 ON 订单.订单ID = 订单明细.订单ID
WHERE 订单.订购日期 BETWEEN ‘1997-01-01’ AND ‘1997-07-01’
GROUP BY 订单.订单ID
1
2
3
4
5
在这里插入图片描述

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

SELECT 产品.类别ID, ROUND(AVG(产品.单价),2) AS 平均价格
FROM 产品
GROUP BY 产品.类别ID
1
2
3
在这里插入图片描述

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

SELECT 地区, COUNT(客户.地区) AS 客户总数量
FROM 客户
GROUP BY 客户.地区
1
2
3
在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值