【SQL边干边学系列】02介绍性问题(续)

文章目录

  • 前言
  • 回顾
  • 介绍性问题
    • 7.产品名称中包含“queso”的产品
    • 8.运往法国或比利时的订单
    • 9.运往拉丁美洲任何国家的订单
    • 10.员工,按年龄的顺序排列
    • 11.让DateTime列仅显示Date
    • 12.员工全名
    • 13.每个订单的详细金额
    • 14.有多少客户?
    • 15.第一个订单是什么时候?
    • 16.已有客户的国家
    • 17.统计每个ContactTitle的数量
    • 18.产品与相关供应商名
  • 答案
    • 7.产品名称中包含“queso”的产品
    • 8.运往法国或比利时的订单
    • 9.运往拉丁美洲任何国家的订单
    • 10.员工,按年龄的顺序排列
    • 11.让DateTime列仅显示Date
    • 12.员工全名
    • 13.每个订单的详细金额
    • 14.有多少客户?
    • 15.第一个订单是什么时候?
    • 16.已有客户的国家
    • 17.统计每个ContactTitle的数量
    • 18.产品与相关供应商名
  • 未完待续


前言

在这里插入图片描述
该系列教程,将会从实际问题出发,边干边学,逐步深入讲解SQL的各方面知识。

你需要完成所有的问题吗?绝对不是。介绍性的问题相当简单,所以你可以直接跳过到“中级问题”部分。如果你不是初学者,但不确定应该从哪里开始,请在“入门问题”部分看看问题和预期结果,并确保你理解这些概念。如果已经理解了这些概念,请开始阅读“中级问题”部分。

你想从这本书中复制代码并在你的服务器上运行?我建议你手动输入,而不是复制粘贴。为什么要去麻烦地重新打字呢?科学表明,打字的行为会在你的脑中留下更深刻的印象。当你只是复制和粘贴时,代码只是直接从你电脑里的一个窗口转到另一个窗口,而不会给你留下多少印象。但是当你把它打出来时,你必须集中精力,这非常有助于保留信息。

一旦你完成了所有的问题,将拥有一些在数据分析和高级Select语句使用方面非常有用的技能。当然,这并不是SQL的全部内容。还有修改数据(更新、插入、删除)、DDL(数据定义语言,即如何创建和修改数据库对象)、编程(如存储过程)和许多其他主题。

该系列教程中,只涉及到了使用Select语句检索数据的问题,这几乎是所有其他数据库主题的基础开端。


回顾

上篇文章👉《【SQL边干边学系列】01介绍性问题》 讨论了部分介绍性问题,这篇我们接着讨论剩余的介绍性问题。


介绍性问题

7.产品名称中包含“queso”的产品

在产品表(products)中,我们希望看到那些产品名称(ProductName)中包含字符串“queso”的产品的产品标识(ProductID)和产品名称(ProductName)。

-- 预期结果
ProductID   ProductName
----------- ----------------------------------------
11          Queso Cabrales
12          Queso Manchego La Pastora
(2 row(s) affected)

提示:在前面的一个问题中,我们正在寻找精确的匹配(过滤器与字段中的值精确匹配)。在这里,我们正在寻找产品名称字段中包含“queso”的那些行。在答案中使用带有通配符的“like”运算符。

8.运往法国或比利时的订单

看看订单表(Orders),有一个列叫做目的地(ShipCountry)。编写一个查询,显示目的地为法国(France)或比利时(Belgium)的订单的订单ID(OrderID)、客户ID(CustomerID)和目的地(ShipCountry)。

-- 预期结果
OrderID     CustomerID ShipCountry
----------- ---------- ---------------
10248       VINET      France
10251       VICTE      France
10252       SUPRD      Belgium
10265       BLONP      France
.......
11043       SPECD      France
11051       LAMAI      France
11076       BONAP      France
(96 row(s) affected)

提示: 在where子句中,使用Or将过滤器连接起来。

9.运往拉丁美洲任何国家的订单

现在,我们想展示来自任何一个拉丁美洲国家的所有订单。拉丁美洲国家列表:巴西(Brazil),墨西哥(Mexico),阿根廷(Argentina)和委内瑞拉(Venezuela)。

不能再使用"Or"语句,它会变得太复杂,应该使用“In”语句。

-- 预期结果
OrderID     CustomerID ShipCountry
----------- ---------- ---------------
10250       HANAR      Brazil
10253       HANAR      Brazil
10256       WELLI      Brazil
......
11071       LILAS      Venezuela
11073       PERIC      Mexico
(173 row(s) affected)

