SQL语句,一步一步。 2022-07-11 学习 暂无评论 ## 分组查询 group by >把多条数据进行分组输出,一般用`group by`,可以根据一个字段分组也可以根据多个分组,如果是多个字段分组,多个字段一样才算一组,任何一个字段不一样都不算一组,有点像主键🔑,举个例子🌰 ```sql select id,count(*) from table1 group by id; ``` ```sql select id,date,count(*) from table1 group by id,date; ``` > 根据id分组,获取这个id的个数,要注意的是`count(*)`必须是单行表达式,如果要在这个分组后的结果集中筛选可以在`group by` 后面加上`having 条件` ```sql select id,count(*) from table1 group by id having count(*)>10; ``` >❗切记哈❗,`where`条件是对表中的原始数据进行筛选,(或者说是对行数据进行筛选)分组后的结果集是不存在的新表,对这个新的结果集筛选要用`having` ## 连接查询 > 连接查询又称多表查询,有很多钟方式 > > ```sql > select 字段 > from 表一 > join 表二 //内外链接的区别在这 > on 连接的条件 > where 筛选条件 > group by 分组 > having 分组筛选 > order by 排序 > ``` - 内连接 `inner join` inner可以省略 内连接可以理解成,通过某个条件连接两个表(外键)这是99语法,其实就是92语法中,where条件,但是92语法可读性较差 - 外连接 - 左连:`left` - 右连接:`right` 外连接中要区分主从表,查询结果中包含了**主表的所有记录**,如果`on`后面的条件成立,则显示从表内容,如果不存在则显示`NULL`,**外连接可以理解成从表是主表的某种条件**,要需要查询哪个表,哪个就是主表。 左连接的左边是主表, 右连接的右边是主表, 某种意义上左右连接是一样的。 - 全连接:`full` (没听明白啥意思,反正用的少) - 交叉连接: `cross` 交叉连接就是两个表互乘,表a为1,2,3表b为4,5,6,用cross就是14,15,16。24,25,26。34,35,36,行数就是表一*表二 ## 子查询:star2: > 出现在其他语句内部的select就叫子查询,有点像套娃,可以出现在 select,from,where,having这个关键字的后面。 | 类别 | 特点 | 运算符 | Tips | | ---------- | -------- | :----------------------------: | :------------------------------------------------------: | | 标量子查询 | 一行一列 | 关系运算符 < > <= | 可以理解成是个变量,某个人具体的年龄,姓名等 | | 列子查询 | 一列多行 | **in**/**not in**/any/some/all | 结果集是列表,也可以用于函数,max,min等等 | | 行子查询 | 一行多列 | 没学明白 :sweat: | 多个条件,反正用的少 | | 表子查询 | 多行多列 | | 生成一个新的表,所以必须要有别名,根据别名在进行筛选操作 | >select 仅仅支持**标量** > >from支持**表** > > where或having **标量:star:** **列:star:** **行** ## 分页查询 > 网页中很常见的需求,ef框架做分页很简单,用Linq就行了。 > > ```sql > select 列表 from 表名 【一系列条件 where, group by】 limit offset,size; > select 列表 from 表名 【一系列条件 where, group by】 limit (page-1)*size,size; > ``` > > offset:起始的索引,从0开始的,如果是0可以省略 > > size:需要显示的个数,不是结束索引。 ## 联合查询 union > 大致意思是,多个表格合并成一个表格 需要列名的个数是一样的,他是按照查询字段的顺序直接连上去的,虽然不会报错,但是不合适。**会自动去重**,如果不去重可以使用`union all` 标签:mysql, sql