SQL中基本SELECT语句及常见关键字的使用(内连接,左/右连接)

这里写目录标题

  • SQL中基本SELECT语句的使用
    • SQL语法简介
      • DDL、DML、DCL
      • SEECT
    • SELECT常用关键词
      • group by分组
      • having筛选
      • limit限定条数
      • UION和UION ALL合并
      • SQL执行顺序
    • 联表查询
      • 多表查询示例
      • 特殊用法:笛卡尔积(交叉连接)
      • 等值连接vs非等值连接
      • 自连接vs非自连接
      • 内连接vs外连接
        • SQL 92实现内/外连接
        • SQL 99实现内/外连接

SQL中基本SELECT语句的使用

SQL语法简介

DDL、DML、DCL

DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create 、 drop 、 alter 、create等。

DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录(增删改查),并检查数据完整性,常用的语句关键字主要包括 insert 、 delete 、 update 等。

DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grant 、 deny 、 revoke 、 commit 等。

区别:

  • 作用不同:
  • 回滚支持不同:DML可以回滚(前提是关闭了AutoCommit属性),DDL和DML执行后立即commit(不受AutoCommit=FALSE属性影响),无法回滚

SEECT

作为开发人员,最常用的是DML,而其中最常用也最复杂的就是SELECT语句,如下是92和99标准的语句示例:

--sql 92语法:
SELECT .... ,.... ,....(存在聚合函数)
FROM ...,....
WHERE 多表的连接条件 AND 不包含聚合函数的过滤条件 
GROUP BY ...,....
HAVING 包含聚合函数的过滤条件
ORDERBY .... ,...(AsC /DESC )
LIMIT ... , ....

--sql 99语法:
SELECT .... ,.... , . ...(存在聚合函数)
FROM ... 
(LEFT / RIGHT)JOIN ....ON 多表的连接条件
(LEFT / RIGHT)JOIN ....ON 多表的连接条件
WHERE 不包含聚合函数的过滤条件
GROUP BY ..., ....
HAVING 包含聚合函数的过滤条件
ORDER BY ...- ,...(AsC /DESC )
LIMIT ... ,....

SELECT常用关键词

group by分组

作用:用来给数据分组,需要指定一个或者一组字段,作为分组的依据

特点:select选中的字段要么是group by修饰的字段,要么是由各种聚合函数修饰的字段,不能有其它字段。

--查看每个部门的平均工资
select dept,AVG(salary)
from tables
group by dept;

having筛选

作用:用来过滤数据,可以用来修饰涉及到聚合函数的过滤条件

特点:必须跟在group by后面,因为必须先分组,才有聚合函数的值,然后才能对这些聚合函数的值进行过滤;当然,如果没有用groupby,只用到了聚合函数,那其实having也可用,但没有过滤的意义,因为总共只有一个组

--查找平均工资大于100的部门
select dept
from table
group by dept having AVG(salary)>100;

--查找最高工资大于100的部门
select dept
from tables
group by dept 
having AVG(salary)>100;

--练习:查询部门id为10,20,30,40这4个部门中最高工资比10000高的部门信息
--方式l:推荐,执行效率高于方式2.
SELECT department_id,MAX(salary)FROM employees
WHERE department_id IN( 10,20,30,40)GROUP BY department_id
HAVING MAX(salary) > 10000;
I
--方式2:
SELECT department_id,MAX (salary)FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000 AND department_id IN (10,20,30,40);

--结论:当过滤条件中没有聚合函数时,则此过滤条件声明在wHERE中或HAVING中都可以,但建议用where,因为执行效率更高。

wher和having对比

  • 用法:当过滤条件中带有聚合函数时,不能用where,必须用having,否则两者都可以用;having必须跟在groupby后面
  • 先后顺序:当同时存在where和having时,having放在后面
  • 执行效率: 做联表查询时,where的执行效率比having高,因为having必须在group by分组之后才能筛选,而where是先筛选,再group by,,先筛选的话group by的效率自然就高了。

