SQL——基础查询

259 阅读9分钟

SELECT语句基础

列的查询

从表中选取数据时,需要使用SELECT语句,也就是只从表中选出(SELECT)必要数据的意思。通过SELECT语句查询并选取出必要数据的过程称为匹配查询或者查询(query)。

SELECT语句是SQL语句中使用最多的最基本的SQL语句。

SELECT <列名>,..... FORM <表名>

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

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

接下来,我们尝试从下面的 Product(商品)表中,查询 出图 2-1 所示的 product_id(商品编号)列、product_name(商 品名称)列和 purchase_price(进货单价)列。

337FDBBD-CA53-41bf-891A-2F05854F464A.png

SELECT product_id,product_name,purchase_price FROM Product;

执行结果

EADF7B48-9BC1-466e-AA99-31A952E119E1.png

查出表中所有的列

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

SELECT * FROM <表名>;

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

为列设定别名

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

例如:

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

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

常数的查询

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

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

36ACBC07-2D89-43db-81CF-D6E199E6F018.png

如上执行结果所示,所有的行中都显示出了SELECT子句中的常数,此外,SELECT子句中除了书写常数,还可以书写计算式。

从结果中删除重复行

想知道Product表中保存了哪些商品种类(product_type)时,

781B4D4B-5193-4086-B805-21EBC7B8F1B0.png

想要删除重复行,可以通过SELECT子句中使用DISTINCT来实现

SELECT DISTINCT product_type FROM Product;

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

DISTINCT也可以在多列之前使用。此时,会将多个列的数据进行组合,将重复的数据合并为一条。下面例子是对product_type(商品种类)列和regist_date(登记日期)列的数据进行组合,将重复的数据合并为一条。

SELECT DISTINCT product_type,regist_date FROM Product;

执行结果:

image.png

根据WHERE 语句来选择记录

前面的例子都是将表中存储的数据全都选取出来,但实际上并不是每次都需要选取全部数据,大部分情况都是要选取出满足“商品种类为衣服”“销售单间在1000日元以上”等某些条件的数据。

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

在SELECT语句中使用WHERE子句的语法如下:

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

image.png

显示了从Product表中选取商品种类(product_type)为‘衣服’的记录

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

WHERE子句中“product_type='衣服'”就是用来表示查询条件的表达式(条件表达式)。等号是比较两边的内容是否相等的符号。上述条件就是将product_type列的值和‘衣服’进行比较,判断是否相等。Product表的所有记录都会被进行比较。

接下来会从查询出来的记录中选取出SELECT语句指定的product_name列和product_type列。首先通过WHERE子句查询出符合指定条件的记录,然后再选取出SELECT语句指定的列。

image.png

上面的例子是为了确认选出的数据是否正确,通过SELECT子句吧作为查询条件的product_type列也选取出来了,其实并不是必须的。如果只想知道商品名称的话,可以只选取出product_name列。

image.png

SQL中子句的书写顺序是固定的,不能随意更改。WHERE子句必须紧跟在FROm子句之后,书写顺序发生改变的话,会造成执行错误。

注释的书写方法

注释是SQL语句中用来标识说明或者注意事项的部分。

注释对SQL的执行没有任何影响。因此,无论是英文字母还是汉字都可以随意使用。

注释的书写方法有如下两种

单行注释:

书写在“--”之后,只能写在同一行。

-- 本SELECT语句会从结果中删除重复记录

多行注释:

书写在“/*” 和“*/”之间,可以跨多行。

/*本SELECT语句会从结果中删除重复记录*/

算术运算符和比较运算符

算术运算符

SQL语句中可以使用计算表达式。 把各个商品单价以"sale_price_x2"列的形式显示出来。

image.png

四则运算所使用的运算符(+,-,*,/)称为算术运算符。运算符就是使用其两边的值进行四则运算或者字符串的拼接、数值大小比较等运算。

需要注意NULL
  • 5 + NULL
  • 1 * NULL
  • 10 - NULL
  • 4 / NULL
  • NULL / 9
  • NULL / 0

正确答案全部都是NULL,实际上所有包含NULL的计算,结果肯定是NULL。

比较运算符

WHERE子句时,我们使用符号 = 从Product表中选取出了商品种类(product_type)为字符串“衣服”的记录。下面再使用符号 = 选取出销售单价 (sale_price)为500日元的记录。

image.png

像符号 = 这样用来比较其两边的列或者值的符号称为比较运算符,符号 = 就是比较运算符。在WHERE自居中通过使用比较运算符可以组合出各种各样的条件表达式。

接下来,我们使用“不等于”这样代表否定含义的比较运算符 <>A, 选取出 sale_price 列的值不为 500 的记录

image.png

比较运算符:

image.png

这些比较运算符可以对字符、数字和日期等几乎所有数据类型的列和 值进行比较。例如,从 Product 表中选取出销售单价(sale_price) 大于等于 1000 日元的记录,或者登记日期(regist_date)在 2009 年 9 月 27 日之前的记录,可以使用比较运算符 >= 和 <,在 WHERE 子句 中生成如下条件表达式(代码清单 2-20、代码清单 2-21)。

image.png

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

使用下面的SQL语句创建Chars表。

image.png

执行查询语句

SELECT chr FROM Chars WHERE chr > '2';

执行结果:

image.png

