条件查询(WHERE条件过滤是对所有记录过滤)
SELECT 字段1, ... FROM 数据表名 WHERE 条件
子查询
SELECT 字段1, ... FROM 数据表名 WHERE id IN (SELECT 字段2, ... FROM 数据表名 WHERE 条件)
排序
SELECT 字段1, ... FROM 数据表名 ORDER BY id DESC
模糊查询
SELECT 字段1, ... FROM 数据表名 WHERE name like '_轩%'
去重
SELECT DISTINCT 字段1, ... FROM 数据表名 ORDER BY id DESC
分组+函数+分组结果过滤(HAVING过滤是对分组结果过滤,WHERE优先级高于HAVING)
函数:SUM,AVG,COUNT等
SELECT 字段1, COUNT(字段2) as count FROM 数据表名 GROUP BY 字段1 HAVING count>1;
字段1 count
男 10
女 11
连表查询&笛卡尔积
参考1
参考2
ON:连表条件,满足条件的加入最终结果集
驱动表:第一个需要查询的表,执行查询的策略与普通表查询一致
被驱动表:驱动表结果集中的每一条记录分别到被驱动表中找匹配项
- 内连接:`SELECT a.field1, b.field1 FROM a INNER JOIN b ON a.id=b.a_id,a为驱动表,b为被驱动表,将所有满足ON条件的记录插入最终结果集
- 左连接:
SELECT a.field1, b.field1 FROM a LEFT JOIN b ON a.id=b.a_id
,a为驱动表,b为被驱动表,驱动表没有在被驱动表中找到满足ON条件的记录则创建一条被驱动表字段为空的记录 - 右连接:
SELECT a.field1, b.field1 FROM a RIGHT JOIN b ON a.id=b.a_id
,a为被驱动表,b为驱动表,驱动表没有在被驱动表中找到满足ON条件的记录则创建一条被驱动表字段为空的记录
id a1 id b1 a_id
1 ! 1 # 1
2 @
SELECT a.id as a_id,a.a1 as a1,b.b1 as b1 FROM a LEFT JOIN b ON a.id=b.a_id
a_id a1 b1
1 ! # // 驱动表a第一条记录在被驱动表b中找到了1条满足ON条件的记录,并且将这条记录插入到最终结果集
2 @ NULL // 驱动表a第二条记录在被驱动表b中找到了0条满足ON条件的记录,并且将这条记录插入到最终结果集,并且以NULL的形式将被驱动表数据补全
3表联查
参考
可以理解为多个步骤