SQL查询数据
完整语法
Select [select选项] 字段列表[字段别名]/* from 数据源 [where条件子句] [group by子句] [having子句] [order by子句] [limit 子句];
Select选项
*、All: 保留所有的结果/Distinct: 去重。
字段别名
多表查询的时候, 会有同名字段。需要对字段名进行重命名。
数据源
数据源: 数据的来源, 关系型数据库的来源都是数据表。数据源分为多种: 单表数据源, 多表数据源, 查询语句(子查询)
单表数据源: select * from 表名;
多表数据源: select* from 表名1,表名2...;
子查询: 数据的来源是一条查询语句(查询语句的结果是二维表) 格式:Select * from (select 语句) as 表名;
Where子句
Where子句: 用来判断数据,筛选数据。返回结果: 0或者1, 0代表false,1代表true.
判断条件:
比较运算符: >, <, >=, <= ,!= ,<>, =, like, between and, in/not in
逻辑运算符: &&(and), ||(or), !(not)
Where原理: where是唯一一个直接从磁盘获取数据的时候就开始判断的条件: 从磁盘取出一条记录, 开始进行where判断: 判断的结果如果成立保存到内存;如果失败直接放弃.
Group by子句
Group by:分组是为了统计数据(按组统计: 按分组字段进行数据统计)
SQL提供了一系列统计函数
Count(): 统计分组后的记录数:,每一组有多少记录。可以使用两种参数: [*] 代表统计记录、[字段名]代表统计对应的字段(NULL不统计)
Max(): 统计每组中最大的值、Min(): 统计最小值、Avg(): 统计平均值、Sum(): 统计和
注意:
- 分组会自动排序: 根据分组字段:默认升序
- 多字段分组: 先根据一个字段进行分组,然后对分组后的结果再次按照其他字段进行分组
- group_concat(字段): 可以对分组的结果中的某个字段进行字符串连接(保留该组所有的某个字段): ;
- with rollup(回溯统计): 任何一个分组后都会有一个小组, 最后都需要向上级分组进行汇报统计: 根据当前分组的字段. 这就是回溯统计: 回溯统计的时候会将分组字段置空.
Having子句
Having子句: 与where子句一样: 进行条件判断的。Where是针对磁盘数据进行判断: 进入到内存之后,会进行分组操作: 分组结果就需要having来处理.
Having能做where能做的几乎所有事情, 但是where却不能做having能做的很多事情.
- 分组统计的结果或者说统计函数都只有having能够使用.
- Having能够使用字段别名: where不能: where是从磁盘取数据,而名字只可能是字段名: 别名是在字段进入到内存后才会产生.
Order by子句
Order by: 排序, 根据某个字段进行升序或者降序排序, 依赖校对集.
排序可以进行多字段排序: 先根据某个字段进行排序, 然后排序好的内部,再按照某个数据进行再次排序:
Limit子句
Limit子句是一种限制结果的语句: 限制数量.
Limit有两种使用方式:
方案1: 只用来限制长度(数据量): limit 数据量;
方案2: 限制起始位置,限制数量: limit 起始位置,长度;(记录数从0开始)
Limit方案2主要用来实现数据的分页: 为用户节省时间,提交服务器的响应效率, 减少资源的浪费.
对于用户来讲: 可以点击的分页按钮: 1,2,3,4
对于服务器来讲: 根据用户选择的页码来获取不同的数据: limit offset,length;
Length: 每页显示的数据量: 基本不变
Offset: offset = (页码 - 1) * 每页显示量