添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

一、SELECT 语句

正如 学习 SQL 之前需要了解的基础知识 所述,SQL 语句是由简单的英语单词构成的。这些单词称为 关键字 ,每个 SQL 语句都是由一个或多个关键字构成的。

最经常使用的 SQL 语句大概就是 SELECT 语句了。它的用途是从一个或多个表中检索数据。

关键字(keyword)

作为 SQL 组成部分的保留字。关键字不能用作表或列的名字。 SQL 保留字 列出了某些经常使用的保留字。

为了使用 SELECT 检索数据库表中的数据,必须至少给出两条信息——想选择什么,以及从什么地方选择。

说明:理解例子

本文中的样例SQL语句(和样例输出)使用了 学习 SQL 所用到的样例表脚本 中描述的一组数据文件。

如果想要理解和试验这些样例(我强烈建议这样做),请参阅附录A,它解释了如何下载或创建这些数据文件。

提示:使用正确的数据库

利用 DBMS 可以处理多个数据库(参见 学习 SQL 之前需要了解的基础知识 里文件柜的比喻)。

根据 学习 SQL 所用到的样例表脚本 安装好样例表之后,建议你把它们装进新的数据库。

如果这样的话,要确保在处理之前就选择好了数据库,就像你在创建样例表之前做的那样。

二、检索单个列

我们将从简单的 SQL SELECT 语句讲起,此语句如下所示:

SELECT prod_name
FROM Products;

上述语句利用 SELECT 语句从 Products 表中检索一个名为 prod_name 的列。所需的列名写在 SELECT 关键字之后,FROM 关键字指出从哪个表中检索数据。此语句的输出如下所示:

prod_name
-------------------
Fish bean bag toy
Bird bean bag toy
Rabbit bean bag toy
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Raggedy Ann
King doll
Queen doll

根据你使用的具体 DBMS 和客户端,可能你会看到一条信息说明检索了多少行,以及花了多长时间。例如,MySQL 命令行会显示类似下面这样的一行信息:

9 rows in set (0.01 sec)
 

说明:未排序数据

如果你自己试验这个查询,可能会发现显示输出的数据顺序与这里的不同。出现这种情况很正常。

如果没有明确排序查询结果(如何使用 ORDER BY 根据需要排序检索出的数据 介绍怎样指定顺序),则返回的数据没有特定的顺序。

返回数据的顺序可能是数据被添加到表中的顺序,也可能不是。只要返回相同数目的行,就是正常的。

如上的一条简单 SELECT 语句将返回表中的所有行。数据没有过滤(过滤将得出结果集的一个子集),也没有排序。

提示:结束 SQL 语句

多条 SQL 语句必须以分号(;)分隔。多数 DBMS 不需要在单条 SQL 语句后加分号,但也有 DBMS 可能必须在单条 SQL 语句后加上分号。

当然,如果愿意可以总是加上分号。事实上,即使不一定需要,加上分号也肯定没有坏处。

提示:SQL 语句和大小写

请注意,SQL 语句不区分大小写,因此 SELECTselect 是相同的。同样,写成 Select 也没有关系。

许多 SQL 开发人员喜欢对 SQL 关键字使用大写,而对列名和表名使用小写,这样做代码更易于阅读和调试。

不过,一定要认识到虽然 SQL 是不区分大小写的,但是表名、列名和值可能有所不同(这有赖于具体的 DBMS 及其如何配置)。

提示:使用空格

在处理 SQL 语句时,其中所有空格都被忽略。SQL 语句可以写成长长的一行,也可以分写在多行。下面这 3 种写法的作用是一样的。

SELECT prod_name
FROM Products;
SELECT prod_name FROM Products;
SELECT
prod_name
Products;
 

多数 SQL 开发人员认为,将 SQL 语句分成多行更容易阅读和调试。

三、检索多个列

要想从一个表中检索多个列,仍然使用相同的 SELECT 语句。唯一的不同是必须在 SELECT 关键字后给出多个列名,列名之间必须以逗号分隔。

提示:当心逗号

在选择多个列时,一定要在列名之间加上逗号,但最后一个列名的后面不加。如果在最后一个列名的后面加了逗号,将出现错误。

下面的 SELECT 语句从 Products 表中选择 3 列。

SELECT prod_id, prod_name, prod_price
FROM Products;

