关联关系:
多对一
多对多
一对一
连接查询
交叉连接 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 别名
字段的别名可以直接显示在查询结果中