SQL中,查询是数据库中最常见的操作,我们先来了解一下基本的查询语句。本篇我们学习如何使用 SELECT 和 FROM 查询表中的数据,通过投影操作获取指定的字段信息。
SQL 不仅仅能够查询表中的数据,还可以返回算术运算、函数和表达式的结果。在许多数据库中,不包含 FROM 子句的无表查询可以用于快速获取信息。另外,别名可以让我们编写的 SQL 语句更易阅读和理解。
SQL 查询指定字段
在 employee 表中,存储了关于员工的信息。假设现在打算群发邮件,需要找出所有员工的姓名、性别和电子邮箱。在 SQL 中可以通过一个简单的查询语句来实现:
SELECT emp_name, sex, email FROM employee;
其中 SELECT 表示查询,随后列出需要返回的字段,多个字段使用逗号分隔;FROM 表示要从哪个表中进行查询;分号表示 SQL 语句的结束。该语句执行的结果如下(显示部分数据):
这种查询表中指定字段的操作在关系运算中被称为投影(Projection),使用 SELECT 子句进行表示。投影是针对表进行的垂直选择,保留需要的字段用于生成新的表。以下是投影操作的示意图:
投影操作中包含一个特殊的操作,就是查询表中所有的字段。
SQL 查询全部字段
查看表中的全部字段可以使用一个简单的写法,就是使用星号(*)表示全部字段。例如,以下语句查询员工表中的所有数据:
SELECT * FROM employee;
数据库在解析该语句时,会使用表中的字段名进行扩展:
SELECT emp_id, emp_name, sex, dept_id, manager,
hire_date, job_id, salary, bonus, email
FROM employee;
该语句执行的结果如下(显示部分数据):
注意:星号可以便于快速编写查询语句,但是在实际项目中不要使用这种写法。
因为应用程序可能并不需要所有的字段,避免返回过多的无用数据;
另外,当表结构发生变化时,星号返回的信息也会发生改变。
除了查询表的字段之外,SELECT 语句还支持扩展的投影操作,包括基于字段的算术运算、函数和表达式等。
SQL 查询扩展操作
以下示例返回了员工的姓名、一年的工资(12 个月的月薪)以及电子邮箱的大写形式:
SELECT emp_name,
salary * 12,
UPPER(email)
FROM employee;
其中 UPPER
是 SQL 中将字符串转换为大写的函数,函数将在第 8 篇中进行介绍。该语句的结果如下(显示部分数据):
在上面的结果中,返回字段的名称不是很好理解;能不能给它指定一个更明确的标题呢?这就需要使用到 SQL 中的别名(Alias)功能了。
SQL 查询常数
SELECT查询还可以对常数进行查询。对的,就是在SELECT查询结果中增加一列固定的常数列。这列的取值是我们指定的,而不是从数据表中动态取出的。你可能会问为什么我们还要对常数进行查询呢?SQL中的SELECT语法的确提供了这个功能,一般来说我们只从一个表中查询数据,通常不需要增加一个固定的常数列,但如果我们想整合不同的数据源,用常数列作为这个表的标记,就需要查询常数。
比如说,我们想对heros数据表中的英雄名进行查询,同时增加一列字段platform
,这个字段固定值为“王者荣耀”,可以这样写:
SELECT '王者荣耀' as platform, name FROM heros
运行结果:(69条记录)
在这个SQL语句中,我们虚构了一个platform
字段,并且把它设置为固定值“王者荣耀”。
需要说明的是,如果常数是个字符串,那么使用单引号(‘’)就非常重要了,比如‘王者荣耀’。单引号说明引号中的字符串是个常数,否则SQL会把王者荣耀当成列名进行查询,但实际上数据表里没有这个列名,就会引起错误。如果常数是英文字母,比如'WZRY'
也需要加引号。如果常数是个数字,就可以直接写数字,不需要单引号,比如:
SELECT 123 as platform, name FROM heros
运行结果:(69条记录)
SQL 查询使用别名
为了提高查询结果的可读性,可以使用别名为表或者字段指定一个临时的名称。SQL 中使用关键字 AS 指定别名。我们为上面的示例指定一些更好理解的标题:
SELECT e.emp_name AS "姓名",
salary * 12 AS "工资",
UPPER(email) "电子邮箱"
FROM employee AS e; -- Oracle 需要去掉此处的 AS
别名中的关键字 AS 可以省略。对于 Oracle 而言,表别名不支持 AS 关键字,省略掉即可。
首先,我们为 employee 表指定了一个表别名 e;然后为查询的结果字段指定了 3 个更明确的列别名(使用双引号)。在查询中为表指定别名之后,引用表中的字段时可以加上别名限定,例如 e.emp_name,表示要查看哪个表中的字段。以下是使用别名之后的效果:
在 SQL 语句中使用别名不会修改数据库中存储的表名或者列名,别名只在当前语句中生效。
SQL 无表查询
以下查询没有 FROM 子句,用于计算一个表达式的值:
-- MySQL、SQL Server 以及 PostgreSQL 实现
SELECT 1+1;
1+1|
---|
2|
这种形式的查询语句通常用于快速查找信息,或者当作计算器使用。但是需要注意的是这种语法并不属于 SQL 标准,而是数据库产品自己的扩展。MySQL、SQL Server 以及 PostgreSQL 都支持无表查询;对于 Oracle 而言,可以使用以下等价的形式:
-- Oracle 实现
SELECT 1+1
FROM dual;
1+1|
---|
2|
dual 是 Oracle 中的一个特殊的表;它只有一个字段且只包含一行数据,就是为了方便快速查询信息。另外,MySQL 也提供了 dual 表。