回到目录
列的查询
用select语句选取列。
SELECT 列名1, 列名2, ...
FROM 表名;
-- 例如
SELECT product_id, product_name, purchase_price
FROM Product;
如上所示,查询多列时要用逗号对列名进行分隔。查询结果中列的顺序和select子句中列的顺序相同。
使用 * 查询选取所有列。
SELECT *
FROM 表名;
使用了星号就无法设定查询结果中列的顺序了,这时会按照CREATE TABLE语句的定义对列进行排序。
为列设定别名
使用AS为列设定别名。
SELECT 列名1 AS 别名1,
列名2 AS 别名2,
列名3 AS 别名3
FROM 表名;
别名可以使用中文,但注意中文的别名要用双引号而不是单引号。英文别名既不用双引号也不用单引号。
SELECT product_id AS "编号",
product_name AS "名称",
purchase_price AS "进货单价"
FROM Product;
从查询结果中删除重复行(记录)
使用关键字DISTINCT
SELECT DISTINCT product_type
FROM Product;
这样就会删除重复行(记录),例如上述语句得到的查询结果中,product_type这一列的值相同的行(记录)会被合并为一行。
此外,DISTINCT会把null也视为一类数据,null也是一种类别。
还可以对多列使用DISTINCT,这样,多列均相同的重复项才会被删除。
SELECT DISTINCT product_type, regist_date
FROM Product;
注意,多列使用DISTINCT时,DISTINCT只能用在第一个列名之前。
使用WHERE来过滤查询的行(记录)
使用WHERE子句来指定查询的条件,过滤选择满足一定条件的记录。(可联想if条件句)
SELECT 列名
FROM 表名
WHERE 条件表达式;
-- 例如
SELECT product_name, product_type
FROM Product
WHERE product_type = '衣服';
这样,where语句会将表Product中的记录通过条件表达式过滤得只剩下类型为衣服的记录,再从这些记录中选取product_name和product_type这两列。也就是先执行了where语句,再执行select。
至此,要引出一个很重要的概念:select查询先选取行,再选取列。如上述,先选取满足条件类型为衣服的所有行,再从这些行中选取出所需要的列的信息。
还要注意到,SQL中语句的书写顺序是固定的,不能随意改变。例如,WHERE必须在FROM后面。
注释的书写
注释分为单行注释和多行注释。单行注释写在"--"之后,"--"后要加空格再写注释内容。而多行注释写在" / "和" / "之间。如下所示:
-- 单行注释
/* 多行注释
多行注释
多行注释 */
运算符
运算符就是使用其两边的值进行运算并返回结果的符号,包括算术运算符、比较运算符、逻辑运算符。
算数运算符
包括加减乘除(+、-、*、/)四则运算的运算符。算术运算符中可以使用括号改变优先级顺序。
需要注意的是,含有null的运算,其结果都是null。
比较运算符
如下表所示:
比较运算符可以对字符、数字、日期等几乎所有数据类型进行比较。其中,数字型数据根据数字大小进行比较,日期型数据根据时间先后进行比较,字符型数据根据字典序进行比较。
还需注意,不能对null使用比较运算符,否则一条记录也取不出来。对null比较时要使用专门的is null和is not null运算符。
逻辑运算符
非、与、或,即逻辑运算。
非,表否定含义,对应的逻辑运算符为not。
-- 例如
SELECT product_name
FROM Product
WHERE NOT sale_price > 1000;
-- 选取的是Product表中售价不大于(小于等于)1000的记录(行)的商品名字
与对应的逻辑运算符为and(注意不能写成&&),表示在其两侧的条件同时为真时结果才为真。作用同&&。
-- 例如
SELECT product_name
FROM Product
WHERE product_type = '厨房用具' AND sale_price > 3000;
-- 选取出表Product中类型是厨房用具并且售价大于3000的记录(行)的商品名字
或对应的逻辑运算符为or(注意不能写成||),表示在其两侧的条件有一个为真时结果就是真。作用同||。
and的优先级优于or,但同样也可以通过括号改变优先级顺序。
null既不为真也不为假
SQL有三种逻辑值,因此SQL的逻辑运算被称为三值逻辑,分别是真(TRUE)、假(FALSE)、不确定(UNKNOWN)。而null的真值就是不确定(UNKNOWN)。
关于unknown的逻辑运算详见以下真值表:
AND运算
OR运算
如上所示,正是因为有了null,真值表变得复杂和繁琐,因此通常情况下还是尽量不使用null,这就是为什么会有NOT NULL这样的列约束。