Mysql数据库常用语句——隐式内连接/显式外连接/左外连接/右外连接/子连接

Mysql数据库常用语句——创建数据库/表_yopky的博客-CSDN博客
Mysql数据库常用语句——插入/更改/删除数据_yopky的博客-CSDN博客
 

新增一张表

-- 新增一张工资表wage
CREATE TABLE wage(
			wid INT PRIMARY KEY AUTO_INCREMENT,
			wage_level VARCHAR(30),
			wage_money VARCHAR(30));
			
INSERT INTO wage (wage_level,wage_money) VALUES ('1级','9000-8000'),('2级','7000-6000'),('3级','5000-4000'),('4级','3000-2000');
SELECT * FROM wage

-- employee 新增一列wage_id
ALTER TABLE employee ADD wage_id INT;

-- 插入wage_id数据
UPDATE employee SET wage_id = 1 where eid in (2,6,8,13);
UPDATE employee SET wage_id = 2 where eid in (1,5,10,14);
UPDATE employee SET wage_id = 3 where eid in (3,6,8,12);
UPDATE employee SET wage_id = 4 where eid in (4,5,11,15);

内连接查询

内连接

通过指定条件匹配2张表的数据,匹配上就显示,匹配不上就不显示

隐式内连接

隐式内连接:FROM后面直接写多个表名,使用where指定连接条件的连接方式

查询所有的员工信息及所在部门

-- 查询所有的员工信息及所在部门
SELECT * FROM employee,department where dept_id = id;

-- 查询员工名字及所在部门
SELECT e.ename,d.dep_name FROM employee e,department d WHERE e.dept_id= d.id


-- 查询黄二属于哪个部门
SELECT e.eid,e.ename,d.dep_name FROM employee e,department d WHERE e.dept_id=d.id AND e.ename='黄二'

显式内连接

显式内连接:使用INNER JOIN..ON 这种方式

两表显式内连接查询

-- 查询所有员工信息及对应的部门信息

SELECT * FROM employee e INNER JOIN department d ON e.dept_id=d.id ORDER BY e.eid

查询年龄小于于40的员工信息,包括部门跟工资级别

三表显式内连接查询

-- 查询年龄小于于40的员工信息,包括部门跟工资级别
-- 三表显式内连接查询
SELECT e.ename,d.dep_name,w.wage_level FROM (employee e INNER JOIN department d ON e.dept_id=d.id) INNER JOIN wage w ON e.wage_id=w.wid WHERE e.age<40
SELECT * from employee WHERE age<40;

左外连接查询

左外连接:使用LEFT OUTER JOIN

1.已左表为基准,匹配右边表中的数据,如果匹配得上,就展示匹配到的数据

2.如果匹配不到,左表的数据正常展示,右边的展示为NULL

-- department添加一条数据
INSERT into department (dep_name,dep_location) VALUES ('运营部','上海')

-- 2表左外连接
SELECT * FROM employee e LEFT JOIN department d ON e.dept_id=d.id;

SELECT * FROM department d LEFT JOIN employee e ON e.dept_id=d.id;

 示例代码:

-- 3表左外连接
SELECT * FROM (employee e LEFT JOIN department d ON e.dept_id=d.id) LEFT JOIN wage w ON e.wage_id=w.wid ORDER BY e.eid

-- 查询每个部门有多少人
SELECT d.dep_name AS '部门',COUNT(e.ename) As '人数' FROM employee e LEFT JOIN department d ON e.dept_id=d.id GROUP BY e.dept_id

-- 查询每个部门有多少人不包括没部门的
SELECT d.dep_name AS '部门',COUNT(e.ename) As '人数' FROM employee e LEFT JOIN department d ON e.dept_id=d.id WHERE e.dept_id IS NOt NULL GROUP BY e.dept_id

右外连接查询

右外连接:使用RIGHT OUTER JOIN

1.已右表为基准,匹配左边表中的数据,如果匹配得上,就展示匹配到的数据

2.如果匹配不到,右表的数据正常展示,左边的展示为NULL

-- 右外连接
SELECT * FROM department d RIGHT JOIN employee e ON d.id=e.dept_id;

子查询

一条select查询语句的结果,作为另一条select语句的一部分

-- 子查询
-- 通过子查询,查询员工年龄最大的员工信息
SELECT * FROM employee WHERE age = (SELECT MAX(age) FROM employee)

-- 查询产品部的所有人的信息
-- 方法一:子连接
SELECT * FROM employee e WHERE e.dept_id = (SELECT d.id FROM department d WHERE d.dep_name='产品部')
-- 方法二:左连接
SELECT * FROM employee e LEFT JOIN department d ON e.dept_id=d.id WHERE d.dep_name='产品部' 

-- 查询小于平均年龄的员工信息
SELECT * FROM employee WHERE age<(SELECT AVG(age) FROM employee)

-- 查询小于平均年龄的员工信息,包括部门及工资级别信息
SELECT e.ename,d.dep_name,w.wage_level FROM (employee e LEFT JOIN department d ON e.dept_id=d.id) LEFT JOIN wage w ON e.wage_id=w.wid WHERE age < (SELECT AVG(age) FROM employee)

-- 查询年龄小于40的员工来自哪个个部门
-- 方法一:子查询使用IN获得单列多行数据
SELECT * FROM department d WHERE d.id IN (SELECT DISTINCT e.dept_id FROM employee e WHERE e.age <40);

-- 方法二:
SELECT DISTINCT d.id,d.dep_name FROM employee e LEFT JOIN department d ON e.dept_id = d.id WHERE e.age < 40

-- 查询‘行政部’与‘开发部’下面的全部员工信息
-- 方法一:
SELECT * FROM employee WHERE dept_id IN (SELECT id FROM department WHERE dep_name IN ('行政部','开发部'))

-- 方法二:
SELECT * FROM employee e LEFT JOIN department d ON e.dept_id=d.id WHERE d.dep_name IN ('行政部','开发部')

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值