查询执行路径中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎
SELECT语句的执行流程:
FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause --> ORDER BY --> SELECT --> LIMIT
单表查询:
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[MAX_STATEMENT_TIME = N]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr ...]
[FROM table_references
[PARTITION partition_list]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[FOR UPDATE | LOCK IN SHARE MODE]]
select DISTINCT Host,User from user;
DISTINCT:数据去重
SQL_CACHE:显示指定存储查询结果于缓存之中
SQL_NO_CACHE:显示查询结果不予缓存
query_cache_type的值为'ON'时,查询缓存功能打开;
SELECT的结果符合缓存条件及会缓存。否则,不予缓存
如果显示指定SQL_NO_CACHE,不予缓存
query_cache_type的值为'DEMAND'时,查询缓存功能按需进行;
显示指定SQL_CACHE的SELECT语句才会缓存;其他均不予缓存
缓存命中次数查看:
SHOW GLOBAL STATUS LIKE 'Qcache%';
Qcache_hits命中次数
查询总数:
SHOW GLOBAL STATUS LIKE 'Com_se%';
Com_select查询总数
字段别名显示:
col1 AS alias1,col2 AS alias2, ...
WHERE子句:指明过滤条件以实现"选择"的功能
过滤条件:布尔型表达式
算数操作符:+ - * / %
比较操作符:= != <> <=> > >= < <=
BETWEEN min_num AND max_num
IN(element1, element2, ...)
IS NULL
IN NOT NULL
LIKE:
%:任意长度的任意字符;
_:任意单个字符;
RLIKE或REGEXP:匹配字符串可用正则表达式书写模式
逻辑操作符:
NOT
AND
OR
XOR
GROUP:根据指定的条件把查询结果进行"分组"以用于做"聚合"运算;
avg() max() min() count() sum()
SELECT avg(rank),sex FROM base_member_info GROUP BY sex;
HAVING:对分组聚合运算后的结果指定过滤条件
SELECT avg(rank) as fansik,sex FROM base_member_info GROUP BY sex HAVING fansik > 60;
ORDER BY:根据指定的字段对查询的结果进行排序
升序:ASC
降序:DESC
SELECT avg(rank) as fansik,sex FROM base_member_info GROUP BY sex HAVING fansik > 60 ORDER BY fansik DESC;
LIMIT [[offset,]row_count]:offset为偏移量,如果只有一个值,那默认表示行数
SELECT weixin_nickname,rank,sex FROM base_member_info ORDER BY rank DESC LIMIT 180,20;
对查询结果中的数据请求施加"锁":
读锁(共享锁):LOCK IN SHARE MODE
写锁(独占锁、排它锁):FOR UPDATE
多表查询:
交叉连接:笛卡尔乘积:
表1有8行数据,表2有8行数据
select * from 表1,表2;
结果会有64行数据,这就是笛卡尔乘积
内连接:
等值连接:让表之间的字段以"等值"建立连接关系
select 表1.name,表2.name from 表1,表2 where 表1.id=表2.id
不等值连接
自然连接
自连接
外连接:
左外连接:
FROM 表1 LEFT JOIN 表2 on 表1.col=表2.col
右外连接
FROM 表1 RIGHT JOIN 表2 on 表1.col=表2.col
子查询:在查询语句嵌套这查询语句(MySQL对于子查询的优化比较查,建议尽量少的使用)
基于某语句的查询结果再次进行查询
用在WHERE子句中的子查询
(1)用于比较表达式中的子查询;子查询仅能返回单个值
SELECT rank,sex FROM base_member_info WHERE rank < (SELECT avg(rank) FROM base_member_info);
(2)用于IN中的子查询:子查询应该单键(一个字段)查询并返回一个或多个值
SELECT nickname,rank,sex FROM base_member_info WHERE rank IN (SELECT rank FROM base_member);
(3)用于EXISTS
用于FROM子句中的子查询
使用格式:SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause;
联合查询:UNION(使用EXPLAIN会看到有三个查询语句)
SELECT Name,Age FROM students UNION SELECT Name,Age FROM teacher