limit限定条数

如果给定一个参数n,该参数代表返回行数(默认从从第一行数据算起,也就是0到n-1行)

如果给定两个参数,第一个参数 i 代表从表格中的第 i + 1 行数据开始检索,第二个参数 j 代表返回的行数,如LIMIT 10,20 的意思返回从11行开始,往后的20行。

 --前n行
 select * from tables limit n-1
 --第n行
 select * from tables limit n-1,1
 --第5到8行
  select * from tables limit 44
  
 --倒数前n行
 select * from tables order by column desc limit n-1,1
 --倒数第n行
 select * from tables order by column desc limit n-1
 --倒数5到8行
 select * from tables order by column desc limit 4,4

UION和UION ALL合并

UION代表横向合并,比如合并两个select的数据行,UION会自动去除重复行再返回

UION ALL则不会去重,完全是横向的一个拼接,效率较高

SELECT employee_id, department_name
FROM employees e 
LEFT JOIN departments d ON e.department_id = d.department_id 
UNION ALL
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d ON e.department_id = d.department_id WHERE e. department_id IS NULL;

SQL执行顺序

联表SQL语句的执行过程:
FROM …笛卡尔积-> ON->(LEFT/RIGNTJOIN) ->WHERE->GROUP BY ->HAVING -> SELECT -> DISTINCT->#ORDERBY ->LIMIT

总结:先做笛卡尔积,然后ON筛选,然后where筛选,然后group by分组,然后having对分组结果再筛选,然后才选中数据;最后再对这些数据进行排序,然后分页。

联表查询

多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。

前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联。

多表查询示例

例如有两张表,分别是员工信息表,和部门信息表
在这里插入图片描述
需求:查询所有员工的姓名及其部门名称

--sql92语法,联表查询
SELECT employee_id, department_name
FROM employees, departments
WHERE employees. department_id = departments.department_id;

使用多表查询的注意点

--sql92语法,联表查询

--如果查询语句中出现了多个表中都存在的字段,则必须指明此字段所在的表名。
SELECT employees.employee_id, departments.department_name ,employees.department_id
FROM employees, departments
WHERE employees.department_id = departments.department_id;

--.可以给表起别名,在SELECT和WHERE中使用表的别名。
SELECT emp.employee_id, dept.department_name , emp.department_id
FROM employees emp, departments dept
WHERE emp.department_id = dept.department_id;

--注意:如果有n个表实现多表的查询,则需要至少n-1个连接条件
--练习:查询员工的employee_id,last_name , department_name , city
SELECT e.employee_id,e.last_name,d.department_name,l.city,e. department_id,l.location_id
FROM employees e, departments d,locations l
WHERE e.department_id = d.department_id AND d.location_id= l.location_id ;

特殊用法:笛卡尔积(交叉连接)

笛卡尔乘积是一个数学运算。假设我有两个集合X和Y,那么X和Y的笛卡尔积就是X和Y的所有可能组合,也就是第一个对象来自于X,第二个对象来自于Y的所有可能。组合的个数即为两个集合中元素个数的乘积数。

在这里插入图片描述

如果选中不同表的字段,如下情况会产生笛卡尔积:

  • 没有指定多个表的连接条件(或关联条件)
  • 连接条件(或关联条件)无效
--sql92语法,联表查询

--案例:查询员工的姓名及部门名称所有可能的组合
SELECT last_name,department_name
FROM employees, departments;

等值连接vs非等值连接

角度1:从连接条件的角度看,分为等值连接和非等值连接

--sql92语法,联表查询

--如:查询薪水介于最低薪资和最高薪资的人的姓名、薪资、级别
SELECT e.last_name,e.salary,j.grade_level
FROM employees e,job_grades j
where e.salary between j.lowest_sal  and j.highest_sal;

自连接vs非自连接

