检索单个列
语法格式:SELECT 列名 FROM 表名;
示例:从表products中检索一个名为prod_name的列。
SQL语句:SELECT prod_name FROM products;
检索多个列
语法格式:SELECT 列名1,列名2 ,列名3 , FROM 表名;
示例:从products表中检索出列名为 prod_id, prod_name, prod_price的信息。
SQL语句:SELECT prod_id, prod_name, prod_price FROM products;
如何检索出不同值的列表呢?
解决办法是使用DISTINCT关键字,使得MySQL只返回不同的值。
LIMIT限制输出结果
示例1:使用SELECT语句检索单个列,LIMIT 5约束MySQL返回不多于5行。
SQL语句:SELECT prod_name FROM products LIMIT 5;
示例2:返回从第5行开始之后的5行表信息,第一个数为开始位置,第二个数为要检索的行数。
SQL语句:SELECT prod_name FROM products LIMIT 5, 5;
ORDER BY排序结果(ASC—升序,DESC—降序)
示例1:对检索出的prod_name列以字母顺序降序排序数据。
SQL语句:SELECT prod_name FROM products ORDER BY prod_name DESC;
示例2:检索三列prod_id, prod_price, prod_name 信息,并按prod_price, prod_name两列对结果进行排序,即首先按价格,然后再按名称排序。
SQL语句:SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;
示例3:在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 '
(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 '
(7) 匹配多个实例
比如“sticks?”匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现)
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\