数据库MySQL--连接查询
例子文件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--连接查询的更多相关文章
- MySql数据库之连接查询
在MySql数据库中连接查询分为以下几种方式: 1.内连接查询 内连接查询通过关键字 inner join 关键字来实现,通过代码实现: select * from 表1 inner join 表2 ...
- mysql连接查询经典小例题
mysql连接查询: Mysql连接查询支持多表连接 对同一张表可以重复连接多次(别名在多次连接同一张表时很重要) 例题1: 下面有2张表 teams表 比赛结果表:result 问题: 得出一张表: ...
- MySQL连接查询、联合查询、子查询
参考地址:http://blog.csdn.net/u011277123/article/details/54863371 1.MySQL连接查询 连接查询:将多张表(>=2)进行记录的连接(按 ...
- 掌握MySQL连接查询到底什么是驱动表
准备我们需要的表结构和数据 两张表 studnet(学生)表和score(成绩)表, 创建表的SQL语句如下 CREATE TABLE `student` ( `id` int(11) NOT NUL ...
- MySQL连接查询驱动表被驱动表以及性能优化
准备我们需要的表结构和数据 两张表 studnet(学生)表和score(成绩)表, 创建表的SQL语句如下 CREATE TABLE `student` ( `id` int(11) NOT NUL ...
- 细说MySQL连接查询:内连、左连和右连
转: 细说MySQL连接查询:内连.左连和右连 简介: MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接.首先,要确定一个主表作为结果集,然后将 ...
- SQLServer数据库之连接查询
SQLServer数据库之连接查询 表的连接查询的几种方法介绍: inner join on内连接,left join on 左连接 , rigth join on 右连接, full join on ...
- mysql连接查询,封装mysql函数
连接查询 交叉连接语法: select * | 字段列表 from 表1 cross join 表2 内连接: select *|字段列表 from 左表 inner join 右表 on 左表. ...
- Mysql连接查询、子查询、联合查询 整理
连接查询 连接语法的基本形式 from 表1 [连接方式] join 表2 [on 连接条件]: 交叉连接 语法: from 表1 [cross] join 表2 ; //可 ...
- MySQL连接查询(inner join,left join和right join的区别)
关系数据库由多个相关表组成,这些表使用已知为外键列的常用列链接在一起. 因此,从业务角度来看,每个表中的数据是不完整的. 例如,在示例数据库(yiibaidb)中,使用orderNumber列链接的o ...
随机推荐
- leetcode.数组.283移动零-Java
1. 具体题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须 ...
- vue-router 使用二级路由去实现子组件的显示和隐藏
在需求中有一个这样的情况:一个组件在主组件和另外的组件中引用,且点击主组件和这个组件分别有相应得切换事件. 一开始的时候我是没有划分组件,把它们放到主组件内,这样便于切换,但是主主件内有独立的部分需要 ...
- 【HDOJ】P5056 Boring count
题目意思是给你一个字符串和K,让你求其中有多少个字串中每个字母的出现次数不超过K次,可以等于 题目意思是很简单的,写起来也很简单,不过就是注意最后要是long long要不WA了,555~ #incl ...
- 使用Kettle的命名参数动态执行作业
关于如何根据传入的不同参数,达到动态运行作业的目的,这里不介绍.只提供一个思路,就是不同的调度进程调度同一个Kettle文件时,传入了不同的参数,从而得到不同的数据. 如下图所示: 1. 先设置参数名 ...
- 【第十周读书笔记】读node入门,一本全面的node.js教程
我学到了路由的定义,路由就是解析URL然后转到相应的执行程序. 我们要为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码(这里“代码”对应整个应用的第三部 ...
- egrep 或与
' HEADERABC' .txt | .txt 'HEADERABC' .txt > .txt .txt > .txt ' HEADERABC' ' TAILER123' .txt &g ...
- C# Func和匿名方法 简单使用
今天敲代码遇见一个问题,解决中用到了C#的Func和匿名方法,发现挺好用的 定义一个这样的方法可以避免重复写try catch 这里用到了Func<int,string> ,它其实就是一个 ...
- Excel如何快速渲染百万级别的数据
Excel主要经历1.查询2.渲染的方式 关于查询: 不同技术水平的人有不同的解决方案,目前我采用的是 1:多线程查询 2:一个异步后台线程每次查询100条便渲染,采用的“懒加载方式”,这样可以做到实 ...
- 线程池 一 ThreadPoolExecutor
java.util.concurrent public class ThreadPoolExecutor extends AbstractExecutorService ThreadPoolExecu ...
- Spring使用Redis
1.引入依赖 <dependency> <groupId>org.springframework.data</groupId> <artifactId> ...