SQL-SELECT-检索数据(一)

来源:互联网 发布:金门炮战知乎 编辑:程序博客网 时间:2024/05/17 03:27

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相同的功能,但推荐使用INSELECT 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 0
原创粉丝点击