- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MySQL多表查询详解下由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
好好吃饭,好好休息,听着很简单,实际落实缺失不那么容易.
继续回顾mysql的多表查询之1999语法 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#二,sql1999语法
语法:
select
查询列表
from
表1 别名 【连接类型】
join
表2 别名
on
链接条件
【
where
筛选条件】
【
group
by
分组】
【
having
筛选条件】
【
order
by
排序列表
asc
|
desc
】
分类(连接类型):
内连接(★):
inner
外联结
左外(★):
left
【
outer
】
右外(★):
right
【
outer
】
全外:
full
【
outer
】
交叉连接:
cross
|
=============================================================================== 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
1、内连接
语法:
select
查询列表
from
表1 别名
inner
join
表2 别名
on
连接条件
【
where
筛选条件】
【
group
by
分组】
【
having
筛选分组】
【
order
by
排序列表
asc
|
desc
】
分类:
等值
非等值
自连接
特点:
①添加排序,分组,筛选
②
inner
可以省略
③筛选条件放在
where
后面,连接条件放在
on
后面,提高分离性,便于阅
读。
④
inner
join
连接和sql1992语法中的等值连接效果是一样的,都是查
询交集部分。
|
1
2
3
4
5
6
7
8
9
10
|
#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;
|
1
2
3
4
5
6
|
#案例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%'
;
|
1
2
3
4
5
6
7
8
|
#案例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;
|
1
2
3
4
5
6
7
8
9
10
11
12
|
#案例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
;
|
1
2
3
4
5
6
7
8
9
|
#案例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
;
|
1
2
3
4
5
6
|
#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;
|
1
2
3
4
5
6
7
8
|
#案例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
;
|
1
2
3
4
5
6
|
#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;
|
1
2
3
4
5
6
|
#案例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
2
3
4
5
6
7
8
9
10
11
12
|
#二,外连接
应用场景:用于查询一个表中有,另一个表没有的记录。
特点:
1.外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示
null
外连接查询结果=内连接结果+主表中有而从表没有的记录
2.左外连接,
left
join
左边的是主表
右外连接,
right
join
右边的是主表
3.左外和右外交换两个表的顺序,可以实现同样的效果。
4.全外连接=内连接的结果+表1中有但表2中没有的+表2中有但表一没有的(mysql不支持)
|
1
2
3
|
引入:
select
*
from
beauty;
select
*
from
boys;
|
1
2
3
4
5
|
#引入:查询男朋友不在男神表的女神名
select
b.
name
,bo.*
from
beauty b
left
outer
join
boys bo
on
b.boyfriend_id=bo.id;
|
1
2
3
4
5
6
7
|
#左外连接
select
b.
name
,bo.*
from
beauty b
left
outer
join
boys bo
on
b.boyfriend_id=bo.id
where
bo.id
is
null
;
#选从表中的主键列
|
1
2
3
4
5
6
|
#右外连接,得到同样的结果。
select
b.
name
,bo.*
from
boys bo
right
outer
join
beauty b
on
b.boyfriend_id=bo.id
where
bo.id
is
null
;
|
1
2
3
4
5
6
|
#把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
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#案例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
;
|
1
2
3
4
5
6
7
|
#全外连接查出的结果有三部分组成(举例,mysql不支持)语法结构演示
先把两张表的交集查出来,在把缺失的填充查出来,在把其他无关联的查出来
语法结构示例
select
b.*,bo.*
from
beauty b
full
outer
join
boys bo
on
b.boyfriend_id=bo.id
|
1
2
3
4
5
|
#交叉连接,使用1999的语法标准实现的
笛卡尔乘积
select
b.*,bo.*
from
beauty b
cross
join
boys bo;
|
1
2
3
|
#sql1992语法 与 sql 1999语法 相比
功能:sql1999支持的较多
可读性:sql1999实现连接条件和筛选条件的分离,可读性提高
|
总结
1
2
3
4
|
select
<select_list>
from
a
inner
join
b
on
a.
key
=b.
key
;
|
1
2
3
4
|
select
<select_list>
from
a
left
join
b
on
a.
key
=b.
key
;
|
1
2
3
4
|
select
<select_list>
from
a
right
join
b
on
a.
key
=b.
key
;
|
1
2
3
4
5
|
select
<select_list>
from
a
left
join
b
on
a.
key
=b.
key
where
b.
key
is
null
;
|
1
2
3
4
5
|
select
<select_list>
from
a
right
join
b
on
a.
key
=b.
key
where
a.
key
is
null
;
|
1
2
3
4
|
select
<select_list>
from
a
full
join
b
on
a.
key
=b.
key
;
|
1
2
3
4
5
6
|
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多表查询内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.cnblogs.com/jxearlier/p/13376452.html 。
最后此篇关于MySQL多表查询详解下的文章就讲到这里了,如果你想了解更多关于MySQL多表查询详解下的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有三张 table 。表 A 有选项名称(即颜色、尺寸)。表 B 有选项值名称(即蓝色、红色、黑色等)。表C通过将选项名称id和选项名称值id放在一起来建立关系。 我的查询需要显示值和选项的名称,而
在mysql中,如何计算一行中的非空单元格?我只想计算某些列之间的单元格,比如第 3-10 列之间的单元格。不是所有的列...同样,仅在该行中。 最佳答案 如果你想这样做,只能在 sql 中使用名称而
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在为版本7.6进行Elasticsearch查询 我的查询是这样的: { "query": { "bool": { "should": [ {
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
是否可以编写一个查询来检查任一子查询(而不是一个子查询)是否正确? SELECT * FROM employees e WHERE NOT EXISTS (
我找到了很多关于我的问题的答案,但问题没有解决 我有表格,有数据,例如: Data 1 Data 2 Data 3
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
我从 EditText 中获取了 String 值。以及提交查询的按钮。 String sql=editQuery.getText().toString();// SELECT * FROM empl
我有一个或多或少有效的查询(关于结果),但处理大约需要 45 秒。这对于在 GUI 中呈现数据来说肯定太长了。 所以我的需求是找到一个更快/更高效的查询(几毫秒左右会很好)我的数据表大约有 3000
这是我第一次使用 Stack Overflow,所以我希望我以正确的方式提出这个问题。 我有 2 个 SQL 查询,我正在尝试比较和识别缺失值,尽管我无法将 NULL 字段添加到第二个查询中以识别缺失
什么是动态 SQL 查询?何时需要使用动态 SQL 查询?我使用的是 SQL Server 2005。 最佳答案 这里有几篇文章: Introduction to Dynamic SQL Dynami
include "mysql.php"; $query= "SELECT ID,name,displayname,established,summary,searchlink,im
我有一个查询要“转换”为 mysql。这是查询: select top 5 * from (select id, firstName, lastName, sum(fileSize) as To
通过我的研究,我发现至少从 EF 4.1 开始,EF 查询上的 .ToString() 方法将返回要运行的 SQL。事实上,这对我来说非常有用,使用 Entity Framework 5 和 6。 但
我在构造查询来执行以下操作时遇到问题: 按activity_type_id过滤联系人,仅显示最近事件具有所需activity_type_id或为NULL(无事件)的联系人 表格结构如下: 一个联系人可
如何让我输入数据库的信息在输入数据 5 分钟后自行更新? 假设我有一张 table : +--+--+-----+ |id|ip|count| +--+--+-----+ |
我正在尝试搜索正好是 4 位数字的 ID,我知道我需要使用 LENGTH() 字符串函数,但找不到如何使用它的示例。我正在尝试以下(和其他变体)但它们不起作用。 SELECT max(car_id)
我有一个在 mysql 上运行良好的 sql 查询(查询 + 连接): select sum(pa.price) from user u , purchase pu , pack pa where (
我是一名优秀的程序员,十分优秀!