2-1 SELECT 语句基础

SQL
Author

Rui

Published

November 9, 2022

一些未知的原因导致我不能使用 SQL 代码块创建表,但可以使用查询。所以我事先使用以下代码把示例数据在 PostgreSQL 中创建好,之后再通过 SQL 代码块查询。

-- 创建数据库
CREATE DATABASE shop;

-- 创建表
CREATE TABLE Product
(product_id      CHAR(4)        NOT NULL,
 product_name    VARCHAR(100)   NOT NULL,
 product_type    VARCHAR(32)    NOT NULL,
 sale_price      INTEGER        ,
 purchase_price  INTEGER        ,
 regist_date     DATE           ,
 PRIMARY KEY (product_id));
 
-- DML:插入数据
START TRANSACTION;

INSERT INTO Product VALUES ('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');
INSERT INTO Product VALUES ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11');
INSERT INTO Product VALUES ('0003', '运动T恤', '衣服', 4000, 2800, NULL);
INSERT INTO Product VALUES ('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');
INSERT INTO Product VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
INSERT INTO Product VALUES ('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20');
INSERT INTO Product VALUES ('0007', '擦菜板', '厨房用具', 880, 790, '2008-04-28');
INSERT INTO Product VALUES ('0008', '圆珠笔', '办公用品', 100, NULL, '2009-11-11');

COMMIT;

2-1 SELECT 语句基础

列的查询

  • 使用 SELECT 语句从表中选取列数据,该过程称为匹配查询查询(query)

  • 基本用法:包含 SELECT 和 FROM 两个子句

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

比如:

SELECT product_id, product_name, purchase_price
  FROM Product;
8 records
product_id product_name purchase_price
0001 T恤衫 500
0002 打孔器 320
0003 运动T恤 2800
0004 菜刀 2800
0005 高压锅 5000
0006 叉子 NA
0007 擦菜板 790
0008 圆珠笔 NA
Note
  • 查询多列时要用逗号分隔列名;

  • 返回的列的顺序与 SELECT 子句中指定的列的顺序一致。

查询表中所有列

想查询所有列时使用星号(*)

SELECT *
  FROM <表名>;
Note

使用这种方法返回的列的顺序与原表一致。

为列设定别名

使用 AS 关键字为列设定别名。比如:

SELECT product_id       AS id,
       product_name     AS name,
       purchase_price   AS price
  FROM Product;
8 records
id name price
0001 T恤衫 500
0002 打孔器 320
0003 运动T恤 2800
0004 菜刀 2800
0005 高压锅 5000
0006 叉子 NA
0007 擦菜板 790
0008 圆珠笔 NA
Note
  • 别名可以使用中文,但必须用双引号括起来(不能是单引号!);

  • 别名中若包含空格则必须使用双引号把别名括起来。若忘记则会报错。最好的方法是避免使用空格,改用下划线(_)。

常数的查询

有的时候,表中某一列中的元素全部都相同,称为常数。可以使用 SELECT 子句对常数设置别名,比如:某一列全为字符串常数 “商品”,某一列全为数值型常数 38,还有一列全为日期常数 “2009-02-24”,那么可以设置

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

SQL 中使用字符串常数或日期常数时必须使用单引号(’)括起来。

从结果中删除重复行

想知道 Product 表格中有哪些商品?删除 product_type 的重复值即可得到,那么要怎么删除重复值呢?可以在 SELECT 子句中使用 DISTINCT 实现:

SELECT DISTINCT product_type
  FROM Product;
3 records
product_type
衣服
办公用品
厨房用具
Note
  • NULL 也会被视为一类数据。NULL 存在于多行时会被合并为一条 NULL 数据;

  • R 中的 tidyverse 也有同名的 distinct() 函数用于剔除重复值。

DISTINCT 也可用于多列,此时会将多列的数据组合,将重复的数据合并为一条:

SELECT DISTINCT product_type, regist_date
  FROM Product;
7 records
product_type regist_date
衣服 NA
厨房用具 2008-04-28
衣服 2009-09-20
办公用品 2009-11-11
厨房用具 2009-01-15
办公用品 2009-09-11
厨房用具 2009-09-20

根据 WHERE 语句来选择记录

前面讲的是如何将某一列或某几列的数据全部选取出来,可不可以按照条件把符合该条件的记录选取出来呢?当然可以,使用 WHERE 语句可以实现。

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

比如:

SELECT product_name
  FROM Product
 WHERE product_type = '衣服';
2 records
product_name
T恤衫
运动T恤
Note
  • R 和 Python 中比较左右两端是否相等的符号是两个等号(==),SQL 中使用一个等号(=);

  • SELECT,WHERE 和 FROM 子句的顺序不能更改。

注释

  • 使用 -- 书写单行注释

  • 使用 /**/ 书写多行注释