MySQL:多表连接查询(2)

3. sql99标准

语法

select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件(内连接 inner,左外连接 left outer,右外连接 right outer,全外连接 full outer,交叉连接 cross)
【where 筛选条件】
【group by 分组条件】
【having 筛选条件】
【order by 排序列表】


内连接 - 等值连接

  • 案例:查询员工名和对应的部门名
SELECT 
  `last_name`,
  `department_name` 
FROM
  `departments` AS d 
  INNER JOIN `employees` AS e 
    ON e.`department_id` = d.`department_id` ;
  • 案例:查询名字中包含e的员工名和工种名
SELECT 
  `last_name`,
  `job_title` 
FROM
  `jobs` AS j 
  INNER JOIN `employees` AS e 
    ON e.`job_id` = j.`job_id` 
WHERE `last_name` LIKE "%e%" ;
  • 案例:查询部门个数大于3的城市名和部门个数
SELECT 
  `city`,
  COUNT(*) 
FROM
  `departments` AS d 
  INNER JOIN `locations` AS l 
    ON d.`location_id` = l.`location_id` 
GROUP BY `city` 
HAVING COUNT(*) > 3 ;
  • 案例:查询员工个数大于3的部门名和员工个数,并按照个数降序排序
SELECT 
  `department_name`,
  COUNT(*) 
FROM
  `departments` AS d 
  INNER JOIN `employees` AS e 
    ON d.`department_id` = e.`department_id` 
GROUP BY `department_name` 
HAVING COUNT(*) > 3 
ORDER BY COUNT(*) DESC 
  • 案例:查询员工名,部门名,工种名,并按部门名降序
SELECT 
  `last_name`,
  `department_name`,
  `job_title` 
FROM
  `employees` AS e 
  INNER JOIN `departments` AS d 
    ON d.`department_id` = e.`department_id` 
  INNER JOIN `jobs` AS j 
    ON e.`job_id` = j.`job_id` 
ORDER BY `department_name` DESC ;

总结:

  1. 可以添加排序,分组,筛选
  2. inner可以省略
  3. 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
  4. inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集

内连接 - 非等值连接

  • 案例:查询员工的工资和工资级别
SELECT 
  `last_name`,
  `salary`,
  `grade_level` 
FROM
  `employees` AS e 
  INNER JOIN `job_grades` AS jd 
    ON `salary` BETWEEN `lowest_sal` 
    AND `highest_sal` 
  • 案例:查询工资级别的员工个数大于20的,按照工资级别降序系列
SELECT 
  `grade_level`,
  COUNT(*) 
FROM
  `employees` AS e 
  INNER JOIN `job_grades` AS jd 
    ON `salary` BETWEEN `lowest_sal` 
    AND `highest_sal` 
GROUP BY `grade_level` 
HAVING COUNT(*) > 20 
ORDER BY `grade_level` DESC 

内连接 - 自连接

  • 案例:查询员工名以及上级的名称
SELECT 
  e.`employee_id`,
  e.`last_name`,
  e.`manager_id`,
  m.`last_name` 
FROM
  `employees` AS e 
  INNER JOIN `employees` AS m 
    ON e.`manager_id` = m.`employee_id` 
WHERE e.`last_name` LIKE "%k%" 

外连接

  • 案例:查询男朋友不在男神表的女神名
-- 左外连接
SELECT 
  g.`name` 
FROM
  `beauty` AS g 
  LEFT OUTER JOIN `boys` AS b 
    ON g.`boyfriend_id` = b.`id` 
WHERE b.`id` IS NULL 
-- 右外连接
SELECT 
  g.`name` 
FROM
  `boys` AS b 
  RIGHT OUTER JOIN `beauty` AS g 
    ON g.`boyfriend_id` = b.`id` 
WHERE b.`id` IS NULL 
  • 案例:查询没有员工的部门
SELECT DISTINCT 
  d.`department_id` 
FROM
  `departments` AS d 
  LEFT OUTER JOIN `employees` AS e 
    ON d.`department_id` = e.`department_id` 
WHERE e.`employee_id` IS NULL 

总结:

  1. 用于查询一个表中有,另一个表中没有的数据
  2. 左外连接中,左侧为主表;右外连接,右侧为主表;左外和右外交换表的顺序可以实现同样的效果
  3. 外连接的查询结果为主表中的所有数据,如果从表中有与之匹配的,就显示匹配记录,否则显示null
  4. 全外连接会将左外连接和右外连接的结果组合在一起

交叉连接

  • 含义即为两表的笛卡尔乘积
SELECT 
  * 
FROM
  `beauty` 
  CROSS JOIN `boys` 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352