第五章:SQL Server2019数据库之 综合案例练习、开启 SELECT 语句之旅

学前必备知识

  1. 第一章:SQL Server 数据库环境搭建与使用
  2. 第二章:SQL Server2019 数据库的基本使用之图形化界面操作
  3. 第三章:SQL Server2019数据库 之 开启 SQL 语言之旅
  4. 第四章:SQL Server2019数据库 之 综合案例练习、 使用SQL语句插入数据、更新和删除数据

一、综合案例:记录的插入、更新和删除

第四章:SQL Server2019数据库 之 综合案例练习、 使用SQL语句插入数据、更新和删除数据 重点介绍了数据表中数据的插入、更新和删除操作。SQLServer 中可以灵活的对数据进行插入与更新,SQLServer 中对数据的操作没有任何提示,因此在更新和删除数据时,一定要谨慎小心,查询条件一定要准确,避免造成数据的丢失。本小节的综合案例包含了对数据表中数据的基本操作,包括记录的插入、更新和删除。

1. 案例目的

创建表 books,对数据表进行插入、更新和删除操作,掌握数据表数据基本操作。books 表结构以及表中的记录,如下所示:

books 表结构如下:

字段名 字段说明 数据类型 主键 外键 非空 唯一 自增
b_id 书编号 INT
b_name 书名 VARCHAR(50)
authors 作者 VARCHAR(100)
price 价格 FLOAT
pubdate 出版日期 DATETIME
note 说明 VARCHAR(100)
num 库存 INT

books 表中的记录:

b_id b_name authors price pubdate note num
1 Tale of AAA Dickes 23 1995 novel 11
2 EmmaT Jane lura 35 1993 joke 22
3 Story of Jane Jane Tim 40 2001 novel 0
4 Lovely Day George Byron 20 2005 novel 30
5 Old Land Honore Blade 30 2010 law 0
6 The Battle Upton Sara 30 1999 medicine 40
7 Rose Hood Richard Haggard 28 2008 cartoon 28

2. 案例操作过程

  1. 创建数据库 Test。
  2. 在数据库 test 下创建表 books,并按上面的表结构定义各个字段。
  3. 将 books 表中的 b_name 为 Tale of AAA 的记录指定所有字段名称进行插入。
  4. 不指定字段名称插入 b_id 为 2 的记录。
  5. 同时插入多条记录(使用 INSERT 语句将剩下的多条记录插入表中)。
  6. 将小说类型(novel) 的书的价格都增加 5。
  7. 将名称为 EmmaT 的书的价格改为 40,并将说明改为 drama。
  8. 删除库存为 0 的记录。
  9. 删除所有表中的记录。

二、简单查询

本小节将介绍 SELECT 语句的基本结构,以及如何使用 SELECT 语句完成简单的查询命令,使读者对 SELECT 语句有一个简单的了解。SELECT 语句是在 SQL 中常用到的语句,也是比较重要的语句。使用 SELECT 语句可以从数据表中或视图中进行查询,并将查询结果以表格的形式返回,以表格返回的结果称为结果集。SELECT 语句的主要结构如下:

SELECT select_list
[ INTO new_table ]
FROM table_name
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ASC| DESC ]];

参数说明如下:

  1. select_list:指定需要查询返回的列。多个列之间使用逗号分隔。在选择列时也可以使用 * 符号来表示返回表中的所有列。
  2. INTO new_table:创建新表并将查询行插入新表中。new_table 表示指定新表的名称。
  3. FROM table_name:指定需要查询的表,也称为来源表。这些来源表可能包括基表、视图和连接表。FROM 子句还可以包含连接说明,该说明定义了数据库用来在表之间进行导航的特定路径。
  4. WHERE search_condition:指定用于限制返回的行的搜索条件。
  5. GROUP BY group_by_expression:根据 group_by_expression 列中的值将结果集分成组。例如,student 学生信息表在性别列 ShipVia 中有两个值,GROUP BY ShipVia 子句将结果集分成两组,每组对应于 ShipVia 的一个值。
  6. HAVING search_condition:指定组或聚合的搜索条件。逻辑上讲,HAVING子 句从中间结果集对行进行筛选,这些中间结果集是用 SELECT 语句中的 FROM、WHERE或GROUP BY子句创建的。HAVING 子句通常与 GROUP BY 子句一起使用,尽管 HAVING 子句前面不必有 GROUP BY子句。
  7. ORDER BY order_expression [ASC| DESC ]:定义结果集中的行排列的顺序。order_expression 指定组成排序列表的结果集的列。ASC 和 DESC 关键字用于指定行是按升序还是按降序排序。ORDER BY 之所以重要,是因为关系理论规定除非已经指定 ORDER BY,否则不能假设结果集中的行带有任何序列。如果结果集行的顺序对于 SELECT 语句来说很重要,那么在该语句中就必须使用 ORDER BY子句。

数据准备
在这里插入图片描述
将上面四个文件复制到:C:\Program Files\Microsoft SQL Server\MSSQL15.AMOXIANG(这里的名字可能每个人的不一样)\MSSQL\DATA 中,然后使用 第二章:SQL Server2019 数据库的基本使用之图形化界面操作 中附加数据库的方法向服务器中添加数据库,本篇博文所有查询都是依赖于 shop、student 两个数据库。

