Sql多表查询

多表查询的分类:

在这里插入图片描述

多表查询的语法

select
	字段列1,
	字段列2,
	...
from
	表名1,
	表名2,
	...
where
	...

由于在数据库查询中需要涉及到多张表的查询,但是在多表查询过程会出现笛卡尔积问题。

笛卡尔积的概念:
如有两个集合A,B取这两个集合的所有组成情况,但是笛卡尔积中会出现我们不需要的数据,所以要完成多表查询,就需要消除无用的数据存在。

消除无用的数据就需要涉及到:

  • 内连接查询
  • 外连接查询
  • 子查询

内连接查询

内连接查询分为:隐式内连接查询和显示内连接查询

隐式内连接查询

隐式内连接语法:

隐式内连接语法:
select 
	字段列1,
	字段列2,
	...
from1,2,
	 ...
where
	 条件;

显示内连接查询
显示内连接查询语法:

显示内连接语法:
select
	 字段列1,
	 字段列2,
	 ...
from1,innerjoin2 
on 
	条件

注意是:隐式内连接是不会出现join和on关键字的,而显示内连接而不会出现where关键字;并且inner关键可以省略不写

数据准备区

CREATE TABLE dept(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(32) NOT NULL
);

CREATE TABLE emp(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(32) NOT NULL,
	gender CHAR(5), -- 性别
	salary DOUBLE, -- 工资
	join_date DATE ,-- 入职日期
	dept_id INT ,
	
	FOREIGN KEY (dept_id) REFERENCES dept (id)
);

INSERT INTO dept (NAME) VALUE('开发部'),('市场部'),('财务部');
SELECT * FROM dept;
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男
',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男
',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',
9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女
',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女
',4500,'2011-03-14',1);
SELECT * FROM emp;

隐式内连接查询区

例子:
1.查询所有员工的信息和对应的部门信息
2.查询员工的名称,性别,部门表的名称
3.查询员工的名称,性别,部门表的名称(标准写法)

-- 查询所有员工信息和对应的部门信息
SELECT * FROM emp,dept WHERE emp.`dept_id`=dept.id;

-- 查询员工表的名称,性别,部门表的名称
SELECT emp.name,emp.`gender`,dept.`name` FROM emp,dept WHERE emp.`dept_id`=dept.`id`;

-- 查询员工表的名称,性别,部门表的名称(由于上述写法不标准,如果表名太长,不方便所以最好起别名)

SELECT 
	e1.`name`,	-- 员工名称
	e1.`gender`,	-- 员工表性别
	d1.`name`	-- 部门名称
FROM
	emp e1,   -- 员工表,起别名为e1
	dept d1   -- 部门表,起别名为d1
WHERE 
	e1.`dept_id`=d1.`id`;

显示内连接查询区

例子:
1.查询所有员工的信息和对应的部门信息
2.查询员工的名称,性别,部门表的名称
3.查询员工的名称,性别,部门表的名称(标准写法)
4.确定查询字段,查询唐僧的信息,显示员工 id,姓名,性别,工资和所在的部门名称
5.我们发现写表名有点长,可以给表取别名,显示的字段名也使用别名


-- 查询所有员工信息和对应的部门信息
SELECT * FROM emp INNER JOIN dept ON  emp.`dept_id`=dept.`id`;

-- 显示内链接查询
-- 查询所有员工的信息和对应部门信息
SELECT * FROM emp JOIN dept ON emp.`dept_id`=dept.`id`;

-- 查询所有员工的名称,性别,部门表名称
SELECT emp.`name`,emp.`gender`,dept.`name` FROM emp JOIN dept ON emp.`dept_id`=dept.`id` ;
-- 查询所有员工的名称,性别,部门表名称(标准写法)
SELECT 
	e1.name,	-- 员工名称
	e1.gender,	-- 员工性别
	d1.name		-- 部门名称
FROM 	
	emp e1		-- 员工表,别名e1
JOIN	
	dept d1		-- 部门表,别名d1
	
ON	
	e1.`dept_id`=d1.`id`;
	
-- 确定查询字段,查询唐僧的信息,显示员工 id,姓名,性别,工资和所在的部门名称
SELECT e.id,e.name,e.gender,e.salary,d.name FROM emp e JOIN dept d ON e.`dept_id`=d.`id` WHERE e.`name`="孙悟空";
-- 我们发现写表名有点长,可以给表取别名,显示的字段名也使用别名
SELECT
	 e.id 员工编号 ,
	 e.name 员工姓名,
	 e.gender 性别,
	 e.salary 工资,
	 d.name 部门名称
 FROM 
 	emp e 
JOIN
	 dept d
ON
	 e.`dept_id`=d.`id`
WHERE
	 e.`name`="孙悟空";

综合练习区:

-- 例子:查询唐僧的id,性别,姓名,工资和所在部门名称
/*
	唐僧的id,姓名,姓名和工资需要用到emp表,部门名称需要用到dept表
	条件
	name='唐僧'
	emp.dept_id=dept.id
*/
-- 使用隐式查询
SELECT 
	emp.id,
	emp.`gender`,
	emp.`name`,
	emp.`salary`,
	dept.`name`
FROM 
	emp,
	dept
WHERE 
	emp.`dept_id`=dept.`id`
		AND
	emp.`name`='唐僧';
	
-- 使用显示查询
/*
	唐僧的id,姓名,姓名和工资需要用到emp表,部门名称需要用到dept表
	条件
	name='唐僧'
	emp.dept_id=dept.id
*/
SELECT 
	emp.id,
	emp.`name`,
	emp.`gender`,
	emp.`salary`,
	dept.`name`
FROM
	emp
JOIN	
	dept
ON
	emp.`name`='唐僧' 
		AND
	emp.`dept_id`=dept.`id`;

总结内连接查询步骤:

  1. 确定查询哪些表
  2. 确定表连接的条件
  3. 确定查询的条件
  4. 确定查询的字

注意还有外连接查询和子查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值