10.员工,按年龄的顺序排列

对于“员工”表(employees)中的所有员工,请显示FirstName、LastName、头衔(Title)和出生日期(BirthDate)。按出生日期排序,所以我们先看到最年长的员工。

-- 预期结果
FirstName  LastName             Title                          BirthDate
---------- -------------------- ------------------------------ -----------------------
Margaret   Peacock              Sales Representative           1955-09-19 00:00:00.000
Nancy      Davolio              Sales Representative           1966-12-08 00:00:00.000
Andrew     Fuller               Vice President, Sales          1970-02-19 00:00:00.000
Steven     Buchanan             Sales Manager                  1973-03-04 00:00:00.000
Laura      Callahan             Inside Sales Coordinator       1976-01-09 00:00:00.000
Robert     King                 Sales Representative           1978-05-29 00:00:00.000
Michael    Suyama               Sales Representative           1981-07-02 00:00:00.000
Janet      Leverling            Sales Representative           1981-08-30 00:00:00.000
Anne       Dodsworth            Sales Representative           1984-01-27 00:00:00.000
(9 row(s) affected)

11.让DateTime列仅显示Date

在上面的查询的输出中,按出生日期的顺序显示员工,展示了BirthDate字段(Datetime类型),我们只想显示Date,不想显示Time。

--- 预期结果
FirstName   LastName            Title                          DateOnlyBirthDate
---------- -------------------- ------------------------------ -----------------
Margaret   Peacock              Sales Representative           1955-09-19 
Nancy      Davolio              Sales Representative           1966-12-08 
Andrew     Fuller               Vice President, Sales          1970-02-19 
Steven     Buchanan             Sales Manager                  1973-03-04 
Laura      Callahan             Inside Sales Coordinator       1976-01-09 
Robert     King                 Sales Representative           1978-05-29
Michael    Suyama               Sales Representative           1981-07-02 
Janet      Leverling            Sales Representative           1981-08-30 
Anne       Dodsworth            Sales Representative           1984-01-27 
(9 row(s) affected)

提示:使用“转换函数”可以将“BirthDate”列转换为“Date”列

12.员工全名

显示Employees表中的FirstName和LastName列,然后创建一个名为FullName的新列,显示FirstName和LastName连接在一起的效果,中间有一个空格。

-- 预期结果
FirstName   LastName            FullName
---------- -------------------- -------------------------------
Nancy      Davolio              Nancy Davolio
Andrew     Fuller               Andrew Fuller
Janet      Leverling            Janet Leverling
Margaret   Peacock              Margaret Peacock
Steven     Buchanan             Steven Buchanan
Michael    Suyama               Michael Suyama
Robert     King                 Robert King
Laura      Callahan             Laura Callahan
Anne       Dodsworth            Anne Dodsworth
(9 row(s) affected)

13.每个订单的详细金额

在订单详细信息表(OrderDetails)中,我们有字段的单位价格(UnitPrice)和数量(Quantity)。创建一个新的字段,总价格(TotalPrice),它将这两个值相乘。我们现在将忽略折扣字段。此外,还可以显示订单ID(OrderID)、产品ID(ProductID)、单位价格(UnitPrice)和数量(Quantity)。按订单ID(OrderID)和产品标识(ProductID)排序。

-- 预期结果
OrderID     ProductID   UnitPrice             Quantity TotalPrice
----------- ----------- --------------------- -------- ---------------------
10248       11          14.00                 12       168.00
10248       42          9.80                  10       98.00
10248       72          34.80                 5        174.00
...
11077       75          7.75                  4        31.00
11077       77          13.00                 2        26.00
(2155 row(s) affected)

14.有多少客户?

我们的客户表(Customers)中有多少个客户?只显示一个值,并且不要依赖于返回结果最后附带的统计计数。

-- 预期结果
TotalCustomers
--------------
91
(1 row(s) affected)

提示:为了获得客户的总数,我们需要使用所谓的聚合函数。

15.第一个订单是什么时候?

显示在订单表(Orders)中创建的第一个订单的日期。

-- 预期结果
FirstOrder
-----------------------
2014-07-04 08:00:00.000
(1 row(s) affected)

提示:有一个叫做Min的聚合函数来解决这个问题。

16.已有客户的国家

显示该公司拥有客户的国家名单。

-- 预期结果
Country
---------------
Argentina
Austria
Belgium
Brazil
Canada
Denmark
Finland
France
Germany
Ireland
Italy
Mexico
Norway
Poland
Portugal
Spain
Sweden
Switzerland
UK
USA
Venezuela
(21 row(s) affected)

