SQL基础教程笔记:第二章 查询基础

SELECT语句基础

列的查询

基本的SELECT语句,

SELECT <列名>,……
FROM <表名>;

该 SELECT 语句包含了 SELECT 和 FROM 两个子句(clause)。子句是 SQL 语句的组成要素,是以 SELECT 或者 FROM 等作为起始的短语.

  • SELECT 子句中列举了希望从表中查询出的列的名称,
  • 而 FROM 子句则指定了选取出数据的表的名称。

image

--从Product表中输出3列
SELECT product_id, product_name, purchase_price
FROM Product;

image
SELECT 语句第一行的 SELECT product_id,product_name,purchase_price 就是 SELECT 子句。查询出的列的顺序可以任意指定。查询多列时,需要使用逗号进行分隔。 查询结果中列的顺序和SELECT 子句中的顺序相同

查询出表中所有的列

想要查询出全部列时,可以使用代表所有列的星号(*).

SELECT *
FROM <表名>;

输出Product表中全部的列,

SELECT *
FROM Product;

这与下面的代码等价:

SELECT product_id, product_name, product_type, sale_price,
purchase_price, regist_date
FROM Product;

但是,如果使用星号的话,就无法设定列的显示顺序了。这时就会按照 CREATE TABLE 语句的定义对列进行排序
image

为列设定别名

SQL 语句可以使用 AS 关键字为列设定别名

SELECT product_id AS id,
product_name AS name,
purchase_price AS price
FROM Product;

