连接查询:

  • 也叫多表查询。常用于查询字段来自于多张表
  • 如果直接查询两张表,将会得到笛卡尔积
mysql> select name, dept_name from employees, departments;
  • 通过添加有效的条件可以进行查询结果的限定
 mysql> select name, dept_name from employees, departments where employees.dept_id=departments.dept_id;

连接分类

按功能分类

  • 内连接(重要)

    • 等值连接
    • 非等值连接
    • 自连接
  • 外连接
    • 左外连接(重要)
    • 右外连接(重要)
    • 全外连接(mysql不支持,可以使用UNION实现相同的效果)
  • 交叉连接

按年代分类

  • SQL92标准:仅支持内连接
  • SQL99标准:支持所功能的连接

SQL99标准多表查询

  • 语法格式
SELECT 字段...
FROM 表1 [AS] 别名 [连接类型]
JOIN 表2 [AS] 别名
ON 连接条件
WHERE 分组前筛选条件
GROUP BY 分组
HAVING 分组后筛选条件
ORDER BY 排序字段

内连接

  • 语法格式
select 查询列表
from 表1 别名
inner join 表2 别名 on 连接条件
inner join 表3 别名 on 连接条件
[where 筛选条件]
[group by 分组]
[having 分组后筛选]
[order by 排序列表]

等值连接

  • 查询每个员工所在的部门名
mysql> select name, dept_name-> from employees-> inner join departments-> on employees.dept_id=departments.dept_id;
  • 查询每个员工所在的部门名,使用别名
mysql> select name, dept_name-> from employees as e-> inner join departments as d-> on e.dept_id=d.dept_id;
  • 查询每个员工所在的部门名,使用别名。两个表中的同名字段,必须指定表名
mysql> select name, d.dept_id, dept_name-> from employees as e-> inner join departments as d-> on e.dept_id=d.dept_id;
  • 查询11号员工的名字及2018年每个月工资
mysql> select name, date, basic+bonus as total-> from employees as e-> inner join salary as s-> on e.employee_id=s.employee_id-> where year(s.date)=2018 and e.employee_id=11;
  • 查询2018年每个员工的总工资
mysql> select name, sum(basic+bonus) from employees-> inner join salary-> on employees.employee_id=salary.employee_id-> where year(s.date)=2018-> group by name;
  • 查询2018年每个员工的总工资,按工资升序排列
mysql> select name, sum(basic+bonus) as total from employees as e-> inner join salary as s-> on e.employee_id=s.employee_id-> where year(s.date)=2018-> group by name-> order by total;
  • 查询2018年总工资大于30万的员工,按工资降序排列
 mysql> select name, sum(basic+bonus) as total from employees as e-> inner join salary as s-> on e.employee_id=s.employee_id-> where year(s.date)=2018-> group by name-> having total>300000-> order by total desc;

非等值连接

附:创建工资级别表

创建表语法:

CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)

创建工资级别表:

id:主键。仅作为表的行号
grade:工资级别,共ABCDE五类
low:该级别最低工资
high:该级别最高工资
mysql> use nsd2021;
mysql> create table wage_grade-> (-> id int,-> grade char(1),-> low int,-> high int,-> primary key (id));

向表中插入数据:

  • 语法:
INSERT INTO 表名称 VALUES (值1, 值2,....);

向wage_grade表中插入五行数据:

mysql> insert into wage_grade values-> (1, 'A', 5000, 8000),-> (2, 'B', 8001, 10000),-> (3, 'C', 10001, 15000),-> (4, 'D', 15001, 20000),-> (5, 'E', 20001, 1000000);
  • 查询2018年12月员工基本工资级别
mysql> select employee_id, date, basic, grade-> from salary as s-> inner join wage_grade as g-> on s.basic between g.low and g.high-> where year(date)=2018 and month(date)=12;
  • 查询2018年12月员工各基本工资级别的人数
