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

本文探讨了如何通过在SQL查询中使用WHERE子句加入有效的连接条件来防止笛卡尔集的产生。讲解了等值连接、连接查询、表别名的重要性,以及各类连接类型(内连接、外连接、交叉连接)的应用实例。还介绍了常用函数如日期、数学和字符串操作,以及如何在查询中组合使用这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 笛卡尔集

笛卡尔集会在下面条件下产生

– 省略连接条件
– 连接条件无效
– 所有表中的所有行互相连接
• 为了避免笛卡尔集, 可以在 WHERE 加入有 效的连接条件。

加入where 可以避免无效查询

 二、等值连接/连接

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

 在 WHERE 子句中写入连接条件。

 在表中有相同列时,在列名之前加上表名前缀

 2、区分重复的列名

   在不同表中具有相同列名的列可以用表的别名

加以区分。

   如果使用了表别名,则在select语句中需要使

用表别名代替表名

   表别名最多支持32个字符长度,但建议越少越

3、表的别名

​ 使用别名可以简化查询。

​ 使用表名前缀可以提高执行效率。

区分多个重名的字段

 连接n个表,需要n-1个连接条件

注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定

4、连接查询案例

含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行

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

如何避免:添加有效的连接条件

分类:

按年代分类:

sql92标准:仅仅支持内连接

sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接

按功能分类:

内连接:

等值连接√

非等值连接

自连接

外连接:

左外连接√

右外连接√

全外连接

交叉连接

5、等值连接

1、等值连接

① 多表等值连接的结果为多表的交集部分

②n表连接,至少需要n-1个连接条件

③ 多表的顺序没有要求

④一般需要为表起别名

⑤可以搭配前面介绍的所有子句使用,比如排序、分组、筛选

左外连接

SELECT b.*,bo.*

FROM t_mysql_boys bo

LEFT OUTER JOIN t_mysql_beauty b

ON b.`boyfriend_id` = bo.`id`

WHERE b.`id` IS NULL;

案例1:查询哪个部门没有员工(左外)

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;

###### 右外

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;


4:常见函数

概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名

好处:1、隐藏了实现细节 2、提高代码的重用性

调用:select 函数名(实参列表) 【from 表】;

特点:

①叫什么(函数名)

②干什么(函数功能)

分类:

 1、单行函数

如 concat、length、ifnull等

2、分组函数

功能:做统计使用,又称为统计函数、聚合函数、组函数

常见函数:

一、单行函数

字符函数:

1.length 获取参数值的字节个数

SELECT LENGTH('john');

SELECT LENGTH('张三丰hahaha');

**concat 拼接字符串**

SELECT CONCAT(last_name,'_',first_name) 姓名 t_mysql_FROM employees;

**upper、lower**

SELECT UPPER('john');

SELECT LOWER('joHn');

示例:将姓变大写,名变小写,然后拼接

SELECT CONCAT(UPPER(last_name),LOWER(first_name)) 姓名 FROM t_mysql_employees;

**substr、substring**

注意:索引从1开始

截取从指定索引处后面所有字符

SELECT SUBSTR('李莫愁爱上了陆展元',7) out_put;

案例:姓名中首字符大写,其他字符小写然后用_拼接,显示出来

SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) out_put

FROM t_mysql_employees;

**instr**

返回子串第一次出现的索引,如果找不到返回0

SELECT INSTR('杨不殷六侠悔爱上了殷六侠','殷八侠') AS out_put;

**trim**

SELECT LENGTH(TRIM('   张翠山   ')) AS out_put;

SELECT TRIM('aa' FROM 'aaaaaaaaa张aaaaaaaaaaaa翠山aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') AS out_put;

**lpad**

用指定的字符实现左填充指定长度

SELECT LPAD('殷素素',2,'*') AS out_put;

**rpad**

用指定的字符实现右填充指定长度

SELECT RPAD('殷素素',12,'ab') AS out_put;

**replace**

替换

SELECT REPLACE('周芷若周芷若周芷若周芷若张无忌爱上了周芷若','周芷若','赵敏') AS out_put;

###### 数学函数:

**round**

四舍五入

SELECT ROUND(-1.55);

SELECT ROUND(1.567,2);

**ceil**

向上取整,返回>=该参数的最小整数

SELECT CEIL(-1.02);

**floor**

向下取整,返回<=该参数的最大整数

SELECT FLOOR(-9.99);

**truncate**

截断

SELECT TRUNCATE(1.69999,1);

**mod**

取余

mod(a,b) : a-a/b*b

mod(-10,-3):-10- (-10)/(-3)*(-3)=-1

SELECT MOD(10,-3);

SELECT 10%3;

###### 日期函数:

**now**

返回当前系统日期+时间

SELECT NOW();

**curdate**

返回当前系统日期,不包含时间

SELECT CURDATE();

**curtime**

返回当前时间,不包含日期

SELECT CURTIME();

可以获取指定的部分,年、月、日、小时、分钟、秒

SELECT YEAR(NOW()) 年;

SELECT YEAR('1998-1-1') 年;

SELECT YEAR(hiredate) 年 FROM t_mysql_employees;

SELECT MONTH(NOW()) 月;