image
别名可以使用中文,使用中文时需要用双引号(")括起来。

SELECT product_id AS "商品编号",
product_name AS "商品名称",
purchase_price AS "进货单价"
FROM Product;

image

英文的别名加不加双引号都行,中文必须加双引号,使 用 双 引 号 可 以 设 定 包 含 空 格(空白)的别名。但是如果忘记使用双引号就可能出错,因此并不推 荐。大 家 可 以 像product_list 这样使用下划线(_)来代替空白。

常数的查询

SELECT 子句中不仅可以书写列名,还可以书写常数。

  • 代码清单 2-6中的 SELECT 子句中的第一列 '商品' 是字符串常数
  • 第 2 列 38 是数字常数
  • 第 3 列 '2009-02-24' 是日期常数

它们将与 product_id列和 product_name 列一起被查询出来。

SELECT '商品' AS string, 38 AS number, '2009-02-24' AS date,
product_id, product_name
FROM Product;

image

从结果中删除重复行

image
如上所示,想要删除重复行时, 可以通过在 SELECT 子句中使用DISTINCT来实现

SELECT DISTINCT product_type
FROM Product;

image
在使用 DISTINCT 时, NULL 也被视为一类数据。 NULL 存在于多行中时, 也会被合并为一条 NULL 数据

--对含有NULL数据的列使用DISTINCT关键字
SELECT DISTINCT purchase_price
FROM Product;

image
DISTINCT 也可以像代码清单 2-9 那样在多列之前使用。此时,会将多个列的数据进行组合,将重复的数据合并为一条

-- 在多列之前使用DISTINCT
SELECT DISTINCT product_type, regist_date
FROM Product;

image

DISTINCT 关键字只能用在第一个列名之前。因此,请大家注意不能写成 regist_date, DISTINCT product_type。

根据WHERE语句来选择记录

SELECT 语句通过 WHERE 子句来指定查询数据的条件。在 WHERE子句中可以指定“某一列的值和这个字符串相等”或者“某一列的值大于这个数字”等条件。执行含有这些条件的 SELECT 语句,就可以查询出只符合该条件的记录.了

SELECT <列名>, ……
FROM <表名>
WHERE <条件表达式>;

用来选取product_type列为'衣服'的记录的SELECT语句,

SELECT product_name, product_type
FROM Product
WHERE product_type = '衣服';

image

首先通过WHERE子句查询出符合指定条件的记录,然后再选取出SELECT语句指定的列(图 2-4)。
image

SQL 中子句的书写顺序是固定的,不能随意更改。 WHERE 子句必须紧跟在 FROM 子句之后,书写顺序发生改变的话会造成执行错误(代码清单 2-12)
image

注释的书写方法

  • 行注释,书写在“--”之后,只能写在同一行。MySQL 中需要在“--”之后加入半角空格(如果不加的话就不会被认为是注释).
-- 本SELECT语句会从结果中删除重复行。
SELECT DISTINCT product_id, purchase_price
FROM Product;
SELECT DISTINCT product_id, purchase_price
-- 本SELECT语句会从结果中删除重复行。
FROM Product;
  • 多行注释,书写在“/”和“/”之间,可以跨多行。
/* 本SELECT语句,
会从结果中删除重复行。 */
SELECT DISTINCT product_id, purchase_price
FROM Product;
SELECT DISTINCT product_id, purchase_price
/* 本SELECT语句,
会从结果中删除重复行。 */
FROM Product;

注释不仅可以写在 SELECT 语句中,而且可以写在任何 SQL 语句当中,写多少都可以。

算术运算符和比较运算符

算术运算符

SQL 语句中可以使用计算表达式。

SELECT product_name, sale_price,
sale_price * 2 AS "sale_price_x2"
FROM Product;

image

image

SELECT子句中可以使用常数或者表达式。

当然, SQL 中也可以像平常的运算表达式那样使用括号 ( )。括号中运算表达式的优先级会得到提升,优先进行运算。例如在运算表达式(1 + 2) * 3 中,会先计算 1 + 2 的值,然后再对其结果进行 * 3 运算。括号的使用并不仅仅局限于四则运算,还可以用在 SQL 语句的任何表达式当中。

需要注意NULL

SQL 语句中进行运算时,需要特别注意含有NULL 的运算。请大家考虑一下在 SQL 语句中进行如下运算时,结果会是什么呢?
image
正确答案全部都是 NULL。实际上所有包含 NULL 的计算,结果肯定是 NULL。即使像 F 那样用 NULL除以 0 时这一原则也适用。通常情况下,类似 5/0 这样除数为 0 的话会发生错误,只有 NULL 除以 0 时不会发生错误,并且结果还是 NULL。尽管如此,很多时候我们还是希望 NULL 能像 0 一样,得到 5 + NULL = 5 这样的结果。不过也不要紧, SQL 中也为我们准备了可以解决这类情况的方法.

image

比较运算符

image

有很多 RDBMS 可以使用比较运算符“!=”来实现不等于功能。但这是限于不被标准 SQL 所承认的特定 SQL,出于安全的考虑 , 最好不要使用

-- 选取出sale_price列的值不是500的记录
SELECT product_name, product_type
FROM Product
WHERE sale_price <> 500;

image

-- 选取出登记日期在2009年9月27日之前的记录
SELECT product_name, product_type, regist_date
FROM Product
WHERE regist_date < '2009-09-27';

image

-- WHERE子句的条件表达式中也可以使用计算表达式
SELECT product_name, sale_price, purchase_price
FROM Product
WHERE sale_price - purchase_price >= 500;

image

对字符串使用不等号时的注意事项

字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。

不能对NULL使用比较运算符

希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符

  • 选取NULL的记录,
SELECT product_name, purchase_price
FROM Product
WHERE purchase_price IS NULL;

image

  • 选取不为NULL的记录,
SELECT product_name, purchase_price
FROM Product
WHERE purchase_price IS NOT NULL;

image

逻辑运算符

NOT运算符

SELECT product_name, product_type, sale_price
FROM Product
WHERE NOT sale_price >= 1000;

image

AND运算符和OR运算符

在 WHERE 子句中使用 AND 运算符或者 OR 运算符,可以对多个查询条件进行组合。

  • AND 运算符在其两侧的查询条件都成立时整个查询条件才成立,其意思相当于“并且”
-- 在WHERE子句的查询条件中使用AND运算符
SELECT product_name, purchase_price
FROM Product
WHERE product_type = '厨房用具'
AND sale_price >= 3000;

image

  • OR 运算符在其两侧的查询条件有一个成立时整个查询条件都成立,其意思相当于“或者”
-- 在WHERE子句的查询条件中使用OR运算符
SELECT product_name, purchase_price
FROM Product
WHERE product_type = '厨房用具'
OR sale_price >= 3000;

image

通过括号强化处理

AND 运算符优先于 OR 运算符,通过使用括号让OR运算符先于AND运算符执行.

SELECT product_name, product_type, regist_date
FROM Product
WHERE product_type = '办公用品'
AND ( regist_date = '2009-09-11'
OR regist_date = '2009-09-20');

image

逻辑运算符和真值

三个运算符 NOT、 AND 和 OR 称为逻辑运算符。这里所说的逻辑就是对真值进行操作的意思。真值就是值为真(TRUE) 或假(FALSE) 其中之一的值

但 是 在 SQL 中 还 存 在“ 不 确 定 ”(UNKNOWN)这样的值。

image

含有NULL时的真值

我们来看一下 Product(商品)表,商品“叉子”和“圆珠笔”的进货单价(purchase_price)为 NULL。那么,对这两条记录使用查询条件 purchase_price = 2800(进货单价为 2800 日元)会得到什
么样的真值呢?既不是真也不是假,那结果到底是什么呢?其实这是 SQL 中特有的情况。这时真值是除真假之外的第三种值——不确定(UNKNOWN)。一般的逻辑运算并不存在这第三种值。 SQL 之外的语言也基本上只使用真和假这两种真值。与通常的逻辑运算被称为二值逻辑相对,只有 SQL 中的逻辑运算被称为三值逻辑
image

练习题

2.1 编写一条 SQL 语句,从 Product(商品)表中选取出“登记日期(regist_date)在 2009 年 4 月 28 日之后”的商品。查询结果要包含 product_name 和 regist_date 两列。

SELECT product_name, regist_date
FROM Product
WHERE regist_date >= '2009-04-28';

2.2 请说出对 Product 表执行如下 3 条 SELECT 语句时的返回结果。
image
① ~ ③中的 SQL 语句都无法选取出任何一条记录。

2.3 代码清单 2-22(2-2 节)中的 SELECT 语句能够从 Product 表中取出“销售单价(sale_price)比进货单价(purchase_price)高出500
日元以上”的商品。请写出两条可以得到相同结果的 SELECT 语句。执行结果如下所示。
image
image

2.4 请写出一条SELECT语句,从Product表中选取出满足“销售单价打九折之后利润高于100日元的办公用品和厨房用具”条件的记录。查询结果要包括 product_name 列、 product_type 列以及销售单价打九折之后的利润(别名设定为 profit)。
提示:销售单价打九折,可以通过 sale_price 列的值乘以 0.9 获得,利润可以通过该值减去 purchase_price 列的值获得。

SELECT product_name, product_type,
sale_price * 0.9 - purchase_price AS profit
FROM Product
WHERE sale_price * 0.9 - purchase_price > 100
AND ( product_type = '办公用品'
OR product_type = '厨房用具');

image

posted on 2022-10-27 12:20  朴素贝叶斯  阅读(84)  评论(0编辑  收藏  举报

导航