今日学习总结3.03

一、查询关键字之having过滤
** 功能上having与where是一模一样的**
** 但是使用位置上有所不同**
** where在分组之前使用**
** having在分组之后使用**
** 表准备**
** create table emp(**
** id int primary key auto_increment,**
** name varchar(20) not null,**
** sex enum('male','female') not null default 'male', #大部分是男的**
** age int(3) unsigned not null default 28,**
** hire_date date not null,**
** post varchar(50),**
** post_comment varchar(100),**
** salary double(15,2),**
** office int, #一个部门一个屋子**
** depart_id int**
** );**

** 插入记录**
** 三个部门:教学,销售,运营**
** insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values**
** ('liyang','male',18,'20170301','虹桥第一帅形象代言',7300.33,401,1), #以下是教学部**
** ('tom','male',78,'20150302','teacher',1000000.31,401,1),**
** ('kevin','male',81,'20130305','teacher',8300,401,1),**
** ('tony','male',73,'20140701','teacher',3500,401,1),**
** ('owen','male',28,'20121101','teacher',2100,401,1),**
** ('jack','female',18,'20110211','teacher',9000,401,1),**
** ('jenny','male',18,'19000301','teacher',30000,401,1),**
** ('sank','male',48,'20101111','teacher',10000,401,1),**
** ('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门**
** ('呵呵','female',38,'20101101','sale',2000.35,402,2),**
** ('西西','female',18,'20110312','sale',1000.37,402,2),**
** ('乐乐','female',18,'20160513','sale',3000.29,402,2),**
** ('拉拉','female',28,'20170127','sale',4000.33,402,2),**
** ('僧龙','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门**
** ('程咬金','male',18,'19970312','operation',20000,403,3),**
** ('程咬银','female',18,'20130311','operation',19000,403,3),**
** ('程咬铜','male',18,'20150411','operation',18000,403,3),**
** ('程咬铁','female',18,'20140512','operation',17000,403,3);**


** 统计各部门年龄在30岁以上的员工平均工资,并且保留平均工资大于10000的部门**
** 1.先筛选出所有30岁以上的员工**
** select * from emp where age>30;**
** 2.然后再按照部门分组**
** '''SQL语句的查询结构我们也可以直接看成是一张表'''**
** select post,avg(salary) from emp where age>30 group by post;**
** 3.分组之后做过滤操作**
** select post,avg(salary) from emp **
** where age>30 **
** group by post **
** having avg(salary)>10000**
** ;**
二、查询关键字之distinct去重
** 去重有一个非常严格的前提条件 数据必须是完全一样**
** 如果数据带有主键那么肯定无法去重**
** select distinct age from emp;**
三、查询关键字之order by排序
** select * from emp order by salary; # 默认是升序**
** select * from emp order by salary asc; # 升序关键字 可以不写**
** select * from emp order by salary desc; # 降序**

** 排序也可以指定多个字段**
** select * from emp order by age desc,salary asc;**

** 统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序**
** select post,avg(salary) from emp **
** where age>10**
** group by post**
** having avg(salary)>1000**
** order by avg(salary);**
四、查询关键字之limit分页
** 用来限制数据的展示条数**
** select * from emp limit 5; # 前五条**
** select * from emp limit 5,5; # 起始位置、条数**

** 查询工资最高的人的详细信息**
** # 先按照工资排序 然后限制展示条数**
** select * from emp order by salary desc limit 1;**
五、查询关键字之regexp正则
** 正则表达式**
** 用一些特殊符号的组合去字符串中筛选出符合条件的数据**


** select * from emp where name regexp '^j.(n|y)$';**
** # '^j.
(n|y)$' j开头 中间无所谓 n或者y结尾**
六、多表查询思想
** 1.子查询**
** 分步解决问题**
** 将一条SQL语句的查询结果用括号括起来当作另外一条SQL语句的查询条件**


** 2.连表操作**
** 先将所有需要用到的表拼接到一起(一张表)**
** 然后就是转换成单表查询**
七、子查询
** 表准备**
** #建表**
** create table dep(**
** id int primary key auto_increment,**
** name varchar(20) **
** );**

** create table emp(**
** id int primary key auto_increment,**
** name varchar(20),**
** sex enum('male','female') not null default 'male',**
** age int,**
** dep_id int**
** );**

** #插入数据**
** insert into dep values**
** (200,'技术'),**
** (201,'人力资源'),**
** (202,'销售'),**
** (203,'运营'),**
** (205,'公关');**

** insert into emp(name,sex,age,dep_id) values**
** ('jason','male',18,200),**
** ('egon','female',48,201),**
** ('kevin','male',18,201),**
** ('nick','male',28,202),**
** ('owen','male',18,203),**
** ('jerry','female',18,204);**
** # 查询egon所在的部门名称 **
** # 第一步 先获取jason所在的部门id    **
** select dep_id from emp where name='jason';   **
** # 第二步 根据id号去部门表中筛选    **
** select * from dep where id = 200;    **
** # 完整句式    **
** select * from dep where id=(select dep_id from emp where name='jason');**
八、连表操作
** # 前戏(了解)**
** select * from emp,dep;**
** # 基于上表筛选数据(了解)**
** '''为了避免字段冲突 可以在字段名前面加表名明确'''**
** select * from emp,dep where emp.dep_id=dep.id;**

** 掌握**
** inner join 内连接 拼接公共的部分**
** select * from emp inner join dep on emp.dep_id=dep.id;**
** left join 左连接 以左表为基准展示所有数据 没有的null填充**
** select * from emp left join dep on emp.dep_id=dep.id;**
** right join 右连接 以右表为基准展示所有数据 没有的null填充**
** select * from emp right join dep on emp.dep_id=dep.id;**




** union 全连接**
** select * from emp left join dep on emp.dep_id=dep.id**
** union**
** select * from emp right join dep on emp.dep_id=dep.id;**


posted @ 2022-03-04 13:41  晨昏xcf  阅读(32)  评论(0)    收藏  举报