角度2:从连接的表来看,自连接和非自连接

自连接:当前表和当前表进行连接

--sql92语法,联表查询

--如:查询员工id,员工姓名及其管理者的id和姓名
SELECT emp.employee_id, emp.last_name, mgr.employee_id,mgr.last_name
FROM employees emp ,employees mgr
WHERE emp.manager_id = mgr.employee_id;

内连接vs外连接

角度3:从连接方式来看,分为内连接和外连接

之前涉及到的都是内连接,因为最终只显示了满足连接条件的数据行的对应字段,但其实除此之外还有其它连接方式

  • 内连接:最终只显示了满足连接条件的数据行
  • 外连接:除了返回满足连接条件的行以外,还返回左表或右表中某些中不满足条件的行,没有匹配的行时,结果表中相应的列为空(NULL)。外连接具体又可分为左(外)连接,和右(外)连接。
    • 左(外)连接:会将左表所有数据行都查出来,如果右边表中有数据和它匹配(满足连接条件),就正常显示;如果没有数据和左边匹配,就用NULL填充
    • 右(外)连接:会将右表所有数据行都查出来,如果左边表中有数据和它匹配(满足连接条件),就正常显示;如果没有数据和右边表匹配,就用NULL填充

在这里插入图片描述

例子:查找员工和其对应部门时

  • 内连接:只返回有部门的员工和有员工的部门,没有对应部门的员工不会返回,没有员工的部门也不会返回。
  • 左外连接:返回所有员工,及其对应的部门,没有对应部门的员工也会包含,只不过对应部门用NULL代替
  • 右外连接:返回所有部门,及其对应的员工,里面没有员工的部门也会包含,只不过对应员工用NULL代替
SQL 92实现内/外连接

内连接

SELECT employee_id, department_name
FROM employees e , departments d
WHERE e.department_id = d.department_id;

外连接

在连接条件中使用+来实现外连接,+号代表把NULL值也显示出来,+号在左边就是右连接,+号在右边就是左连接

--SQL92语法实现外连接
SELECT employee_id, department_name
FROM employees e , departments d
WHERE e.department_id = d.department_id(+);
--注意:MysQL不支持sQL92语法中外连接的写法!

满外链接

--满外连接: mysql不支持FULL OUTER JOINSELECT last_name , department_name
FROM employees e 
FULL OUTER JOIN departments d ON e.department_id = d.departmentlid;

MySQL要实现满外链接,需要用到uion或者uion字段去拼接两个结果集
比如将左外连接和右外连接进行uion操作

在这里插入图片描述
具体实现

--左上图的结果
SELECT employee_id, department_name
FROM employees e 
LEFT JOIN departments d ON e.department_id = d.department_id 
--去重拼接
UNION
--右上图的结果
SELECT employee_id,department_name
FROM employees e 
RIGHT JOIN departments d ON e.department_id = d.department_id;

或者将左外连接和去除掉公共部分的右外连接进行uion all操作

在这里插入图片描述

具体实现

--左上图的结果
SELECT employee_id, department_name
FROM employees e 
LEFT JOIN departments d ON e.department_id = d.department_id 
--拼接
UNION ALL
--右中图的结果
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d ON e.department_id = d.department_id WHERE e. department_id IS NULL;
SQL 99实现内/外连接

内连接

--SQL99i语法实现内连接:
SELECT last_name , department_name
FROM employees e 
JOIN departments d ON e.department_idr d.department_id;

SELECTlast _name , department_name , city
FROM employees e 
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.location_id = 1.location_id;

--注意:JOIN其实本质上是INNER JOIN,只不过省略了INNER

外连接

--练习:查询所有的员工的last_name , department_name信息
--左外连接:查出的是所有员工,及部门信息
SELECT last_name , department_name
FROM employees e 
LEFT JOIN departments d ON e.department_id = d.department_id;
--右外连接:查出的是所有部门,及员工信息
SELECT last_name, department_name
FROM employees e 
RIGHT JOIN departments d ON e.department_id = d.department_id;