1. 查询所有的列、部分列查询

【例1】 查询包含所有字段的记录。在 Student 数据库中,查询 grade 表的所有记录,SQL 语句如下:

-- 语法格式:SELECT * FROM table_name; *:表示所有的列,table_name:指定需要查询的表名
SELECT * FROM grade;

查询结果如下图所示:
在这里插入图片描述
【例2】 查询包含部分字段的记录。在 grade 表中,显示学号、课程成绩字段的信息。SQL 语句如下:

-- 语法格式: SELECT select_list,...,select_list FROM table_name;
-- 单列查询:SELECT select_list FROM table_name; select_list: 指定需要查询的列名
SELECT 学号,课程成绩 FROM grade;

查询结果如下图所示:
在这里插入图片描述
在查询表时,很多时候只显示所需要的字段。这时在 SELECT 子句后分别列出各个字段名称就可以。

2. 别名的应用

在创建数据表时,一般都会使用英文单词或英文单词缩写来设置字段名,在查询时列名都会以英文的形式显示,这样会给用户查看数据带来不便。这种情况可以使用别名来代替英文列名,增强阅读性。创建别名可以通过使用以下4种方法来实现:

-- 1.使用双引号创建别名。
SELECT goods_name "商品名称" FROM goods;
-- 2.使用单引号创建别名。
SELECT goods_name '商品名称' FROM goods;
-- 3.不使用引号创建别名。
SELECT goods_name 商品名称 FROM goods;
-- 4.使用 AS 关键字创建别名。
SELECT goods_name AS "商品名称" FROM goods;

【例3】在 goods 商品信息表中,使用 SELECT 语句对goods_name列、 market_price列和shop_price列使用别名,以方便查看。SQL 语句如下:

SELECT goods_name AS "商品名称",
market_price AS "市场价",
shop_price AS "本店价",
click_count
FROM goods;

查询结果如下图所示:
在这里插入图片描述
列别名常用的4种情况:

  1. 在创建表时字段名多数都会使用英文单词或英文单词缩写表示,在查询时会很不方便,此时就可以使用别名来代替列名,增强表的阅读性。
  2. 当对多个表进行查询时,有可能会出现相同的列名,这种情况很容易给用户造成误解,这时就可以使用别名来区分列名是属于哪个表中的。
  3. 在表中可以对多个列进行计算,计算后会产生一个新列,这时可以使用别名给该列指定列名,如不指定该列列名,则默认列名为 (无列名)
  4. 在查询表中的数据时,有时会使用聚合函数对数据进行查询,查询后会产生一个新列此时可以使用别名来指定该列的列名,如不指定该列列名,则默认列名为(无列名)

3. 删除重复数据

DISTINCT 关键字可以从 SELECT 语句的结果中删除重复的行。如果没有指定 DISTINCT 关键字,那么将返回所有行,包括重复的行。在使用 DISTINCT 关键字删除重复记录时,须将 DISTINCT 关键字放在第1个字段名的前面。DISTINCT 的语法格式如下:

SELECT [DISTINCT|ALL] select_list FROM table_name;

在 orderform 订单信息表中,在 SELECT 语句中不使用 DISTINCT 关键字查询出收货人的信息。SQL 语句如下:

SELECT consignee,[address],mobile FROM orderform;

查询结果如下图所示:
在这里插入图片描述
【例4】在 orderform 订单信息表中,在 SELECT 语句中使用 DISTINCT 关键字查询出不重复的收货人信息。SQL 语句如下:

SELECT DISTINCT consignee,[address],mobile FROM orderform;

查询结果如下图所示:
在这里插入图片描述
常见错误:在 SELECT 列表中只能使用一次 DISTINCT 关键字,而且 DISTINCT 关键字必须放在第一位,不要在其后添加逗号。例如,执行下面的语句将提示错误信息。

SELECT [address], DISTINCT consignee,mobile FROM orderform;

提示的错误信息如下图所示:
在这里插入图片描述

4. 限制查询结果

在 SQL Server 数据库中使用 SELECT 语句时,可以使用 TOP 关键字来限制最多返回多少行。TOP 关键字可以指定返回表中的前n行数据,语法如下:

SELECT TOP n
FROM table_name;

TOP n:指定从查询结果集中输出前 n 行,n 是介于 0 和 4294967295 之间的整数。在SQL Server 数据库中,查看 goods 商品信息表中的所有数据。
在这里插入图片描述
【例5】在SQL Server 数据库中,查看 goods 商品信息表中的前5条数据。SQL 语句如下:

SELECT TOP 5 * FROM goods;

查询结果如下图所示:
在这里插入图片描述

三、计算列查询

在使用 SELECT 语句进行查询时,有时会对列进行计算。例如,对某两个列进行相加或相减计算,通过计算后会得到一列新的数据。本节将会对连接列值查询、计算查询和使用表达式查询进行介绍。

1. 连接列值

