连接查询
当查询中涉及到了多个表的字段,需要使用多表连接 select 字段1,字段2 from 表1,表2,…;
笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接 如何解决:添加有效的连接条件
分类
按年代分类: sql92: 等值 非等值 自连接 也支持一部分外连接(用于oracle、sqlserver,mysql不支持) sql99【推荐使用】 内连接 等值 非等值 自连接 外连接 左外 右外 全外(mysql不支持) 交叉连接
等值连接
#2.为表起别名 #查询员工的名,工种号和工种名 #如果起了别名,就不能在语句中使用原来的字段
#3.from 表的顺序,可以调换
#4.加筛选条件,AND #查询有奖金的员工和部门
#5. 加分组 #查询每个城市的部门个数
#查询有奖金的每个部门的名字和领导编号即该部门的最低工资
#查询每个工种的名字和员工个数,并按个数降序排列
#7.三表连接,多条件用AND
总结:
- 多表等值连接为多表的交集
- 多表条件为n-1
- 一般会起别名
- 可以搭配分组、排序等
非等值连接
#查询员工工资和等级,先建一个等级表
CREATE TABLE job_grades
(grade_level VARCHAR(3),
lowest_sal INT,
highest_sal INT);
INSERT INTO job_grades
VALUES ('A', 1000, 2999);
INSERT INTO job_grades
VALUES ('B', 3000, 5999);
INSERT INTO job_grades
VALUES('C', 6000, 9999);
INSERT INTO job_grades
VALUES('D', 10000, 14999);
INSERT INTO job_grades
VALUES('E',15000,24999);
INSERT INTO job_grades
VALUES('F',25000,40000);
自连接
表内的等值连接
#查询员工名字和上级名字,注意别名的应用
Sql99
语法:
select 查询列表
from 表1 [别名] [连接类型]
join 表 2 [别名]
on 连接条件
where 筛选条件
group by 分组条件
having 筛选条件
order by 排序条件
连接类型:
內连 :inner
等值,非等值,自连接
外连:
左外:left [outer]
右外:right [outer]
全外:full [outer]
交叉连接:cross
外连接
①查询的结果=主表中所有的行,如果从表和它匹配的将显示匹配行,如果从表没有匹配的则显示null ②left join 左边的就是主表,right join 右边的就是主表 full join 两边都是主表 ③一般用于查询除了交集部分的剩余的不匹配的行
#查询没有男朋友的
USE girls;
SELECT g.name,b.*
FROM beauty g
LEFT OUTER JOIN boys b
ON g.id=b.id
WHERE b.id IS NULL;
#查询没有人的部门
SELECT d.department_name,e.department_id
FROM employees e
RIGHT OUTER JOIN departments d
ON e.department_id=d.department_id
WHERE e.department_id IS NULL;
交叉连接
sql99下的笛卡尔集