1. SELECT语句基础
从表中选取数据时需要使用 SELECT 语句,通过 SELECT 语句查询并选取出必要数据的过程称为匹配查询或查询(query)。
1.1 基本的select语句
选择特定字段,按写的先和顺序显示字段
select <列名>,...
from <表名>;
SELECT 子句中列举了希望从表中查询出的列的名称,FROM 子句指定了选取出数据的表的名称。
示例:
SELECT product_id, product_name, product_type, sale_price,
purchase_price, regist_date
FROM Product;
选择所有列,不能进行排序,*代表全部的意思
SELECT *
FROM
Product;
法则 2-1 星号(*)代表全部列的意思。
1.2 为列设置别名
使用as关键字为列设定别名,别名如果是中文,需要用双引号括起来
示例:
SELECT product_id AS id,
product_name AS name,
purchase_price AS price
FROM Product;
法则 2-2 设定汉语别名时需要使用双引号(")括起来。
1.3 删除重复数据
在select子句中使用distinct来实现删除重复行
SELECT DISTINCT product_type
FROM Product;
在使用distinct时,null也会被视为一类数据,null存在于多行中时,也会被合并成一条null数据。
法则 2-3 在SELECT语句中使用DISTINCT可以删除重复行。
distinct只能放在第一个列名之前。
1.4 根据where语句来选择记录
select语句通过where子句来指定查询数据条件。在 WHERE 子句中可以指定“某一列的值和这个字符串相等”或者“某一列的值大于这个数字”等条件。
SELECT <列名>, ……
FROM <表名>
WHERE <条件表达式>;
示例:
SELECT product_name, product_type
FROM Product
WHERE product_type = '衣服';
先通过where子句查询出符合指定条件的记录,然后再选取出select语句指定的列。
SQL子句的书写顺序是固定的,WHERE 必须跟在FROM子句后面,否则会报错。
法则 2-4 WHERE子句要紧跟在FROM子句之后。
1.5 SQL注释
注释的书写方法有如下两种:
- 单行注释 ”--“
- 多行注释 ”/“和”/“之间可以跨多行
-- 本SELECT语句会从结果中删除重复行。
SELECT DISTINCT product_id, purchase_price FROM Product;
/* 本SELECT语句,
会从结果中删除重复行。*/
SELECT DISTINCT product_id, purchase_price
FROM Product;
注释不仅可以写在 SELECT 语句 中,而且可以写在任何 SQL 语句当中,写多少都可以。
法则 2-5 注释是 SQL 语句中用来标识说明或者注意事项的部分。 分为1行注释和多行注释两种。
2. 算术运算符和比较运算符
- 运算符就是对其两边的列或者值进行运算(计算或者比较大小 等)的符号。
- 比较运算符可以用来判断列或者值是否相等,还可以用来比较 大小。
2.1 算术运算符和比较运算符
SQL语句中可以使用计算表达式
SELECT product_name, sale_price,
sale_price * 2 AS "sale_price_x2"
FROM Product;
把单价的两倍(sale_price * 2 )以”sale_price_x2“的形式读取出来
SQL语句中可以使用的四则运算的主要运算符
运算符 | 含义 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算 |
() | 括弧 |
注意含有null的运算,计算结果都是null,null/0 结果也是null
法则 2-6 SELECT子句中可以使用常数或者表达式。
2.2 比较运算符
在where子句中通过使用比较运算符可以组合出各种各样的条件表达式
选取出sale_price列的值不是500的记录
SELECT product_name, product_type
FROM Product
WHERE sale_price <> 500;
运算符 | 含义 |
---|---|
= | 和~相等 |
<> | 和~不等 |
>= | 大于等于~ |
> | 大于~ |
<= | 小于等于~ |
< | 小于 |
这些运算符可以对字符、数字和日期等所有数据类型的列和值进行比较。
在使用大于等于(>=)或者小于等于(<=)作为查询条件时,一 定要注意不等号(<、>)和等号(=)的位置不能颠倒。
法则 2-7 使用比较运算符时一定要注意不等号和等号的位置。
比较字符串的时候是用类似于字典顺序进行比较,也就是像姓名那样,按照条目在字典中出现的顺序来进行 排序。该规则最重要的一点就是,以相同字符开头的单词比不同字符开 头的单词更相近。
Chars 表 chr 列中的数据按照字典顺序进行排序的结果如下所示。
1
10
11
2
222
3
'10' 和 '11' 同样都是以 '1' 开头的字符串,首先判定为比 '2' 小。 这就像在字典中“提问”“提议”和“问题”按照如下顺序排列一样。
法则 2-8 字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
2.2 不能对 NULL 使用比较运算符
不能对null进行直接比较,通过 IS NULL
和IS NOT NULL
来判断某个值是不是null
法则 2-9 希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。 希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。
2.3 逻辑运算符
- NOT 运算符
NOT 不能单独使用,必须和其他查询条件组合起来使用
SELECT product_name, product_type, sale_price
FROM Product
WHERE NOT sale_price >= 1000;
等同于
SELECT product_name, product_type
FROM Product
WHERE sale_price < 1000;
法则 2-10 NOT运算符用来否定某一条件,但是不能滥用。
- AND运算符和OR运算符
对多个查询条件进行组合
AND 运算符在其两侧的查询条件都成立时整个查询条件才成立,其意 思相当于“并且”。
OR 运算符在其两侧的查询条件有一个成立时整个查询条件都成立,其 意思相当于“或者”。
法则 2-11 多个查询条件进行组合时,需要使用AND运算符或者OR运算符。
法则 2-12 文氏图很方便。
法则 2-13 AND运算符的优先级高于OR运算符。想要优先执行OR运算符时可以 使用括号。
2.4 逻辑运算符和真值
逻辑运算符对比较运算符等返回的真值进行操作。
三值逻辑,在SQL中语言逻辑运算除了真假值之外,还有第三种值-不确定(UNKNOW),也就是null。
SQL中真值表
AND:
P | Q | P AND Q |
---|---|---|
真 | 真 | 真 |
真 | 假 | 假 |
真 | 不确定 | 不确定 |
假 | 真 | 假 |
假 | 假 | 假 |
假 | 不确定 | 假 |
不确定 | 真 | 不确定 |
不确定 | 假 | 假 |
不确定 | 不确定 | 不确定 |
OR:
P | Q | P OR Q |
---|---|---|
真 | 真 | 真 |
真 | 假 | 真 |
真 | 不确定 | 真 |
假 | 真 | 真 |
假 | 假 | 假 |
假 | 不确定 | 不确定 |
不确定 | 真 | 真 |
不确定 | 假 | 不确定 |
不确定 | 不确定 | 不确定 |
原本只有 4 行的真值表,如果要考虑 NULL 的话就会像上表那样增加为3×3=9 行,看起来也变得更加繁琐,考虑 NULL 时的条件判断也会变得异常复杂,这与我们希望的结果大相径庭。因此,我们要尽量不使用 NULL。
这就是在数据库中设置了NOT NULL约束的原因
法则 2-14 通过创建真值表,无论多复杂的条件,都会更容易理解。
总结
本次学习了SQL 最基本也是最重要的语句——SELECT 语句,同时学习了执行查询操作时指定想要查询数据的条件(查询条件),查询时可以指定一个或多个查询条件,例如“某一列等于这个值”“某一列计算之 后的值大于这个值”等。
在指定查询条件时,我们要注意null这个特殊的值,它的逻辑运算结果和正常值的逻辑运算结果不一样。