MySQL表查询:SELECT、WHERE、BETWEEN、LIKE、IS NULL、IN/AND/OR、DISTINCT、ORDER BY、DESC、LIMIT、NOT、完全限定查询
原创
©著作权归作者所有:来自51CTO博客作者董哥的黑板报的原创作品,请联系作者获取转载授权,否则将追究法律责任
SELECT select_list FROM table_list # 选择的表和列
WHERE row_constraint # 行必须满足的条件
GROUP BY grouping_columns # 结果如何分组
ORDER BY sorting_columns # 结果如何排序
HAVING <EXPRESSION> [{<OPERATOR> <EXPRESSION>}] # 分组必须满足的条件
LIMIT [<OFFSET>,] <ROW COUNT> # 限制结果里的行数
- GROUP BY grouping_columns:告诉MySQL如何显示查询出来的数据,并按照指定的字段分组
- ORDER BY sorting_columns:将查询出来的结果按照后面的字段进行排序。默认为升序,可以进行的排序有:升序(ASC),降序(DESC)
- LIMIT [<OFFSET>,] <ROW COUNT>:告诉MySQL每次限时查询出来的数据条数
CREATE TABLE fruits(
f_id CHAR(10) NOT NULL,
s_id INT NOT NULL,
f_name CHAR(255) NOT NULL,
f_price DECIMAL(8,2) NULL,
PRIMARRY KEY(f_id)
);
一、SELECT
查询所有字段
SELECT f_id,s_id,f_name,f_price FROM fruits;
查询指定字段
SELECT f_id, s_id FROM fruits;
二、WHERE条件查询
- 根据WHERE子句中指定的搜索条件来对结果进行过滤。
演示案例
四、BETWEEN AND查询
演示案例
五、LIKE字符匹配查询
- 匹配:LIKE '***'
- 不匹配:NOT LIKE '***'
- %通配符:代表任意长度的字符串。
- _通配符:一次只能代表一个字符。
- 从技术上说,like是谓词而不是操作符。
- 如果MySQL的配置方式区分大小写,那么匹配就需要严格根据大小写。
- 尾空格可能会干扰通配符匹配。例如,在保存“apple ”时在尾部多个一个空格,那么like '%apple'将不会匹配到。为了解决这个错误,可以在搜索模式最后附加一个“%”,更好的办法是使用函数去掉首尾空格。
- 注意NULL:通配符不可以匹配NULL。
- 有的字符串中文占两个字符,所以查询时一个中文需要两个_。
- 相对于正则表达式regexp的缺点:like省略通配符时查询失效,此时regexp不会(见正则表达式文章的演示案例:
演示案例
- 查询“e”前面有三个字符,“e”后面有两个字符的行
六、查询空值:IS NULL
- 查询NULL值:IS NULL。
- 查询非NULL值:IS NOT NULL。
- MYSQL对NULL有特殊的处理,这两个特殊语法可以用来判断NULL字段。更多说明可以参阅
- 注意事项:"IS NULL"与"= NULL"是不同的(前者是空的,后者是字段的值等于字符串"NULL")。
演示案例
演示案例
SELECT suffix FROM member;
SELECT suffix FROM member WHERE suffix IS NOT NULL;
SELECT suffix FROM member WHERE suffix <> NULL;
七、IN操作符查询
- 在范围内:IN()。
- 不在范围内:NOT IN()。
- IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。
- IN操作符有时可以完成与OR相同的功能(见下面的演示案例)。
- 使用IN操作符的优点:
- 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
- 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
- IN操作符一般比OR操作符清单执行很快。
- IN操作符最大优点是可以包含其他select语句,使得能够更动态地建立where子句(在后面的文章会有展示)。
演示案例
- 查询名字为“apple”和“orange”的列,然后进行排序:
八、AND多条件查询
- AND可以用在多个表达式之间,所有条件都满足才返回结果。并且and可以多次使用。
- 如果与OR操作符进行使用,AND操作符的优先级高于OR操作符,因为为了防止查询的二义性,最好使用圆括号(OR操作符中有演示案例)。
select f_id,f_name from fruits where s_id='101' and f_price>=5;
select f_id,f_name from fruits where s_id='101' and f_price>=5 and f_name='apple';
九、OR多条件查询
- 与and的使用原理相同。但是多个条件中,只要满足其中一个条件就可以返回结果。
- 如果与or操作符进行使用,and操作符的优先级高于or操作符,因为为了防止查询的二义性,最好使用圆括号(见下面的演示案例)。
- or可以完成与in一样的功能(见上面in操作符的演示案例)。
优先级演示案例
- 下面的语句原本想要查询f_price的价格>=10的水果,但是由于and操作符的优先级高于or操作符,因此先执行“f_id=103 and f_price >=10”再去执行“f_id=101”,所以产生了如下的结果:
- 根据上面的错误,我们可以加上圆括号来明确要查询的操作(圆括号的优先级高于一切运算符):
十、DISTINCT查询结果不重复
- 查询出来的结果,如果有重复的只显示一条。
- 注意事项:
- DISTINCT必须放在列名前面。
- DISTINCT应用于所有的列,但不仅是其后面的列。
- 另外,如果查询多个列,如果两个或多个列之间的值不同,那么所有的列都会被显示出来(见下面的演示案例)。
- DISTINCT也可以用于多列。
- 例如,下面表示[col1,col2,col3]这三列加在一起不重复。
SELECT DISTINCT col1, col2, col3 FROM table_name;
演示案例
- 下面的查询,s_id和f_name的列都是相同的 ,因此都只显示一行:
- 下面的查询虽然s_id和f_name的值都是相同的,但是f_price不同,因此所有的结果都被显示出来了:
十一、ORDER BY排序查询结果
- 如果要对查询的结果进行排序,则可以使用“ORDER BY”关键字。
- 注意事项:
- order by默认为升序排序。
- order by既可以根据单个列进行排序,也可以根据多个列进行排序(见下面的演示案例)。
- 多列排列时,先对前面的列进行排序;前面的列排序完之后,再对后面的列进行排序。
- 如果字段有NULL,则NULL排在最前面。
演示案例
- 下面根据f_name和f_price进行排序:先对f_name进行排序,之后对f_price列排序时参照f_name进行排序。例如有2行apple,那么f_price则根据apple这两行进行排序,5.2比6.2大,则5.2在6.2之前;同理,banana也是如此。
十一、DESC、ASC指定排序顺序
- asc:将排序结果进行升序排序(默认使用的)。
- desc:将排序结果进行降序排序。
- 结果的排序通常配合“ORDER BY”使用。
演示案例
- 下面的演示结果默认为升序排序,但是使用使用“DESC”之后,可以进行降序排序:
- 对多列进行不同的排序,根据f_name进行降序排序,然后根据f_price进行升序排序:
十二、LIMIT限制查询行数
格式①
格式②
- 位置偏移量:代表从第几行开始查询,省略时从第一条开始。
- 第一条记录的偏移量为0...以此类推。
- 行数:代表查询结果显示多少行。
演示案例
- 例如下面配合“order by”和“desc”使用来查询最贵的水果中的一个:
十三、NOT操作符
- NOT操作符有且只有一个功能,就是否定之后所跟的任何条件。
- NOT可以与in、between ... and、like、exists、is null配合使用(其中部分在上面已经演示案例)。
十四、使用完全限定查询
- 上面的查询,需要先选择一个数据库,然后对数据库中的表进行查询。如果我们为选择一个数据库,那么可以使用“完全限定”来查询指定的内容。
- 完全限定可以用在表前,也可以用在字段前。
演示案例
- 如果此时我们没有用use选择任何数据库,那么查询是失败的: