美文网首页
03 - 查询基础

03 - 查询基础

作者: 丑丑的小怪物 | 来源:发表于2019-08-14 21:36 被阅读0次

SELECT 语句

列的查询

基本的 SELECT 语句

  • 语法:
SELECT <列名>,……
 FROM <表名>;
  • 说明:
  1. 该 SELECT 语句包含了 SELECT 和 FROM 两个子句(clause)
  2. 子句是 SQL 语句的组成要素,是以 SELECT 或者 FROM 等作为起始的短语。
  3. SELECT 子句中列举了希望从表中查询出的列的名称,而 FROM 子句则指定了选取出数据的表的名称。
  • 示例:
SELECT product_id, product_name, purchase_price
FROM Product;
  • 说明:
  1. 查询出的列的顺序可以任意指定。
  2. 查询多列时,需要使用逗号进行分隔。
  3. 查询结果中列的顺序和 SELECT 子句中的顺序相同。

查询出表中所有的列

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

  • 语法:
SELECT *
FROM <表名>;
  • 示例:
SELECT *
FROM Product;

-- 等价于

SELECT product_id, product_name, product_type, sale_price,
       purchase_price, regist_date
  FROM Product;
  • 说明:

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


为列设定别名

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

  • 示例
SELECT product_id     AS id,
       product_name   AS name,
       purchase_price AS price
  FROM Product;
  • 说明:
  1. 别名可以使用中文,使用中文时需要用双引号(")括起来。

常数的查询

  • 示例:
SELECT '商品' AS string, 38 AS number, '2009-02-24' AS date,
       product_id, product_name
  FROM Product;
  
  • 执行结果
string  |  number  |    date     | product_id | product_name
---------+----------+-------------+------------+--------------
 商品    |  38      | 2009-02-24  | 0001       | T恤衫
 商品    |  38      | 2009-02-24  | 0002       | 打孔器
 商品    |  38      | 2009-02-24  | 0003       | 运动T恤
 商品    |  38      | 2009-02-24  | 0004       | 菜刀
 商品    |  38      | 2009-02-24  | 0005       | 高压锅
 商品    |  38      | 2009-02-24  | 0006       | 叉子
 商品    |  38      | 2009-02-24  | 0007       | 擦菜板
 商品    |  38      | 2009-02-24  | 0008       | 圆珠笔

从结果中删除重复行

  • 在SELECT语句中使用DISTINCT可以删除重复行。
SELECT DISTINCT product_type
  FROM Product;
  • 说明:
  1. 在使用 DISTINCT 时,NULL 也被视为一类数据。NULL 存在于多行中时,也会被合并为一条 NULL 数据。
  2. DISTINCT 关键字只能用在第一个列名之前。

根据 WHERE 语句来选择记录

  • SELECT 语句通过 WHERE 子句来指定查询数据的条件。在 WHERE 子句中可以指定“某一列的值和这个字符串相等”或者“某一列的值大于这个数字”等条件。
  • 语法:
SELECT <列名>, ……
  FROM <表名>
 WHERE <条件表达式>;
  • 说明:
  1. SQL 中子句的书写顺序是固定的,不能随意更改。
  2. WHERE 子句必须紧跟在 FROM 子句之后,书写顺序发生改变的话会造成执行错误。

注释的书写方法

  • 单行注释

书写在“--”之后,只能写在同一行。(MySQL中需要在“--”之后加入半角空格(如果不加的话就不会被认为是注释)。)

  • 多行注释

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

  • 示例:
-- 本SELECT语句会从结果中删除重复行。
SELECT DISTINCT product_id, purchase_price
  FROM Product;
  
/* 本SELECT语句,
   会从结果中删除重复行。*/
SELECT DISTINCT product_id, purchase_price
  FROM Product;

算术运算符和比较运算符

  1. 运算符就是对其两边的列或者值进行运算(计算或者比较大小等)的符号。
  2. 使用算术运算符可以进行四则运算。
  3. 括号可以提升运算的优先顺序(优先进行运算)。
  4. 包含NULL的运算,其结果也是NULL。
  5. 比较运算符可以用来判断列或者值是否相等,还可以用来比较大小。
  6. 判断是否为NULL,需要使用IS NULL或者IS NOT NULL运算符。

算术运算符

  • 四则运算所使用的运算符(+、-、*、/)称为算术运算符。
  1. 运算符就是使用其两边的值进行四则运算或者字符串拼接、数值大小比较等运算,并返回结果的符号。加法运算符(+)前后如果是数字或者数字类型的列名的话,就会返回加法运算后的结果。SQL 中除了算术运算符之外还有其他各种各样的运算符。
  2. SELECT子句中可以使用常数或者表达式。
  3. 所有包含 NULL 的计算,结果肯定是 NULL。
  • 示例:
-- 把各个商品单价的 2 倍(sale_price 的 2 倍)以 "sale_price_x2" 列的形式读取出来。
SELECT product_name, sale_price,
       sale_price * 2 AS "sale_price_x2"
  FROM Product;

FROM子句真的有必要吗?

  • FROM子句在SELECT语句中并不是必不可少的,只使用SELECT子句进行计算也是可以的。
-- SQL Server  PostgreSQL  MySQL
SELECT (100 + 200) * 3 AS calculation;

注意:在 Oracle 数据库中不允许省略 SELECT 语句中的 FROM 子句,这种情况下可以使用 DUAL 这个临时表。DB2 中可以使用SYSIBM.SYSDUMMY1这个临时表

比较运算符

  • 像符号 = 这样用来比较其两边的列或者值的符号称为比较运算符.在 WHERE 子句中通过使用比较运算符可以组合出各种各样的条件表达式。
比较运算符 含义
= 和 ~ 相等
<> 和 ~ 不相等
>= 大于等于 ~
> 大于 ~
<= <=
< 小于 ~
  • 示例:
SELECT product_name, product_type
  FROM Product
 WHERE sale_price <> 500;
 
 SELECT product_name, sale_price, purchase_price
  FROM Product
 WHERE sale_price - purchase_price >= 500;

对字符串使用不等号时的注意事项:
1. 字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
2. 不能对 NULL 使用比较运算符.希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。


逻辑运算符

NOT 运算符

  1. NOT 不能单独使用,必须和其他查询条件组合起来使用。
  2. NOT运算符用来否定某一条件,但是不能滥用
SELECT product_name, product_type, sale_price
  FROM Product
 WHERE NOT sale_price >= 1000;

AND 运算符和 OR 运算符

  • 简单示例
  1. AND 运算符在其两侧的查询条件都成立时整个查询条件才成立,其意思相当于“并且”。
  2. OR 运算符在其两侧的查询条件有一个成立时整个查询条件都成立,其意思相当于“或者”
  3. 多个查询条件进行组合时,需要使用AND运算符或者OR运算符。
-- AND 运算符
SELECT product_name, purchase_price
  FROM Product
 WHERE product_type = '厨房用具'
   AND sale_price >= 3000;

-- OR 运算符
SELECT product_name, purchase_price
  FROM Product
 WHERE product_type = '厨房用具'
    OR sale_price >= 3000;
  • 通过括号强化处理

AND运算符的优先级高于OR运算符。想要优先执行OR运算符时可以使用括号。

-- “商品种类为办公用品” 并且 “登记日期是 2009 年 9 月 11 日或者 2009 年 9 月 20 日”
SELECT product_name, product_type, regist_date
  FROM Product
 WHERE product_type = '办公用品'
   AND (   regist_date = '2009-09-11'
        OR regist_date = '2009-09-20');

逻辑运算符和真值

真值就是值为真(TRUE)或假(FALSE)其中之一的值.
比较运算符会把运算结果以真值的形式进行返回
真值是除真假之外的第三种值——不确定(UNKNOWN)。


代码清单

从 Product 表中输出 3 列

SELECT product_id, product_name, purchase_price
  FROM Product;

输出 Product 表中全部的列

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

为列设定别名

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

设定中文别名

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

查询常数

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

使用 DISTINCT 删除 product_type 列中重复的数据

SELECT DISTINCT product_type
  FROM Product;

对含有 NULL 数据的列使用 DISTINCT 关键字

SELECT DISTINCT purchase_price
  FROM Product;

在多列之前使用DISTINCT

SELECT DISTINCT product_type, regist_date
  FROM Product;

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

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

不选取出作为查询条件的列

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

1行注释的使用示例

-- 本SELECT语句会从结果中删除重复行。
SELECT DISTINCT product_id, purchase_price
  FROM Product;

多行注释的使用示例

/* 本SELECT语句,
   会从结果中删除重复行。*/
SELECT DISTINCT product_id, purchase_price
  FROM Product;

SQL 语句中使用运算表达式

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

只包含SELECT子句的SELECT语句

-- SQL Server  PostgreSQL  MySQL
SELECT (100 + 200) * 3 AS calculation;

相关文章

网友评论

      本文标题:03 - 查询基础

      本文链接:https://www.haomeiwen.com/subject/wpcojctx.html