MySQL多表查询详解下

  好好吃饭,好好休息,听着很简单,实际落实缺失不那么容易。

继续回顾MySql的多表查询之1999语法

#二,SQL1999语法
语法:
 SELECT 查询列表
 FROM 表1 别名 【连接类型】
 JOIN 表2 别名
 ON 链接条件
 【WHERE 筛选条件】
 【GROUP BY 分组】
 【HAVING 筛选条件】
 【ORDER BY 排序列表ASC|DESC】

分类(连接类型):
 内连接(★): INNER
 外联结
 左外(★):LEFT 【OUTER】
 右外(★):RIGHT 【OUTER】
 全外:FULL 【OUTER】
 交叉连接:CROSS

===============================================================================

一、内连接
语法:
 SELECT 查询列表
 FROM 表1 别名
 INNER JOIN 表2 别名
 ON 连接条件
 【WHERE 筛选条件】
 【GROUP BY 分组】
 【HAVING 筛选分组】
 【ORDER BY 排序列表 ASC|DESC】

分类:
 等值
 非等值
 自连接
 特点:
 ①添加排序,分组,筛选
 ②INNER可以省略
 ③筛选条件放在WHERE后面,连接条件放在ON后面,提高分离性,便于阅
 读。
 ④INNER JOIN连接和SQL1992语法中的等值连接效果是一样的,都是查
 询交集部分。
#1.等值连接
#案例1.查询员工名,部门名。交换连接条件不影响结果。
SELECT last_name AS 员工名,department_name AS 部门名
FROM employees e
INNER JOIN departments d
ON e.department_id=d.department_id;
SELECT last_name AS 员工名,department_name AS 部门名
FROM employees d
INNER JOIN departments e
ON e.department_id=d.department_id;

#案例2.查询名字中包含e的员工和工种名(筛选)
SELECT last_name AS 员工名,job_title AS 工种名
FROM employees e
INNER JOIN jobs j
ON e.job_id=j.job_id
WHERE e.last_name LIKE '%e%';

#案例3.查询部门个数>3的城市名和部门个数。(分组+筛选)
分步:先把每个城市的部门个数查出来,在筛选满足条件的。
SELECT city AS 城市,COUNT(*) AS 个数
FROM locations l
INNER JOIN departments d
ON l.location_id=d.location_id
GROUP BY city
HAVING COUNT(*) > 3;

#案例4.查询哪个部门员工个数>3的部门名和员工个数,并按个数降序排序。
分步:
1.查询每个部门的员工个数,
2.在上面的结果上筛选出员工数大于3的记录,
3.把员工数排序
SELECT COUNT(*) AS 员工个数,d.department_name AS 部门名
FROM employees e
INNER JOIN departments d
ON e.department_id=d.department_id
GROUP BY d.department_name
HAVING COUNT(*) > 3
ORDER BY 员工个数 DESC;

#案例5.查询员工名,部门名,工种名,并按部门名降序。三表连接注意条件。
SELECT last_name AS 员工名,department_name AS 部门名,
job_title AS 工种名
FROM employees e
INNER JOIN departments d
ON e.department_id=d.department_id
INNER JOIN jobs j
ON e.job_id=j.job_id
ORDER BY d.department_name DESC;

#2.非等值连接。范围(间接)
#案例1.查询员工的工资级别。
SELECT salary AS 月薪,grade_level AS 工资等级
FROM employees e
INNER JOIN job_grades g
ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;

#案例2.查询每个工资的级别的个数>20,并且按降序排列。
SELECT j.grade_level AS 等级,COUNT(*) 个数
FROM employees e
INNER JOIN job_grades j
ON e.salary BETWEEN j.lowest_sal AND j.highest_sal
GROUP BY j.grade_level
HAVING COUNT(*) > 20
ORDER BY 个数 DESC;

#3.自连接
#案例1.查询员工的名字,上级的名字。
SELECT e.last_name AS 员工名,m.last_name AS 上级名
FROM employees e
INNER JOIN employees m
ON e.manager_id=m.employee_id;

#案例2.查询员工的名字,上级的名字,名字中包含字符k。
SELECT e.last_name AS 员工名,m.last_name AS 上级名
FROM employees e
INNER JOIN employees m
ON e.manager_id=m.employee_id
WHERE e.last_name LIKE '%k%';

#二,外连接

应用场景:用于查询一个表中有,另一个表没有的记录。
特点:
1.外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表没有的记录
2.左外连接,LEFT JOIN左边的是主表
右外连接,RIGHT JOIN右边的是主表
3.左外和右外交换两个表的顺序,可以实现同样的效果。
4.全外连接=内连接的结果+表1中有但表2中没有的+表2中有但表一没有的(Mysql不支持)
引入:
SELECT * FROM beauty;
SELECT * FROM boys;

#引入:查询男朋友不在男神表的女神名
SELECT b.NAME,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id=bo.id;