现在,chr列背定为字符串类型,并且在对字符串类型的数据进行大小比较时,使用的是和数字比较不同的规则。典型的规则就是按照字典顺序进行比较,也就是像姓名那样,按照条目在字典中出现的顺序来进行排序。该规则最重要的一点就是,以形同字符开头的单词比不同字符开头的单词更相近。chars表chr列中的护具按照字典顺序进行排序的结果如下:

1. '1'
2. '10'
3. '11'
4. '2'
5. '222'
6. '3'
不能对NULL使用比较运算符

image.png

  1. 从 product表中查出所有的数据;
  2. 筛选 purchase_price = 2800 的记录;
  3. 筛选 purchase_price <> 2800 的记录;

通过上面的操作,可以看出,两条记录未查出。“叉子”和“圆珠笔”,这两天记录的单价不明(NULL)。

尝试使用 select product_name,purchase_price from product where purchase_price = NULL;;

查询结果还是一条记录都没有。

SQL提供了专门用来判断是否NULL的 IS NULL运算符。

select product_name,purchase_price from product where purchase_price IS NULL;

image.png

反之,希望选取不是NULL的记录时,需要使用 IS NOT NULL运算符。

select product_name,purchase_price from product where purchase_price IS NOT NULL;

image.png

逻辑运算符

NOT运算符

想要“不是”这样的否定条件时,需要使用<>运算符。除此之外还存在另外一个表示否定,并且使用范围更广的运算符NOT。

NOT不能单独使用,必须和其他查询条件组合起来使用。例如: 选取出销售单间(sale_price)大于等于1000日元的记录。

select product_name,product_type,sale_price from product where sale_price >= 1000;

image.png

向上述的select语句的查询条件中添加NOT运算符之后的结果如下:

select product_name,product_type,sale_price from product where NOT sale_price >= 1000;

image.png

通过上面例子可以发现NOT sale_price >= 1000 就相当于是: sale_price < 1000;不适用NOT运算符也可以编写出效果相同的查询条件。不仅如此,不适用NOT运算符的查询条件更容易让我们理解。使用NOT运算符时,我们都要进行“大于等于1000日元以上这个条件的否定就是小于1000日元”这样的转换。

image.png

虽然如此,但是也不能完全否定NOT运算符的作用。在编写复杂的SQL语句时,经常会看到NOT的身影。

AND运算符和OR运算符

到目前为止,我们看到的每条sql语句中都只有一个查询条件,但是在实际使用过程中,往往都是同事指定多个查询条件对数据进行查询的,例如:想要查询“商品种类未厨房用具、销售单价大于等于3000日元”或“进货单价大于等于5000日元或小于1000日元”的商品等情况。

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

  • AND运算符在其两侧的查询条件都成立时整个查询条件才成立,其意思相当于时“并且”
  • OR运算符在其两侧的查询条件有一个成立时,整个查询条件就成立。其意思相当于“或者”。

例如: 从product表选取出“商品种类未厨房用具(product_type = '厨房用具'), 并且销售单价大于等于3000日元(sale_price >= 3000)的商品”的查询条件就使用AND运算符。

select product_name,purchase_price from product where product_type = '厨房用具' AND sale_price >= 3000;

image.png

该查询条件的文氏图如下:左侧的圆圈代表符合查询条件“商品种类厨房用户”的商品,右侧的圆圈代表符合查询条件“销售单价大于等于3000日元”的商品。两个圆重合的部分。(同时满足两个查询条件的商品)就是通过AND运算符能够选取出的记录。

image.png

例如:选取出“商品种类为厨房用具(product_type = '厨房用具'),或者销售单价大于等于3000日元(sale_price >= 3000)的商品”的查询条件中使用了OR运算符

select product_name,purchase_price from product where product_type = '厨房用具' OR sale_price >= 3000;

image.png

看看查询条件的文氏图。左侧的圆圈(商品种类为厨房用具的商品)或者右侧的圆圈(销售单价大于等于3000日元的商品)中的部分(两个查询条件中满足任意一个的商品)就是通过OR运算符能够选取出的记录。

image.png

通过括号强化处理

尝试复杂一些的查询条件。“商品种类为办公用品,并且登记时间是2009年9月11日或者2009年9月20日”

把上述查询条件原封不动的写入WHERE自居中,得到的SELECT语句

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.png

可以发现,查询出的结果并不是我们想要的。这是AND运算符优先于OR运算符造成的。可以理解为:“商品种类为办公用品,并且登记日期是2009年9月11日”或者“登记日期是2009年9月20日”。这和想要指定的查询条件并不相符。想要优先执行OR运算符,换一种写法:

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.png

逻辑运算符和真值

这里所说的逻辑就是对真值进行操作的意思。真值就是值为真(TRUE)或假(FALSE)其中之一的值。

上面介绍的比较运算符会把运算结果以真值的形式进行返回。比较结果成立时返回真(TRUE),比较结果不成立是返回假(FALSE)。例如:对于sale_price >= 3000 这个查询条件来说,由于product_name 列为“运动T恤”的记录的sale_price列的值都是2800,因此会返回假(FALSE),而product_name列为‘高压锅’的记录的sale_price列的值是5000,所以返回真(TRUE)。

逻辑运算符对比较运算符等返回的真值进行操作。AND 运算符两侧 的真值都为真时返回真,除此之外都返回假。OR 运算符两侧的真值只要 有一个不为假就返回真,只有当其两侧的真值都为假时才返回假。NOT 运算符只是单纯的将真转换为假,将假转换为真。真值表(truth table)就 是对这类操作及其结果进行的总结。

image.png