欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

最全最易理解的数据库查询教程

程序员文章站 2022-05-09 17:20:35
...

检索数据表中一个字段的内容

我们将从最简单的 SELECT 语句开始学习。

语法规则为:

SELECT 字段名 FROM 表名 

举个例子
我们想从表 Customers 中得到 cust_name 字段所有的内容,即所有人的姓名。表 Customers 的内容如下图所示:
最全最易理解的数据库查询教程
输入:

SELECT cust_name
FROM Customers

输出:

最全最易理解的数据库查询教程
我们成功从表 Customers 中检索到了字段 cust_name 的内容。

检索数据表中多个字段的内容

如果我想检索更多的字段呢?当然可以做到,而且语法结构与检索单个字段的内容类似,只需要你把想要检索的字段,统统放到 SELECT 后面就可以了,记得要加逗号隔开。

语法规则为:

SELECT 字段名1, 字段名2, 字段名3 FROM 表名 

举个例子
我们想从表 Customers 中得到 cust_id 和 cust_name 字段所有的内容。

输入:

SELECT cust_id, cust_name
FROM Customers

输出:
最全最易理解的数据库查询教程
可以看到,我们成功从表 Customers 中检索到了字段 cust_id 和 cust_name 的内容。

检索数据表中所有字段的内容

如果我想检索一张表内的所有字段呢?是不是需要我把字段一个一个列出来呀?如果我不记得字段都有哪些了怎么办呢?当然有解决办法!
我们可以通过在 SELECT 语句后使用 * 来返回表内所有字段的内容。

语法规则为:

 SELECT * FROM 表名 

举个例子
我们想从表 Customers 中得到所有字段的内容。

输入:

SELECT *
FROM Customers

输出:
最全最易理解的数据库查询教程

带限制条件的查询

SELECT 语句可以帮你返回所有匹配的内容,甚至整张表的内容。但是如果你仅仅是想要第一行的数据或者前几行的数据怎么办呢?好消息是我们可以通过限制条件来查询,不过限制条件的语法在各个数据库中的语法是不同的。在 SQL Server 中:

语法规则为:

SELECT TOP 行数 字段名 FROM 表名

举个例子
我们想从表 Customers 中得到 cust_name 字段的前 3 行内容。表 Customers 的内容如下图所示:

最全最易理解的数据库查询教程

输入:

SELECT TOP 3 cust_name
FROM Customers

输出:

最全最易理解的数据库查询教程

当然,如果你使用的是 MYSQL 或者其他数据库,语法可不一样啊,你得去问 google 咯-

表达式查询

有时候,你并不想知道某个字段的内容,而是想知道经过处理后的内容。这种情况有很多。比如,你想知道这一批的书打6折后都是多少钱?你想知道字段 A 和字段 B 加起来是多少?这是可以做到的,我们可以使用表达式查询来达到此目的。

语法规则为:

 SELECT 包含字段名的表达式 AS 新字段名 FROM 表名

其中,表达式计算的结果会放在新字段名下面,但是新字段名并没有存储在表中,而是暂时把结果返回给你,供你参考。

举个例子
我们想从把表 Customers 中每位消费者的 cust_id 都 +1 。表 Customers 的内容与上例的相同。

输入:

SELECT cust_id, cust_id+1 as new_cust_id
FROM Customers

输出:
最全最易理解的数据库查询教程

使用 WHERE 语句和逻辑表达式

下表为与 WHERE 语句搭配的操作符列表:
最全最易理解的数据库查询教程

使用WHERE语句检索单范围数据

如果你想在房屋中介数据库中,寻找小于100万的房子,你应该怎么做?你是不是很自然的就想到了要用操作符 < 的。

让我们举个例子来看看,检索单范围数据是怎么实现的:

我们想从表 Customers 中找到消费大于 1000 的人。表 Customers 的内容如下图所示:
最全最易理解的数据库查询教程
输入:

SELECT cust_name, cost
FROM Customers
WHERE cost > 1000

输出:
最全最易理解的数据库查询教程
不仅是 > ,其他操作符 < , <= , >= , !< , !> 的使用方法也是一样的。

使用WHERE语句检索双范围数据

还有一种情况,就是你心目中有一个理想的区间范围。比如你想买房,不能太便宜,因为便宜的有可能又小又偏僻,也不能太贵,因为。。。呵呵大家懂的。这时候,你就需要划定一个范围,SQL 很贴心的为大家提供了自然语言关键字,用来划定数字的范围。

语法规则为:

WHERE 字段名 BETWEEN 数字1 AND 数字2

举个例子
我们想从表 Customers 中找到消费在 1000~3000 之间的人。表 Customers 的内容和上例相同。

输入:

SELECT cust_name, cost
FROM Customers
WHERE cost BETWEEN 1000 AND 3000

输出:
最全最易理解的数据库查询教程
Tips:
注意,使用 BETWEEN…AND… 时一定要记住较小的数在前边,较大的数在后边!

使用WHERE语句检索不匹配某条件的语句

有很多人可能有过这样的感觉,问你想要什么样的男/女朋友,你可能说想要这样的,那样的,好像都不错,看感觉吧。虽然你可能不知道你最想要什么,但是你一定知道你不想要什么。

SQL 语句也一样,它为你提供了选择不想要什么的机会。

举个例子
我们想从表 Customers 中找到消费者不在 New York 的人。表 Customers 的内容和上例相同。

输入:

SELECT cust_name, cust_city
FROM Customers
WHERE cust_city <> 'New York'

