MySQL入门命令之连接查询
sql92标准仅支持内连接
sql99标准支持内连接+外连接(左外、右外)+交叉连接
按功能分类:内连接:inner等值连接非等值连接自连接外连接:左外连接 left outer右外连接 right outer全连接 full outer交叉连接 cross outerselect 查询的表from 表1 as 别名join 表2 as 别名on 连接条件[where][group][having][order by]
一:等值连接
案例一:查询女生对应的男朋友
mysql> select name,boyname from boys,beauty-> where beauty.boyfriend_id=boys.id;
+------------+-----------+
| name | boyname |
+------------+-----------+
| Angelababy | 黄晓明 |
| 热巴 | 鹿晗 |
| 周芷若 | 张无忌 |
| 小昭 | 张无忌 |
| 王语嫣 | 段誉 |
| 赵敏 | 张无忌 |
+------------+-----------+
6 rows in set (0.00 sec)
案例二
查询有奖金的员工名、部门名
mysql> select last_name,department_name,commission_pct-> from employees e,departments d-> where e.department_id=d.department_id and commission_pct is not null;
+------------+-----------------+----------------+
| last_name | department_name | commission_pct |
+------------+-----------------+----------------+
| Russell | Sal | 0.40 |
| Partners | Sal | 0.30 |
案例三
查询城市名第二个字符为o最后一个字符为n的部门名和城市名
mysql> select department_name,city-> from departments d,locations l-> where d.location_id=l.location_id and city like '_o%n';
+-----------------+--------+
| department_name | city |
+-----------------+--------+
| Hum | London |
+-----------------+--------+
1 row in set (0.00 sec)
二:非等值连接
将等值连接的=号换为其它运算符
三:自连接
mysql> select e.employee_id,e.last_name,m.employee_id,m.last_name-> from employees e,employees m-> where e.manager_id=m.employee_id;
+-------------+-------------+-------------+-----------+
| employee_id | last_name | employee_id | last_name |
+-------------+-------------+-------------+-----------+
| 101 | Kochhar | 100 | K_ing |
| 102 | De Haan | 100 | K_ing |
| 103 | Hunold | 102 | De Haan |
内连接
select ~
from ~ as ~
inner join ~ as ~
on ~;
#等值连接
mysql> select last_name,department_name-> from employees e-> inner join departments d-> on e.department_id=d.department_id;
+-------------+-----------------+
| last_name | department_name |
+-------------+-----------------+
| Whalen | Adm |
| Hartstein | Mar |
| Fay | Mar |mysql> SELECT city,COUNT(*)-> FROM locations l-> INNER JOIN departments d-> ON l.location_id=d.location_id-> GROUP BY city-> HAVING COUNT(*)>3;
+---------+----------+
| city | COUNT(*) |
+---------+----------+
| Seattle | 21 |
+---------+----------+
1 row in set (0.00 sec)mysql> SELECT COUNT(*),department_name-> FROM departments d-> INNER JOIN employees e-> ON d.`department_id`=e.department_id-> GROUP BY department_name-> HAVING COUNT(*)>3-> ORDER BY COUNT(*) DESC;
+----------+-----------------+
| COUNT(*) | department_name |
+----------+-----------------+
| 45 | Shi |
| 34 | Sal |
| 6 | Fin |
| 6 | Pur |
| 5 | IT |
+----------+-----------------+
5 rows in set (0.00 sec)
#非等值连接
mysql> SELECT COUNT(*),grade_level-> FROM employees AS e-> INNER JOIN job_grades AS j-> ON e.`salary` BETWEEN j.`lowest_sal` AND j.`highest_sal`-> GROUP BY grade_level-> HAVING COUNT(*)>2-> ORDER BY COUNT(*) DESC;
+----------+-------------+
| COUNT(*) | grade_level |
+----------+-------------+
| 38 | C |
| 26 | B |
| 24 | A |
| 16 | D |
| 3 | E |
+----------+-------------+
5 rows in set (0.00 sec)
#自连接
mysql> select a.last_name,b.last_name-> from employees a-> inner join employees b on a.manager_id=b.employee_id;
+-------------+-----------+
| last_name | last_name |
+-------------+-----------+
| Kochhar | K_ing |
| De Haan | K_ing |
| Hunold | De Haan |
| Ernst | Hunold |
| Austin | Hunold |
外连接
特点:
外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
左外连接:left join左边的是主表
右外连接:right join右边的是主表
全外连接:full join,显示内容为两表交叉部分以及两表交叉部分以外的部分,为空用null表示
mysql> select b.name,bo.*-> from beauty b-> left outer join boys bo-> on b.boyfriend_id=bo.id;
+------------+------+-----------+--------+
| name | id | boyName | userCP |
+------------+------+-----------+--------+
| 周芷若 | 1 | 张无忌 | 100 |
| 小昭 | 1 | 张无忌 | 100 |
| 赵敏 | 1 | 张无忌 | 100 |
| 热巴 | 2 | 鹿晗 | 800 |
| Angelababy | 3 | 黄晓明 | 50 |
| 王语嫣 | 4 | 段誉 | 300 |
| 柳岩 | NULL | NULL | NULL |
| 苍老师 | NULL | NULL | NULL |
| 周冬雨 | NULL | NULL | NULL |mysql> select b.name-> from beauty b-> left outer join boys bo-> on b.boyfriend_id=bo.id-> where bo.id is null;
+-----------+
| name |
+-----------+
| 柳岩 |
| 苍老师 |
| 周冬雨 |
| 岳灵珊 |
| 双儿 |
| 夏雪 |
+-----------+mysql> select b.name,bo.*-> from boys bo-> right outer join beauty b-> on b.boyfriend_id=bo.id;
+------------+------+-----------+--------+
| name | id | boyName | userCP |
+------------+------+-----------+--------+
| 周芷若 | 1 | 张无忌 | 100 |
| 小昭 | 1 | 张无忌 | 100 |
| 赵敏 | 1 | 张无忌 | 100 |
| 热巴 | 2 | 鹿晗 | 800 |
| Angelababy | 3 | 黄晓明 | 50 |
| 王语嫣 | 4 | 段誉 | 300 |
| 柳岩 | NULL | NULL | NULL |
| 苍老师 | NULL | NULL | NULL |
| 周冬雨 | NULL | NULL | NULL |
| 岳灵珊 | NULL | NULL | NULL |
查询没有员工的部门
mysql> 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;
+---------------+-----------------+------------+-------------+-------------+
| department_id | department_name | manager_id | location_id | employee_id |
+---------------+-----------------+------------+-------------+-------------+
| 120 | Tre | NULL | 1700 | NULL |
| 130 | Cor | NULL | 1700 | NULL |
| 140 | Con | NULL | 1700 | NULL |
| 150 | Sha | NULL | 1700 | NULL |
| 160 | Ben | NULL | 1700 | NULL |
| 170 | Man | NULL | 1700 | NULL |
mysql> select d.*,e.employee_id-> from departments d-> left outer join employees e-> on e.department_id=d.department_id-> where d.manager_id is null;
+---------------+-----------------+------------+-------------+-------------+
| department_id | department_name | manager_id | location_id | employee_id |
+---------------+-----------------+------------+-------------+-------------+
| 120 | Tre | NULL | 1700 | NULL |
| 130 | Cor | NULL | 1700 | NULL |
| 140 | Con | NULL | 1700 | NULL |
| 150 | Sha | NULL | 1700 | NULL |
| 160 | Ben | NULL | 1700 | NULL |
| 170 | Man | NULL | 1700 | NULL |
自然连接
将两表具有相同属性值的元组相连接
如
SELECT course.*,instructor.*
FROM course NATURAL JOIN instructor;
和
SELECT course.*,instructor.*
FROM course,instructor
WHERE course.`dept_name`=instructor.`dept_name`;
具有相同的查询结果
交叉连接 cross join
类似两表做笛卡尔积
mysql> select b.*,bo.*-> from beauty b cross join boys bo;
48 rows in set (0.00 sec)
mysql> select count(*) from beauty;
+----------+
| count(*) |
+----------+
| 12 |
+----------+
1 row in set (0.00 sec)mysql> select count(*) from boys;
+----------+
| count(*) |
+----------+
| 4 |
+----------+
1 row in set (0.00 sec)
更多MySQL命令
MySQL入门命令之连接查询相关推荐
- MySQL入门 (二) : SELECT 基础查询
1 查询资料前的基本概念 1.1 表格.纪录与栏位 表格是资料库储存资料的基本元件,它是由一些栏位组合而成的,储存在表格中的每一笔纪录就拥有这些栏位的资料. 以储存城市资料的表格「city」来说,设计 ...
- linux中mysql客户端命令行连接不了 docker 创建的mysql
linux中mysql客户端命令行连接不了 docker 创建的mysql 问题 :如题 a@z:~$ mysql -h localhost -p ERROR 2002 (HY000): Can't ...
- MySQL简单命令和SELECT查询,给字段起别名【MySQL数据库】
Java养成计划----学习打卡第六十四天 内容导航 数据库的相关操作 数据库的导入 查看导入数据库中的表 查看表中的数据 查看表的基本结构[简化] 查看表的结构[详细] 查看mysql数据库的版本号 ...
- 【mysql】左外连接查询中 on 和 where 的区别
论点 在使用 mysql 的左外连接(left join)查询时,驱动表(left join 左边的表),亦即数据需要全部被查出表的查询条件建议用 where 设定,被驱动表(left join 右边 ...
- mysql学习笔记之连接查询与子查询
mysql连接查询与子查询 1.子查询是指在另一个查询语句中的SELECT子句. 例句: SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t ...
- MySQL中多表连接查询总结与实践
关联博文: MySQL中Union联合查询使用实践总结 连接查询:将多张表(>=2)进行 记录的连接(按照某个指定的条件进行数据拼接). 连接查询的意义:在用户查看数据的时候,数据往往来源于多张 ...
- MySql(九)连接查询
文章目录 连接查询的分类 1. 按照年代进行分类 2. 按照功能进行分类 注:在连接查询中有可能会出现笛卡尔乘积现象 笛卡尔乘积现象:表1有m行:表2有n行:结果=m*n行 发生:在多表查询时没有添加 ...
- mysql创表的工种_[MySQL基础]七、连接查询
含义:又称为多表查询,当查询的字段来自多个表时,就会用到连接查询 笛卡尔乘积现象 表1 有m行,表2有n行,结果为m*n行 发生原因:没有有效的连接条件. 如何避免:添加有效的连接条件. 案例:在bo ...
- mysql|多表连接查询
use test; select * from students; select * from courses; select * from sc; # 多表连接查询-- 查询选修了[数据库原理]的计 ...
最新文章
- linux shell 脚本 查找文件,Linux Shell在目录下使用for循环结合if查找文件的巧用
- 中如何直接使用方法返回的值_java基础-2-方法、面向对象
- Codeforces Round #643 (Div. 2)(A, B, C, D, E)
- 使用Ajax的Spring MVC REST调用
- IMG图片和文字同一行显示,图片和文字居中显示
- svg mysql_SVG 实例
- 行业看点 | 量子计算时代即将到来?华人科学家揭秘“天使粒子”背后故事……...
- 虚拟主机网站搬到服务器上,如何把网页文件放到云虚拟主机
- java加密算法之DES篇
- 冰点还原精灵和惠普增霸卡安装软件的方法
- Java网络编程第一章
- Linux源码阅读(Web在线阅读)
- G002-186-17
- 免费会员管理系统实现门店微信会员营销
- train,dev,test数据集划分
- vue运行(Emitted value instead of an instance of Error)
- 计算机主机配件及图解,电脑主机有哪些配件组成
- grep搜索特定文件
- PAT甲级题解 1030
- 美国旅游带孩子怎么申请签证?