与前一个例子一样,这条语句使用 SELECT 语句从表 Products 中选择数据。在这个例子中,指定了 3 个列名,列名之间用逗号分隔。此语句的输出如下:

prod_id       prod_name                prod_price
---------     --------------------     ----------
BNBG01        Fish bean bag toy        3.49
BNBG02        Bird bean bag toy        3.49
BNBG03        Rabbit bean bag toy      3.49
BR01          8 inch teddy bear        5.99
BR02          12 inch teddy bear       8.99
BR03          18 inch teddy bear      11.99
RGAN01        Raggedy Ann              4.99
RYL01         King doll                9.49
RYL02         Queen dool               9.49
 

说明:数据表示

SQL 语句一般返回原始的、无格式的数据,不同的 DBMS 和客户端显示数据的方式略有不同(如对齐格式不同、小数位数不同)。

数据的格式化是表示问题,而不是检索问题。因此,如何表示一般会在显示该数据的应用程序中规定。

通常很少直接使用实际检索出的数据(没有应用程序提供的格式)。

四、检索所有列

除了指定所需的列外(如上所述,一列或多列),SELECT 语句还可以检索所有的列而不必逐个列出它们。在实际列名的位置使用星号(*)通配符可以做到这点,如下所示。

SELECT *
FROM Products;

如果给定一个通配符(*),则返回表中所有列。列的顺序一般是表中出现的物理顺序,但并不总是如此。

不过,SQL 数据很少直接显示(通常,数据返回给应用程序,根据需要进行格式化,再表示出来)。因此,这不应该造成什么问题。

注意:使用通配符

一般而言,除非你确实需要表中的每一列,否则最好别使用 * 通配符。

虽然使用通配符能让你自己省事,不用明确列出所需列,但检索不需要的列通常会降低检索速度和应用程序的性能。

提示:检索未知列

使用通配符有一个大优点。由于不明确指定列名(因为星号检索每一列),所以能检索出名字未知的列。

五、检索不同的值

如前所述,SELECT 语句返回所有匹配的行。但是,如果你不希望每个值每次都出现,该怎么办呢?例如,你想检索 Products 表中所有产品供应商的 ID

SELECT vend_id
FROM Products;
vend_id
----------
BRS01
BRS01
BRS01
DLL01
DLL01
DLL01
DLL01
FNG01
FNG01

SELECT 语句返回 9 行(即使表中只有 3 个产品供应商),因为 Products 表中有 9 种产品。那么如何检索出不同的值?

办法就是使用 DISTINCT 关键字,顾名思义,它指示数据库只返回不同的值。

SELECT DISTINCT vend_id
FROM Products;

SELECT DISTINCT vend_id 告诉 DBMS 只返回不同(具有唯一性)的 vend_id 行,所以正如下面的输出,只有 3 行。

如果使用 DISTINCT 关键字,它必须直接放在列名的前面。

vend_id
----------
BRS01
DLL01
FNG01
 

注意:不能部分使用 DISTINCT

DISTINCT 关键字作用于所有的列,不仅仅是跟在其后的那一列。

例如,你指定 SELECT DISTINCT vend_id, prod_price,则 9 行里的 6 行都会被检索出来,因为指定的两列组合起来有 6 个不同的结果。

若想看看究竟有什么不同,你可以试一下这样两条语句:

SELECT DISTINCT vend_id, prod_price FROM Products;
SELECT vend_id, prod_price FROM Products;

六、限制结果

SELECT 语句返回指定表中所有匹配的行,很可能是每一行。如果你只想返回第一行或者一定数量的行,该怎么办呢?这是可行的,然而遗憾的是,各种数据库中的这一 SQL 实现并不相同。

在 SQL Server 中使用 SELECT 时,可以用 TOP 关键字来限制最多返回多少行,如下所示:

SELECT TOP 5 prod_name
FROM Products;
prod_name
-----------------
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Fish bean bag toy
Bird bean bag toy

上面代码使用 SELECT TOP 5 语句,只检索前 5 行数据。

如果你使用的是 DB2,就得使用下面这样的 DB2 特有的 SQL 语句:

SELECT prod_name
FROM Products
FETCH FIRST 5 ROWS ONLY;

FETCH FIRST 5 ROWS ONLY 就会按字面的意思去做的(只取前 5 行)。

