本篇是系列性,由浅入深,主要是为了本人日后回看时再学习,如果道友对Mysql也是零基础的话,强烈建议从头开始看
SELECT:
Query Cache
查询执行路径中的组件:查询缓存,解析器,预处理器,优化器,
SELECT语句的执行流程:
FROM Clause --> WHERE clause -->Group BY -->HAVING Clause --> ORDER BY --> SELECT -->LIMIT
单表查询
Syntax:
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[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
[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]]
DISTINCT:数据去重,
SQL_CACHE:显示指定存储查询结果于缓存之中;
SQL_NO_CACHE:显示查询结果不予缓存;
quary_cache_type的值为'ON'时,查询缓存功能打开;
SELECT的结果符合缓存条件即会缓存,否则,不予缓存;
显示指定SQL_NO_CACHE,不予缓存;
quary_cache_type的值为“DEMAND”时,查询缓存功能按需进行;
显示指定SQL_CACHE的SELECT语句才会缓存,其它均不予缓存;
字段显示可以使用别名:
col1 AS alias1,col2 AS alias2, ...
WHERE子句,指明过滤条件以实现“选择”的功能;
过滤条件,布尔型表达式;
算术操作符:+ - * / %
比较操作符:= !=等于<> <=> > >= < <=
BETWEEN min_num AND max_num
IN (element1,element2,...)
IS NULL:
IS NOT NULL
LIKE
% :任意长度的任意字符
_:任意单个字符
RLIKE:
REGEXP:匹配字符串可用正则表达式书写模式;
逻辑操作符:
NOT
AND
OR
XOR:异或
GROUP:根据指定的条件把查询结果进行“分组”以用于“聚合”运算;
avg(),max(),min(),count(),sum()
HAYING:对分组聚合运算后的结果指定过滤条件;
ORDER BY:根据指定的字段对查询结果进行排序
升序:ASC
降序:DESC
LINIT [[offset,]row_count],对查询的结果进行输出行数,数量限制
对查询的结果中的数据请求施加“锁”;
FOR UPDATE:写锁
LOCK IN SHARE MODE:读锁,共享锁
练习:导入hellodb.sql生成数据库
(1)在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄;
(2)以ClassID为分组依据,显示每组的平均年龄;
(3)显示第2题中平均年龄大于30的分组及平均年龄;
(4)显示以L开头的名字的同学的信息;
(5)显示TeacherID非空的同学的相关信息;
(6)以年龄拍寻后,显示年龄最大的前10位同学的信息;
(7)查询年龄大于等于20岁,小于等于25岁的同学的信息,用三种方法;
1) 在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄;
2) 以ClassID为分组依据,显示每组的平均年龄;
3) 显示第2题中平均年龄大于30的分组及平均年龄;
4) 显示以L开头的名字的同学的信息;
5) 显示TeacherID非空的同学的相关信息;
6) 以年龄排序后,显示年龄最大的前10位同学的信息;
7) 查询年龄大于等于20岁,小于等于25岁的同学的信息,用三种方法;
方法一:
方法二:
方法三:
多表查询:
交叉连接,笛卡尔乘积;
内连接:
等值连接:让表之间的字段以“等值”建立连接关系;
不等值连接
自然连接;
自连接;
外连接:
左外连接:
FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
右外连接:
FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col
子查询:在查询语句嵌套着查询语句
基于某语句的查询结果再次进行查询
用在WHERE子句中的子查询:
1) 用于比较表达式中的子查询;子查询仅能返回单个值:
SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM students);
2) 用于IN中的子查询:子查询应该单键查询并返回一个或多个值构成列表;
SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);
3) 用于EXISTS;
用于FROM子句中的子查询:
使用格式:SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause;
联合查询:UNION将两外或多个返回值字段相同的查询的结果合并输出
SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;
练习2:导入hellodb.sql,以下在students表上进行;
1) 以ClassID分组,显示每班的同学的人数;
2) 以Gender分组,显示其年龄之和;
3) 以ClassID分组,显示其平均年龄大于25的班级; 4) 以Gender分组,显示各组中年龄大于25的学员的年龄之和;