mysql-third day

-- SQL 中的内置函数帮助文档的查看
? functions; 查看有哪些类型的函数

ex:
? round;


-- 分组 ,分组的目的就是为了进行聚合统计
-- group by 字段
-- 查询班级学生的性别
select gender from students;

-- 查看有哪几种性别
select distinct gender from students;--distinct 去重

-- 按照性别分组
select gender from students group by gender;

-- 计算每种性别中的人数
select gender, count(*) from students group by gender;

-- group_concat(...)
-- 查询每个性别分组数据中的人的姓名
select gender, name from students group by gender; --错误,显示的结果只是gender分组后对应的姓名中的一个
select gender,group_concat(name) from students group by gender;--group_concat(name)表示将名字连接起来
select gender,group_concat(name) as infos, count(*) from students group by gender;


男 周杰伦
男 彭于晏
男 张学友
...
女 静香
女 周杰

男: 周杰伦, 彭于晏, 张学友
女: 静香, 周杰


-- 查询同种性别中的姓名和身高
-- 计算男性的人数
select count(*) from students where gender = 1;
-- 通过分组来实现
select gender, count(*) from students group by gender;

+--------+----------+
| gender | count(*) |
+--------+----------+
| 男 | 5 |
| 女 | 7 |
| 中性 | 1 |
| 保密 | 1 |
+--------+----------+
需要在分组之后的数据中做进一步的筛选操作
-- 使用having 条件筛选 表示对于已经分组的数据做进一步的筛选
-- 对分组之后的数据做进一步的筛选操作, 只能够是用having 做筛选 不能够使用where
select gender, count(*) from students group by gender having gender = 1;
select gender, count(*) from students group by gender where gender = 1; 错误

-- 除了男生以外的分组的人数
select gender, count(*) from students group by gender having gender != 1;
select gender, count(*) from students group by gender having not gender = 1;

-- having 对于分组之后的数据 做进一步的筛选
-- 查询每种性别中的平均年龄avg(age)
select gender, avg(age) from students group by gender;

-- 查询每种性别中的平均年龄avg(age), 最大年龄,平均身高,最高身高, 分组是为了更好的统计
select gender, avg(age),max(age), avg(height), max(height) from students group by gender;

-- 查询平均年龄超过30岁的性别,以及姓名, 对分组之后的数据做进一步筛选操作 having
select gender, group_concat(name),avg(age) from students group by gender having avg(age) > 30;
select gender,group_concat(name),avg(age) from students group by gender having avg(age)>30;
--查询年龄超过平均年龄的性别、姓名,对分组后的数据进行进一步筛选操作
select gender,name,age from students where age>(select avg(age) from students);****


-- having 和 where 的区别
having 表示对于已经分组的数据做进一步的筛选, 有having就一定有group by, 有group by 不一定有 having
where 是对源数据做筛选操作

select gender, substring_index(group_concat(height order by height desc),',', 2) from students group by gender;
substring_index(str,delim,count)
str:要处理的字符串
delim:分隔符
count:计数

-- 分页
-- limit start, count
-- start: 表示从哪里开始查询, start 默认值为0, 可以省略, start跳过多少条数据
-- count: 查询多少条

获取第一页, 每页显示4条数据
select * from students limit 0,4;

第1页

第2页

第3页

第4页


-- 每页显示4个,显示第3页的信息, 按照年龄从小到大排序
select name from student limit 8,4 order by age;
select name from student order by age limit 8,4;


-- 连接查询 将两个表按照某种条件合并到一起

-- 查询学生的名字和学生对应的班级名字
-- 学生名字在学生表, 班级名字在班级表
select students.name,classes.name from students,classes; -- 笛卡尔积查询 有可能产生庞大的中间表
select * from students,classes;
-- 笛卡尔积查询, 会产生很多无用的信息


-- 连接查询 将两个表中的数据按照设置的连接条件进行筛选, 符合连接条件的数据才能够被筛选出来
-- table1 inner join table2 on 条件 , 设置内连接条件 内连接查询
select students.name, classes.name from students inner join classes on students.cls_id = classes.id;
select s.name,c.name from students as s inner join classes as c on s.cls_id = c.id;
select s.*,c.* from students as s inner join classes as c on s.cls_id = c.id;

-- 按照要求显示姓名、和学生对应的班级的名字(学生所在的班级)
select s.name,c.name from students as s inner join classes as c on s.cls_id = c.id;
-- 在以上的查询中,将班级名字显示在第1列
select c.name,s.name from students as s inner join classes as c on s.cls_id = c.id;
-- 查询 学生所在的班级, 按照班级进行排序
select c.name,s.name from students as s inner join classes as c on s.cls_id = c.id order by c.name;


-- 外连接查询: left join + right join
-- left join 左外连接查询
-- 查询每位学生对应的班级信息, 不满足连接条件的数据会以NULL填充
select s.*,c.* from students as s left join classes as c on s.cls_id = c.id;

-- right join 右外连接查询 使用的比较少
-- 将数据表名字互换位置,用left join完成

-- 扩充了解, 内连接和外连接的其他写法
-- 内连接的其他写法
select s.*,c.* from students as s inner join classes as c on s.cls_id = c.id;
select s.*,c.* from students as s join classes as c on s.cls_id = c.id;
select s.*,c.* from students as s cross join classes as c on s.cls_id = c.id;

-- 外连接的其他写法
select s.*,c.* from students as s left outer join classes as c on s.cls_id = c.id;
select s.*,c.* from students as s right outer join classes as c on s.cls_id = c.id;

猜你喜欢

转载自www.cnblogs.com/zxw2016208120/p/11358435.html