mysql> select grade, count(*)-> from salary as s-> inner join wage_grade as g-> on s.basic between g.low and g.high-> where year(date)=2018 and month(date)=12-> group by grade;
+-------+----------+
| grade | count(*) |
+-------+----------+
| A     |       13 |
| B     |       12 |
| C     |       30 |
| D     |       32 |
| E     |       33 |
+-------+----------+
5 rows in set (0.00 sec)
  • 查询2018年12月员工基本工资级别,员工需要显示姓名
mysql> select name, date, basic, grade-> from employees as e-> inner join salary as s-> on e.employee_id=s.employee_id-> inner join wage_grade as g-> on s.basic between g.low and g.high-> where year(date)=2018 and month(date)=12;

自连接

  • 要点:

    • 将一张表作为两张使用
    • 每张表起一个别名
  • 查看哪些员的生日月份与入职月份相同

mysql> select e.name, e.hire_date, em.birth_date-> from employees as e-> inner join employees as em-> on month(e.hire_date)=month(em.birth_date)-> and e.employee_id=em.employee_id;
+-----------+------------+------------+
| name      | hire_date  | birth_date |
+-----------+------------+------------+
| 李玉英    | 2012-01-19 | 1974-01-25 |
| 郑静      | 2018-02-03 | 1997-02-14 |
| 林刚      | 2007-09-19 | 1990-09-23 |
| 刘桂兰    | 2003-10-14 | 1982-10-11 |
| 张亮      | 2015-08-10 | 1996-08-25 |
| 许欣      | 2011-09-09 | 1982-09-25 |
| 王荣      | 2019-11-14 | 1999-11-22 |
+-----------+------------+------------+
7 rows in set (0.00 sec)

外连接

  • 常用于查询一个表中有,另一个表中没有的记录

  • 如果从表中有和它匹配的,则显示匹配的值

  • 如j要从表中没有和它匹配的,则显示NULL

  • 外连接查询结果=内连接查询结果+主表中有而从表中没有的记录

  • 左外连接中,left join左边的是主表

  • 右外连接中,right join右边的是主表

  • 左外连接和右外连接可互换,实现相同的目标

左外连接

  • 语法
SELECT tb1.字段..., tb2.字段
FROM table1 AS tb1
LEFT OUTER JOIN table2 AS tb2
ON tb1.字段=tb2.字段
  • 查询所有部门的人员以及没有员工的部门
mysql> select d.*, e.name-> from departments as d-> left outer join employees as e-> on d.dept_id=e.dept_id;

右外连接

  • 语法
SELECT tb1.字段..., tb2.字段
FROM table1 AS tb1
RIGHT OUTER JOIN table2 AS tb2
ON tb1.字段=tb2.字段
  • 查询所有部门的人员以及没有员工的部门
mysql> select d.*, e.name-> from employees as e-> right outer join departments as d-> on d.dept_id=e.dept_id;

交叉连接

  • 返回笛卡尔积
  • 语法:
SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE子句]
  • 查询员工表和部门表的笛卡尔积
mysql> select name, dept_name-> from employees-> cross join departments;

作者:一个小运维
链接:https://www.jianshu.com/p/6cd2c076eb28

相关资源:

redis哨兵配置文件 - Dcsdn

GitOps 初探 - Dcsdn

rabbitmq入门和实战 - Dcsdn

