mysql之联表查询、常用函数、聚合函数
1.连表查询
注意事项:
1.联表查询是因为需要得到的数据在两个表中,一个表无法满足我们的需求
例:一个员工表,里面有员工姓名和员工id两个字段,另一张表是工资表里面有员工id和与员工工资现在我的要求是得到改公司每个员工的姓名和对应的工资,这时候我们就需要用到联表查询–>
2.联表查询就是将两个表通过一定的关系连接起来,如果没有有效的连接,将会发生–>
笛卡尔乘积现象–>
表a 有m行数据,表b 有n行–>
select * from a , b where 1=1–>
1=1就是没有效果的连接因为1是恒等于1的所有这就是无效连接–>
缺点:(没有优点)–>
1.可能造成卡顿,–>
如果表a有10000条数据,表b也有10000条数据那么这时候我们又定义了无效连接条件的话将会查询显示1千万条数据–>
2.需求数据查找麻烦–>
就比如上面我举得员工姓名和工资问题,如果不建立有效连接那么,一个员工对应多个工资那么就无法拿我们想要的数据–>
连接分类:
内连接:
等值连接:
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉连接
有很多连接我就挑几个常用的讲一下
等值连接
① 多表等值连接的结果为多表的交集部分
②n表连接,至少需要n-1个连接条件
③ 多表的顺序没有要求
④一般需要为表起别名
⑤可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
例:查询各个员工对应的工资
select name,money from yuangong , gomgzi where yuangong.id=gomgzi.id
这里我们可以用取别名的方式让代码看起来简洁一点
select name,money from yuangong y , gomgzi g where y.id=g.id
外连接
1、外连接的查询结果为主表中的所有记录如果从表中有和它匹配的,则显示匹配的值如果从表中没有和它匹配的,则显示null外连接查询结果=内连接结果+主表中有而从表没有的记录
2、左外连接,left join左边的是主表 右外连接,right join右边的是主表
3、左外和右外交换两个表的顺序,可以实现同样的效果
4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
例
select * from 主表 a left outer join 从表 b on a.id=b.id where a.id is not null
select a.*,b.* from usera a left outer join grade b on a.id=b.uid where a.id is not null
常见函数
字符函数
作用 | 函数 | 结果 |
---|---|---|
转小写 | LOWER(‘SQL Course’) | sql course |
转大写 | UPPER(‘SQL Course’) | SQL COURSE |
拼接 | CONCAT(‘Hello’, ‘World’) | HelloWorld |
截取 | SUBSTR(‘HelloWorld’,1,5) | Hello |
长度 | LENGTH(‘HelloWorld’) | 10 |
字符出现索引值 | INSTR(‘HelloWorld’, ‘W’) | 6 |
字符截取后半段 | TRIM(‘H’ FROM ‘HelloWorld’) | elloWorld |
字符替换 | REPLACE(‘abcd’,‘b’,‘m’) | amcd |
数字函数
作用 | 函数 | 结果 |
---|---|---|
四舍五入 | ROUND(45.926, 2) | 45.93 |
截断 | TRUNC(45.926, 2) | 45.92 |
求余 | MOD(1600, 300) | 100 |
日期函数
作用 | 函数 | 结果 |
---|---|---|
获取当前日期 | now() | 当前日期时间 |
将日期格式的字符转换成指定格式的日期 | STR_TO_DATE(‘9-13-1999’,’%m-%d-%Y’) | 1999-09-13 |
将日期转换成字符 | DATE_FORMAT(‘2018/6/6’,‘%Y年%m月%d日’) | 2018年06月06日 |
聚合函数
1、 SUM():求和。
2、 AVG():求平均值。
3、MAX():求最大值。
4、 MIN():求最小值。(1、2、3、4、常与GROUP BY一起使用,也可单独使用)
5、 COUNT():统计记录的条数。常与GROUP BY一起使用,也可单独使用 如果有筛选的条件加关键字having
合并
1、UNION:将所有的查询结果合并到一起,然后去除掉相同的记录
2、UNION ALL:将所有的查询结果合并到一起,不会去除掉相同的记录