例子文件1:https://files.cnblogs.com/files/Vera-y/myemployees.zip

例子文件2:https://files-cdn.cnblogs.com/files/Vera-y/girls.zip

连接查询:又称多表查询,当查询的字段来自多个表时,将会运用到连接查询

连接查询的分类:

1.按年代分类:

  sql92标准:92年推出的标准,仅仅支持内连接

语法: select 查询列表

    from 表

    where 连接条件、(筛选条件)

    (group by 分组)

    (having 筛选条件)

    (order by 排序列表)

  sql99标准:99年推出的标准,MySQL中99标准支持内连接,外连接(全外连接不支持),交叉连接

语法: select 查询列表

    from 表1 (连接类型)

    join 表2

    on 连接条件

    (where筛选条件)

    (group by 分组)

    (having 筛选条件)

    (order by 排序列表)

2.按功能分类:

  内连接:等值连接,非等值连接,自连接

  外连接:左外连接,右外连接,全外连接

  交叉连接

spl99 标准功能分类连接类型:

  内连接:inner  (可以省略)

  外连接:左外:left (outer)、右外:right(outer)、全外:full(outer)

  交叉连接:cross

壹:内连接

一、等值连接

1.简单基础的等值查询

例1.查询员工名和对应的部门名

sql92:

  SELECT last_name,department_name
  FROM employees,departments
  WHERE employees.department_id = departments.department_id;

  # 注意两个表是通过什么连接的,这里是通过department_id连接的(又称键)

sql99:

  SELECT last_name,department_name
  FROM employees INNER JOIN departments
  ON employees.department_id = departments.department_id;

例2.查询员工名、工种号、工种名

SELECT last_name,employees.job_id,job_title
FROM employees,jobs      # 在这里可以给表起别名
WHERE employees.job_id = jobs.job_id;

(注:虽然可以起别名,但是一旦起了别名,使用到表名的地方就一定要用别名代替,否则报错)

2. 加筛选条件的等值查询

例1.查询有奖金的员工名、部门名

sql92:

  SELECT last_name, department_name
  FROM employees,departments
  WHERE commission_pct IS NOT NULL
  AND employees.department_id=departments.department_id;

sql99:

  SELECT last_name,department_name
  FROM employees INNER JOIN departments
  ON employees.department_id=departments.department_id
  WHERE commission_pct IS NOT NULL;

例2.查询城市名中第二个字符为o的部门名和城市名

SELECT department_name,city
FROM departments,locations
WHERE departments.location_id=locations.location_id
AND city LIKE '_o%';

3.添加分组

例1.查询每个城市的部门个数

sql92:

  SELECT COUNT(*),city
  FROM departments,locations
  WHERE departments.location_id=locations.location_id
  GROUP BY city;

sql99:

  SELECT COUNT(*),city
  FROM departments INNER JOIN locations
  ON departments.location_id=locations.location_id
  GROUP BY city;

例2.查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资

SELECT department_name,MIN(salary),departments.manager_id
FROM departments,employees
WHERE departments.department_id=employees.department_id
AND commission_pct IS NOT NULL
GROUP BY department_name,departments.manager_id;

可能出现的一个错误:https://www.cnblogs.com/Vera-y/p/10923850.html

3.添加排序

例1:查询每个工种的工种名和员工的个数,并且按员工个数排降序

SELECT job_title,COUNT(*)
FROM jobs, employees
WHERE jobs.job_id=employees.job_id
GROUP BY job_title
ORDER BY COUNT(*) DESC;

例2.查询那个部门的员工个数>3的部门名和员工个数,并按个数降序

sql92:

  SELECT department_name,COUNT(*)
  FROM departments,employees
  WHERE departments.department_id=employees.department_id
  GROUP BY department_name
  HAVING COUNT(*)>3
  ORDER BY COUNT(*) DESC;

sql99:

  SELECT department_name,COUNT(*)
  FROM departments INNER JOIN employees
  ON departments.department_id=employees.department_id
  GROUP BY department_name
  HAVING COUNT(*)>3
  ORDER BY COUNT(*) DESC;

4.三表连接

例:查询员工名、部门名、和所在城市

sql92:

  SELECT last_name,department_name,city
  FROM employees,departments,locations
  WHERE employees.department_id=departments.department_id
  AND departments.location_id=locations.location_id;

