1.sql99语法剩余内容
#2,非等值连接
#案例1:查询员工的工资级别
SELECT e.`salary`,j.`grade_level`
FROM employees AS e JOIN job_grades AS j
ON e.`salary` BETWEEN j.`lowest_sal` AND j.`highest_sal`;
#案例2:查询每个工资级别员工个数大于20的个数,并按照工资级别排序
SELECT COUNT(*),j.`grade_level`
FROM employees AS e JOIN job_grades AS j
ON e.`salary` BETWEEN j.`lowest_sal` AND j.`highest_sal`
GROUP BY j.`grade_level`
HAVING COUNT(*)>20
ORDER BY j.`grade_level` DESC;
#3.自连接
#查询员工名和其上级名,其中员工名包含k
SELECT e.`last_name` AS 员工名,m.`last_name` AS 上级名
FROM employees AS e JOIN employees AS m
ON e.`manager_id`=m.`employee_id`
WHERE e.`last_name` LIKE '%k%';
#二.外链接
/*
应用场景,实现一个表有,一个表没有的情况
1.特点:外连接的查询结果为主表中所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接的查询结果等于内连接结果+主表中有而从表中没有的记录
2.左外连接,left左边是主表
右外连接,right join右边的是主表
3.左外和右外交换两个表的顺序可以达到同样的效果
4.全外连接=内连接+表1NULL+表2NULL,sql99没有
*/
#左外连接
2.子查询部分内容
#子查询
/*
含义:出现在其他语句中的select语句,称为子查询或内查询
外部的查询语句,称为主查询或外查询
分类:
按子查询的出现位置:
select后面:仅仅支持标量子查询
from后面:支持表子查询
where或having后面:支持标量子查询、列子查询、行子查询
exists(相关子查询):表子查询
按结果集的行列数不同:
标量子查询(结果集还有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有一行多列)
表子查询(结果集一般为多行多列)
*/
#一、where或having后面
/*1、标量子查询(单行子查询)
2、列子查询
3、行子查询(多列多行)
特点:1、子查询放在小括号内
2、子查询一般放在条件的右侧
3、标量子查询,一般搭配单行操作符> < = <= >=
4、列子查询,一般搭配多行操作符使用
in any/some all
5、子查询的执行优先于主查询,主查询的条件用到了子查询的结果
*/
#1,标量子查询
#案例1:谁的工资比Abel高?
SELECT *
FROM employees
WHERE salary >(
SELECT salary
FROM employees
WHERE last_name ='Abel'
);
#案例2:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资
SELECT last_name,job_id,salary
FROM employees
WHERE job_id=(SELECT job_id FROM employees WHERE employee_id=141)
AND salary>(SELECT salary FROM employees WHERE employee_id=143);
#案例3:返回公司工资最少的员工的last_name,job_id和salary
SELECT last_name,job_id,salary
FROM employees
WHERE salary=(SELECT MIN(salary) FROM employees);
#案例4:查询最低工资大于50号部门的最低工资的部门id和其最低工资
SELECT department_id,MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary)>(
SELECT MIN(salary)
FROM employees
WHERE department_id=50
GROUP BY department_id);
3.明日计划,子查询剩余内容,联合查询,库、表相关操作