MySQL基础4

目录

查询关键字之having过滤

having与where的功能类似where用于条件筛选数据 多数shiyongyu-整体分组前 having用于分组之后的进一步数据筛选  为了区别与两者 我们通常将where处理数据称为筛选 而将 having称为过滤 过滤案列题: 	统计筛选 每个部门(post) 年龄在三十岁以上的员工(age name) 的平均(avg)薪水(salary)     三层筛选准则:     先对.部门的.薪水筛选 在对各部门.年龄进行分组 在对分组后的.数据进行过滤留下我们要的数据     select post,avg(salart) from 表名     	where age>30,         group by post,        	having avg(salary) > 10000         ;  本轮所运用的知识点 avg 聚合函数平均值 where 条件判断 group by 分组判断 having过滤数据  补充:可以通过as起别名的方式将集合函数做到快速理解  select post,avg(salary) as avg_salary from emp    	where age>30      group by post     having avg_salary > 10000     ; 

查询关键字之distinct去重、

去重的前提 数据必须是一模一样的才可以(如果数据有主键肯定无法去重) 去重的格式:select distinct age from 表名;  等我们学到django orm之后 数据会被封装成对象  那个时候主键很容易被我们忽略 从而导致去重没有效果!!!  

查询关键字之order by排序

升序排列:     select * from 表名 order by salary; 默认是升序排列      select * from 表名 order by salary asc;升序排列 关键字 asc      select * from 表名 order by 降序的序列 desc; 降序排列 案列:先安装年龄升序排列 如果年龄相同再按照薪水进行降序排行  	select*from 表名 order by age asc,salary desc; 案列2:统计各部门年龄(psot)在18岁以上(age>18)的员工平均工资(salary) 并且保留平均工资大于1000(salary>1000)的部门 降序排行(desc) 	select post,avg(salary) as avg_salary from 表名,     where age > 18,     group by post     having avg_salary > 1000     order by avg_salary desc; 

查询关键字之limit分页

分页即限制展示条数 1.限制之展示五条数据 	select * from 表名 limit 5; 2.分页效果 	select * from 表名 limt 5,5;  当数据特别多的时候 经常使用limit来限制展示条数 节省资源 防止系统崩溃  

查询关键字之正则

select * from emp where name regexp '^j.*(n|y)$';  补充说明:我们目前所讲的是MySQL查询关键字中使用频率较高的一些 其实还有一些关键字目前无需讲解 并且SQL语句里面同样还支持流程控制语法 如果感兴趣的话 课后可以自行百度查看 非常简单!!!  

多表查询思路

# 多表查询的思路总共就两种 	1.子查询   	就相当于是我们日常生活中解决问题的方式(一步步解决)     将一条SQL语句的查询结果加括号当做另外一条SQL语句的查询条件     eg:以昨天的员工表和部门表为例 查询jason所在的部门名称       	子查询的步骤         	1.先查jason所在的部门编号           2.根据部门编号去部门表中查找部门名称              2.连表操作   	先将多张表拼接到一起 形成一张大表 然后基于单表查询获取数据     eg:以昨天的员工表和部门表为例 查询jason所在的部门名称       	连表操作         	1.先将员工表和部门表按照某个字段拼接到一起           2.基于单表查询            # 实际演练 	create table dep( 		id int primary key auto_increment,     name varchar(32)   );   create table emp(   	id int primary key auto_increment,     name varchar(32),     gender enum('male','female','others') default 'male',     age int,     dep_id int   );   insert into dep values(200,'技术'),(201,'人力资源'),(202,'销售'),(203,'运营'),(205,'安保');   insert into emp(name,age,dep_id) values('jason',18,200),('tony',28,201),('oscar',38,201),('jerry',29,202),('kevin',39,203),('jack',48,204);  # 使用子查询 获取jason所在的部门名称 # 1.先获取jason的部门编号 	select dep_id from emp where name='jason'; # 2.将结果加括号作为查询条件 	select name from dep where id=(select dep_id from emp where name='jason');    # 使用连表操作  获取jason所在的部门名称 笛卡尔积(了解知识) 	select * from emp,dep;  # 会讲所有的数据全部对应一遍   select * from emp,dep where emp.dep_id=dep.id;  # 效率低下  1.一条SQL语句的查询结果 我们也可以看成是一张虚拟表 2.如果一条SQL语句中设计到多张表的字段名称编写 建议使用表名前缀做区分  连表操作有四个关键字 	inner join		内连接   	select * from emp inner join dep on emp.dep_id=dep.id;     '''只连接两张表中有对应关系的数据'''   left join			左连接   	select * from emp left join dep on emp.dep_id=dep.id;     '''以左表为基准 展示所有的数据 没有对应项则用NULL填充'''   right join		右连接   	select * from emp right join dep on emp.dep_id=dep.id;     '''以右表为基准 展示所有的数据 没有对应项则用NULL填充'''   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;     '''左右两表数据全部展示 没有对应项则用NULL填充''' 答案求解 	select dep.name from emp    inner join dep on emp.dep_id=dep.id   where emp.name='jason'   ;     了解 我们学会了连表操作之后 其实就可以将N多张表拼接到一起 	思路:我们可以将两张表拼接之后的结果起别名当做一张表使用 	然后再去跟另外一张表拼接 select * from emp inner join  (select emp.id as epd,emp.name,dep.id from emp inner join dep on emp.dep_id=dep.id) as t1 on emp.id=t1.epd;  

可视化软件之Navicat

Navicat可以充当很多数据库软件的客户端 提供了图形化界面能够让我们更加快速的操作数据库 # 下载 	navicat有很多版本 并且默认都是收费使用   正版可以免费体验14天    针对这种图形化软件 版本越新越好(不同版本图标颜色不一样 但是主题功能是一样的) # 使用 	内部封装了SQL语句 用户只需要鼠标点点点就可以快速操作   连接数据库  创建库和表 录入数据 操作数据   外键 SQL文件 逆向数据库到模型 查询(自己写SQL语句)   # 使用navicat编写SQL 如果自动补全语句 那么关键字都会变大写   SQL语句注释语法(快捷键与pycharm中的一致 ctrl+?)   	#      -- # 运行SQL文件