提示:需要使用 Group By 子句。

17.统计每个ContactTitle的数量

显示“Customers”表中“ContactTitles”列的所有不同值,还包括每个值的统计数。

-- 预期结果
ContactTitle                   TotalContactTitle
------------------------------ -----------------
Owner                          17
Sales Representative           17
Marketing Manager              12
Sales Manager                  11
Accounting Manager             10
Sales Associate                7
Marketing Assistant            6
Sales Agent                    5
Assistant Sales Agent          2
Order Administrator            2
Assistant Sales Representative 1
Owner/Marketing Assistant      1
(12 row(s) affected)

提示:需要使用分组、聚合函数和别名。

18.产品与相关供应商名

我们想展示每个产品的相关供应商。显示供应商的ProductID、ProductName和CompanyName,按ProductID排序。

这个问题将介绍一个新的概念,即SQL中的Join子句。Join子句用于以逻辑的方式将两个或多个关系数据库表连接在一起。

-- 预期结果
ProductID    ProductName                             Supplier
----------- ---------------------------------------- ------------------------------
1           Chai                                     Exotic Liquids
2           Chang                                    Exotic Liquids
3           Aniseed Syrup                            Exotic Liquids
...
74          Longlife Tofu                            Tokyo Traders
75          Rhönbräu Klosterbier                     Plutzer Lebensmittelgroßmärkte AG
76          Lakkalikööri                             Karkki Oy
77          Original Frankfurter grüne Soße          Plutzer Lebensmittelgroßmärkte AG
(77 row(s) affected)

答案

7.产品名称中包含“queso”的产品

答案

Select
 ProductID 
 ,ProductName 
From Products 
Where
 ProductName like '%queso%'

讨论

“Like”运算符总是与通配符一起使用,例如百分比符号(%),它可以替换任意数量的字符。

请注意,即使搜索字符串使用了一个小写的“q”和一个类似的子句ProductName like '%queso%',得到的结果也可能包含大写Q。例如:

Queso Cabrales
Queso Manchego La Pastora

这是因为SQL Server的默认安装不区分大小写,尽管也可以安装为区分大小写。

8.运往法国或比利时的订单

答案

Select
 OrderID
 ,CustomerID
 ,ShipCountry
From Orders
where
 ShipCountry = 'France'
 or ShipCountry = 'Belgium'

讨论

这是一个非常简单的例子,但在许多情况下,将有多个where子句,并用“Or”和“And”连接起来。

在这种情况下,另一种替代方法是使用“In”运算符。

9.运往拉丁美洲任何国家的订单

答案

Select
 OrderID
 ,CustomerID
 ,ShipCountry
From Orders
where
 ShipCountry in
 (
 'Brazil'
 ,'Mexico'
 ,'Argentina'
 ,'Venezuela'
 )

讨论

在编写SQL时,像这样使用“In”语句是一个非常常见的场景,通常把值放在单独的行上,以便让它更容易阅读、理解和修改。

10.员工,按年龄的顺序排列

答案

Select
 FirstName
 ,LastName
 ,Title
 ,BirthDate
From Employees
Order By Birthdate

讨论

这是一个按顺序排列的简单例子。

默认情况下,SQL Server按升序排序。要按降序排列,请使用desc关键字:

Select
 FirstName
 ,LastName
 ,Title
 ,BirthDate
From Employees
Order By Birthdate desc -- desc代表降序

11.让DateTime列仅显示Date

答案

Select
 FirstName
 ,LastName
 ,Title
 ,DateOnlyBirthDate = convert(date, BirthDate)
From Employees
Order By Birthdate

讨论

我们在这里使用的是计算列(相对于返回列来说)。在这种情况下,我们正在使用一个函数来转换返回的数据类型。

请注意,我们已经为计算列添加了一个名称(DateOnlyBirthDate),这被称为别名。

DateOnlyBirthDate = convert(date, BirthDate)

如果你没有指定列别名,那么将得到一个空的列头,这非常不利于阅读。

12.员工全名

答案

Select
 FirstName 
 ,LastName 
 ,FullName = FirstName + ' ' + LastName 
From Employees

讨论

这是已计算的列的另一个示例。在这种情况下,我们不是对一个字段使用一个函数,而是连接两个字段。

13.每个订单的详细金额

答案

Select
 OrderID
 ,ProductID
 ,UnitPrice
 ,Quantity
 ,TotalPrice = UnitPrice * Quantity