输出:
最全最易理解的数据库查询教程
Tips:
注意,在SQL Server 中,不等于只能用 <> 符号,不能使用 != 符号。

使用通配符[]模糊匹配数据内容

通配符 [] 是个中括号,一看就知道里面是应该放点什么内容,放点什么呢?它又有什么作用呢?

[] 用于将一组字符囊括在内,这一组字符之间是或的关系,而通配符 [] 出现的位置也严格匹配于括号中出现的字符在整个字符串中的位置。

是不是有点抽象?一会儿我们举个例子你就明白了,先来看看语法吧。

语法规则为:

 SELECT 字段名 
 FROM 表名  
 WHERE  字段名 LIKE '[数据]' 

举个例子
我们想从表 Customers 中,检索到所有 cust_name 以 a 和 t 开头的消费者的所有数据。表 Customers 的内容如下图所示:
最全最易理解的数据库查询教程
输入:

SELECT *
FROM Customers
WHERE cust_name LIKE '[at]%'

输出:
最全最易理解的数据库查询教程
分析:
我们在语法中加入了通配符 % 。因为通配符 [] 中出现的只能是有或关系的 单字符 。所以除非你想检索的是单字符,否则不加 % 的话,你将检索不到任何内容。

Tips:
注意,通配符中的字符大小写不敏感 !

使用通配符[]和^模糊匹配取反的数据内容

我们还可以对检索内容进行“取反”。使用符号 ^ 后,我们可以成功的检索到 [] 中没出现的字符。

语法规则为:

SELECT 字段名 
 FROM 表名  
 WHERE  字段名 LIKE '[^数据]' 

举个例子
我们想从表 Customers 中,检索到所有 cust_name 不是以 a 和 t 开头的消费者的所有数据。表 Customers 的内容如下图所示:
最全最易理解的数据库查询教程
输入:

SELECT *
FROM Customers
WHERE cust_name LIKE '[^at]%'

输出:
最全最易理解的数据库查询教程
分析:
当然,你也可以使用 NOT 操作符来得到相同的结果。相比来说,^ 唯一的好处就是简化了 WHERE 语句的语法。

举个例子

SELECT *
FROM Customers
WHERE NOT cust_name LIKE '[at]%'

使用通配符_模糊匹配数据内容

另一个很实用的通配符是下划线 _ ,它的使用规则与 % 类似,唯一与 % 不同的是:% 能匹配多个字符,而 _ 只能匹配一个字符!

语法规则为:

SELECT 字段名 
 FROM 表名  
 WHERE  字段名 LIKE '数据和_的组合' 

举个例子
我们想从表 Customers 中检索到 cust_id 尾数只有个位数的消费者的所有数据。表 Customers 的内容如下图所示。大家可以看到,我们只有一个 cust_id 尾数为两位数的消费者 Sol Pozo ,该如何撇开它呢?最全最易理解的数据库查询教程

输入:

SELECT *
FROM Customers
WHERE cust_id LIKE '100000000_'

输出:
最全最易理解的数据库查询教程
在这个例子里,通配符 _ 只匹配到了一个字符,那如果想匹配多个连起来的字符呢?那就把通配符 _ 连起来!

使用通配符%模糊匹配数据内容的后半部分

在所有通配符中,最常用的通配符要数 % 了。使用了 % 就意味着,你能从现有的数据中匹配到任意个数的字符(注意,可以是不止一个字符哟)。

语法规则为:

SELECT 字段名 
 FROM 表名  
 WHERE  字段名 LIKE '数据%'; 

举个例子
我们想从表 Customers 中检索到所有叫 Alice 的消费者的所有数据。表 Customers 的内容如下图所示。大家可以看到,我们有 Alice Nicholas 和 Alice Edwards 两个都叫 Alice 的人,该如何做才能同时匹配到他们两个呢?

最全最易理解的数据库查询教程

输入:

SELECT *
FROM Customers
WHERE cust_name LIKE 'Alice%'

输出:

最全最易理解的数据库查询教程
在这个例子里,我们使用了模糊匹配模式 Alice% ,运行后,数据库会检索出所有以 Alice 为开头的字符串来,无论 Alice 后有多长的字符串数据库都能检索出来。

Tips:
注意,模式匹配是大小写敏感的!如果你检索的是 alice% ,那就什么都检索不到了!

使用通配符%模糊匹配数据内容的任意部分

如果,你想检索的内容既不在字符串的头部,也不在字符串的尾部,而是在它们的中间,你该如何检索呢?

举个例子
我们想从表 Customers 中得检索到所有拥有 yahoo 邮箱的消费者的所有数据。表 Customers 的内容如下图所示:
最全最易理解的数据库查询教程
如果我们还按刚才的方法,看看我们能检索到什么?

输入:

SELECT *
FROM Customers
WHERE cust_email LIKE 'yahoo%'

输出:

最全最易理解的数据库查询教程
啊哦!什么都没检索到!那是因为, yahoo% 模式严格匹配的是以 yahoo 开头的字符串。而大家可以看到,在我们的例子中,包含 yahoo 字符串的邮箱地址是以不同名字作为字符串开头的。

所以,要想匹配到五花八门的名字,我们需要把它们都变成通配符 % 。

输入:

SELECT *
FROM Customers
WHERE cust_email LIKE '%yahoo%'

输出:
最全最易理解的数据库查询教程
想象一下,如果你在 cust_email 中检索 a%m ,会得到什么样的结果?