mysql之常用函数、聚合函数以及合并(union&union all)

本文详细介绍了数据库查询中的笛卡尔集问题及其解决方法,包括等值连接、非等值连接、自连接以及使用ON子句创建连接的技巧。同时,讲解了内连接、外连接(左连接和右连接)的概念和应用实例。此外,还探讨了子查询的分类和使用场景,并列举了聚合函数如SUM、AVG、MAX、MIN和COUNT的用法。最后,提到了UNION和UNION ALL用于合并查询结果的操作。
摘要由CSDN通过智能技术生成

一、笛卡尔集

发生的原因:没有有效的连接条件

缺点:

– 省略连接条件
– 连接条件无效
– 所有表中的所有行互相连接

联表查询时会产生很多重复代码,效率慢,数据过多时可能会卡死数据库

解决方式:可以在where中加入有效条件

二、等值连接 

使用连接在多个表中查询数据

例:以t_mysql_beauty表和t_mysql_boys表举例

select * from t_mysql_boys a,t_mysql_beauty b where a.id=b.id;

在where子句中加入连接条件,如果有相同列名,在列名前加表名前缀

a.id=b.id就是连接条件,两个表都有id这个列所以起别名,方便调用

连接多个表时要有总数减一个查询条件把这些表连接起来

联表查询时表的顺序可以调换

可以加筛选

例:select * from t_mysql_boys a,t_mysql_beauty b where a.id=b.id and b.photo is not null

在原本的多表查询多了一个条件,从而优化代码

分组

例:查询每个男生的女朋友个数

select count(*),boyfriend_id from t_mysql_boys a,t_mysql_beauty b where a.id=b.id GROUP BY boyfriend_id;

解析:GROUP BY分组语句、先调用a.id=b.id查到数据在进一步按照boyfriend_id进行分组count(*)计算个数

三、非等值连接

例:查询员工的工资和工资级别(salary工资)

SELECT salary,grade_level FROM t_mysql_employees e,t_mysql_job_grades g WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`AND g.`grade_level`='A';

原理:拿salary工资去对应 g.`lowest_sal` AND g.`highest_sal`AND g.`grade_level`='A';这三个条件去进行筛选

四:自连接 

自己跟自己进行连接

例;查询员工名与上级的名称

SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM t_mysql_employees e,t_mysql_employees m
WHERE e.`manager_id`=m.`employee_id`; 

原理:自己跟自己进行连接

上面sql语句分析:先运行e.`manager_id`=m.`employee_id`;然后根据e.`manager_id对应的上级名进行查询

五、使用on子句创建连接

使用on子句指定额外的连接条件

on子句是与其他条件分开的

on子句可以让语句变得更加易读

六、内连接/外连接/交叉连接 

一、内连接(inner)

语法:select 查询列表 from 表1 别名 inner join 表2 别名 on 连接条件; 

特点:

①添加排序、分组、筛选
②inner可以省略
③ 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
④inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集

二、左外连接(left)

语法:select 查询列表 from 表1 别名 left join 表2 别名 on 连接条件; 

含义:左表的所有数据连接右表的部分数据

例:查询哪个部门没有员工

SELECT d.*,e.employee_id
FROM t_mysql_departments d
LEFT OUTER JOIN t_mysql_employees e
ON d.`department_id` = e.`department_id`
WHERE e.`employee_id` IS NULL;

三、右外连接(right)

语法:select 查询列表 from 表1 别名 right join 表2 别名 on 连接条件; 

含义:右表的所有数据连接左表的部分数据

例:查询哪个部门没有员工

SELECT d.*,e.employee_id
FROM t_mysql_employees e
RIGHT OUTER JOIN t_mysql_departments d
ON d.`department_id` = e.`department_id`
WHERE e.`employee_id` IS NULL;

七、常见函数

一、字符函数

 

最常用的是获取字符长度

二、数字函数

 

三、日期函数

 

日期函数三个都是很常用的、记好笔记家银们

四、其他函数

version
database
user

五、控制函数 

if
case

八、子查询 

含义:
出现在其他语句中的select语句,称为子查询或内查询
外部的查询语句,称为主查询或外查询

就相当于查询里面再套了个查询

分类:
按子查询出现的位置:
select后面:
仅仅支持标量子查询

from后面:
支持表子查询
where或having后面:★
标量子查询(单行) √
列子查询 (多行) √

行子查询

exists后面(相关子查询)
表子查询
按结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有一行多列)
表子查询(结果集一般为多行多列)

 子查询的例子

查询员工的信息,满足 salary>last_name = 'Abel'结果
SELECT *
FROM t_mysql_employees
WHERE salary>(

SELECT salary
FROM t_mysql_employees
WHERE last_name = 'Abel'

);

九、聚合函数

sum 求和

例:SELECT SUM(salary) FROM t_mysql_employees;

avg 平均值

例:SELECT AVG(salary) FROM t_mysql_employees;

max 最大值 

例:SELECT MAX(salary) FROM t_mysql_employees;

min 最小值 

例:SELECT MIN(salary) FROM t_mysql_employees;

count 计算个数

例:SELECT COUNT(salary) FROM t_mysql_employees;

十、合并 

UNION:将所有查询结果合并到一起,然后去除掉相同的记录

UNION ALL:将所有的查询结果合并到一起,不会去除相同的记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值