mysql交集(mysql交集怎么写)

http://www.itjxue.com  2023-03-03 06:08  来源:未知  点击次数: 

mysql 判断两个数组是否有交集

在PHP中求数组的交集,我们可以与PHP给我们提供的现成函数:array_intersect(),其用法格式为:

array array_intersect(array array1,array array2[,arrayN…])

根据上述的语法格式,我们来写一个例子:

1 ?php

2 $fruit1 = array("Apple","Banana","Orange");

3 $fruit2 = array("Pear","Apple","Grape");

4 $fruit3 = array("Watermelon","Orange","Apple");

5 $intersection = array_intersect($fruit1, $fruit2, $fruit3);

6 print_r($intersection);

7 // 输出结果:

8 // Array ( [0] = Apple )

9 ?

本例子将返回在$fruit1数组中出现且在$fruit2和$fruit3中也出现的所有水果的名子。

使用array_intersect()函数时要注意:只有在两个元素相等且具有相同的数据类型时,array_intersect()函数才会认

为它们是相同的,否则不能进行交集计算。array_intersect()函数返回一个保留了键的数组,只由第一个数组中出现的且在其它数组中都出现的

值组成。

若要求关联数组的交集,请使用array_intersect_assoc()函数,给你个简单的例子:

1 ?php

2 $fruit1 = array("red"="Apple","yellow"="Banana","orange"="Orange");

3 $fruit2 = array("yellow"="Pear","red"="Apple","purple"="Grape");

4 $fruit3 = array("green"="Watermelon","orange"="Orange","red"="Apple");

5 $intersection = array_intersect_assoc($fruit1, $fruit2, $fruit3);

6 print_r($intersection);

7 // 输出:

8 // Array ( [red] = Apple )

9 ?

array_intersect_assoc()函数语法格式如下:

array array_intersect_assoc(array array1,array array2[,arrayN…])

array_intersect_assoc()与array_intersect()基本相同,只不过他在比较中还考虑了数组的键。因此,只有在第一个数组中出现,且在所有其他输入数组中也出现的键/值对才返回到结果数组中。

MySQL中的交叉连接、内连接、外连接

学生student表:

课程course表:

交叉连接:

结果为两张表的笛卡尔积:

内连接(inner join ,inner 可以省略)

显示内连接和隐示内连接获得的查询结果是一样的,都是A表和B表的交集(例:A.id = B.id),但是只能查到有关系的信息,如果A表的一条数据的与B表关联的字段没有对应的信息(如:A.id = null),即:这条数据在B表中没有对应的信息,则无法获得。

外连接(outer join,outer可以省略)

左外连接获得的查询结果是左边的表A的全部信息和A,B两张表的交集,左边A表的全部包含A表中在B表中没有对应关系的信息。

右外连接获得的查询结果是右边的表B的全部信息和A,B两张表的交集,右边B表的全部包含B表中在A表中没有对应关系的信息。

【技术干货】作为测试,你必须知道的MySQL知识(二)

????????在上一文章 《 【技术干货】作为测试,你必须知道的MySQL知识(一) 》 中我们已经学了MySQL基础知识。对于 最常用、最重要 的select语句将会在本文与大家分享,带你轻松搞定查询语句。

????学习select之前,需先知道查询语句 逻辑执行顺序 ,了解了逻辑执行顺序,对我们写select语句有帮助,但是需要注意的是,逻辑顺序并不是真正执行的顺序,因为MySQL 优化器 会将SQL子句按最优的路径执行。如果想要查看实际执行顺序,可使用Explain关键字进行分析,获取对应的执行计划。

查询语句的使用都离不开以下的格式:

需要记住,这是学好查询语句的基础~

以上select的逻辑执行顺序如下(前面的序号):

?查询语句中where后面支持多种运算符,进行条件的处理,其中常见运算符包括:比较运算、逻辑运算、模糊查询、范围查询、空判断。

① 等于: =

② 大于:

③ 大于等于: =

④ 小于:

⑤ 小于等于: =

⑥ 不等于: != 或

① and

② or

③ not

【模糊查询语法】:字段名 like 匹配字段字符串

【常见的匹配字段字符串】:%、_、[] 、[^]

① in:表示在一个非连续的范围内

② between ... and ...:表示在一个连续的范围内

① 判断为空:is null

② 判断非空:is not null

【注意】:null与''是不同的。

使用JOIN 来联合多表查询,JOIN 按照功能大致分为如下三类:

① INNER JOIN(内连接) : 获取两个表中字段匹配关系的记录。

② LEFT JOIN(左连接) : 获取左表所有记录,即使右表没有对应匹配的记录。

③ RIGHT JOIN(右连接) : 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

-【举个栗子】:对表t_user与表t_order进行内连接

-【举个栗子】:对表t_user与表t_order进行左连接

-【举个栗子】:对表t_user与表t_order进行右连接

① 内连接: 保留两表中交集的记录;

② 左连接: 左表全部保留,右表关联不上用null表示;

③ 右连接: 右表全部保留,左表关联不上的用null表示。

group by语句是根据一个或多个列对结果集进行分组。在分组的列上我们经常会使用到 聚合函数 ,因此,先了解 常用的聚合函数 :

① sum():求和

② avg():求平均数

③ count():统计记录条数

④ max():求最大值

⑤ min():求最小值

【group by语法】:

可以根据某个字段(column_name)进行分组。如果不指定分组字段,默认将所有记录作为一组。