From OrderDetails
Order by
 OrderID 
 ,ProductID

讨论

这里我们有另一个计算列的例子,这次使用算术算子“*”来进行乘法。

当然,你也可以使用“as”语句:

Select
 OrderID
 ,ProductID
 ,UnitPrice
 ,Quantity
 ,UnitPrice * Quantity as TotalPrice -- Alias using "as"
From OrderDetails
Order by
 OrderID
 ,ProductID

14.有多少客户?

答案

Select
 TotalCustomers = count(*)
from Customers

15.第一个订单是什么时候?

答案

Select
 FirstOrder = min(OrderDate)
From Orders

16.已有客户的国家

答案

Select
 Country
From Customers
Group by
 Country

讨论

Group By子句是SQL的基石。对于任何复杂度的分析,你将使用多个 Group By子句,因此理解它们很重要。

17.统计每个ContactTitle的数量

答案

Select
 ContactTitle
 ,TotalContactTitle = count(*)
From Customers
Group by
 ContactTitle
Order by
 count(*) desc

讨论

这种特殊的构造,有一个分组,然后是每个组的总数的计数,它本身和作为其他查询的一部分都是非常常见的。

18.产品与相关供应商名

答案

Select
 ProductID
 ,ProductName
 ,Supplier = CompanyName
From Products
 Join Suppliers
 on Products.SupplierID = Suppliers.SupplierID

讨论

连接可以非常简单,也可以非常复杂。你需要彻底地理解它们,因为除了最简单的SQL之外,它们对编写任何东西都至关重要。

当你阅读SQL代码时,你也会看到这样的答案:

Select
 ProductID
 ,ProductName
 ,Supplier = CompanyName
From Products P -- 别名表
 Join Suppliers S -- 别名表
 on P.SupplierID = S.SupplierID

如果这样做,也需要在On子句中使用P和S。

尽管这很常见,但是我不喜欢这种风格。唯一的好处是避免了一些重复输入,但缺点很严重,它导致代码更难阅读。

在像这样的小块SQL中,这并不是什么问题。然而,在长而复杂的SQL中,你会发现自己想知道一个字母的别名是什么意思,总是需要查阅From子句,并在脑海中翻译。


未完待续

下次我们接着讨论中级问题。


如果喜欢这篇文章,请不要忘记关注🧡、点赞👍和收藏📔哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/679634.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

程序调试

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在程序开发过程中,免不了会出现一些错误,有语法方面的,也有逻辑方面的。对于语法方面的比较好检测,因…

积累常用css

