数据库|(六)连接查询

article/2025/9/14 14:24:08

含义:连接查询又称为多表查询,当查询的字段来自多个表时,就会用到连接查询。

1. 笛卡尔乘积

笛卡尔乘积现象:表1有 m 行,表2有 n 行,则查询结果有 m*n 行。

SELECT `name`, boyName FROM boys, beauty;

发生原因:没有有效的连接条件
解决办法:添加有效的连接条件

SELECT `name`, boyName FROM boys, beauty
WHERE beauty.boyfriend_id=boys.id;

2. 连接查询分类

2.1 按年代分

  1. sql192 标准【只支持内连接】
  2. sql199 标准【推荐】支持内连接+外连接(左外和内外)+交叉连接

2.2 按功能分

3. 等值连接(sql 92标准)

3.1 特点

  1. 多表等值连接的结果为多表的交集部分
  2. n表连接,至少需要n-1个连接条件
  3. 多表的顺序没有要求
  4. 一般需要为表取别名
  5. 连接可以搭配前面所有子句使用,比如排序、分组、筛选

3.2 一般使用

案例1: 查询女神名和对应的男神名

USE girls;
SELECT `name`, boyName
FROM boys, beauty
WHERE beauty.boyfriend_id=boys.id;

案例2:查询员工名和对应的部门名

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

3.3 为表取别名

优点:提高简洁度、区分重名字段
注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定

案例2:查询员工名、工种号、工种名

SELECT e.last_name,e.job_id,j.job_title
FROM jobs AS j, employees AS e
WHERE e.job_id=j.job_id;

3.4 两表顺序可以调换

SELECT e.last_name,e.job_id,j.job_title
FROM employees e,jobs j
WHERE e.job_id=j.job_id;

3.5 可以加筛选

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

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

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

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

3.6 可以加分组

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

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

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

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

3.7 可以加排序

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

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

3.8 可以实现三表连接

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

SELECT last_name,department_name,city
FROM employees e,departments d,locations l
WHERE e.department_id=d.department_id
AND d.location_id=l.location_id
AND city LIKE 's%'
ORDER BY department_name DESC;

4. 非等值连接(sql 92标准)

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

SELECT salary, grade_level
FROM employees e,job_grades g
WHERE salary BETWEEN g.lowest_sal AND g.highest_sal
AND g.grade_level='A';

5. sql99 语法

5.1 基本语法与分类

语法:

SELECT 查询列表
FROM `表1` 别名 [连接类型]
JOIN `表2` 别名
ON 连接条件
[WHERE 筛选条件]
[GROUP BY 分组]
[HAVING 筛选条件]
[ORDER BY 排序列表]

5.2 内连接

基本语法:

SELECT 查询列表
FROM1 别名
INNER JOIN2 别名
ON 连接条件

1. 等值连接

特点:

  1. 可以添加排序、分组、筛选
  2. inner 可以省略
  3. 筛选条件放在where后,连接条件放在on后
  4. 和sql92标准等值连接效果一样

案例1:查询员工名、部门名

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

案例2: 查询名宇字中包含e的员工名和工种名(添加筛选)

SELECT last_name,job_title
FROM employees e
INNER JOIN jobs j
ON e.job_id=j.job_id
WHERE last_name LIKE '%e%';
  1. 查询部门个数>3的城市名和部门个数(添加分组和筛选)
SELECT city,COUNT(*)
FROM departments d
INNER JOIN locations l
ON d.location_id=l.location_id
GROUP BY city
HAVING COUNT(*)>3;
  1. 查询哪个部门的部门员工个数>3的部门名和员工个数,并按个数降序(添加排序)
SELECT COUNT(*),department_name
FROM employees e
INNER JOIN departments d
ON e.department_id=d.department_id
GROUP BY department_name
HAVING COUNT(*)>3
ORDER BY COUNT(*) DESC;
  1. 查询员工名、部门名、工种名,并按部门名降序(多表连接)
SELECT last_name,department_name,job_title
FROM employees e
INNER JOIN departments d 
ON e.department_id=d.department_id
INNER JOIN jobs j
ON e.job_id=j.job_id
ORDER BY department_name DESC;

2. 非等值连接

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

SELECT salary,grade_level
FROM employees e
JOIN job_grades g
ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;