如果你使用 Oracle,需要基于 ROWNUM(行计数器)来计算行,像这样:

SELECT prod_name
FROM Products
WHERE ROWNUM <=5;

如果你使用 MySQL、MariaDB、PostgreSQL 或者 SQLite,需要使用 LIMIT 子句,像这样:

SELECT prod_name
FROM Products
LIMIT 5;

上述代码使用 SELECT 语句来检索单独的一列数据。LIMIT 5 指示 MySQL 等 DBMS 返回不超过 5 行的数据。这个语句的输出参见下面的代码。

为了得到后面的 5 行数据,需要指定从哪儿开始以及检索的行数,像这样:

SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;

LIMIT 5 OFFSET 5 指示 MySQL 等 DBMS 返回从第 5 行起的 5 行数据。第一个数字是检索的行数,第二个数字是指从哪儿开始。这个语句的输出是:

prod_name
-------------------
Rabbit bean bag toy
Raggedy Ann
King doll
Queen doll

所以,LIMIT 指定返回的行数。LIMIT 带的 OFFSET 指定从哪儿开始。在我们的例子中,Products 表中只有 9 种产品,所以 LIMIT 5 OFFSET 5 只返回了 4 行数据(因为没有第 5 行)。

注意:第 0 行

第一个被检索的行是第 0 行,而不是第 1 行。因此,LIMIT 1 OFFSET 1 会检索第 2 行,而不是第 1 行。

提示:MySQL、MariaDB 和 SQLite 捷径

MySQL、MariaDB 和 SQLite 可以把 LIMIT 4 OFFSET 3 语句简化为 LIMIT 3,4。使用这个语法,逗号之前的值对应 OFFSET,逗号之后的值对应 LIMIT(反着的,要小心)。

说明:并非所有的 SQL 实现都一样

我加入这一节只有一个原因,就是要说明,SQL 虽然通常都有相当一致的实现,但你不能想当然地认为它总是这样。非常基本的语句往往是相通的,但较复杂的语句就不同了。

当你针对某个问题寻找 SQL 解决方案时,一定要记住这一点。

七、使用注释

可以看到,SQL 语句是由 DBMS 处理的指令。如果你希望包括不进行处理和执行的文本,该怎么办呢?为什么你想要这么做呢?原因有以下几点。

很多 DBMS 都支持各种形式的注释语法。我们先来看行内注释:

SELECT prod_name    -- 这是一条注释
FROM Products;

注释使用 -- (两个连字符)嵌在行内。-- 之后的文本就是注释,例如,这用来描述 CREATE TABLE 语句中的列就很不错。

下面是另一种形式的行内注释(但这种形式有些 DBMS 不支持)。

# 这是一条注释
SELECT prod_name
FROM Products;

在一行的开始处使用 #,这一整行都将作为注释。你在 学习 SQL 所用到的样例表脚本 提供的脚本 create.sql 和 populate.sql 中可以看到这种形式的注释。

你也可以进行多行注释,注释可以在脚本的任何位置停止和开始。

/* SELECT prod_name, vend_id
FROM Products; */
SELECT prod_name
FROM Products;

注释从 /* 开始,到 */ 结束,/**/ 之间的任何内容都是注释。

这种方式常用于把代码注释掉,就如这个例子演示的,这里定义了两个 SELECT 语句,但是第一个不会执行,因为它已经被注释掉了。

本文介绍了如何使用 SQL 的 SELECT 语句来检索单个表列、多个表列以及所有表列。也介绍了如何返回不同的值,如何注释代码。

同时不好的消息是,复杂的 SQL 语句往往不够通用。

如何使用 ORDER BY 根据需要排序检索出的数据 介绍如何使用 SELECT 语句的 ORDER BY 子句,对检索出的数据进行排序

原文链接:https://www.developerastrid.com/sql/sql-select/