注意:

  • Oracle对SQL92支持较好,可以使用SQL92的加号+语法去实现外连接。
  • MySQL不支持SQL92语法中使用+去完成外连接,所以MySQL里面要实现外连接,只能用jion on的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/886382.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VScode 自定义代码配色方案

vscode是一款高度自定义配置的编辑器, 我们来看看如何使用它自定义配色吧 首先自定义代码配色是什么呢? 看看我的代码界面 简而言之, 就是给你的代码的不同语义(类名, 函数名, 关键字, 变量)等设置不同的颜色, 使得代码的可读性变强. 其实很多主题已经给出了定制好的配色方案…

D3.js中国地图可视化

1、项目介绍 该项目来自Github,基于D3.js中国地图可视化。 D3.js is a JavaScript library for manipulating documents based on data. It uses HTML, SVG, and CSS to display data. The full name of D3 is "Data-Driven Documents," which means it a…

【Flume Kafaka实战】Using Kafka with Flume

一 目标 在Cloudera Manager中创建两个Flume的Agent,Agent1从local file中获取内容,写入到kafka的队列中。Agent2以Agent1的sink作为source,将数据从kafka中读取出来,写入到HDFS中。 二 实战 2.1 Kafka Sink 第一步&#xff0…

828华为云征文|部署多功能集成的协作知识库 AFFiNE

828华为云征文|部署多功能集成的协作知识库 AFFiNE 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 AFFiNE3.1 AFFiNE 介绍3.2 AFFiNE 部署3.3 AFFiNE 使用 四、…

Nginx基础详解5(nginx集群、四七层的负载均衡、Jmeter工具的使用、实验验证集群的性能与单节点的性能)

续Nginx基础详解4(location模块、nginx跨域问题的解决、nginx防盗链的设计原理及应用、nginx模块化解剖)-CSDN博客 目录 14.nginx集群(前传) 14.1如何理解单节点和集群的概念 14.2单节点和集群的比较 14.3Nginx中的负载均衡…

StopWath,apache commons lang3 包下的一个任务执行时间监视器的使用

StopWath是 apache commons lang3 包下的一个任务执行时间监视器&#xff0c;与我们平时常用的秒表的行为比较类似&#xff0c;我们先看一下其中的一些重要方法&#xff1a; <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependen…

过渡到内存安全语言:挑战和注意事项

开放源代码安全基金会 ( OpenSSF )总经理 Omkhar Arasaratnam 讨论了内存安全编程语言的演变及其为应对 C 和 C 等语言的局限性而出现的现象。 内存安全问题已存在五十多年&#xff0c;它要求程序员从内存管理任务中抽离出来。 Java、Rust、Python 和 JavaScript 等现代语言通…

八大排序详解

文章目录 目录1. 排序的概念及其运用1.1 排序的概念1.2 排序的运用1.3 常见的排序算法 2. 常见排序算法的实现2.1 插入排序2.1.1 基本思想2.1.2 直接插入排序2.1.3 希尔排序 2.2 选择排序2.2.1 基本思想2.2.2 直接选择排序2.2.3 堆排序 2.3 交换排序2.3.1 基本思想2.3.2 冒泡排…

SSL VPN | Easyconnect下载安装使用 (详尽)

EasyConnect是一款远程连接工具&#xff0c;为用户提供简便、快捷的远程访问和控制解决方案。 目录 下载 安装 使用 卸载 下载 通过链接进入官网技术支持板块 深信服技术支持-简单、高效、自助化服务 (sangfor.com.cn)https://support.sangfor.com.cn/ 选择软件下载 在安…

【C语言】指针篇 | 万字笔记