案例2:查询每个工资级别的个数>20,并按级别排序

SELECT COUNT(*),grade_level
FROM employees e
JOIN job_grades g
ON e.salary BETWEEN g.lowest_sal AND g.highest_sal
GROUP BY grade_level
HAVING COUNT(*)>20
ORDER BY grade_level DESC;

3. 自连接

查询包含字符k的员工名字和上级名字

SELECT e.last_name,m.last_name
FROM employees e
INNER JOIN employees m
ON e.manager_id=m.employee_id
WHERE e.last_name LIKE '%k%';

5.3 外连接

应用场景:用于查询一个表中有,另一个表中没有的记录。
特点:

  1. 外连接的查询结果为主表中的所有记录,如果从表中有和他匹配的,则显示匹配的值,如果从表中没有,则显示 null
    外连接查询结果 = 内连接结果 + 主表中有而从表中没有的记录。
  2. 左外连接中:left 左边的为主表
    右外连接:right 右边的为主表
  3. 左外和右外交换两个表的顺序,可以实现同样的效果。
  4. 全外连接 = 内连接 + 表1有但表2没有 + 表2有但表1没有的

案例1:左、右外连接

-- 引入:查询男朋友不在男生表的女神名
SELECT b.`name`, bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.boyfriend_id=bo.id
WHERE bo.id IS NULL;

案例2:查询哪个部门没有员工

-- 左外连接
SELECT d.*,e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.department_id=e.department_id
WHERE e.employee_id IS NULL;
-- 右外连接
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;

案例3:全外连接

-- 不支持! 
USE girls;
SELECT b.*,bo.*
FROM beauty b
FULL OUTER JOIN boys bo
ON b.boyfriend_id = bo.id;

5.4 交叉连接

SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;

OUTER JOIN departments d
ON d.department_id=e.department_id
WHERE e.employee_id IS NULL;


