SQL 基本查询语句

SQL中,查询是数据库中最常见的操作,我们先来了解一下基本的查询语句。本篇我们学习如何使用 SELECT 和 FROM 查询表中的数据,通过投影操作获取指定的字段信息。

SQL 不仅仅能够查询表中的数据,还可以返回算术运算、函数和表达式的结果。在许多数据库中,不包含 FROM 子句的无表查询可以用于快速获取信息。另外,别名可以让我们编写的 SQL 语句更易阅读和理解。

SQL 查询指定字段

在 employee 表中,存储了关于员工的信息。假设现在打算群发邮件,需要找出所有员工的姓名、性别和电子邮箱。在 SQL 中可以通过一个简单的查询语句来实现:

SELECT emp_name, sex, email FROM employee;

其中 SELECT 表示查询,随后列出需要返回的字段,多个字段使用逗号分隔;FROM 表示要从哪个表中进行查询;分号表示 SQL 语句的结束。该语句执行的结果如下(显示部分数据):

SQL基本查询

这种查询表中指定字段的操作在关系运算中被称为投影(Projection),使用 SELECT 子句进行表示。投影是针对表进行的垂直选择,保留需要的字段用于生成新的表。以下是投影操作的示意图:

SQL基本查询

投影操作中包含一个特殊的操作,就是查询表中所有的字段。

SQL 查询全部字段

查看表中的全部字段可以使用一个简单的写法,就是使用星号(*)表示全部字段。例如,以下语句查询员工表中的所有数据:

SELECT * FROM employee;

数据库在解析该语句时,会使用表中的字段名进行扩展:

SELECT emp_id, emp_name, sex, dept_id, manager,
       hire_date, job_id, salary, bonus, email
FROM employee;

该语句执行的结果如下(显示部分数据):

SQL基本查询

注意:星号可以便于快速编写查询语句,但是在实际项目中不要使用这种写法。

因为应用程序可能并不需要所有的字段,避免返回过多的无用数据;

另外,当表结构发生变化时,星号返回的信息也会发生改变。

除了查询表的字段之外,SELECT 语句还支持扩展的投影操作,包括基于字段的算术运算、函数和表达式等。

SQL 查询扩展操作

以下示例返回了员工的姓名、一年的工资(12 个月的月薪)以及电子邮箱的大写形式:

SELECT emp_name,
       salary * 12,
       UPPER(email)
  FROM employee;

其中 UPPER是 SQL 中将字符串转换为大写的函数,函数将在第 8 篇中进行介绍。该语句的结果如下(显示部分数据):

SQL基本查询

在上面的结果中,返回字段的名称不是很好理解;能不能给它指定一个更明确的标题呢?这就需要使用到 SQL 中的别名(Alias)功能了。

SQL 查询常数

SELECT查询还可以对常数进行查询。对的,就是在SELECT查询结果中增加一列固定的常数列。这列的取值是我们指定的,而不是从数据表中动态取出的。你可能会问为什么我们还要对常数进行查询呢?SQL中的SELECT语法的确提供了这个功能,一般来说我们只从一个表中查询数据,通常不需要增加一个固定的常数列,但如果我们想整合不同的数据源,用常数列作为这个表的标记,就需要查询常数。

比如说,我们想对heros数据表中的英雄名进行查询,同时增加一列字段platform,这个字段固定值为“王者荣耀”,可以这样写:

SELECT '王者荣耀' as platform, name FROM heros

运行结果:(69条记录)

SQL基本查询
在这个SQL语句中,我们虚构了一个platform字段,并且把它设置为固定值“王者荣耀”。

需要说明的是,如果常数是个字符串,那么使用单引号(‘’)就非常重要了,比如‘王者荣耀’。单引号说明引号中的字符串是个常数,否则SQL会把王者荣耀当成列名进行查询,但实际上数据表里没有这个列名,就会引起错误。如果常数是英文字母,比如'WZRY'也需要加引号。如果常数是个数字,就可以直接写数字,不需要单引号,比如:

SELECT 123 as platform, name FROM heros

运行结果:(69条记录)

SQL基本查询

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,表示要查看哪个表中的字段。以下是使用别名之后的效果:

avatar

在 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 表。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程