SQL语句:连接查询相关推荐

  1. sql语句连接查询.

    sql语句连接查询. 接触sql语句这么长时间了,牵涉到连接的时候,总是google别人的. 今天好好学学sql 的连接查询 准备工作 : mysql5.6 建表语句 查询语句 select p.id ...

  2. 数据库——sql语句 连接查询

    数据库--连接查询 1.定义:同时涉及多个表的查询. 2.连接条件常用格式: [<表名1>]<列名><比较运算符>[<表名2>]<列名2> ...

  3. 浅谈sql之连接查询

    SQL之连接查询 一.连接查询的分类 sql中将连接查询分成四类: 内链接 外连接 左外连接 右外连接 自然连接 交叉连接 二.连接查询的分类 数据库表如下: 1.学生表 2.老师表 3.班级表 表用 ...

  4. mysql查询选课程的学生学号和姓名_数据库SQL语句中查询选修了全部课程的学生的学号和姓名理解...

    首先头脑中有三点概念: 1.EXISTS子查询找到的提交 NOTEXISTS子查询中找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2.建立程序循环的概念,这是一个动态的查询过程.如FOR ...

  5. java 查询sql语句_java执行SQL语句实现查询的通用方法详解

    完成sql查询 并将查询结果放入vector容器,以便其他程序使用 /* * 执行sql查询语句 */ public static vector executequery(class clazz, s ...

  6. 如何在 Linux 上用 SQL 语句来查询 Apache 日志

    Linux 有一个显著的特点,在正常情况下,你可以通过日志分析系统日志来了解你的系统中发生了什么,或正在发生什么.的确,系统日志是系统管理员在解决系统和应用问题时最需要的第一手资源.我们将在这篇文章中 ...

  7. PHP获取MySQL执行sql语句的查询时间

    PHP获取MySQL执行sql语句的查询时间 1. $t1=microtime(true); mysql_query($sql); echo microtime(true)-$t1; 2. //计时开 ...

  8. Mybatis映射文件SQL语句模糊查询,#和$的区别和注意事项

    Mybatis映射文件SQL语句模糊查询 1. "%"#{value}"%" 在参数中不需要添加 %_ 推荐使用 2. '%${value}%' 在参数中不需要 ...

  9. java sql范围查询语句,java类中写sql语句,查询条件包含换行

    java类中写sql语句,查询条件包含换行 detachedCriteria.add(Restrictions.or( Restrictions.like("chengBanDanWeiId ...

  10. Python与开源GIS:在OGR中使用SQL语句进行查询

    属性选择与空间选择都可以看作是OGR内置的选择功能,这两种功能可以解决大部分实际中的问题.但是也有这种时候,就是进行查询时的条件比较复杂.针对这种情况,OGR也提供了更加灵活的解决方案:支持使用SQL ...

最新文章

  1. 2020移动apn接入点哪个快_为什么都是4G网你的就没别人快?跟我这样设置,网速直线提升...
  2. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(添加均值点)实战
  3. 上升沿_不懂上升、下降沿的我,高兴惨了!
  4. 蓝桥杯-K好数(java)
  5. vb字符串在内存中的分布?
  6. 今天开始记录我的开发生涯
  7. 图像数据转换成db(leveldb/lmdb)文件(转)
  8. python selenium安装
  9. QModelIndex——
  10. 帆软报表 js 调用sql_SQL Server中的报表–创建由先前创建的主报表调用的基于矩阵的子报表
  11. 真传x深度学习第一课:环境配置搭建
  12. L - Oil Deposits
  13. CentOS6.4配置Hadoop-2.6.0集群配置安装指南
  14. python解析地址
  15. 阴阳师哪个服务器可以用微信登录,网易大神怎么绑定阴阳师QQ微信账号 网易大神绑定阴阳师QQ微信账号方法...
  16. C# MemcachedHelper 帮助类 控制台程序
  17. 神经网络算法用什么软件,神经网络计算机应用
  18. atm机用visio画工作流程图_VISIO画职能流程图规范性培训文档(内附模版).ppt
  19. 微信公众号开通流量主
  20. datagrid全选

热门文章

  1. 赫/哈/霍 夫曼(Huffman)编码 游程编码
  2. Docker 加速器
  3. ubuntu从源码编译安装python
  4. ip地址聚合-路由聚合
  5. HBuilder X如何运行uni-app 项目
  6. 挂茶馆热血传奇私服辅助开发教程
  7. java开发pc端和移动端的区别,移动端和PC端的区别
  8. PLSQL 导出、导入 表和数据
  9. python 爬虫框架scrapy优势_开源爬虫框架各有什么优缺点
  10. QT5安装自己下载的mingw32及一些常见报错解决