文章目录一、SELECT 语句二、检索单个列三、检索多个列四、检索所有列五、检索不同的值六、限制结果七、使用注释八、小结本文介绍了如何使用 SQL 的 SELECT 语句来检索单个表列、多个表列以及所有表列。也介绍了如何返回不同的值以及如何注释代码。一、SELECT 语句正如 学习 SQL 之前需要了解的基础知识 所述,SQL 语句是由简单的英语单词构成的。这些单词称为关键字,每个 SQL 语句都是由一个或多个关键字构成的。最经常使用的 SQL 语句大概就是 SELECT 语句了。它的用途是从一个或
批量查询数据sql语句 包括根据数字转成汉字、日期计算 <select id="queryFinaByIds" parameterType="cn.com.git.dgmsfund.api.entity.bo.finance.finaExcelBO" resultType="cn.com.git.dgmsfund.api.entity.bo.finance.finaExcelBO"> select FINANCIAL_INSTITUTION AS financialInstitution
实际的项目,存在多张表的关联关系。不可能在一张表里面就能检索出所有数据。如果没有表连接的话,那么我们就需要非常多的操作。比如需要从A表找出限制性的条件来从B表中检索数据。不但需要分多表来操作,而且效率也不高。比如书中的例子: 代码如下:SELECT FIdFROM T_CustomerWHERE FName=’MIKE’ 这个SQL语句返回2,也就是姓名为MIKE 的客户的FId为2,这样就可以到T_Order中检索FCustomerId等于2 的记录: 代码如下:SELECT FNumber,FPriceFROM T_OrderWHERE FCustomerId=2 下面我们详细来看看表
我们在进行项目开发中,经常会遇到多条件模糊查询的需求。对此,我们常见的解决方案有两种:一是在程序端拼接SQL字符串,根据是否选择了某个条件,构造相应的SQL字符串;二是在数据库的存储过程中使用动态的SQL语句。其本质也是拼接SQL字符串,不过是从程序端转移到数据库端而已。 这两种方式的缺点是显而易见的:一是当多个条件每个都可为空时,要使用多个if语句进行判断;二是拼接的SQL语句容易产生SQL注入漏洞。 最近写数据库存储过程的时候经常使用case when 语句,正好可以用这个语句解决一下以上问题。以SQL中的NorthWind数据库为例,我要操作的是其中的Employees表,该表中默认
SQL使用GROUP BY来对SELECT的结果进行数据分组,在具体使用GROUP BY之前需要知道一些重要的规定。 1、GROUP BY子句可以包含任意数目的。也就是说可以在组里再分组,为数据分组提供更细致的控制。 2、如果在GROUP BY子句中指定多个分组,数据将在最后指定的分组上汇总。 3、GROUP BY子句中出的每个都必须是检索或有效的表达式(但不能是聚集函数)。如果在SELECT使用了表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。 4、出了聚集计算语句外,SELECT语句中的每一都必须在GROUP BY子句中给出。
数据表都已经创建起来了,假设我们已经插入了许多的数据,我们就可以用自己喜欢的方式对数据表里面的信息进行检索和显示了,比如说:可以象下面这样把整个数据表内的内容都显示出来 select * from president; 也可以只选取某一个数据行里的某一个数据 select birth from president where last_name=’Eisenhower’; select语句的通用形式如下: select 你要的信息 from 数据表(一个多个) where 满足的条件 select语句有几个子句,他们的各种搭配能帮你查出最感兴趣的信息,这些子句可以很简单,也可以很复杂,看看
检索范围很大时,使用IN语句仍然比较麻烦,更重要的是,IN语句只能检索离散,当需要检索所有工资介于3000到5000元之间的员工信息时,IN语句就无能为力了,因为介于3000到5000之间的是无数的。     当然我们可以使用普通的“大于等于”和“小于等于”来实现范围检索,比如要完成功能“检索城市编号在2~12之间的地区的所有信息”,就可以使用下面的SQL语句:
你可以使用 SQL 的 JOIN 命令来从两个或多个表中提取数据。JOIN 命令用于将两个表中共同的行连接在一起,并基于某些条件来检索它们的数据。常见的 JOIN 类型包括 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN。以下是一个简单的例子: 假设你有两个表,一个是客户表,另一个是订单表。你想检索客户信息和他们的订单信息。你可以使用以下 SQL 查询SELECT customers.customer_id, customers.customer_name, orders.order_id, orders.order_date FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id; 这个查询将返回客户表和订单表中所有匹配的行,并且只显示客户 ID、客户名称、订单 ID 和订单日期这四个。在这个例子中,我们使用 INNER JOIN 将两个表连接在一起,并且指定了连接条件为客户 ID 相等。