mysql基础5:连表查询教程ServerSQL

savh 162

MYSQL基础学习导航:
第1节:基础使用第2节:select语句、去重第3节:算术运算符第4节:排序与分页第5节:连表查询
第5节:连表查询

表结构:



基础使用

# 两个表的连接查询
SELECT employee_id, department_name
FROM employees, departments
WHERE employees.`department_id` = departments.department_id;
 
# 如果查询语句中出现了多个表中都存在的字段,则必须指明此字段所在的表
SELECT employees.employee_id, departments.department_name, employees.department_id
FROM employees, departments
WHERE employees.`department_id` = departments.department_id;
 
# 可以给表起别名,在SELECT和WHERE中使用表的别名
SELECT emp.employee_id, dept.department_name, emp.department_id
FROM employees emp, departments dept
WHERE emp.`department_id` = dept.department_id;
 
# 如果给表起了别名,一旦在SELECT或WHERE中使用表名的话,则必须使用表的别名,而不能再使用表的原名
# 如下的操作是错误的:
SELECT emp.employee_id, departments.department_name, emp.department_id
FROM employees emp, departments dept
WHERE emp.`department_id` = departments.department_id;
 
# 如果有n个表实现多表的查询,则需要至少n-1个连接条件
# 查询员工的employee_id,last_name,department_name,city
SELECT e.employee_id, e.last_name, d.department_name, l.city, e.department_id, l.location_id
FROM employees e, departments d, locations l
WHERE e.`department_id` = d.`department_id`
AND d.`location_id` = l.`location_id`;


非等值连接

SELECT e.last_name, e.salary, j.grade_level
FROM employees e, job_grades j
#where e.`salary` between j.`lowest_sal` and j.`highest_sal`;
WHERE e.`salary` >= j.`lowest_sal` AND e.`salary` <= j.`highest_sal`;

    

自连接

# 查询员工id,员工姓名及其管理者的id和姓名,在1张表中查询
SELECT emp.employee_id, emp.last_name, mgr.employee_id, mgr.last_name
FROM employees emp, employees mgr
WHERE emp.`manager_id` = mgr.`employee_id`;


内外连接

# 内连接:合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
SELECT employee_id, department_name
FROM employees e, departments d
WHERE e.`department_id` = d.department_id;  
 
# SQL99语法实现内连接:
SELECT last_name, department_name
FROM employees e INNER JOIN departments d
ON e.`department_id` = d.`department_id`;
 
# 多个表内连接 inner join on 可省略inner
SELECT last_name, department_name, city
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`
JOIN locations l
ON d.`location_id` = l.`location_id`;
 
# 外连接:合并具有同一列的两个以上的表的行, 结果集中除了包含一个表与另一个表匹配的行之外,还查询到了左表 或 右表中不匹配的行
# 外连接的分类:左外连接、右外连接、满外连接
# 左外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左表中不满足条件的行,这种连接称为左外连接
# 右外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回右表中不满足条件的行,这种连接称为右外连接
 
# 错误写法
# SQL92语法实现外连接:MySQL不支持SQL92语法中外连接的写法,如下案例不支持
SELECT employee_id, department_name
FROM employees e, departments d
WHERE e.`department_id` = d.department_id(+);
 
# SQL99语法中使用 JOIN ...ON 的方式实现多表的查询。这种方式也能解决外连接的问题。MySQL是支持此种方式的
 
# SQL99语法实现外连接:
# 查询所有的员工的last_name,department_name信息 
# 左外连接:
SELECT last_name, department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`;
 
# 右外连接:
SELECT last_name, department_name
FROM employees e RIGHT OUTER JOIN departments d
ON e.`department_id` = d.`department_id`;
 
# 错误写法
# 满外连接:mysql不支持FULL OUTER JOIN的写法,如下案例不支持
SELECT last_name, department_name
FROM employees e FULL OUTER JOIN departments d
ON e.`department_id` = d.`department_id`;


sql joins



UNION 和 UNION ALL 的使用

# UNION:会执行去重操作
# UNION ALL:不会执行去重操作
 
# 7种JOIN的实现:
# 中图:内连接
SELECT employee_id, department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`;
 
# 左上图:左外连接
SELECT employee_id, department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`;
 
# 右上图:右外连接
SELECT employee_id, department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
 
# 左中图:
SELECT employee_id, department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL;
 
# 右中图:
SELECT employee_id, department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;
 
# 左下图:满外连接
# 方式1:左上图 UNION ALL 右中图
SELECT employee_id, department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
UNION ALL
SELECT employee_id, department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;
 
# 方式2:左中图 UNION ALL 右上图
SELECT employee_id, department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id, department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
 
# 右下图:左中图 UNION ALL 右中图
SELECT employee_id, department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id, department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;


新特性

# SQL99语法的新特性1:自然连接
# 原始写法
SELECT employee_id, last_name, department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`
AND e.`manager_id` = d.`manager_id`;
 
# 新写法
# NATURAL JOIN 它会帮你自动查询两张连接表中`所有相同的字段`,然后进行`等值连接`
SELECT employee_id, last_name, department_name
FROM employees e NATURAL JOIN departments d;
 
# SQL99语法的新特性2:USING
# 原始写法
SELECT employee_id, last_name, department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id;
 
# 新写法
SELECT employee_id, last_name, department_name
FROM employees e JOIN departments d
USING (department_id);
 
# 拓展:使用内连接
SELECT last_name, job_title, department_name 
FROM employees INNER JOIN departments INNER JOIN jobs 
ON employees.department_id = departments.department_id 
AND employees.job_id = jobs.job_id;


http://www.savh.cn/thread-1618.htm

转载请注明:Savh.Cn 发表

推荐阅读
最新动态 (0)

    ( 登录 ) 后,可以发表评论!

    返回