-【举个栗子】: 在emp表中,有3个字段,一个是员工id(id),一个是部门id(dept_id),一个是员工薪水(salary)

【注意】:

① ?使用group by的select语句中的字段,应该 出现在 聚合函数 中,或者 出现在 group by 中;

②? having 子句可以使用聚合函数,而 where 子句不能使用。

③从逻辑执行过程可知: where 是没有分组前对所有数据进行过滤, having 是对分组后的数据进行过滤。

子查询是指一个查询语句嵌套在另一个查询语句内部的查询。

-【举个栗子】: 一张user表,有2个字段,一个是名称(name),一个是年龄(age),查询出比小李年龄高的人有哪些?

- >【举个栗子】: 获取员工工资低于所在部门的平均工资的员工信息

????要对某个字段进行降序,可以在查询语句后可使用:order by 排序的字段名 desc

??? ?要对某个字段进行升序,可以在查询语句后可使用:order by 排序的字段名 asc

【注意】:order by默认情况下是升序,asc可省略不写。

???? 有2个维度的排序时,使用逗号隔开2个排序,优先使用前者进行排序,再使用后者进行排序。

??? limit:限制查询数据条数,经常在分页的场景中应用。LIMIT子句接受一个或两个参数。参数值都必须为零或正整数。limit的使用格式:

【参数解释】:

limit N :? 返回 N 条记录;

offset M : ?跳过 M 条记录, 默认 M=0;

limit N,M :? 从第 N 条记录开始, 返回 M 条记录。

-【举个栗子】:

【注意】:limit的两个参数中:

① 第1个参数:指要返回的第一行的偏移量。第一行的偏移量为0,而不是1;

②?第2个参数:指要返回的记录行数。

??如上面"检索6-15行记录"例子中,第1个参数为5,其实指的是第6行;第2个参数为10,指的是从第6行开始,取10条记录,所以是获取到6-15的记录。

????当需要查询出某个字段不重复的记录时,可以使用distinct来过滤重复的记录,格式如下:

使用distinct可以进行单字段去重、多字段去重、所有字段去重、以及与聚合函数的综合使用。

--【举个栗子】: student表中有name、age、weight3个字段字段。

????使用distinct之后,只能返回去重的字段,而不能返回其他的字段,可以使用group by进行去重查询,

【注意】:

①? distinct 只能在select语句中使用;

② ? distinct 必须在所有字段的最前面;

③ 多个字段去重时,多个字段组合后一样时才会被去重;

④ 列中有null值,当对该列使用distinct子句,将保留一个null值(所有null值被视为相同的值)。

mysql 判断字符串是否有交集

DROP FUNCTION IF EXISTS `INTE_ARRAY`;

delimiter //

-- 集合交集检查函数

-- @param varchar(255) setA A 集合 如 "1,3,5,9"

-- @param varchar(255) setB B 集合 如 "8,2,3,7"

-- @return int(1) B 集合内单元在 A集合 内存在则返回 1 否则返回 0

CREATE FUNCTION `INTE_ARRAY` (setA varchar(255),setB varchar(255)) RETURNS int(1)

BEGIN

DECLARE idx INT DEFAULT 0 ; -- B 集合单元索引

DECLARE len INT DEFAULT 0;-- B 集合表达式长度

DECLARE llen INT DEFAULT 0;-- 最后检查位置

DECLARE clen INT DEFAULT 0;-- 当前检查位置

DECLARE tmpStr varchar(255);-- 临时检查数据集

DECLARE curt varchar(255);-- B 当前检查的单元

SET len = LENGTH(setB);

WHILE idx len DO

SET idx = idx + 1;

SET tmpStr = SUBSTRING_INDEX(setB,",",idx);

SET clen = LENGTH(tmpStr);

-- 获取当前 setB 中的单元

IF idx = 1 THEN SET curt = tmpStr;

ELSE SET curt = SUBSTRING(setB,llen+2,clen-llen-1);

END IF;

-- 检查是否存在于 setA 中

IF FIND_IN_SET(curt,setA) 0 THEN RETURN 1;

END IF;

-- 当前检查终点与上次检查终点相同则跳出

IF clen = llen THEN RETURN 0;

END IF;

SET llen = clen;

END WHILE;

RETURN 0;

END;

//

delimiter ;

select INTE_ARRAY("1,3,5,9","8,2,3,7") as is_inte_array;

--select INTE_ARRAY("1,3,5,9","2,8,6,10") as is_inte_array;

--select INTE_ARRAY("10,3,5,9","2,8,6,10") as is_inte_array;

--select INTE_ARRAY("1,30,5,9","2,8,6,10") as is_inte_array;

--select INTE_ARRAY("1,30,5,9","2,30,6,10") as is_inte_array;

mysql 获取交集数据

你是要查前十个查询结果中相同的那些记录,而不求前十个相同记录吧,因为这是有差别的,按照你的语句,应该是求前者,即先求出A的前十条数据,B的前十条数据,再求它们的交集。

既然是求交集,那么这两个表的关系模式应该是相同的了,

select

a.*

from

(select

*

from

table

order

by

table.a

desc

limit

10)

as

a,

(select

*

from

table

order

by

table.b

desc

limit

10)

as

b

where

a.primary_key

=

b.primary_key

--先将两个结果作为两张临时表,然后通过主键

primary_key来获取交集(交集肯定就是主键相等的了,因为关系模式相同)

(责任编辑:IT教学网)

更多