1、封面文字,垂直居中,可以两列并排 2、宽border效果 .dashed-box { margin: 80px 0 40px 0;width: 100%;display: inline-block;background-image: linear-gradient(to right, #979797 65%, rgba(255, 255, 255, 0) 20%);background-position: bottom;…

yangwebrtc x86_64环境搭建

版本:5.0.099 sudo apt-get install libxext-dev sudo apt-get install x11proto-xext-dev sudo apt-get install libxi-dev sudo apt install libasound2-dev sudo apt install libgl1-mesa-dev sudo apt-get install libxtst-dev 用qt打开以下两个项目的.pro met…

性价比之战,小米、希喂、霍尼韦尔三款宠物空气净化器真实测评!

怨种闺蜜跟我吐槽,养猫之后家里面的空气质量变得越来越糟糕,空气中的浮毛和便臭严重影响到了居家舒适度,怀念没有养猫时清新的空气。 又想养猫,又不想生活在糟糕的环境中。使用了一些粘毛器和吸毛器都只能对付表面看得见的一些大…

BI平台概述

随着数字化浪潮的推进,企业对于数据驱动决策的需求日益增长。纷享销客作为一款领先的CRM平台,一直致力于帮助企业实现销售管理的高效与智能。纷享销客一体化BI智能分析平台作为CRM平台中的重要一环,旨在为企业提供更加全面、深入的数据分析能…

CDN(Content Delivery Network)内容分发网络原理、组成、访问过程、动静态加速、作用详解

CDN简介 什么是CND CDN(Content Delivery Network)的缩写,是一种利用分布式节点技术,在全球部署服务器,即时地将网站、应用视频、音频等静态或动态资源内容分发到用户所在的最近节点,提高用户访问这些内容…

opencv 在飞行堡垒8中调用camera导致设备消失

简介 使用 OpenCV 库时, 在最后调用cv::destroyAllWindows()之后设备管理器中的摄像头设备消失了, 看看是怎么触发的, 后面再慢慢研究RootCause是什么。 步骤 设备管理器原来摄像头显示 1. 代码 main.cpp Note: 1. haarcascade_frontalface_default…

武汉盛势启创科技携手三品软件 EDM系统助力企业图文档数字化

客户简介 武汉盛势启创科技有限公司(以下简称“盛世启创”)是一家专注于新能源汽车零部件领域的科技型企业,其主要业务涵盖新能源汽车三电系统智能传感器、智能座舱及线控底盘控制器的芯片开发、硬件设计、嵌入式系统开发。以及相关产品的生产…

云实例初始化的行业标准:Cloud-Init

01 前言 Cloud-Init[1] 是跨平台云实例初始化的行业标准。它得到了所有主要公共云提供商的支持,适用于私有云基础设施的配置系统以及裸机安装。Cloud-Init 将在启动时识别其运行所在的云环境,读取来自云端提供的任何元数据,并据此初始化系…

JsonCpp源码跨平台编译

1.macos编译jsoncpp: https://github.com/open-source-parsers/jsoncpp.git 克隆jsoncpp源码 使用CMake进行编译 生成makefile mkdir build cd build cmake ../ 编译: make编译并运行测试成功:

Github:ChatTTS从下载到使用

前言 本文使用工具: Anaconda :直接进行包管理,用来自定义生成python解释器,虚拟环境vscode:用来执行代码 注:我使用的Ubuntu,使用win,mac等,需要额外配置 简介 Chat…

python的内置模块 I

内置模块 I 除了我们自己写的模块之外,Python 中还内置了大量非常实用的模块。其实,我们之前的代码中就已经使用过几个内置模块了,比如 time 模块和 random 模块。 Python 的内置模块非常多,今天我们介绍几个常用的模块。废话少…

Linux 内存屏障简介

文章目录 1. 前言2. 什么是内存屏障?3. 为什么需要内存屏障?3.1 多发射(Multi-issuing)3.2 乱序执行(Out-of-order execution)3.3 预测执行(Speculative execution)3.4 Load-Store 优化3.5 CPU Cache3.6 编译乱序3.7 小结 4. ARM 内存一致性模型 和 内存…

Julia编程11:变量作用域 Scope of Variables

There are two main types of scopes in Julia, global* scope* and local* scope*. Julia有全局变量作用域和局部变量作用域,函数或者一些结构体、循环体如for等是否内部是局部环境可以参照下表。 ConstructScope typeAllowed withinmodule, baremoduleglobalglo…

商品API数据集成:一站式商品信息服务平台

一站式商品信息服务平台:商品API数据集成 在数字化快速发展的今天,信息的高效获取与整合成为了各行各业追求的核心竞争力。特别是在商品信息领域,如何快速、准确地获取并整合来自多个渠道的商品数据,为企业决策提供支持&#xff0…

【数据结构】图论——AOV和AOE(拓扑排序、存放表达式、关键活动、关键路径)

目录 AOV和AOEAOV 有向无环图及其应用(拓扑结构)有向无环图的应用——存放表达式二叉树存放表达式图存放表达式 AOE 有向无环图及其应用——关键路径1. 事件的最早发生时间事件(顶点)最早发生时间的计算方法: 2. 事件允许的最晚发生时间事件(…

JS百题斩~ typeof 、instanceof 与 Object.prototype.toString 区别(简单易懂)

首先,让我们先了解一下JavaScript的数据类型,分为两类: 基础类型:Undefined,Null,Boolean,Number,BigInt,String,Symbol 引用类型:Object&#xf…

网络简史-基于图论的网络

先看一幅图: 如图,我们对类似 crossbar,banyan tree,b-tree,10-tree,256-tree,甚至 dcn fat-tree 等 “规则拓扑” 网络相当熟悉。规则拓扑网络中,地址信息被编码到拓扑本身&#…

每天复习一点小CTF知识(6.4)

NSSCTF/[FSCTF 2023]夜深人静的时候也会偷偷emo 直接爆破压缩包,先来数字 解压好,一个flag.mp3 mp3隐写,直接干 得一个txt文件直接开

2024最新破解版CorelDRAW解锁设计新境界!

在当今快速变化的市场环境中,品牌之间的竞争愈发激烈。为了在众多品牌中脱颖而出,企业需要不断地提升自身的品牌形象和市场识别度。而在这个过程中,视觉设计起到了至关重要的作用。一款优秀的设计软件不仅能帮助设计师轻松地将创意想法变成现…