- union联合查询
-
union用于合并两个或多个select语句的结果集
-
unnion将两个表上下拼在一起
-
要求:
–两边select语句的字段数必须一致
–两边可以有不同数据类型的字段
–字段名默认按左边的表来设置
select column_name from table1 union select column_name from table2;
- inner join:内连接(交集)
-
nner join 根据两个或多个表之间的共同列(即连接条件)来组合行。使用
INNER JOIN
时,只有当连接条件满足时,即在两个或多个表中都存在匹配的行时,才会返回结果。 -
如果没有匹配的行,
INNER JOIN
不会返回这些行 -
inner 可省略
-
语法:
--隐式内连接(SQL92标准) select * from table1, table2 where condition; --显式内连接(sql99标准) SELECT columns FROM table1 INNER JOIN table2 ON table1.common_field = table2.common_field, [INNER JOIN table3 ON table1.common_field = table3.common_field]; --多表内连接 SELECT columns FROM table1 INNER JOIN table2 ON table1.common_field = table2.common_field, INNER JOIN table3 ON table1.common_field = table3.common_field;
–
table1
和table2
是要连接的两个表。–
common_field
是两个表共有的列,用于连接这两个表。–
columns
是你想要从连接的结果中选择的列。 -
示例:
假设有两个表:
employees
和departments
。employees
表包含员工信息,departments
表包含部门信息,它们通过department_id
列连接。SELECT employees.name, departments.department_name FROM employees INNER JOIN departments ON employees.department_id = departments.id;
-- 这个查询将返回所有员工的姓名和他们所属的部门名称,但只有当员工和部门在 `department_id` 上有匹配时才会显示。
select
departments.name, group_concat(employees.ename), count(*)
from
dept
join emp on departments.id = employees.department_id
group by
departments.name
having
count(*)>=3
order by
count(*) desc;
– 这个查询将返回部门员工数≥3的部门名称,部门员工姓名,部门员工数量,并按部门员工数量的降序排列
- left [outer] join:左(外)连接
-
left join关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配,如果右表没有匹配,则common_field结果为null。
-
语法
SELECT columns FROM table1 LEFT JOIN table2 ON table1.common_field = table2.common_field;
- rigth (outer)join:右(外)连接
-
ight join关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配,如果右表没有匹配,则common_field结果为null。
-
语法
SELECT columns FROM table1 right JOIN table2 ON table1.common_field = table2.common_field;
full join:满外连接,mysql不支持满外连接,可以使用union关键字实现左外连接和右外连接的并集达到满外连接的效果
select * from table1 left join table2 on table1.column = taable2.column
union
select * from table1 right join table2 on table1.column = taable2.column
-- 使用union on也可以,union去重了,union on 未去重
6、交叉连接查询
-
交叉连接查询返回被连接的两个表所有数据行的笛卡尔积
-
笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配
-
假如A表有m行数据,B表有n行数据,则会返回m*n行数据
-
这种查询会产生很多冗余数据,后期的其他查询可以在该集合的基础上进行条件筛选
-
语法
select * from table1, table2, table3...;