#左外连接
SELECT b.NAME,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id=bo.id
WHERE bo.id IS NULL;
#选从表中的主键列
#右外连接,得到同样的结果。
SELECT b.NAME,bo.*
FROM boys bo
RIGHT OUTER JOIN beauty b
ON b.boyfriend_id=bo.id
WHERE bo.id IS NULL;

#把beauty表中的id为10行的boyfriend_id从4改到6.才能查询出如下结果。
SELECT b.*,bo.*
FROM boys bo
LEFT OUTER JOIN beauty b
ON b.boyfriend_id=bo.id
WHERE b.id IS NULL;

#案例1.哪个部门没有员工。
#左外写法
SELECT d.*,e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.department_id=e.department_id
WHERE e.department_id IS NULL;
==============================
#右外写法
SELECT d.*,e.employee_id
FROM employees e
RIGHT OUTER JOIN departments d
ON d.department_id=e.department_id
WHERE e.employee_id IS NULL;

#全外连接查出的结果有三部分组成(举例,Mysql不支持)语法结构演示
 先把两张表的交集查出来,在把缺失的填充查出来,在把其他无关联的查出来
 语法结构示例
SELECT b.*,bo.*
FROM beauty b
FULL OUTER JOIN boys bo
ON b.boyfriend_id=bo.id
#交叉连接,使用1999的语法标准实现的
笛卡尔乘积
SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;

#SQL1992语法 与 SQL 1999语法 相比
功能:SQL1999支持的较多
可读性:SQL1999实现连接条件和筛选条件的分离,可读性提高

总结:

SELECT <select_list>
FROM A
INNER JOIN B
ON A.KEY=B.KEY;

SELECT <select_list>
FROM A
LEFT JOIN B
ON A.KEY=B.KEY;

SELECT <select_list>
FROM A
RIGHT JOIN B
ON A.KEY=B.KEY;

SELECT <select_list>
FROM A
LEFT JOIN B
ON A.KEY=B.KEY
WHERE B.KEY IS NULL;

SELECT <select_list>
FROM A
RIGHT JOIN B
ON A.KEY=B.KEY
WHERE A.KEY IS NULL;

SELECT <select_list>
FROM A
FULL JOIN B
ON A.KEY=B.KEY;

SELECT <select_list>
FROM A
FULL JOIN B
ON A.KEY=B.KEY
WHERE A.KEY IS NULL
OR B.KEY IS NULL;

  简单的多表查询已结束,相信看到这里的基本对简单多表连接应该手到擒来,至于看不懂的emmm...

用我们杨老师的话就是,自己去写个二三十遍就有感觉了。o(^▽^)o。

高考结束,大学生活的开始,世界是属于你们的倒计时开启了...不管你们选择什么专业,只要是你自己选择的,一定要相信自己会在这个专业留下一笔....。

