第三章 分组查询、连接查询
一、分组查询
查询列表必须有分组函数和group by后面的字段
基本语法:
Select 分组函数,列(必须出现在group by后面)
From 表
Where 筛选条件
Group by 分组列表
Having 分组后的筛选
Order by 排序列表
例: Select max(salary),job_id
From employee
Group by job_id
分组查询的筛选条件有两类:
① 分组前筛选:筛选数据源是原始表,放在group by子句前面,使用关键字where
② 分组后筛选:筛选数据源是分组后的结果集,放在group by子句后面,使用关键字
Having。
注意:分组函数做条件时关键字必须用having
敲黑板:语句执行顺序:①from ②where ③group by ④having ⑤select ⑥orderby
二、连接查询
当要查询的字段来自多个表时,需要用连接查询
1. 连接查询按功能分类
内连接
等值连接
非等值连接
自连接
外连接
左外连接
右外连接
全外连接
交叉连接
2. 内连接
SQL92语法和99语法都支持内连接
1) 等值连接
要连接查询的两个表里有相同列,利用此列将其连接
例:92语法:
Select last_name,department_id
From employees,department
Where employees .department_id= employees. department_id
99语法:表1 inner join 表2 on 相同字段
Select last_name,department_id
From employees
inner join department
on employees .department_id= employees. department_id
这两个原理和执行效率完全相同
2)非等值连接
要连接查询的两个表里没有相同列,但有相互关联列,利用两列之间的关系将其连接
例:92语法:
Select salary,grade_level
From employees,job_grades
Where salary between job_grades.lowest_sal and job_grades.hightest_sal;
99语法:
Select salary,grade_level
From employees
inner join job_grades
on salary between job_grades.lowest_sal and job_grades.hightest_sal;
3)自连接
只涉及一个表,自己连接自己。
例:92语法:
Select e.employee_id, e.last_name, e.manager_id, m.last_name
FROM employees e,employees m
Where e.manager_id=m.employee_id;
99语法:
Select e.employee_id, e.last_name, e.manager_id, m.last_name
FROM employees e
Inner join employees m
On e.manager_id=m.employee_id;
3. 外连接
用于查询一个表中包含,另一个表中不包含的情况。
外连接的查询结果为主表中的所有记录,如果从表中有和它匹配的,则显示匹配的值,如果没有,则显示null。即:外连接结果=内连接结果+主表中有而从表中没有的记录。
基本语法:
Select 查询列表
From 表1 【连接类型】join 表2
On 连接条件
Where筛选条件
Group by 分组
Having 筛选条件
Order by 排序
1)左外连接
左边的表作为主表,右边的表为从表,保留主表中所有内容,左表中包含,右中不包含的用null代替。
例:
Select *
From department
Left join employee
On department. department _id= employee. department _id;
右边的表作为主表,左边的表为从表,保留主表中所有内容,右表中包含,左中不包含的用null代替。 左外连接和右外连接交换两个表的顺序,可以实现同样的效果
例:
Select *
From employee
Right join department
On department. department _id= employee. department _id;
全外连接=内连接结果+表1有但表2没有+表2有但表1没有
例:
Select *
From department
Full join employee
On department. department _id= employee. department _id;
交叉连接结果即笛卡尔积。笛卡尔积:由没有连接条件的表关系返回的结果为笛卡尔积,检索出的行的数目将是第一个表中的行数乘以第二个表的行数。
例:
Select *
From department
Cross join employee
5)其他常用情况
查询主表中包含,从表中不包含的情况,即在左/右外连接基础上添加条件