SQL-SELECT-检索数据(一)

1. 检索数据

SELECT 从一个或者多个表中检索信息

-- 检索单个列
SELECT prod_name FROM products;

-- 检索多个列
SELECT prod_id, prod_name, prod_price FROM products;

-- 检索所有的列
SELECT * FROM products;

-- 检索不同的值
SELECT DISTINCT vend_id FROM products;

-- 限制结果 (MYSQL)
SELECT prod_name FROM products;
SELECT prod_name FROM products LIMIT 5;
SELECT prod_name FROM products LIMIT 3 OFFSET 0; -- 从第0行开始,检索3行
SELECT prod_name FROM products LIMIT 0, 3; -- 从第0行开始,检索3行

2. 排序检索数据

使用ORDER BY子句对检索出的数据进行排序。ORDER BY子句必须是SELECT语句中的最后一条子句。根据需要,可以利用它在一个或者多个列上对数据进行排序。

-- 排序:保证ORDER BY位于查询语句最后一条子句
SELECT prod_name FROM products ORDER BY prod_name; -- 按照字母表的顺序排序 
SELECT prod_name FROM products ORDER BY prod_id; -- 用非检索数据排序也是合法的

-- 按多个列排序
SELECT prod_id, prod_name, prod_price FROM products ORDER BY prod_price, prod_name;

-- 按列位置排序:易混淆,不推荐使用
SELECT prod_id, prod_price, prod_name FROM products ORDER BY 2,3;

-- 降序排列:DESC(由于默认为升序排列)
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;
# 注:由于DESC只作用到直接位于其前面的列名,上例中,只对prod_price列指定的DESC,对prod_name列不指定,因此,prod_price列以降序排列,而prod_name仍以升序排列。

3. 过滤数据

使用 SELECT 语句的 WHERE 子句指定搜索条件。只检索所需数据需要指定搜索条件,搜索条件也成为过滤条件。

WHERE 子句在表明(FROM子句)之后给出。

SQL过滤与应用过滤:

数据放在应用过滤特别不妥。让客户端应用(或开发语言)处理数据库的工作将会极大地影响应用的性能,并且使所创建的应用完全不具备可伸缩性。此外,在客户端过滤数据,服务器不得不通过网络发送多余的数据,这样导致网络带宽的浪费。因此,应该把过滤好的数据发送至客户端。

WHERE 子句操作符:

这里写图片描述

注:并非所有的DBMS都支持这些操作符。想确定你的DBMS支持哪些操作符,请参阅相应的文档。

-- 使用WHERE子句进行相等检测
SELECT prod_name, prod_price FROM products WHERE prod_price = 3.49;

--  使用WHERE子句进行其他检测
SELECT prod_name, prod_price FROM products WHERE prod_price < 10;
SELECT prod_name, prod_price FROM products WHERE PROD_PRICE <= 10;

-- 不匹配检测
SELECT vend_id, prod_name FROM products WHERE vend_id <> 'DLL01';
# 何时使用引号:单引号用来限定字符串。如果将值与字符串类型的列进行比较,就需要限定引号。

SELECT vend_id, prod_name FROM products WHERE vend_id != 'DLL01';

-- 范围值检查:使用BETWEEN操作符(需要两个值,即范围的开始值和结束值)
SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;

-- 空值检查
# NULL 与字段包含0、空字符串或者仅仅包含空格不同。
# SELECT语句有一个特殊的WHERE子句,可用来检查具有NULL值得列。这个WHERE子句就是IS NULL子句。

SELECT prod_name FROM products WHERE prod_price IS NULL;
SELECT cust_name FROM customers WHERE cust_email IS NULL;
# 这条语句返回所有没有价格(空prod_price字段,不是价格为0)

注意:NULL和不匹配

通过过滤选择不包括指定值的所有行时,有可能希望返回含有NULL值的行。但是这做不到。因为未知(unknown)有特殊的含义,数据库不知道它们如何匹配,所以在进行匹配过滤或不匹配过滤时,不会返回这些结果。过滤数据时,一定要验证被过滤列中含NULL的行确实出现在返回的数据中。


4. 高级数据过滤

为了进行更强的过滤控制,SQL允许给出多个 WHERE 子句。

-- AND操作符:可以增加多个过滤条件,每个条件间都要使用AND关键字。
SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 'DLL01' AND prod_price <= 4;

-- OR操作符:匹配任一条件而不是同时匹配两个条件 
SELECT prod_name, prod_price FROM products WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
# 第一个条件得到满足的情况下,就不再计算第二个条件(在第一个条件满足时,不管第二个是否满足,相应的行都被检测出来)

-- AND在求值过程中优先级更高 
SELECT prod_name, prod_price FROM products WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01') AND prod_price >= 10;
# 使用圆括号明确地分组操作符,不要过分的依赖默认求值顺序

-- IN操作符:用来指定条件范围 
SELECT prod_name, prod_price FROM products WHERE vend_id IN('DLL01','BRS01') ORDER BY prod_name;
-- IN操作符完成了与OR相同的功能,但推荐使用IN
SELECT prod_name, prod_price FROM products WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' ORDER BY prod_name;

-- NOT操作符:用来否定其后条件的关键字。NOT从不单独使用,总是与其他操作符一起使用。
SELECT prod_name FROM products WHERE NOT vend_id = 'DLL01' ORDER BY prod_name;
-- 使用<>操作符来完成
SELECT prod_name FROM products WHERE vend_id <> 'DLL01' ORDER BY prod_name;
SELECT prod_name FROM products WHERE NOT vend_id IN('DLL01', 'BRS01') ORDER BY prod_name;

5. 用通配符进行过滤

什么是通配符?

通配符(wildcard):用来匹配值的一部分的特殊字符。

搜索模式(search pattern): 由字面值、通配符或者两组构成的搜索条件。

如何使用通配符?

通配符搜索只能用于文本字段(串),非文本数据类型字段不能使用符。

怎样使用 LIKE 操作符进行匹配搜索?

  1. 百分号(%)通配符
-- 找出所有以词Fish起头的产品
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'Fish%';

注:区分大小写:根据DBMS 的不同及其配置,搜索可是是区分大小写。如果区分大小写,则‘fish%’与 Fish bean bag toy 就不匹配。

-- 使用两个通配符
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '%bean bag%';
-- 搜索模式‘%bean bag%’表示匹配任何位置上包含文本bean bag的值,不论它之前或之后出现什么字符

--找到以F起头,以y结尾的所有产品
SELECT prod_name FROM products WHERE prod_name LIKE 'F%Y';
-- 可以根据邮箱地址的一部本来查找电子邮箱
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值