写在前面 在学习C语言过程&#xff0c;总有一个要点难点离不开&#xff0c;那就是大名鼎鼎的C语言指针&#xff0c;也是应为有指针的存在&#xff0c;使得C语言一直长盛不衰。因此不才把指针所学的所有功力都转换成这个笔记。希望对您有帮助&#x1f970;&#x1f970; 学习指…

【2025】基于Hadoop短视频流量数据分析与可视化(源码+文档+调试+答疑)

文章目录 前言一、主要技术&#xff1f;二、项目内容1.整体介绍&#xff08;示范&#xff09;2.运行截图3.部分代码介绍 总结更多项目 前言 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&am…

unix中的exec族函数介绍

一、前言 本文将介绍unix中exec族函数&#xff0c;包括其作用以及使用方法。当一个进程调用fork函数创建一个新进程后&#xff0c;新进程可以直接执行原本正文段的其他内容&#xff0c;但更多时候&#xff0c;我们在一个进程中调用fork创建新的进程后&#xff0c;希望新进程能…

杭州电子科技大学《2019年+2023年861自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《杭州电子科技大学861自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2019年真题 2023年真题 Part1&#xff1a;2019年2023年完整版真题 2019年真题 2…

ubuntu 开启root

sudo passwd root#输入以下命令来给root账户设置密码 sudo passwd -u root#启用root账户 su - root#要登录root账户 root 开启远程访问&#xff1a; 小心不要改到这里了&#xff1a;sudo nano /etc/ssh/ssh_config 而是&#xff1a;/etc/ssh/sshd_config sudo nano /etc/ssh…

猫猫cpu的缓存

原题过长&#xff0c;放一下题目大意 题目大意 给你 m m m 个 1 1 1 到 n n n 之间的整数&#xff0c;你要找到若干个大小为固定的 k k k 的闭区间&#xff0c;使得所有这些数都在你找到的某个区间内。你需要最小化这些区间的并集的大小&#xff0c;并输出此大小。本题里…

基于单片机的两轮直立平衡车的设计

本设计基于单片机设计的两轮自平衡小车&#xff0c;其中机械部分包括车体、车轮、直流电机、锂电池等部件。控制电路板采用STC12C5A60S2作为主控制器&#xff0c;采用6轴姿态传感器MPU6050测量小车倾角&#xff0c;采用TB6612FNG芯片驱动电机。通过模块化编程完成了平衡车系统软…

calibre-web的翻译translations

calibre-web的翻译translations Windows安装calibre-web&#xff0c;Python-CSDN博客文章浏览阅读539次&#xff0c;点赞10次&#xff0c;收藏11次。pip install calibreweb报错&#xff1a;error: Microsoft Visual C 14.0 or greater is required. Get it with "Microso…

机器学习(5):机器学习项目步骤(二)——收集数据与预处理

1. 数据收集与预处理的任务&#xff1f; 为机器学习模型提供好的“燃料” 2. 数据收集与预处理的分步骤&#xff1f; 收集数据-->数据可视化-->数据清洗-->特征工程-->构建特征集和数据集-->拆分数据集、验证集和测试集 3. 数据可视化工作&#xff1f; a. 作用&…

深入理解 C 语言中的内存操作函数:memcpy、memmove、memset 和 memcmp

目录&#xff1a; 前言一、 memcpy 函数二、 memmove 函数三、 memset 函数四、 memcmp 函数总结 前言 在 C 语言中&#xff0c;内存操作函数是非常重要的工具&#xff0c;它们允许我们对内存进行直接操作&#xff0c;从而实现高效的数据处理。本文将深入探讨四个常用的内存操…

DC00022基于ssm高校社团管理系统web社团管理系统java web+MySQL项目web程序设计

1、项目功能演示 DC00022基于ssm高校社团管理系统web社团管理系统java web项目MySQL 2、项目功能描述 社团管理系统分为普通用户、管理员 2.1 普通用户功能 01 系统登录、系统注册 02 系统首页、新闻公告、规章制度、社团活动、互动交流 03 修改密码 04 个人信息修改 05 我的…