SELECT MONTHNAME(NOW()) 月;

**str_to_date**

 将字符通过指定的格式转换成日期

SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS out_put;

案例:

查询入职日期为1992--4-3的员工信息

SELECT * FROM employees WHERE hiredate = '1992-4-3';

SELECT * FROM employees WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y');

###### 其他函数:

SELECT VERSION();

SELECT DATABASE();

SELECT USER();
 

<think>我们正在讨论MySQL中的UNION操作符。根据用户的问题,他们想了解UNION的使用方法和示例。根据引用内容,我们可以总结如下: 1. UNION用于合并两个或多个SELECT语句的结果集。 2. UNION内部的每个SELECT语句必须拥有相同数量的列,列也必须拥有相似的数据类型,同时列的顺序必须相同。 3. UNION默认去重,如果不需要去重,可以使用UNION ALL,它更快,因为不进行去重。 此外,引用中提供了几个示例: - 引用[1]展示了一个简单的UNION SELECT示例:`UNION SELECT 1,2,3`,并说明它会与原始查询合并返回新的结果集。 - 引用[2]和[3]展示了在子查询中使用UNION ALL,然后进行分组求和:`select id,sum(num) from (select * from ta union all select * from tb) as tmp group by id;` 和类似的形式。 因此,我们可以这样组织回答: 1. 先解释UNION的作用和规则。 2. 说明UNIONUNION ALL的区别。 3. 给出示例,包括基本示例和引用中的复杂示例(使用子查询和分组求和)。 同时,根据系统指令,我们需要在行内数学表达式使用$...$,独立公式用$$...$$,但这里没有数学公式,所以主要注意代码块的格式和中文回答。 最后,生成相关问题。 注意:引用标识要自然地添加在引用内容的末尾。由于我们的引用来自站内,所以我们在相关位置添加[^1]、[^2]、[^3]。</think>### MySQL UNION 操作符详解 在 MySQL 中,`UNION` 操作符用于**合并两个或多个 SELECT 语句的结果集**,并自动去除重复行。其基本语法如下: ```sql SELECT 列1, 列2 FROM 表1 UNION [ALL] SELECT 列1, 列2 FROM 表2; ``` #### 核心规则 1. **列数量与类型一致** 所有 SELECT 语句必须包含相同数量的列,且对应列的数据类型必须兼容。 ```sql -- 有效(列数相同) SELECT id, name FROM users UNION SELECT product_id, product_name FROM products; -- 无效(列数不同) SELECT id FROM users UNION SELECT id, name FROM products; -- 报错! ``` 2. **UNION vs UNION ALL** - `UNION`:自动去重(默认行为) - `UNION ALL`:保留所有重复行(性能更高) ```sql -- 示例:统计合并表数据(引用[2][3]) SELECT id, SUM(num) FROM ( SELECT * FROM ta UNION ALL SELECT * FROM tb ) AS tmp GROUP BY id; ``` #### 使用示例 假设有两个表: ```sql -- 表A: sales_q1 +----+-------+ | id | sales | +----+-------+ | 1 | 100 | | 2 | 200 | +----+-------+ -- 表B: sales_q2 +----+-------+ | id | sales | +----+-------+ | 2 | 200 | | 3 | 300 | +----+-------+ ``` 1. **基础合并(自动去重)** ```sql SELECT id, sales FROM sales_q1 UNION SELECT id, sales FROM sales_q2; ``` **结果**: ``` +----+-------+ | id | sales | +----+-------+ | 1 | 100 | | 2 | 200 | -- 重复值仅出现一次 | 3 | 300 | +----+-------+ ``` 2. **保留重复行(UNION ALL)** ```sql SELECT id, sales FROM sales_q1 UNION ALL SELECT id, sales FROM sales_q2; ``` **结果**: ``` +----+-------+ | id | sales | +----+-------+ | 1 | 100 | | 2 | 200 | -- 保留重复值 | 2 | 200 | | 3 | 300 | +----+-------+ ``` 3. **复杂应用:合并聚合统计**(引用[2][3]) ```sql SELECT id, SUM(sales) AS total_sales FROM ( SELECT * FROM sales_q1 UNION ALL SELECT * FROM sales_q2 ) AS combined GROUP BY id; ``` **结果**: ``` +----+-------------+ | id | total_sales | +----+-------------+ | 1 | 100 | | 2 | 400 | -- 原始值200+200 | 3 | 300 | +----+-------------+ ``` #### 注意事项 1. 列名以第一个 SELECT 语句为准 2. 排序需放在最后: ```sql (SELECT id FROM users ORDER BY id DESC) UNION (SELECT id FROM products) ORDER BY id; -- 正确:全局排序 ``` 3. 常用于分表数据合并或跨库查询[^1] --- ### 相关问题 1. `UNION` 和 `JOIN` 在数据合并时的主要区别是什么? 2. 如何优化包含 `UNION` 的大数据量查询性能? 3. `UNION` 操作符在 SQL 注入攻击中可能被如何利用?如何防范?[^1] [^1]: MySQL注释区别,union使用,group_concat使用---清风 [^2]: MySQL入门笔记 —— 027 union查询面试题 [^3]: mysql中的UNION面试题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值