欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql 第四天(外连接和子查询)

程序员文章站 2022-05-29 16:42:02
...

#外连接(分主从表) /* 应用场景:用于查询一个表中有,另一个表中没有的(经常作用于交集) 特点: 1,外连接的查询结果为主表中的所有记录 如果从表中有和他匹配的则显示匹配的值 反之显示null
外连接查询结果=内连接结果+主表中而从表没有的记录 2,左外连接:left join左边的是主表
右外连接:right join右边的是主表 3,左外和右外交换两个表的顺序可以实现同样的效果 4,全外连接=内连接的结果+表1有但表2没有的+表2有但表1没有的
*/

#引入“查询男朋友不在男神表的女神名_______>>>>>>>左外连接
SELECT b.name
FROM beauty b
LEFT JOIN boys bo
ON b.boyfriend_id=bo.id
WHERE bo.id IS NULL;#主键
#右外连接:
SELECT b.name
FROM boys bo 
RIGHT JOIN beauty b
ON b.boyfriend_id=bo.id
WHERE bo.id IS NULL;#主键

#查询哪个部门没有员工
SELECT d.department_name
FROM departments d
LEFT JOIN employees e
ON d.department_id=e.department_id
WHERE e.employee_id IS NULL;

#全外
SELECT b.*,bo,*
FROM beauty b
FULL JOIN boys bo
ON b.boyfriend=bo.id;

#交叉连接: 代表笛卡尔积
USE girls
SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;

#进阶7:子查询 /* 含义: 出现在其他语句中的select语句,成为子查询(嵌套查询) 外部的查询欲哭,称为主查询,先执行子查询,利用子查询的结果主查询来利用

分类: 按子查询出现的位置: select后 ——————用的少 表我子查询(结果无定义) 标量子查询 from后
表子查询 where或having后❤❤❤❤❤❤ 标量子查询,√ 列子查询 √ exists后(相关子查询)
表子查询 按结果的行列不同: 标量子查询(结果只有一行一列) 列子查询(结果集一列多行) 行子查询(结果一行多列)
——————用的少 表我子查询(结果无定义)
*/

#where或having后❤❤❤❤❤❤ 标量子查询(单行子查询) 列子查询 行子查询 特点: ①子查询放在小括号内 ②子查询一边放在条件的右侧 ③标量子查询,一般搭配行操作符使用: >< >= <= <> =
④列子查询,一般搭配多行操作符使用:in ,any/SOME ,all

#标量子查询
#eg1,谁的工资比Abel高
SELECT first_name
FROM employees
WHERE salary>(
	SELECT salary
	FROM  employees
	WHERE last_name='Abel' 
)   


#eg2:返回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'	
)

#eg3:返回公司工资最少的员工的last_name,job_id,salary
SELECT last_name,job_id,salary
FROM employees
WHERE salary=(
	SELECT MIN(salary)
	FROM employees
)


SELECT *
FROM employees;

#eg4:查询最低工资大于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
);

#列子查询(多行子查询)
#案例1:返回location_id是1400或1700的部门中的所有员工姓名:
#外连接:(查询速度比上更快)
1,查询location_id是14001700的部门编号
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN(1400,1700)

2,查询员工姓名,要求部门号是1列表中的某一个
SELECT last_name
FROM employees
WHERE department_id IN (
	SELECT DISTINCT department_id
	FROM departments
	WHERE location_id IN(1400,1700)
);

#案例2:返回其他工种中比job_id为'IT_PROG'部门任一工资低的员工的员工号,姓名,job_id以及salary

#1查询job_id为'IT_PROG'部门任一工资
SELECT salary
FROM employees
WHERE job_id='IT_PROG';
#2,查询员工号,姓名,job_id以及salary<1的任意一个
SELECT employee_id,last_name,job_id,salary
FROM employees 
WHERE salary<ANY(
	SELECT DISTINCT salary
	FROM employees
	WHERE job_id='IT_PROG'
)AND job_id!='IT_PROG';

或者用max代替
SELECT employee_id,last_name,job_id,salary
FROM employees 
WHERE salary<(
	SELECT DISTINCT MAX(salary)
	FROM employees
	WHERE job_id='IT_PROG'
)AND job_id!='IT_PROG';

#行子查询(结果集一行多列或多行多列)
#eg:查询员工编号最小并且工资最高的员工信息

SELECT *
FROM employees 
WHERE (employee_id,salary)=(
	SELECT MIN(employee_id),MAX(salary)
	FROM employees
)

SELECT *
FROM employees 
WHERE employee_id=(
	SELECT MIN(employee_id)
	FROM employees 	
)AND salary=(
	SELECT MAX(salary)
	FROM employees 	
);

#二,select后面
#查询每个部门的员工个数
SELECT d.*,(
	SELECT COUNT(*)
	FROM employees 	e
	WHERE e.department_id=d.department_id
)个数
FROM departments d;


#eg2:查询员工号=102的部门名


	SELECT department_name
	FROM departments d
	LEFT JOIN employees e
	ON e.department_id=d.department_id
	WHERE e.employee_id=102;
#三,from后
#1:查询每个部门的平均工资的工资等级
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id;
#2连接1的结果集合job_grades表,筛选条件工资在最低和最高之间
SELECT DISTINCT ag_dep.*, g.grade_level
FROM (
	SELECT AVG(salary) ag,department_id
	FROM employees
	GROUP BY department_id
) ag_dep 
INNER JOIN job_grades g
ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;

#四,相关子查询
EXISTS:相当于bool只关心()有无
SELECT EXISTS (SELECT * FROM employees);
#案例一:查询员工名的部门名
SELECT department_name
FROM departments d
WHERE EXISTS(
	SELECT *
	FROM employees e
	WHERE d.department_id=e.department_id
	);
	
	

续:

相关标签: mysql

上一篇: node.js和npm

下一篇: Mysql第四天