1.数据查询
基本语法select 字段列表/* from 表名 [where 条件];
完整语法select [select 选项] 字段列表 [字段别名] / * from 数据源 [where 条件子句][group by 子句] [having 子句] [order by 子句] [limit 子句];
--1.select选项 :select 对产出来的结果的处理方式
all(默认),保留所有的结果 select * from 表名 === select all * from 表名
destinct,去重 查出来的结果,将重复给去除(只发生在所有字段都相同的情况下)
2.字段别名 :当数据进行查询时,有时候名字并不一定满足需求(多表查询是,会有同名字段),需要对字段名进行重命名 :既别名
--1.as :字段名 as 别名
--2.字段名 别名
3.数据源
数据源即为 数据来源,关系行数据库的来源都是数据表:本质上只要保证数据类似二维表,都可以作为数据源
数据源 分为多种,既单表数据源、多表数据源、查询语句
--1.单表数据源:select * from 表名
--2.多表数据源:select * from 表名1,表名2,表名3...........;
select * from 表1,表2;
从一张表中 取出一条记录,去另外一张表中匹配所有记录,且全部保留:(记录数和字段数),将这种结果 称之为笛卡尔集 既一种交叉连接
笛卡尔集一般并没有什么卵用,耗费相当多资源 ,需要尽量避免出现笛卡尔集
--3.子查询 数据的来源是一条查询语句(查询语句的结果是一张二维表)
select * from (select 语句) as 表名 ; 相当于将括号内select 语句 的查询结果起一个别名(as 表名)
4.where 子句
where 子句用来判断数据,筛选数据
where 子句返回结果 0或者1 false or true
基本运算符:> ,< ,>= 等等
逻辑运算符:&&(and),|| (or) ,! (not)
模糊查询 :like , %表示任意多个字符 ,_表示一个任意字符
select * from students where name like '黄%' (表示查询姓黄的学生)
select * from students where name like '黄_' (查询姓黄并且名字是一个字的学生)
select * from students where name like “黄%” or name like "%静" (查询姓黄或叫静的学生)
范围查询:between .......and..........(在...区间)(当存在多个and 时 ,将优先匹配between and),in/not in
where 是唯一一个直接从磁盘获取数据的时候就开始判断的条件,从磁盘取出一条记录,则开始进行where 判断,判断结果成立则加载进内存,如果不成立则放弃(从源头保证尽可能避免的无效数据占用内存);而其他的判断,都是后期对内存进行的判断
--1.集合 in( )
--2.between A and B (在 A 到 B 之间)
其中 between 本身是闭区间 且 左边的值必须小于右边的值
5.Group by 子句 (根据某个字段进行分组,相同的放一组,不同的放不同的组)
Group by 只会将同类型数据进行分组,且只展示该组第一个数据
在新MySQL 中 group by 字段 必须被 select 约束
按照字段分组,表示此字段相同的数据会被放在一个组中
分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中
可以对分组后的数据进行统计,做聚合运算
--1.基础语法
select 列1,列2,聚合.......from 表名 group by 列1,列2,列3.。。
--2.having 对分组的结果进行筛选
where 和 having 的区别
where 对 from 后面指定的表进行筛选 ,属于筛选原始数据
having 对group by 的结果进行筛选
--3.分组的意义是为了统计数据(按照分组字段 进行数据统计)
SQL 提供了一系列的统计函数:
count () :统计分组后的记录数
里面可以使用两种参数: * 代表统计记录,字段名代表统计对应的字段 (null 不进行统计)
max():统计最大值
min ():最小值
avg():平均值
sum():和
--4.分组的排序
group by 字段 [asc/desc] 分组 会自动排序,根据分组字段, 默认升序asc ,需要降序desc需要声明出
对分组排序的结果 合并之后的整体结果进行排序 而不是对于分组内部的数据进行排序
--5. 多字段分组 ,先班级,后男女
查询每个班级 对应性别下有多少人 先按照班级排序 后按照性别排序
select class_id,male,count(*) from my_stu group by class_id,male;
--6.group_concat() 函数
可以对分组的结果中某个字段进行 字符串链接(保留该组所有的某个字段)
--7.回溯统计 with rollup
任何一个分组后 都会有一个小组 , 最后都需要向上级分组进行一次汇报统计:(根据当前分组的字段)
这就是回溯统计:回溯统计时,会将分组字段至空
单字段分组 回溯统计
既 查询每一个班级,然后按照班级排序 完成后进行一次回溯
多字段分组 回溯统计
既 先按照班级分组 班级又按照性别分组 ------->既性别会按照班级统计一次( x3 ),而班级会单独统计一次,
既:第一层分组 会有一次回溯 ,第二次分组 需要考虑 上一层分组的组数 。。。。。。。。。。直到最后一层分组
6.order by 子句
order by 排序 ,根据某个字段进行升序或者降序排序,依赖校对集(大小写等)
基本语法:
order by 字段1 [asc/desc],字段2[asc/desc].............. 其中 asc 是升序(默认操作) desc是降序
多字段排序 :先根据某个字段进行排序,然后在排序好的内部,再按照某个数据再进行一次排序
7.limit子句
是一种限制结果的子句:可以用来限制数量 多用于分页
way1:只用来限制数据量 limit 数据量
way2:限制起始位置 & 限制长度 多用于分页 既从指定的位置开始 向后找多少条数据
两个参数分别对应偏移量和长度