SELECT 语句
列的查询
基本的 SELECT 语句
- 语法:
SELECT <列名>,……
FROM <表名>;
- 说明:
- 该 SELECT 语句包含了 SELECT 和 FROM 两个子句(clause)
- 子句是 SQL 语句的组成要素,是以 SELECT 或者 FROM 等作为起始的短语。
- SELECT 子句中列举了希望从表中查询出的列的名称,而 FROM 子句则指定了选取出数据的表的名称。
- 示例:
SELECT product_id, product_name, purchase_price
FROM Product;
- 说明:
- 查询出的列的顺序可以任意指定。
- 查询多列时,需要使用逗号进行分隔。
- 查询结果中列的顺序和 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;
- 说明:
- 别名可以使用中文,使用中文时需要用双引号(")括起来。
常数的查询
- 示例:
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;
- 说明:
- 在使用 DISTINCT 时,NULL 也被视为一类数据。NULL 存在于多行中时,也会被合并为一条 NULL 数据。
- DISTINCT 关键字只能用在第一个列名之前。
根据 WHERE 语句来选择记录
- SELECT 语句通过 WHERE 子句来指定查询数据的条件。在 WHERE 子句中可以指定“某一列的值和这个字符串相等”或者“某一列的值大于这个数字”等条件。
- 语法:
SELECT <列名>, ……
FROM <表名>
WHERE <条件表达式>;
- 说明:
- SQL 中子句的书写顺序是固定的,不能随意更改。
- WHERE 子句必须紧跟在 FROM 子句之后,书写顺序发生改变的话会造成执行错误。
注释的书写方法
- 单行注释
书写在“--”之后,只能写在同一行。(MySQL中需要在“--”之后加入半角空格(如果不加的话就不会被认为是注释)。)
- 多行注释
书写在“/”和“/”之间,可以跨多行。
- 示例:
-- 本SELECT语句会从结果中删除重复行。
SELECT DISTINCT product_id, purchase_price
FROM Product;
/* 本SELECT语句,
会从结果中删除重复行。*/
SELECT DISTINCT product_id, purchase_price
FROM Product;
算术运算符和比较运算符
- 运算符就是对其两边的列或者值进行运算(计算或者比较大小等)的符号。
- 使用算术运算符可以进行四则运算。
- 括号可以提升运算的优先顺序(优先进行运算)。
- 包含NULL的运算,其结果也是NULL。
- 比较运算符可以用来判断列或者值是否相等,还可以用来比较大小。
- 判断是否为NULL,需要使用IS NULL或者IS NOT NULL运算符。
算术运算符
- 四则运算所使用的运算符(+、-、*、/)称为算术运算符。
- 运算符就是使用其两边的值进行四则运算或者字符串拼接、数值大小比较等运算,并返回结果的符号。加法运算符(+)前后如果是数字或者数字类型的列名的话,就会返回加法运算后的结果。SQL 中除了算术运算符之外还有其他各种各样的运算符。
- SELECT子句中可以使用常数或者表达式。
- 所有包含 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 运算符
- NOT 不能单独使用,必须和其他查询条件组合起来使用。
- NOT运算符用来否定某一条件,但是不能滥用
SELECT product_name, product_type, sale_price
FROM Product
WHERE NOT sale_price >= 1000;
AND 运算符和 OR 运算符
- 简单示例
- AND 运算符在其两侧的查询条件都成立时整个查询条件才成立,其意思相当于“并且”。
- OR 运算符在其两侧的查询条件有一个成立时整个查询条件都成立,其意思相当于“或者”
- 多个查询条件进行组合时,需要使用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;