第二部分 检索和过滤数据

检索单个列

语法格式:SELECT 列名 FROM 表名;

示例:SELECT prod_name FROM products;

解释:从表products中检索一个名为prod_name的列。

检索多个列

语法格式:SELECT 列名1,列名2 ,列名3 , FROM 表名;

示例:SELECT prod_id, prod_name, prod_price FROM products;

解释:从products表中检索出列名为 prod_id, prod_name, prod_price的信息。

如何检索出不同值的列表呢?

解决办法是使用DISTINCT关键字,使得MySQL只返回不同的值。

LIMIT限制输出结果

示例1:SELECT prod_name FROM products LIMIT 5;

解释:使用SELECT语句检索单个列,LIMIT 5约束MySQL返回不多于5行。

示例2:SELECT prod_name FROM products LIMIT 5, 5;

解释:返回从第5行开始之后的5行表信息,第一个数为开始位置,第二个数为要检索的行数。

ORDER BY排序结果(ASC—升序,DESC—降序)

示例:SELECT prod_name FROM products ORDER BY prod_name DESC;

解释:对检索出的prod_name列以字母顺序降序排序数据。

示例:SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;

解释:检索三列prod_id, prod_price, prod_name 信息,并按prod_price, prod_name两列对结果进行排序,即首先按价格,然后再按名称排序。

举例说明:在products表中找出最贵物品的值

SQL语句:SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;

注意:LIMIT语句必须跟在ORDER BY子句之后,不可弄反

WHERE过滤信息(''='' ''<='' ''>='' ''<>'' 'BETWEEN ... AND...')

示例1:列出价格不等于10美元的所有产品

SQL语句:SELECT prod_name, prod_price FROM products WHERE prod_price <> 10;

示例2:返回没有价格的所有产品,空prod_price字段,并不等于价格为0

SQL语句:SELECT prod_name FROM products WHERE prod_price IS NULL;

示例3:列出价格为10美元以上且由1002或1003制造的所有产品

SQL语句:SELECT prod_name, prod_price FROM products WHERE (vend_id = 1002 OR vend_id = 1003)AND prod_price >= 10;

示例4:检索供应商1002和1003制造的所有产品

SQL语句:SELECT prod_name, prod_price FROM products WHERE vend_id IN (1002,1003) ORDER BY prod_name;

SQL语句:SELECT prod_name, prod_price FROM products WHERE vend_id =1002 OR vend_id =103 ORDER BY prod_name;

备注:IN操作符完成与OR相同的功能。

  • 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观;
  • 在使用IN时,计算的次序更容易管理;
  • IN操作符一般比OR操作符清单执行更快;
  • IN的最大优点是可以包含其它SELECT语句,使得能够更动态地建立WHERE子句;

用通配符进行过滤

(1) 百分号(%)通配符,区分大小写

解释:%表示任何字符出现任意次数。

示例1:找出所有以茨jet起头的产品

SQL语句:SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'jet%';

示例2:匹配任何包含文本anvil的值,而不论它之前或之后出现什么字符

SQL语句:SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '%anvil%';

示例3:找出以s起头以e结尾的所有产品

SQL语句:SELECT prod_name FROM products WHERE prod_name LIKE 's%e';

注意:

  • 尾空格可能会干扰通配符匹配。比如'%anvil '
  • 虽然%通配符可以匹配任何东西,但NULL无法匹配

(2) 下划线(_)通配符

解释:下划线只匹配单个字符而不是多个字符。

示例:输出prod_name中以ton anvil结尾产品,且首部只有一个字符,比如‘2 ton anvil’

SQL语句:SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '_ ton anvil';

用正则表达式进行搜索

正则表达式是用来匹配文本的特殊串,即字符集合。前面所讲的比较和通配符寻找数据可以解决简单的问题,但随着过滤条件的复杂性的增加,WHERE子句本身的复杂性也必然增加,此时,使用正则表达式解决复杂的过滤条件更加有效。

(1) 基本字符匹配:REGEXP

示例1:检索列prod_name包含文本1000的所有行,比如”JetPack 1000“

SQL语句:SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;

示例2:检索列prod_name包含文本000的所有行,比如”JetPack 1000“和”JetPack 2000“

SQL语句:SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;

这里使用了正则表达式.000。”.“是正则表达式语言中一个特殊的字符,它表示匹配任意一个字符。

注意:在SQL语句中LIKE匹配和正则表达式匹配恨形似,但其实它们之间有很大的区别。LIKE匹配整个列,如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回,除非使用通配符。而REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。那么,REGEXP能不能用来匹配整个列值(从而起与LIKE相同的作用)?答案是肯定的,使用^和$定位符即可。通俗讲,LIKE匹配整个串,而REGEXP匹配子串。利用定位符,通过^开始的每个表达式,用$结束每个表达式,可以使得REGEXP的作用与LIKE一样。另外一点就是,通配符%区分大小写,而正则表达式不区分大小写,如果要区分大小写,可使用BINARY关键字,比如WHERE prod_name REGEXP BINARY ‘JetPack .000'。

(2) 进行OR匹配:使用字符'|'搜索两个串之一

示例:输出产品名称为1000或者2000或者3000的产品

SQL语句:SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000|3000' ORDER BY prod_name;

(3) 匹配特定字符:使用[特定字符]完成

示例:[123]匹配1或2或3,比如1 ton anvil或者2 ton anvil或者3 ton anvil,[^123]匹配1或2或3之外的任何东西

SQL语句:SELECT prod_name FROM products WHERE prod_name REGEXP '[123]' ORDER BY prod_name;

(4) 匹配范围:使用集合定义要匹配的一个或多个字符

示例:匹配数字0到9

SQL语句:SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] ton' ORDER BY prod_name;

(5) 匹配特殊字符:\\

示例:找出包含'.'字符的值

SQL语句:SELECT prod_name FROM products WHERE prod_name REGEXP '\\.' ORDER BY prod_name;

(6) 匹配字符类

 

 (7) 匹配多个实例

比如“sticks?”匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现)

示例:匹配连在一起的4位数字,比如1000或者2000,{4}要求它前面的字符(任意数字)出现4次

SQL语句:SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}' ORDER BY prod_name;

 (8) 匹配特定位置的字符

示例:找出一个数(包括以小数点开始的数)开始的所有产品

SQL语句:SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\\.]' ORDER BY prod_name;

猜你喜欢

转载自www.cnblogs.com/wzw0625/p/12604303.html