sql99:

  SELECT last_name,department_name,city
  FROM employees
  INNER JOIN departments ON employees.department_id=departments.department_id
  INNER JOIN locations ON departments.location_id=locations.location_id;

  (注:顺序问题:两个表一定要有连接条件才能让两个表相连)

二、非等值连接

案例:查询员工的工资和工资级别

sql92:

  SELECT salary,grade_level
  FROM employees,job_grades
  WHERE salary BETWEEN job_grades.lowest_sal AND job_grades.highest_sal;   # 这里用between and 限制了范围

sql99:  

  SELECT salary,grade_level
  FROM employees
  JOIN job_grades    # 省略了inner
  ON employees.salary BETWEEN job_grades.lowest_sal AND job_grades.highest_sal;

  

三、自连接

自个儿的表和自个儿的表连接

案例:查询姓名中包含k的员工名和上级领导的名称

sql92:

  SELECT e.employee_id, e.last_name,m.employee_id,m.last_name
  FROM employees AS e,employees AS m # 这里的别名用作区分为两个表
  WHERE e.manager_id=m.manager_id
  AND e.last_name LIKE '%k%';

sql99:

  SELECT e.employee_id, e.last_name,m.employee_id,m.last_name
  FROM employees AS e
  JOIN employees AS m       # 这里省略了inner
  ON e.manager_id=m.manager_id
  WHERE e.last_name LIKE '%k%';

贰:外连接

(sql99标准的外连接)

1、外连接:一个表中有,另一个表中没有的

外连接的查询结果为主表中的所有记录

  若从表中有和主表匹配的,则显示匹配值

  若从表中没有和主表匹配的,则用null填充

  即:外连接结果=内连接结果+主表中有而从表中没有的记录

2、左外连接:left join 左边的是主表

   右外连接:right join 右边的是主表

   左外和右外交换两个表的顺序可以实现同样的效果

3、全外连接=内连接的结果+表1中有但表2中没有+表2中有表1中没有

4、交叉连接:笛卡尔乘积

例1.查询男朋友不在男神表的女神名    # 最终查询的为女神名来自与女神表,所以主表为女神表

左外连接:

  SELECT beauty.`name`,beauty.*
  FROM beauty
  LEFT OUTER JOIN boys
  ON beauty.boyfriend_id=boys.id
  WHERE boys.id IS NULL;        # 主键是不可能本身就为空的,所以只能是匹配后为空

右外连接:

  SELECT beauty.`name`,beauty.*
  FROM boys
  RIGHT OUTER JOIN beauty
  ON beauty.boyfriend_id=boys.id
  WHERE boys.id IS NULL;

例2.查询那个部门没有员工     # 最终查询的是部门的,所以部门表为主表

左外连接:  

  SELECT departments.*, employees.employee_id
  FROM departments
  LEFT JOIN employees
  ON employees.department_id = departments.department_id
  WHERE employees.department_id IS NULL;

右外连接:

  SELECT departments.*, employees.employee_id
  FROM employees
  RIGHT JOIN departments
  ON employees.department_id = departments.department_id
  WHERE employees.department_id IS NULL;

例3.查询部门名为SAL 或IT的员工信息
  SELECT departments.department_name,employees.*
  FROM departments
  LEFT JOIN employees
  ON departments.department_id = employees.department_id
  WHERE departments.department_name IN('SAL','IT');

例4、交叉连接

  SELECT beauty.*,boys.*

  FROM beauty

  CROSS JOIN boys;

有关几个查询的小统计:

数据库MySQL--连接查询的更多相关文章

  1. MySql数据库之连接查询

    在MySql数据库中连接查询分为以下几种方式: 1.内连接查询 内连接查询通过关键字 inner join 关键字来实现,通过代码实现: select * from 表1 inner join 表2 ...

  2. mysql连接查询经典小例题

    mysql连接查询: Mysql连接查询支持多表连接 对同一张表可以重复连接多次(别名在多次连接同一张表时很重要) 例题1: 下面有2张表 teams表 比赛结果表:result 问题: 得出一张表: ...

  3. MySQL连接查询、联合查询、子查询

    参考地址:http://blog.csdn.net/u011277123/article/details/54863371 1.MySQL连接查询 连接查询:将多张表(>=2)进行记录的连接(按 ...

  4. 掌握MySQL连接查询到底什么是驱动表

    准备我们需要的表结构和数据 两张表 studnet(学生)表和score(成绩)表, 创建表的SQL语句如下 CREATE TABLE `student` ( `id` int(11) NOT NUL ...

  5. MySQL连接查询驱动表被驱动表以及性能优化

    准备我们需要的表结构和数据 两张表 studnet(学生)表和score(成绩)表, 创建表的SQL语句如下 CREATE TABLE `student` ( `id` int(11) NOT NUL ...

  6. 细说MySQL连接查询:内连、左连和右连

    转: 细说MySQL连接查询:内连.左连和右连 简介: MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接.首先,要确定一个主表作为结果集,然后将 ...

  7. SQLServer数据库之连接查询

    SQLServer数据库之连接查询 表的连接查询的几种方法介绍: inner join on内连接,left join on 左连接 , rigth join on 右连接, full join on ...

  8. mysql连接查询,封装mysql函数

    连接查询 交叉连接语法: select  * | 字段列表 from 表1  cross join 表2 内连接: select *|字段列表 from 左表 inner join 右表 on 左表. ...

  9. Mysql连接查询、子查询、联合查询 整理

    连接查询 连接语法的基本形式 from 表1  [连接方式]  join 表2  [on 连接条件]: 交叉连接 语法: from  表1  [cross]  join  表2  ;      //可 ...

  10. MySQL连接查询(inner join,left join和right join的区别)

    关系数据库由多个相关表组成,这些表使用已知为外键列的常用列链接在一起. 因此,从业务角度来看,每个表中的数据是不完整的. 例如,在示例数据库(yiibaidb)中,使用orderNumber列链接的o ...

随机推荐

  1. Java随机访问文件

    使用随机访问文件,我们可以从文件读取以及写入文件.使用文件输入和输出流的读取和写入是顺序过程.使用随机访问文件,可以在文件中的任何位置读取或写入.RandomAccessFile类的一个对象可以进行随 ...

  2. Win7环境下VS2010配置Cocos2d-x-2.1.4最新版本的开发环境(亲测)

      写这篇博客时2D游戏引擎Cocos2d-x的最新版本为2.1.4,记得很久以前使用博客园博主子龙山人的一篇博文<Cocos2d-x win7+vs2010配置图文详解(亲测)>成功配置 ...

  3. git入门基本命令

    第一个命令 git init (repo_dir) 初始化git版本库,如果省略repo_dir的话,那么就把当前目录作为git库进行初始化. 第二个命令 git status 查看版本库状态,随时可 ...

  4. 使ie6/7/8支持css3的方法

    使用PIE.htc让IE6\7\8支持CSS3部分属性 包括圆角,阴影,背景渐变等效果 下载地址 http://css3pie.com/download/ 需要注意几点的是 第一,pie是以相对页面h ...

  5. 2018 最新 spring boot 整合 swagger2 (swagger2 版本 2.8.0)

    好久没上了, 看到又有人回复了. 我就来修改一下. 修改时间  2018年5月16日 这回给你上全新版本. 至发稿时间,所有的包都是新版. 注意: 高版本需要添加  jaxb-api 包, 否则会报错 ...

  6. css 给图片添加滤镜效果,透明层毛玻璃效果

    我们用的第一个滤镜是sepia(),他会给图片增加一整降饱和度的橙色染色效果 原图 添加sepia滤镜的效果 img{ width:100%; transition: .5s filter; filt ...

  7. Tools: windbg 使用指南

    windbg使用 符号表C:\Symbols; SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols 系统变量_NT_SYMBOL_PAT ...

  8. MySQL日期格式化 利用Mysql的DATE_FORMAT()进行日期格式转换

    碰到一个MYSQL的问题,表logstatb中moment字段的内容是"年-月-日 时:分:秒",需要查询匹配“年月日”或“时:分:秒”即可的数据条目,这个时候就可以通过下面的SQ ...

  9. 模拟字典序排序——hdu6034

    #include <bits/stdc++.h> #include <iostream> using namespace std; ; ; int n; int maxj; s ...

  10. mysql复制以及一主多从等常见集群概述

    1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的 数据复制到其它主机(slaves)上,并 ...