案例3:全外连接```sql
-- 不支持! 
USE girls;
SELECT b.*,bo.*
FROM beauty b
FULL OUTER JOIN boys bo
ON b.boyfriend_id = bo.id;

5.4 交叉连接

SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;

http://chatgpt.dhexx.cn/article/81gAC8wh.shtml

相关文章

数据库的内连接查询

数据库的内连接查询 数据库查询时,用户需要查询的数据有时并不都在一个数据表中,可能涉及一个以上的表,这时就要使用多表查询 多表查询是将多个表连接在一起的查询,也称为连接查询 根据查询的需要,连接查询主要分为内…

连接查询实验

一、实验目的 1. 掌握连接查询方法。 2. 掌握各种查询的使用方法。 二、实验硬、软件环境 开发环境: Windows XP 操作系统及以上版本 数据库管理系统:SQL Server 2012 运行环境:Windows XP 操作系统及以上版本 三、实验内容及步骤 1…

SQL server连接查询

目录 前沿小补充等值与非等值连接查询自身连接外连接多表连接 前沿小补充 例3.48 查询平均成绩大于等于80分的学生学号和平均成绩 SELECT Sno,AVG(Grade) FROM SC WHERE AVG(Grade)>80 GROUP BY Sno; SELECT * FROM SC;此时发现: 这是因为WHERE子句中是不能用…

MySQL数据库——连接查询

第1关 内连接查询 一、本关任务:使用内连接查询数据表中学生姓名和对应的班级。 内连接查询 仅将两个表中满足连接条件的行组合起来作为结果集,称为内连接; 关键字:[inner] join ... on。 语法: 表1 [inner] joi…

数据库-连接查询

数据库连接查询可以进行多表联查,可以同时展示多个表的数据,方便进行查阅。那么连接查询分为多种方式,我们可以根据要求筛选合适的方式进行查询。下面我们来讲解一下怎么进行多表联查。 首先连接查询大致分为3种形式,分别为&…

当app发生闪退,测试人员该如何进行定位?

对app闪退问题进行定位 1、使用usb连接电脑和手机,打开手机的开发者模式 2、使用adb connect命令去进行连接,如:adb connect ip地址 3、再用adb devices命令查看是否成功连接设备 4、adb logcat -v time >d:\logcat.txt 生成日志文件到D盘…

简单adb 命令抓Android app 闪退日志

系统:Windows 1.手机连上电脑,打开开发者选项,打开调试模式 2.打开cmd,输入命令adb devices查看设备连接成功 下面进入正题: 查看手机的所有日志 adb logcat 只获取该应用的日志 adb logcat | findstr 应用包名开…

[Android Studio]开发APP应用出现软件程序打开闪退的排错

🟧🟨🟩🟦🟪 Android Debug🟧🟨🟩🟦🟪 Topic 发布安卓学习过程中遇到问题解决过程,希望我的解决方案可以对小伙伴们有帮助。 📋笔记目…

iOS App 闪退监测

为保障线上 App 的用户体验,我们一般都会对线上 App 的 crash 率做实时监控,一旦检测到 spike,可以即刻调查原因,但这一切的前提是 crash 日志能够准确上报。 crash 日志上报有两个难点: crash handler 安装之前的代…

苹果上传闪退 php,苹果手机app频繁闪退原因以及解决方法

就算再流畅的ios系统,再好的iPhone手机,用久了都会遇到一个这样子的问题,就是闪退的问题,而且APP闪退占据多数。那该怎么修复呢?闪电修告诉你原因和搞定的步骤。 闪电修上门维修手机 我们先了解下iPhone闪退的原因: 1.插件影响程序的正常运行,而导致APP闪退 2.下载的软件…

vc++6.0打开文件闪退_ipa企业签名app闪退原因

闪退跟签名一般来说没什么直接关系,如果掉签了,那根本打不开应用。闪退一般是程序或者设备问题。 掉签的原因一般有: 1、 企业证书的装机量的问题:苹果公司创建企业开发者账号最初的目的是为了方便一些大型企业内部员工测试用的&a…

app常见的 闪退及闪退的原因

背景: 最近一直在休假,把自己在工作中梳理的点点滴滴汇总整理,这样既能及时地让自己巩固各个要点,也希望通过自己整理的东西帮助其他的同行少走弯路,避开我之前踩过的大大小小,深深浅浅的坑。 此问题经常…

记一次使用android studio分析app闪退原因的过程

闪退演示 首页和问题反馈重复切换两次就闪退 (因为是公司内部app,原有视频不做展示) app架构 app是原生android studio开发的,部分页面是h5开发的,通过WebView和addJavascriptInterface接口实现js与java的交互 页面…

app闪退分析

一、网络异常引起的 1.网络异常引起的,服务端响应不及时,可能导致闪退,检查网络配置情况 二、版本过低 1.应用版本过低,app的sdk和手机的系统不兼容,造成闪退 2.有些api在老版本中有,在新版本中没有&am…

线程池的组成及种类

文章目录 一、 线程池的组成结构二、常见的线程池种类三、线程池的工作流程四、线程池的好处五、小结 我们知道一个进程可以把任务分成多个部分交给线程执行,多线程技术减少了CPU闲置时间,增加了程序并发性。 假设创建线程的时间为t1,执行任务的时间为t2…

Java 中几种常用的线程池

概述: 在java内置API中操作线程所用到的类为Thread。创建线程一般有两种方式, 继承Thread方式实现Runnable方式,并以runnable作为target创建Thread 在Android中的耗时任务一般都需要另开线程来执行,常常需要用线程池来管理这些…

面试官:线程池有哪几种创建方式,能详细的说下么?

根据摩尔定律所说:集成电路上可容纳的晶体管数量每 18 个月翻一番,因此 CPU 上的晶体管数量会越来越多。 但随着时间的推移,集成电路上可容纳的晶体管数量已趋向饱和,摩尔定律也渐渐失效,因此多核 CPU 逐渐变为主流&a…

JAVA常用的几种线程池

1. 为什么使用线程池 诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务。请求以某种方式到达服务器,这种方式可能是通过网络协议(例如 HTTP、FTP 或 POP)、通过 …

java线程池详解及五种线程池方法详解

基础知识 Executors创建线程池 Java中创建线程池很简单,只需要调用Executors中相应的便捷方法即可,比如Executors.newFixedThreadPool(int nThreads),但是便捷不仅隐藏了复杂性,也为我们埋下了潜在的隐患(OOM&#x…

Java常见的线程池有哪些?

1、什么是线程池 java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 假设一个服务…