6.1 创建单表基本查询
1.Select 语句的语法格式及其功能
(1)Select 语句的一般格式。
Select < 字段名称或表达式列表 >
From < 数据表名称或视图名称 >
[ Where < 条件表达式 > ]
[ Group By < 分组的字段名称或表达式 > ]
[ Having < 筛选条件 > ]
[ Order By < 排序的字段名称或表达式 > Asc | Desc ]
[ 数据表的别名 ]
(2)Select 语句的功能。
根据 Where 子句的条件表达式从 From 子句指定的数据表中找出满足条件的记录,再根据 Select 子句选出记录中的字段值,把查询结果以表格的形式返回。
(3)Select 语句的说明。
Select 关键字后面跟的是要检索的字段列表。SQL 查询子句的顺序为 Select、Into、From、Where、Group By、Having 和 Order By。
2.SQL 的语言类型及常用的语句
SQL 的语言类型及常用的语句如表 6-1 所示。
【任务 6-1】使用 Navicat for MySQL 实现查询操作
【任务描述】
在 Navicat for MySQL 中创建、运行查询,查询“用户信息”数据表中所有的记录,要求将该表各个字段的别名设置为“用户 ID”“用户编号”“用户名称”“密码”。
【任务实施】
打开数据库
启动图形管理工具 Navicat for MySQL,打开连接 MallConn,打开数据库 MallDB。
显示查询对象
单击【Navicat for MySQL】窗口工具栏中的【查询】按钮,显示查询对象。
显示对应的按钮
单击【新建查询】按钮,显示对应的按钮,如图 6-1 所示。
图 6-1 查询对应的按钮
选择创建查询的数据表及其字段
在【查询创建工具】窗口左侧的数据表列表中双击数据表“用户信息”,右上方将弹出“用户信息”数据表的字段列表,这里分别选择“UserID”“UserNumber”“Name”“UserPassword”,窗口右侧区域自动生成了对应的 SQL 语句,如图 6-3 所示。
图 6-3 在【查询创建工具】窗口中选择创建查询的数据表和字段
在查询语句模板区域设置别名
目前“用户信息”的字段名称为英文,如果需要设置为中文名,可以在【查询创建工具】窗口的查询语句模板区域单击“< 别名 >”位置,在弹出的输入框中输入中文别名,然后单击【确定】按钮关闭输入框,这里分别输入“用户 ID”“用户编号”“用户名称”“密码”。查询“用户信息”数据表的 SQL 语句如下所示 :
Select
' 用户信息 '.UserID As ' 用户 ID',
' 用户信息 '.UserNumber As ' 用户编号 ',
' 用户信息 '.'Name' As ' 用户名称 ',
' 用户信息 '.UserPassword As ' 密码 '
From
' 用户信息 '
保存创建的查询
在【查询创建工具】窗口中单击【构建】按钮,关闭该窗口。在工具栏中单击【保存】按钮,打开【查询名】对话框,在该对话框中输入查询名“查询 0601”,如图 6-4 所示,然后单击【确定】按钮保存刚才创建的查询。
图 6-4 【查询名】对话框
查看 SQL 语句
在工具栏中单击【解释】按钮,显示【解释 1】选项卡,完整的 SQL 语句与【解释 1】选项卡如图 6-5 所示。
图 6-5 完整的 SQL语句与【解释 1】选项卡
运行查询
在工具栏中单击【运行】按钮,运行“查询 0601”,运行结果如图 6-6 所示。
【任务 6-2】查询时选择与设置字段
Select 语句允许使用通配符“*”选择数据表中所有的字段,使用“All”选择所有记录,“All”一般省略不写。Select 关键字与第一个字段名称之间使用半角空格分隔,可以使用多个半角空格,其效果等效于使用一个空格。SQL 语句中各部分之间必须使用空格分隔(SQL语句中的空格必须是半角空格,如果输入全角空格,则会出现错误提示信息)。
使用 Select 语句时,返回结果中的列标题与数据表或视图中的字段名称相同。查询时可以使用 As 关键字来为字段或表达式指定标题名称,这些名称既可以用来改善查询输出的外观,也可以用来为一般情况下没有标题名称的表达式分配名称(称为别名)。
【任务 6-2-1】查询所有字段
【任务描述】
查询“用户类型”数据表中的所有字段。
【任务实施】
首先打开 Windows 命令行窗口,登录 MySQL 服务器,然后使用“Use MallDB ; ”语句选择数据库 MallDB。
Select * From 用户类型 ;
【任务 6-2-2】查询指定字段
【任务描述】
查询“用户注册信息”数据表中的所有记录,查询结果只包含“用户编号”“用户名称”“密码”3 列数据。
【任务实施】
查询对应的 SQL 语句如下 :
Select 用户编号 , 用户名称 , 密码 From 用户注册信息 ;
【任务 6-2-3】查询经过计算后的字段。
【任务描述】
从“订购商品”数据表中查询订单商品应付金额,查询结果包含“订单编号”“商品编号”“购买数量”“优惠价格”“优惠金额”“应付金额”6 列数据。其中“应付金额”为计算字段,计算公式为“购买数量 * 优惠价格 - 优惠金额”。
【任务实施】
查询对应的 SQL 语句如下。
Select 订单编号 , 商品编号 , 购买数量 , 优惠价格 , 优惠金额 ,
购买数量 * 优惠价格 - 优惠金额 As 应付金额 From 订购商品 ;
【任务 6-2-4】查询时为查询结果指定别名
【任务描述】
查询“用户信息”数据表中的全部用户数据,查询结果只包含“UserNumber”“Name”“UserPassword”3 列数据,要求这 3 个字段输出时分别以“用户编号”“用户名称”“密码”中文名称显示。
【任务实施】
查询对应的 SQL 语句如下。
Select UserNumber As 用户编号 , Name As 用户名称 , UserPassword As 密码
From 用户信息 ;
【任务 6-3】查询时选择行
Where 子句后面是一个用逻辑表达式表示的条件,用来限制 Select 语句检索的记录,即查询结果中的记录都应该是满足该条件的记录。数据表中所有的字段都可以出现在 Where 子句的表达式中,不管它是否出现在要检索的字段列表中。
【任务 6-3-1】在 Where 子句中使用比较查询筛选记录
【任务描述】
(1)从“图书信息”数据表中检索作者为“陈承欢”的图书信息。
(2)从“图书信息”数据表中检索 2020 年之后出版的图书信息。
【任务实施】
从“图书信息”数据表中检索作者为“陈承欢”的图书信息
第 1 项任务对应的 SQL 查询语句如下 :
从“图书信息”数据表中检索 2020 年之后出版的图书信息
第 2 项任务对应的 SQL 查询语句如下 :
【任务 6-3-2】查询时去除重复项
【任务描述】
从“商品信息”数据表中检索所有商品的商品类型,并去除重复项。
【任务实施】
查询对应的 SQL 语句如下 :
【任务 6-3-3】使用 Limit 关键字查询限定数量的记录
【任务描述】
(1)从“图书信息”数据表中检索前 5 种图书的数据。
(2)从“图书信息”数据表中检索第 2 种至第 4 种图书的数据。
以上两项查询的结果只需包含“商品编号”“图书名称”两个字段。
【任务实施】
从“图书信息”数据表中检索前 5 种图书的数据
从“图书信息”数据表中检索前 5 种图书的数据对应的 SQL 语句如下 :
从“图书信息”数据表中检索第 2 种至第 4 种图书的数据
从“图书信息”数据表中检索第 2 种至第 4 种图书的数据对应的 SQL 语句如下 :
Select 商品编号 , 图书名称 From 图书信息 Limit 1 , 3 ;
【任务 6-3-4】使用 Between And 关键字创建范围查询
【任务描述】
从“图书信息”数据表中检索出版日期在“2019-10-1”和“2021-05-1”之间的图书信息,查询结果要求只需包含“商品编号”“图书名称”“出版日期”3 个字段。
【任务实施】
查询对应的 SQL 语句如下 :
Select 商品编号 , 图书名称 , 出版日期 From 图书信息
Where 出版日期 Between '2019-10-01' And '2021-05-01' ;
【任务 6-3-5】使用 In 关键字创建查询
【任务描述】
从“图书信息”数据表中检索出“陈承欢”“王振世”“王斌会”3 位作者编写的图书信息,查询结果要求只需包含“商品编号”“图书名称”“作者”3 个字段。
【任务实施】
查询对应的 SQL 语句如下 :
Select 商品编号 , 图书名称 , 作者 From 图书信息
Where 作者 In (' 陈承欢 ',' 王振世 ',' 王斌会 ') ;
查询条件中的表达式“作者 In (' 陈承欢 ',' 陈启安 ',' 陈海林 ')”也可以用表达式“( 作者 ='陈承欢 ') Or ( 作者 =' 王振世 ') Or ( 作者 =' 王斌会 ')”代替,但使用 In 关键字时表达式简短且可读性更好。
【任务 6-3-6】使用 Like 创建模糊匹配查询
【任务描述】
(1)从“图书信息”数据表中检索出作者姓“郑”的图书信息。
(2)从“图书信息”数据表中检索出作者不姓“陈”的图书信息。
(3)从“图书信息”数据表中检索出作者姓名只有 3 个汉字并且姓“王”的图书信息。
【任务实施】
从“图书信息”数据表中检索出作者姓“郑”的图书信息
第 1 项任务对应的 SQL 查询语句如下 :
从“图书信息”数据表中检索出作者不姓“陈”的图书信息
第 2 项任务对应的 SQL 查询语句如下 :
Select 商品编号 , 图书名称 , 作者 From 图书信息 Where 作者 Not Like ' 陈 %' ;
从“图书信息”数据表中检索出作者姓名只有 3 个汉字并且姓“王”的图书信息
第 3 项任务对应的 SQL 查询语句如下 :
Select 商品编号 , 图书名称 , 作者 From 图书信息 Where 作者 Like ' 王 __' ;
【任务 6-3-7】创建搜索空值的查询
【任务描述】
从“图书信息”数据表中检索“版次”不为空的图书信息,查询结果只包含“商品编号”“图书名称”“版次”3 个字段。
【任务实施】
在 Where 子句中使用 Is Null 可以查询数据表中为 Null 的值,使用 Is Not Null 可以查询数据表中不为 Null 的值。
查询对应的 SQL 语句如下 :
Select 商品编号 , 图书名称 , 版次 From 图书信息 Where 版次 Is Not Null ;
【任务 6-3-8】使用聚合函数进行查询
聚合函数用于对一组数据值进行计算并返回单一值,所以也被称为组合函数。Select 子句中可以使用聚合函数进行计算,计算结果作为新列出现在查询结果集中。聚合运算的表达式可以包含字段名称、常量以及由运算符连接起来的函数。
【任务描述】
(1)从“图书信息”数据表中查询价格在 20 元至 45 元之间的图书种数。
(2)从“订购商品”数据表中查询购买不同商品的种类数量。
(3)从“图书信息”数据表中查询图书的最高价格、最低价格和平均价格。
(4)从“订购商品”数据表中查询图书的总购买数量。
【任务 6-3-9】使用 And 创建多条件查询
【任务描述】
从“图书信息”数据表中检索作者为“陈承欢”,并且出版日期在 2020 年之后的图书信息,查询结果要求只需包含“商品编号”“图书名称”“作者”“出版日期”4 个字段。
【任务实施】
查询对应的 SQL 语句如下 :
Select 商品编号 , 图书名称 , 作者 , 出版日期
From 图书信息
Where 作者 =' 陈承欢 ' And Year( 出版日期 )>2020 ;
【任务 6-3-10】使用 Or 创建多条件查询
【任务描述】
从“图书信息”数据表中检索作者为“陈承欢”或者出版日期在“2020-5-1”年之后的图书信息,查询结果要求只需包含“商品编号”“图书名称”“作者”“出版日期”4 个字段。
【任务实施】
查询对应的 SQL 语句如下 :
Select 商品编号 , 图书名称 , 作者 , 出版日期
From 图书信息
Where 作者 =' 陈承欢 ' Or 出版日期 >'2020-05-01' ;
【任务 6-3-11】将查询结果保存到另一个数据表中
【任务描述】
对“订购商品”数据表中从各个出版社购买图书的数量合计、金额合计进行统计,并将出版社名称、数量合计、金额合计和图书名称列表等数据存储到数据表“图书汇总信息”中。
【任务实施】
首先创建一个数据表“图书汇总信息”,对应的 SQL 语句如下 :
Create Table 图书汇总信息 ( 出版社名称 varchar(16) , 数量合计 int ,
金额合计 decimal(10,2) , 图书名称列表 varchar(100)) ;
然后向数据表“图书汇总信息”中插入查询语句的执行结果,对应的 SQL 语句如下 :
Insert Into 图书汇总信息
Select 出版社信息 . 出版社名称 ,
Sum( 订购商品 . 购买数量 ) ,
Sum( 订购商品 . 购买数量 * 订购商品 . 优惠价格 - 优惠金额 ) ,
Group_Concat( 图书信息 . 图书名称 )
From 订购商品 , 图书信息 , 出版社信息
Where 订购商品 . 商品编号 = 图书信息 . 商品编号
And 图书信息 . 出版社 = 出版社信息 . 出版社 ID
Group By 出版社信息 . 出版社名称 ;
【任务 6-4】对查询结果进行排序
【任务实施】
【任务 6-5】分组进行数据查询
【任务实施】
6.2 创建多表连接查询
实现从两个或两个以上数据表中查询数据且结果集中出现的字段来自两个或两个以上的数据表的检索操作称为连接查询。连接查询实际上是通过各个数据表之间的共同字段的相关性来查询数据,首先要在这些数据表之间建立连接,然后再从数据表中查询数据。连接的类型分为内连接、外连接和交叉连接,其中外连接包括左外连接、右外连接和全外连接两种。连接查询的格式有两种 :
第 2 项任务对应的 SQL 查询语句如下 :
【任务 6-6】创建基本连接查询
【任务实施】
【任务 6-7】创建内连接查询
内连接是组合两个数据表的常用方法。
【任务实施】
【任务 6-8】使用 Union 语句创建多表联合查询
其语法格式如下 :
Select 语句 1
Union | Union All
Select 语句 2
Union | Union All
Select 语句 n ;
使用 Union 运算符将两个或多个 Select 语句的执行结果组合成一个结果集时,可以使用关键字“All”指定结果集中将包含所有记录而不删除重复的记录 ;如果省略 All,将从结果集中删除重复的记录。
使用 Union 联合查询时,结果集的字段名称与 Union 运算符中第 1 个 Select 语句的结果集中的字段名称相同,另一个 Select 语句的结果集的字段名称将被忽略。
【任务描述】
数据库 MallDB 的“订购商品”数据表中的数据主要包括“商品”和“图书”两大类,在 MallDB 数据库中已有“商品信息”数据表和“图书信息”数据表,其中两个数据表包括4 个公共字段,分别为“商品编号”“商品名称”“商品类型”“价格”。使用联合查询将两个数据表的数据合并(商品数据在前,图书数据在后),联合查询时会增加一个新列“商品分类”,其值分别为“非图书商品”和“图书”。
【任务实施】
对应的 SQL 查询语句如下 :
Select 商品编号 , 商品名称 , 商品类型 As 商品类型编号 , 价格 ,
' 非图书商品 ' As 商品分类
From 商品信息
Union All
Select 商品编号 , 图书名称 , 商品类型 As 商品类型编号 , 价格 , ' 图书 '
From 图书信息 ;