入坑数据库MySQL(6)- 操作关联表

1,284 阅读4分钟

关联关系:

  • 多对一
  • 多对多
  • 一对一

连接查询

交叉连接 CROSS JOIN

select * from 表1 CROSS JOIN 表2

交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积。

内连接 INNER JOIN

内连接(inner join)又称简单连接或自然连接,是最常见的连接查询。
内连接只列出与连接条件匹配的数据行。
内连接的两个表可以是同一个表,这种连接称为自连接
简单地说,内连接查询的结果是对交叉连接的结果按连接条件进行过滤后,得到的结果。

select * from 表1 [INNER] JOIN 表2 ON 连接条件

select  *   from department INNER JOIN employee 
ON department.did = employee.did ;

select department.did, department.dname, employee.name 
from department INNER JOIN employee 
ON department.did = employee.did ;

select department.did, department.dname, employee.name
from department , employee 
WHERE department.did = employee.did ;

*为表指定别名:

select  p2.did , p2.name , p1.dname 
from department as p1 JOIN employee as p2
ON p1.did = p2.did ;

select p2.did , p2.name , p1.dname
from department p1, employee p2
WHERE p1.did = p2.did ;
 
为内连接添加查询条件:查询张三的所有个人资料和部门资料
select  p1.* , p2.*
from department p1 JOIN employee p2 ON p1.did = p2.did 
WHERE p2.name = '张三';

找出张三所在的部门的所有员工的资料
select  p1.*
from employee p1 JOIN employee p2 ON p1.did = p2.did 
WHERE p2.name = '张三';

外连接

外连接分两种:

  • LEFT JOIN(左连接):在内连接的基础上,返回左表中不符合连接条件的记录(即返回左表中所有的记录)
  • RIGHT JOIN(右连接):在内连接的基础上,返回右表中不符合连接条件的记录(即返回右表中所有的记录)

注意:多表查询时,应该明确指定每个字段所在的表。格式为:表名.字段名

  • 外连接必定是两个表的连接查询,这两个表分别为左表与右表
  • 外连接的结果不仅包含符合连接条件的数据,还允许查询结果包含不符合连接条件的数据。
  • 简单地说,外连接的查询结果就是在内连接查询结果的基础上,加上左表或右表中不符合连接条件的数据。
select  * from 表1  LEFT JOIN 表2  ON 连接条件
select  * from 表1  RIGHT JOIN 表2  ON 连接条件
  • 全连接FULL JOIN

复合条件连接查询

使用order by 子句对连接查询结果排序

子查询

子查询是指一个查询语句嵌套在另一个查询语句内部的查询。
一个查询可以嵌套在SELECT、SELECT……INTO、INSERT……INTO等语句中。
IN:集合判断运算符
EXISTS:存在测试运算符
ANY:部分满足
ALL:全部满足

带IN关键字的子查询

内层(嵌套)的子查询仅返回一个字段的数据,这些数据可以看成是一个集合。
IN关键字就是判断某个字段(did)的值是否在这个集合中

带EXISTS关键字的子查询

EXISTS(单目运算符),测试后面的子查询是否存在数据。
TRUE:子查询的查询结果存在数据
FALSE:子查询的查询结果不存在数据,即查询结果为空集

带ANY关键字的子查询

ANY关键字表示结果集中任意一个数据满足条件即代表条件成立

带ALL关键字的子查询

ALL关键字表示结果集中所有数据都满足条件,条件才算成立

查询存在年龄为20岁的员工的部门
select  *   from department 
where did IN ( select did from employee  where age = 20 );

查询employee表中是否存在龄大于21岁的员工,如果存在,则查询department表中的所有记录
select  *   from department 
where EXISTS ( select did from employee  where age > 21 );
select  *   from department 
where did >ANY ( select did from employee);

select  *   from employee
where age = ANY ( select age from employee  where did=1);

select  *   from department 
where did >ALL ( select did from employee);

查询出所有年龄比员工的平均年龄小的员工信息。
select  *   from employee
where age > ( select avg(age) from employee);
 
如何知道平均年龄?
select avg(age) from employee;

如何组合?

要查询出所有年龄小于21的员工信息,怎么做?
select  *   from employee
where age < 21;

查询出年龄最小(大)的员工的信息。
最小年龄:select min(age) from employee;
最大年龄:select max(age) from employee;

select  *   from employee
where age= ( select max(age) from employee);

函数(列表)

数学函数: ABS(x):返回x的绝对值
SQRT(x):返回x的平方根
ROUND(x,y):对x进行四舍五入,保留y为小数
CONCAT(…):将各个字段使用下划线连接起来

为表和字段取别名

查询数据时,可以为表和字段取别名。

  • 为表取别名: select * from 表名 AS 别名
  • 为字段取别名: select 字段名 [AS] 别名 from 表名 AS 别名

字段的别名可以直接显示在查询结果中