到此这篇关于MySQL多表查询详解下的文章就介绍到这了,更多相关MySQL多表查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL多表查询实例详解【链接查询、子查询等】

    本文实例讲述了MySQL多表查询.分享给大家供大家参考,具体如下: 准备工作:准备两张表,部门表(department).员工表(employee) create table department( id int, name varchar(20) ); create table employee( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'ma

  • 浅谈MySQL使用笛卡尔积原理进行多表查询

    MySQL的多表查询(笛卡尔积原理) 先确定数据要用到哪些表. 将多个表先通过笛卡尔积变成一个表. 然后去除不符合逻辑的数据(根据两个表的关系去掉). 最后当做是一个虚拟表一样来加上条件即可. 注意:列名最好使用表别名来区别. 笛卡尔积 Demo: 左,右连接,内,外连接 l 内连接: 要点:返回的是所有匹配的记录. select * from a,b where a.x = b.x ////内连接 l 外连接有左连接和右连接两种. 要点:返回的是所有匹配的记录 外加 每行主表外键值为null的

  • 详解MySQL数据库--多表查询--内连接,外连接,子查询,相关子查询

    多表查询 使用单个select 语句从多个表格中取出相关的查询结果,多表连接通常是建立在有相互关系的父子表上; 1交叉连接 第一个表格的所有行 乘以 第二个表格中的所有行,也就是笛卡尔积 创建一个消费者与顾客的表格: 代码如下: -- create table customers( -- id int primary key auto_increment, -- name VARCHAR(20)not null, -- address VARCHAR(20)not NULL -- ); -- C

  • MySQL多表查询详解上

    时光在不经意间,总是过得出奇的快.小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊.在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由我继续带你回顾MySql的知识吧! 回顾练习资料girls库以及两张表的脚本: 链接: https://pan.baidu.com/s/1bgFrP7dBBwk3Ao755pU4Qg 提取码: ihg7 引题:笛卡尔现象,先来观看一下两张表. SELECT * FROM boys; SELECT *

  • 解析Mysql多表查询的实现

    查询是数据库的核心,下面就为您介绍Mysql多表查询时如何实现的,如果您在Mysql多表查询方面遇到过问题,不妨一看.Mysql多表查询: 复制代码 代码如下: CREATE TABLE IF NOT EXISTS contact( contact_id int(11) NOT NULL AUTO_INCREMENT, user_name varchar(255), nom varchar(255), prenom varchar(255), mail varchar(64), passcode

  • MySQL左联多表查询where条件写法示例

    复制代码 代码如下: select * from _test a left join _test b on a.id=b.id where a.level='20' and a.month='04' and b.level='20' and b.month='03'; select a.*,b.* from (select * from _test where level='20' and month='04') as a left join (select * from _test where

  • MySQL 多表查询实现分析

    我们继续使用前面的例子.前面建立的表中包含了员工的一些基本信息,如姓名.性别.出生日期.出生地.我们再创建一个表,该表用于描述员工所发表的文章,内容包括作者姓名.文章标题.发表日期. 1.查看第一个表 mytable 的内容: mysql> select * from mytable; +----------+------+------------+-----------+ | name | sex | birth | birthaddr | +----------+------+-------

  • MySQL多表查询详解下

    好好吃饭,好好休息,听着很简单,实际落实缺失不那么容易. 继续回顾MySql的多表查询之1999语法 #二,SQL1999语法 语法: SELECT 查询列表 FROM 表1 别名 [连接类型] JOIN 表2 别名 ON 链接条件 [WHERE 筛选条件] [GROUP BY 分组] [HAVING 筛选条件] [ORDER BY 排序列表ASC|DESC] 分类(连接类型): 内连接(★): INNER 外联结 左外(★):LEFT [OUTER] 右外(★):RIGHT [OUTER] 全

  • MySQL数据库查询进阶之多表查询详解

    目录 一.多表查询 1.引出 2.笛卡尔积 3. 笛卡尔积的解决方法 二.多表查询分类 1.等值连接和非等值连接 2.自连接和非自连接 3.内连接和外连接 4.UNION 4.自然连接 5.using连接 三.子查询 1.不相关子查询 2.相关子查询 四.聚合函数 1.聚合函数介绍 1.1 AVG和SUM函数 1.2 MIN和MAX函数 1.3 COUNT函数 2.group by 3.使用having进行分组后的筛选 五.where和having的对比 六.select的执行过程 1.关键字顺

  • MySQL 四种连接和多表查询详解

    目录 MySQL 内连接.左连接.右连接.外连接.多表查询 构建环境: 一.INNER JION 内连接 ( A ∩ B ) 二.LEFT JOIN 左外连接( A 全有 ) 三.RIGHT JOIN 右外连接 (B 全有) 四.FULL JOIN 全外连接( A + B) 五.LEFT Excluding JOIN ( A - B 即 A 表独有)+ 六.RIGHT Excluding JOIN ( B - A 即 B表独有) 七.OUTER Excluding JOIN (A 与 B 各自独

  • Java MyBatis 多表查询详解

    目录 多表查询: 一对一: 一对多: 多对多: 总结 多表查询: 学生表.班级表.课程表.班级课程表 一对一: 一个学生只属于一个班级. 查询: id  name  age  gender   banjiName SELECT s.id,s.`name`,s.age,s.gender,b.id AS banjiId,b.name AS banjiName FROM student AS s INNER JOIN banji AS b ON s.banji_id=b.id; MyBatis中使用a

  • MySQL的表分区详解

    一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区.当然也可根据其他的条件分区. 二.为什么要对表进行分区为了改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率.分区的一些优点包括:      1).与单个磁盘或文件系统分区相比,可以存储更多的数据.      2).对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的

  • MySql学习day03:数据表之间的连接、查询详解

    主键: 关键字:primary key 特点:不能为null,并且唯一. 主键分类: 逻辑主键:例如ID,不代表实际的业务意义,只是用来唯一标识一条记录(推荐) 业务主键:例如username,参与实际的业务逻辑. 主键使用方式: 方式一:     Create table t1(        Id int primary key,        Name varchar(100) ); Insert into t1 values(1,'zs'); Insert into t1 values(

  • MySQL单表查询操作实例详解【语法、约束、分组、聚合、过滤、排序等】

    本文实例讲述了MySQL单表查询操作.分享给大家供大家参考,具体如下: 语法 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名                   WHERE 条件                   GROUP BY field                   HAVING 筛选                   ORDER BY field                   LIMIT 限制条数 二.关键字的执行优先级(重点) 重点中的重点:关键

  • MySQL单表查询实例详解

    1.准备数据 以下操作将在该表中进行 create table student ( id int unsigned primary key auto_increment, name char(12) not null, gender enum("male","famale") default "male", age tinyint unsigned not null, hoc_group char(12) not null, html tinyi

随机推荐