在本教程中,您将学习如何使用sql select
语句从单个表中查询数据。
要查询表中的数据,请使用sql select
语句。 select
语句包含用于选择列,选择行,分组数据,连接表以及执行简单计算的语法。
select
语句是sql中最复杂的命令之一,因此,在本教程中,我们将仅介绍基础知识。
下面说明了从单个表中检索数据的select
语句的基本语法。
select
column1, column2, column3, ...
from
table_name;
在此语法中,指定查询select
子句中的数据是使用逗号分隔列的列表,并在from
子句中指定表名。 在评估select
语句时,数据库系统首先计算from
子句,然后再计算select
子句。
分号(;
)不是查询的一部分。 通常,数据库系统使用分号分隔两个sql查询。 有关更多信息,请查看sql语法。
如果要查询表的所有列中的数据,可以使用星号(*
)运算符而不是列列表,如下所示。
select
*
from
table_name;
请注意,sql不区分大小写。所以数据库系统处理
select
和select
都是相同操作。 但是,为了使sql语句更具可读性,我们将使用sql关键字的大写字母(如select
和from
)和小写字母(如表名和列名)等标识符。
除了select
和from
子句之外,select
语句还可以包含许多其他子句,例如 -
order by
- 用于对结果集进行排序limit
- 用于限制返回的行join
- 用于查询来自多个相关表的数据group by
- 用于根据一列或多列对数据进行分组having
- 用于过滤分组您将在后续教程中了解这些子句的使用。
我们将使用示例数据库中的employees
表进行演示。
要查询表中的所有列,请使用星号(*
)而不是指定每列。 例如,以下语句从employees
表中检索所有数据:
select
*
from
employees;
执行上面示例代码,得到以下结果 -
+-------------+------------+-----------+---------------------------+----------------+------------+--------+--------+------------+---------------+
| employee_id | first_name | last_name | email | phone_number | hire_date | job_id | salary | manager_id | department_id |
+-------------+------------+-----------+---------------------------+----------------+------------+--------+--------+------------+---------------+
| 100 | steven | lee | steven.lee@h3.com | 0532-86011111 | 1987-06-17 | 4 | 24000 | null | 9 |
| 101 | neena | wong | neena.wong@kaops.com | 0551-4243311 | 1989-09-21 | 5 | 17000 | 100 | 9 |
| 102 | lex | liang | lex.liang@kaops.com | 0571-87622362 | 1993-01-13 | 5 | 17000 | 100 | 9 |
| 103 | alexander | lee | alexander.lee@kaops.com | 020-95105105 | 1990-01-03 | 9 | 9000 | 102 | 6 |
... ...
| 201 | michael | zhou | michael.zhou@h3.com | 010-67237328 | 1996-02-17 | 10 | 13000 | 100 | 2 |
| 202 | pat | zhou | pat.zhou@h3.com | 0755-28114518 | 1997-08-17 | 11 | 6000 | 201 | 2 |
| 203 | susan | zhou | susan.zhou@h3.com | 0755-83587526 | 1994-06-07 | 8 | 6500 | 101 | 4 |
| 204 | hermann | wu | hermann.wu@h3.com | 0513-83512816 | 1994-06-07 | 12 | 10000 | 101 | 7 |
| 205 | shelley | wu | shelley.wu@h3.com | 0898-31686222 | 1994-06-07 | 2 | 12000 | 101 | 11 |
| 206 | william | wu | william.wu@h3.com | 022-26144822 | 1994-06-07 | 1 | 8300 | 205 | 11 |
+-------------+------------+-----------+---------------------------+----------------+------------+--------+--------+------------+---------------+
40 rows in set
使用星号(*
)运算符只能方便地通过sql客户端应用程序以交互方式查询数据。 但是,如果在应用程序的嵌入语句中使用星号(*
)运算符,则可能存在一些潜在问题。
首先,因为表的结构将发展以适应新的业务需求,例如,可以添加新列并删除现有列。 如果使用星号(*
)运算符并且未更改应用程序代码以使其与新表结构一起使用,则应用程序可能无法正常运行。
星号(*
)运算符的另一个问题是它可能会增加数据库服务器和应用程序之间传输的不必要数据,因为应用程序可能只需要表的部分数据。
select
语句用于准确指定要以任何顺序检索数据的列,它不必按表中定义的顺序排列。
例如,如果想要查看所有员工的员工id,名字,姓氏和雇用日期,则使用以下查询:
select
employee_id,
first_name,
last_name,
hire_date
from
employees;
请注意,结果集仅包含select
子句中指定的四列。如下所示 -
+-------------+------------+-----------+------------+
| employee_id | first_name | last_name | hire_date |
+-------------+------------+-----------+------------+
| 100 | steven | lee | 1987-06-17 |
| 101 | neena | wong | 1989-09-21 |
| 102 | lex | liang | 1993-01-13 |
| 103 | alexander | lee | 1990-01-03 |
... ...
| 202 | pat | zhou | 1997-08-17 |
| 203 | susan | zhou | 1994-06-07 |
| 204 | hermann | wu | 1994-06-07 |
| 205 | shelley | wu | 1994-06-07 |
| 206 | william | wu | 1994-06-07 |
+-------------+------------+-----------+------------+
40 rows in set
如前所述,select语句用于执行简单的计算。 例如,以下查询使用floor()
,datediff()
和current_date
函数计算员工的服务年份。要计算服务年份,将datediff()
函数的结果除以365
。floor()
函数返回小于或等于数值表达式结果的最大整数。yos
是下面表达式的列别名,用于在返回的结果集中显示用户友好的标题。
floor(datediff(now(), hire_date) / 365)
完整的写法如下所示 -
select
employee_id,
first_name,
last_name,
floor(datediff(now(), hire_date) / 365) as yos
from
employees;
执行上面查询语句,得到以下结果 -
+-------------+------------+-----------+-----+
| employee_id | first_name | last_name | yos |
+-------------+------------+-----------+-----+
| 100 | steven | lee | 31 |
| 101 | neena | wong | 29 |
| 102 | lex | liang | 26 |
| 103 | alexander | lee | 29 |
| 104 | bruce | wong | 27 |
| 105 | david | liang | 21 |
| 106 | valli | chen | 20 |
| 107 | diana | chen | 19 |
| 108 | nancy | chen | 24 |
... ...
| 203 | susan | zhou | 24 |
| 204 | hermann | wu | 24 |
| 205 | shelley | wu | 24 |
| 206 | william | wu | 24 |
+-------------+------------+-----------+-----+
40 rows in set
此查询适用于mysql。 如果使用sql server,则可以使用以下查询:
select
employee_id,
first_name,
last_name,
datediff(year, hire_date,current_timestamp)
from
employees;
通过上面示例和学习,您应该知道如何使用sql select
语句从单个表中查询数据。