概念:多张表或一张表多次使用成为多表查询
//1、先查出最高的薪资是多少
select max(salary) from t_emp;
//2、以最高薪资为条件查出对应的员工信息
select * from t_emp where salary=(select max(salary) from t_emp);如果是使用的= != > < >= <=等等,那么要求是后面只能跟单个结果
如果子查询的结果是多个值,那就使用in/not in
需求:查询薪资在5K~7K之间的员工的信息
//1、先查询到薪资在5K到7K之间的员工的编号
select eno from t_emp where salary between 5000 and 7000;
//2、根据编号查询员工的信息
select * from t_emp where eno in(select eno from t_emp where salary between 5000 and 7000);
连接查询
左连接:以左边表为主,查询出左边表中符合条件的全部数据以及右边表中符合条件的数据,缺少的数据以null代替
语法:select ... from 表 left join 表 on 条件;
需求:查询部门对应的员工信息
select d.*,e.* from t_dept d,t_emp e where d.deptno=e.deptno;
select d.*,e.* from t_dept d left join t_emp e on d.deptno=e.deptno;右连接:以右边表为主,查询出右边表中的全部数据及左边表中符合条件的数据,不足的以null代替
语法:select ... from 表 right join 表 on 条件;
合并结果集
注意:合并的结果集要求被合并的字段是相同的类型及数据
union all :合并多张表的数据,不去重复
视图
语法:create view 视图名 as select语句;
需求示例:甲乙双方合作,甲方需要乙方团队的人员部分信息,那么该信息是只有部分且只能查看
需求:将员工1,6,9的基本信息(不包括部门及薪资信息)给到甲方
create view v_emp1 as select ename,sex,phone,address from t_emp where eno in(1,6,9);
视图和原表中的数据如果是一对一可推导的情况下是可以互通的
带有函数的名称是不能作为字段名直接使用的
如果视图中的数据是无法推导原表中数据的变化的,那就不能进行修改(增删改)的动作
回答:视图中修改的数据可以推导出原表中数据的变化那就可以修改,如果推导不出来那就不能改
问题:什么样的情况下回导致通过视图无法推导原表中的数据呢?
回答:当视图中的数据用到了group by 、函数、distinct等等
常见函数
字符串函数:concat(arg0,arg1,...) 字符串拼接,可拼接无限个字符
例如:select concat('hello','world'); 结果是:helloworld
目的:将不同的字符以指定的形式拼接到一块展示出来
now() 获取当前的系统时间
unix_timestamp() 获取当前的系统时间对应的毫秒值
聚合函数用户表中对数据的操作,函数代表某一个特定的功能,对已有的数据根据功能进行操作
(聚合函数是直接操作数据的,函数是操作获取的数据的)
通常情况不建议在数据库中使用函数,会影响数据库性能,所以大多数对数据的处理都是由开发语言来处理的
姓名 张三 年龄 17 性别 男 用户名 admin 密码 root