sq99语法跟sq92语法要区分开来
SELCET 查询列表
FROM 表一 别名1 【连接类型】
JOIN 表二 别名2
ON 连接条件
【WHERE 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序条件】
内连接 inner
外连接:左外 lef outer,右外right outer,全外full outer。
交叉连接
等值连接
假设有一个表格,上面有employees,location,apartment,包含有员工,地点,部门等信息
case1 查询员工名,部门名
SELECT last_name,department_name
FROM department d
INNER JOIN employees e #表示内连接
ON e.'department_id' = d.'department_id';
case 2 查询名字中包含e 的员工名和工种名
SELECT job_title,last_name
FROM employees e
INNER JOIN jobs j
ON e.'job_id' = j.'job_id';
WHERE e.'last_name' LIKE '&e&'; #模糊匹配
case 3 查询部门个数大于3的城市名和部门个数,这里增加啦一个分组后查询
SELECT city,count(*) 部门个数
RROM location l
INNER JOIN department d
ON l.'location_id' = d.'location_id' #连接条件
GROUP BY city #先筛选城市
HAVING count(*) >3
ORDER BY COUNT(*) DESC; #按照个数排序,降序
当有n个表的时候,需要n-1个条件,n个表 的时候,连接顺序由变化,需要一个可以和大多数表可以连接的
SELECT 所需要的数据
FROM 表1
INNER JOIN 表2 ON 表一个表2相等的内容
INNER JOIN 表3 ON 表一个表3相等的内容
INNER JOIN 表n ON 表一个表n相等的内容
非等值连接
情景:当你想要筛选期末考试学生成绩的级别的时候,比如大于90分为A,80-90为B,70-80为C这类的问题,就可以用非等值查询。
设学生成绩表为STU_SCORE 成绩比对表为SCORE
成绩比对表
成绩分级 | 最高成绩 | 最低成绩 |
A | 100 | 90 |
B | 90 | 80 |
C | 80 | 70 |
SELECT stu_score 成绩,fenji
FROM STU_SCORE s
INNER JOIN chengjibiao c ON s.'STU_SCORE' between c.'lower' and c.'high'
GROUP BY STU_SCORE;
显示大致结果
成绩 | fenji |
95 | A |
88 | B |
82 | B |
79 | C |
自连接
自连接就是通过一个表中的两个互相有联系的内容进行筛选查询,比如学校中的学生和导师查询,员工与上级查询,适合于同一张表两个栏目出现相同的内容适合查询。
case 查询班上有姓李的同学主管老师的名字
#case
SELECT s.last_name,t.last_name
FROM classmate c
JOIN classmate t
ON c.'teacher_id' = t.'manager_id'
WHERE s.last_name LIKE '&李&'
外连接
用于查询一个表有,另外一个表没有的表,是求两个表的差集
主要应用场景: 1.外连接的查询结果为主表中所有记录
如果从表中有和它匹配的,显示匹配的值
如果从表中没有匹配的,显示null
外连接查询结果=内连接结果+主表中有而从表中没有的。、
左外连接:left join 左边的是主表反正,右外连接右边是主表
case1查询部门没有员工
#左外
SELECT d.*,e.employee_id
FROM department d
RIGHT OUTER JOIN employee e
ON d.'department_id' = e.'deparetment_id'
WHERE e.employee_id IS NULL;
全外连接
目前MySQL不支持,出现情况是查询两个表的交集部分,没有的用NULL填充,外连接结果,以及表一和表二中互相没有的内容。