【例6】在品牌信息表 brand 中,查看品牌信息。将品牌名称列(name)和品牌分类列 (cat_name) 连接合并成一个新列,列名为 品牌信息。SQL 语句如下:

SELECT [name] + cat_name AS '品牌信息' FROM brand;

查询结果如下图所示:
在这里插入图片描述
2. 查询中使用计算列

在使用 SELECT 语句查询数据时,可以使用算术运算符来辅助完成一些查询功能。例如,想要获得商品的销售金额时,可以将销售数量乘以商品单价。这种查询方式在 SQL 中会经常使用到。下面介绍几种算术运算符的简单应用,下表列出了常用的算术运算符。
在这里插入图片描述
注意:上述运算符的优先级是:先乘除(*、/、%),后加减(+、-),相同优先级时,表达式采用从左到右的计算顺序。可以采用括号明确优先级,以便减少失误。

【例6】在 goods 商品信息表中,查询出每件商品的销售利润。SQL 语句如下:

SELECT goods_id AS 商品ID,goods_name AS 商品名称,
(shop_price - cost_price) AS 销售利润
FROM goods;

查询结果如下图所示:
在这里插入图片描述
【例7】在 goods 商品信息表中,查询出每件商品的销售额。SQL 语句如下:

SELECT goods_id AS 商品ID,goods_name AS 商品名称,
(shop_price * sales_sum) AS 销售额
FROM goods;

查询结果如下图所示:
在这里插入图片描述
【例8】在 goods 商品信息表中,查询出每件商品的销售利润,使用到的公式为:(销售数量*单价-销售数量*进价)/销售数量。SQL 语句如下:

SELECT goods_id AS 商品ID,goods_name AS 商品名称,
(sales_sum*shop_price - sales_sum*cost_price)/sales_sum AS 销售利润
FROM goods
WHERE sales_sum > 0;

查询结果如下图所示:
在这里插入图片描述
因为表中的销售数量可能会存在值为0的情况,当销售数量作为除数时,不能为0,所以添加限制条件为销售数量不等于0,即: sales _sum > 0。

3. 查询中使用表达式

【例9】在 goods 商品信息表中,使用表达式将进价增加50元。SQL 语句如下:

SELECT goods_id AS 商品ID,goods_name AS 商品名称,
cost_price + 50 AS 进价加50
FROM goods;

查询结果如下图所示:
在这里插入图片描述
【例10】将 goods 商品信息表中的销售数量列和商场价格列添加单位 。SQL 语句如下:

SELECT goods_id AS 商品ID,goods_name AS 商品名称,
CONVERT(CHAR(2), sales_sum) + '个' AS 销售数量,
CONVERT(CHAR(8), shop_price) + '元' AS 商场价格
FROM goods;

查询结果如下图所示:
在这里插入图片描述
【例11】在 goods 商品信息表中,使用表达式自动创建两个列。SQL 语句如下:

SELECT goods_id AS 商品ID,goods_name AS 商品名称,
1+1, 'Amo '+'So cool~'
FROM goods;

查询结果如下图所示:
在这里插入图片描述
通过本小节的学习,读者需要掌握在 SELECT 查询语句中如何连接列值、计算列值以及使用表达式。

四、条件查询

在查询表中的数据时,往往不需要所有的数据,只需要查询出满足自己需要的数据,发生此种情况时,可以通过 WHERE 子句指定查询条件,来对数据进行查询。例如,查询出满足给定编号条件的数据。WHERE 子句可以实现按一定条件进行查询的功能。数据库中的表通常会包含大量的记录,若用户仅需满足特定条件的记录,这时就需要使用 WHERE 子句来指定查询条件。下面是 WHERE 子句最简单的语法:

SELECT <字段列表>
FROM <表名>
WHERE <条件表达式>

为了满足多种不同的查询,WHERE 子句提供了丰富的搜索条件,下面将列举出 WHERE 子句中常用的比较运算符,如下表所示。
在这里插入图片描述
student 表所有数据如下图所示:
在这里插入图片描述
【例12】在 student 表中查询 年龄 等于20岁的所有学生。SQL 语句如下:

SELECT * FROM student WHERE 年龄=20;

查询结果如下图所示:
在这里插入图片描述
【例13】在 student 表中查询 年龄 大于等于23岁的所有学生。SQL 语句如下:

SELECT * FROM student WHERE 年龄 >= 23;
SELECT * FROM student WHERE 年龄 !< 23;

查询结果如下图所示:
在这里插入图片描述
【例14】在 student 表中查询 年龄 不等于23岁的所有学生。SQL 语句如下:

SELECT * FROM student WHERE 年龄 <> 23;
SELECT * FROM student WHERE 年龄 != 23;

查询结果如下图所示:
在这里插入图片描述
【例15】在 grade 表中,查询 课程成绩 大于90分的,SQL 语句如下:

SELECT * FROM grade WHERE 课程成绩 > 90;

查询结果如下图所示:
在这里插入图片描述
通过本小节的学习,需要掌握 WHERE 子句并学会使用比较运算符来限制条件查询,最后掌握如何使用表达式自动生成列。

猜你喜欢

转载自blog.csdn.net/xw1680/article/details/115015000