MySQL学习笔记(二)
在MySQL学习笔记(二)中讲了MySQL的基础知识,现在说说MySQL的核心的部分,查询:SELECT语句。
1. 查询所有字段: SELECT * FROM <表名>;
2. 查询指定字段: SELECT <line1,line2,...> FROM <表名>;
3. 指定记录查询: SELECT <line1,line2,...> FROM <表名> WHERE <查询条件>;
WHERE条件判断符有以下这些:
=,<>、!=,<,<=,>,=>,BETWEEN
4. 带IN关键词的查询,就是在查询条件中使用IN关键词。
例如:SELECT line1,line2 FROM tab1 WHERE line1 IN(100,200);
当然,也可以在IN前面加上NOT进行相反的条件查询。
5. 带BETWEEN AND的范围查询,就是在查询条件中使用BETWEEN AND关键词。
例如:SELECT line1,line2 FROM tab1 WHERE line1 BETWEEN 100 AND 200;
相似的,也可以在BETWEEN前面加上NOT进行相反的条件查询。
6. 带LIKE的字符匹配查询:(1)匹配任意长度的字符使用‘%’,当然也包括零字符。
例如,需要查找在tab1中所有以‘a’开头的line1,SQL语句如下:
SELECT line1 FROM tab1 WHERE line1 LIKE ‘a%’;
需要查找在tab1中所有包含‘b’的line1记录,SQL语句如下:
SELECT line1 FROM tab1 WHERE line1 LIKE ‘%b%’;
(2)匹配一个长度的任意字符,使用下划线‘_’,例如:
SELECT line1 FROM tab1 WHERE line1 LIKE ‘_c%’;
7. 空值查询(IS NULL 或者 IS NOT NULL):SELECT line1 FROM tab1 WHERE line1 IS NULL;
8. 多条件查询。
(1)AND关键词:SELECT <line1,line2,...> FROM <表名> WHERE <查询条件1> AND <查询条件2> [AND ...];
(2)OR关键词:SELECT <line1,line2,...> FROM <表名> WHERE <查询条件1> OR <查询条件2> [AND ...];
这两个关键词是可以一起使用的,但是AND的优先级要比OR高,使用时要确保逻辑正确。
9. 去重条件查询:SELECT DISTINCT <字段名> FROM <表名>;
10. 对查询结果排序:使用ORDER BY子句。例如:
(1)对line1进行排序:SELECT line1 FROM tab1 ORDER BY line1;
(2)先按line1排序,再按line2排序:SELECT * FROM tab1 ORDER BY line1,line2;
另外,也可以指定排序,如ASC(升序,默认排序方式),(DESC)降序。
例如需对line1降序,对line2升序:SELECT * FROM tab1 ORDER BY line1 DESC, line2;
11. 分组查询。使用GROUP BY关键词,语法为:[GROUP BY 字段] [HAVING <条件表达式>]
(1) 与集合函数一起使用时,如MAX( )、MIN( )、COUNT( )、SUM( )、AVG( )等。可以加上AS关键词,给这些集合函数取一个别名,如MAX(line1) AS max。
例如以line1分组并统计分组中的数量:SELECT line1,COUNT(*) AS Total FROM tab1 GROUP BY line1;
如果需要详细的显示出分组中的各字段的名字,可以使用GROUP_CONCAT()关键词。
使用如:SELECT line1,GROUP_CONCAT(line2),COUNT(*) AS Total FROM tab1 GROUP BY line1;
当然也可以使用多个字段分组,形如GROUP BY line1,line2;
(2)使用HAVING关键词过滤分组。
例如:SELECT line1,COUNT(*) AS Total FROM tab1 GROUP BY line1 HAVING COUNT(line1)>100;
(3)使用WITH ROLLUP统计数量,它会在分组的最后一列加一条统计上面记录总和的记录。
例如:SELECT line1,COUNT(*) AS Total FROM tab1 GROUP BY line1 WITH ROLLUP;
(4)使用LIMIT限制查询结果,语法:LIMIT [位置偏移量, ] <行数>;
例如,返回前3条记录:SELECT * FROM tab1 LIMIT 3;
从第5条记录起,返回接下来的2条记录: SELECT * FROM tab1 LIMIT 4,2;
12. 子查询。子查询是指一个查询语句中嵌套在另一个查询语句内部的查询。在SELECT语句中,先查询子句的结果,将其作为外层的查询的过滤条件。常用的操作符有ANY(SOME)、ALL、IN、EXISTS。当然,子查询中可以添加到SELECT、UPDATE、DELETE语句中。
(1)带ANY、SOME关键词(即满足其中任一条件)的子查询:
SELECT line1 FROM tab1 WHERE line1 > ANY(SELECT line2 FROM tab2);
(2)带ALL关键词(满足内层的所有条件)的子查询:
SELECT line1 FROM tab1 WHERE line1 > ALL(SELECT line2 FROM tab2);
(3)带(NOT) EXISTS关键字(系统对子查询进行运算以判断是否返回行,EXISTS是一个布尔型值,如果为false则不再对外层语句进行查询)的子查询。
例如:SELECT * FROM tab1 WHERE EXISTS (SELECT lin1 FROM tab2 WHERE lin1>10);
(4)带(NOT)IN关键词的子查询:
SELECT line1 FROM tab1 WHERE line2 IN (SELECT lin1 FROM tab2 WHERE lin2> 10);
(5)使用比较运算符的子查询:
SELECT line1 FROM tab1 WHERE line1=(SELECT lin1 FROM tab2 WHERE lin2= 'one');
13. UNION合并查询的结果。合并的前提是这些表的列数与数据类型必须相同,其返回的行都是唯一不重复的。当使用UNION ALL时,允许有重复的结果,其查询效率相对较高。
语法: SELECT line1,... FROM tab1 UNION [ALL] SELECT line1,... FROM tab1;
14. 使用正则表达式查询。MySQL中使用REGEXP关键词指定字符的匹配模式。关于正则表达式,请看另一篇博文《正则表达式的使用》,这里只举几个例子说明:
(1)查询特定字符(这里以‘s’为例)开头的记录:
SELECT * FROM tab1 WHERE line1 REGEXP '^s';
(2)查询指定字符之外(这里以查询‘a-o’之外的字符为例)的字符:
SELECT * FROM tab1 WHERE line1 REGEXP '[^a-o]';