sql学习一

news2024/11/15 17:58:33

文章目录

    • 一、if 语句
    • 二、去重问题
    • 三、concat,upper,lower
    • 四、group_concat
    • 五、like 模糊匹配
    • 六、union和union all
    • 七、流程控制语句case
    • 八、limit

一、if 语句

if(expr1, expr2, expr3)

当expr1的值为真时函数的返回值为expr2,当expr1的值为假时,函数的返回值为expr3

举例:

  1. 计算特殊奖金
    Employees表,employee_id 是这个表的主键。此表的每一行给出了雇员id ,名字和薪水。
    在这里插入图片描述
    写出一个SQL 查询语句,计算每个雇员的奖金。如果一个雇员的id是奇数并且他的名字不是以’M’开头,那么他的奖金是他工资的100%,否则奖金为0。返回的结果集请按照employee_id排序。
/*
select employee_id, salary * (mod(employee_id, 2) = 1 and substr(name, 1, 1) != 'M') as bonus
from Employees
order by employee_id;
*/
select employee_id,if(employee_id % 2 != 0 and name not like 'M%', salary, 0) as bonus
from Employees
order by employee_id;
  1. 变更性别
    Salary 表,id 是这个表的主键。sex 这一列的值是 ENUM 类型,只能从 (‘m’, ‘f’) 中取。本表包含公司雇员的信息。
    在这里插入图片描述
    请你编写一个 SQL 查询来交换所有的 ‘f’ 和 ‘m’ (即,将所有 ‘f’ 变为 ‘m’ ,反之亦然),仅使用 单个 update 语句 ,且不产生中间临时表。
    注意,你必须仅使用一条 update 语句,且 不能 使用 select 语句。
update Salary
set sex = if(sex = 'm', 'f', 'm');

二、去重问题

删除重复的电子邮件
Person表,id是该表的主键列。该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。
在这里插入图片描述
编写一个 SQL 删除语句来删除所有重复的电子邮件,只保留一个id最小的唯一电子邮件。以任意顺序返回结果表。仅需要写删除语句

/*
delete from Person
where id not in(
    select t.id
    from(
        select min(id) as id
        from Person 
        group by email 
    ) as t
);
*/
delete p1 from Person p1, Person p2
where p1.email = p2.email and p1.id > p2.id;

三、concat,upper,lower

concat(str1,str2,…):用于连接两个字符串,形成一个字符串
upper(str):将输入字符串转换为大写
lower(str):将输入字符串转换为小写

举例:修复表中的名字
Users表,user_id 是该表的主键。该表包含用户的 ID 和名字。名字仅由小写和大写字符组成。
在这里插入图片描述
编写一个 SQL 查询来修复名字,使得只有第一个字符是大写的,其余都是小写的。返回按 user_id 排序的结果表。

/*
select user_id,concat(upper(substr(name,1,1)), lower(substr(name,2,length(name)-1))) as name
from Users
order by user_id;
*/
select user_id,concat(upper(left(name,1)), lower(right(name,length(name)-1))) as name
from Users
order by user_id;

四、group_concat

group_concat()中的值为你要合并的数据的字段名,可以在内部用 distinct 来去重,distinct要去重,默认就要先排序;
separator函数是用来分隔这些要合并的数据的;
' '中是你要用哪个符号来分隔;
在这里插入图片描述
编写一个 SQL 查询来查找每个日期、销售的不同产品的数量及其名称。每个日期的销售产品名称应按词典序排列。返回按 sell_date 排序的结果表

select sell_date,count(distinct product) as num_sold,  GROUP_CONCAT(distinct product order by product SEPARATOR ',') as products
from Activities
group by sell_date;

五、like 模糊匹配

like:用于在 where子句中搜索列中的指定模式
%:用于在模式的前后定义通配符(默认字母)

举例:患某种疾病的患者
Patients表,patient_id (患者 ID)是该表的主键。‘conditions’ (疾病)包含 0 个或以上的疾病代码,以空格分隔。这个表包含医院中患者的信息。
在这里插入图片描述
写一条 SQL 语句,查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀 DIAB1 。

# instr 函数是一个字符串处理函数,返回子字符串在源字符串中的位置,如果在源串中没有找到子串,则返回0
/*
select *
from Patients
where instr(conditions, " DIAB1") or substr(conditions,1,5) = "DIAB1";
*/
select *
from patients
where conditions like 'DIAB1%' or conditions like '% DIAB1%';

六、union和union all

union:去重且排序,取唯一值,记录没有重复
union all:不去重不排序,直接连接,取到得是所有值,记录可能有重复

举例:

  1. 丢失信息的雇员
    Employees表,employee_id 是这个表的主键。每一行表示雇员的id 和他的姓名。
    在这里插入图片描述
    Salaries表,employee_id is 这个表的主键。每一行表示雇员的id 和他的薪水。
    在这里插入图片描述
    写出一个查询语句,找到所有 丢失信息 的雇员id。当满足下面一个条件时,就被认为是雇员的信息丢失:雇员的姓名丢失了,或者雇员的薪水信息丢失了。返回这些雇员的id employee_id , 从小到大排序 。
/*order by默认从小到大
select employee_id
from Employees
where employee_id not in(
    select employee_id
    from Salaries
)
union
select employee_id
from Salaries
where employee_id not in(
    select employee_id
    from Employees
)
order by employee_id;
*/

/*union having
select employee_id
from(
    select employee_id from Employees
    union all
    select employee_id from Salaries
) as t
group by employee_id
having count(*) = 1
order by employee_id;
*/

# 左右连接
select a.employee_id
from Employees a left join Salaries b
on a.employee_id = b.employee_id
where b.salary is null

union

select a.employee_id
from Salaries a left join Employees b
on a.employee_id = b.employee_id
where b.name is null
order by employee_id;
  1. 每个产品在不同商店的价格
    Products表,这张表的主键是product_id(产品Id)。每行存储了这一产品在不同商店store1, store2, store3的价格。如果这一产品在商店里没有出售,则值将为null。
    在这里插入图片描述
    请你重构 Products 表,查询每个产品在不同商店的价格,使得输出的格式变为(product_id, store, price) 。如果这一产品在商店里没有出售,则不输出这一行。输出结果表中的顺序不作要求 。
# 列转行用union all,行转列用group by + sum if
select product_id, 'store1' store, store1 price
from Products
where store1 is not null

union all

select product_id, 'store2', store2 price 
from Products 
where store2 is not null

union all

select product_id, 'store3', store3 price 
from Products 
where store3 is not null
order by product_id, price;

七、流程控制语句case

case流控制语句对基于不同输入产生不同输出非常有效。CASE语句遍历条件并在满足第一个条件时返回一个值(如IF-THEN-ELSE语句)。因此,一旦条件为真,它将停止读取并返回结果。如果没有条件为 true,则返回 ELSE 子句中的值。
如果没有其他部分,并且没有条件为 true,则返回 NULL。

case语法:

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    WHEN conditionN THEN resultN
    ELSE result
END;

举例:树节点
给定一个表 tree,id 是树节点的编号, p_id 是它父节点的 id 。
在这里插入图片描述
树中每个节点属于以下三种类型之一:

  • 叶子:如果这个节点没有任何孩子节点。
  • 根:如果这个节点是整棵树的根,即没有父节点。
  • 内部节点:如果这个节点既不是叶子节点也不是根节点。

写一个查询语句,输出所有节点的编号和节点的类型,并将结果按照节点编号排序

/* if 语句
select id,
    if(isnull(p_id),
     'Root',
     if(id in (select t.p_id from tree t), 'Inner', 'Leaf')) as Type
from tree;
*/

#case
select id,
    case
    	when p_id is null then 'Root'
    	when id in (select p_id from tree) then 'Inner'
    	else 'Leaf'
    end as Type
from tree;

八、limit

第二高的薪水
Employees表,id 是这个表的主键。表的每一行包含员工的工资信息。
在这里插入图片描述
编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null 。

#IFNULL(expression_1,expression_2);
#如果expression_1不为NULL,则IFNULL函数返回expression_1; 否则返回expression_2的结果。
select ifnull(
    (select distinct salary
    from Employee
    order by salary desc limit 1,1), 
    null) as SecondHighestSalary;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装redis并设置开机自启动允许远程链接

一、进入/usr/local目录下面;下载redis包wget https://download.redis.io/releases/redis-5.0.14.tar.gz二、安装gccyum install gcc-c三、解压、进入目录、编译tar -xvf redis-5.0.14.tar.gzcd redis-5.0.14make ##如果报错zmalloc.h:50:31: 致命错误:j…

打破单片机开发模式--胶水语言(JavaScript)

概述 传统的嵌入式单片机开发基本上形式如下图: 该流程对于功能单一或者功能变更极少的场景是比较友好的,但是对于设备应用层变更比较多或者公板方案开发应用的场景,上述场景显的有些累赘。那么有什么方式可以解决呢?&#xff1f…

U-Boot 之七 详解 Driver Model 架构、配置、命令、初始化流程

U-Boot 在 2014 年 4 月参考 Linux Kernel 的驱动模型设计并引入了自己的 Driver Model(官方简称 DM) 驱动架构。这个驱动模型(DM)为驱动的定义和访问接口提供了统一的方法,提高了驱动之间的兼容性以及访问的标准性。 …

和月薪3W的聊过后,才知道自己一直在打杂...

前几天和一个朋友聊面试,他说上个月同时拿到了腾讯和阿里的offer,最后选择了阿里。 我了解了下他的面试过程,就一点,不管是阿里还是腾讯的面试,这个级别的程序员,都会考察项目管理能力,并且权重…

[牛客网] HJ35 蛇形矩阵(写了好久才写出来)

链接https://www.nowcoder.com/practice/649b210ef44446e3b1cd1be6fa4cab5e?tpId37&tqId21258&rp1&ru/exam/oj/ta&qru/exam/oj/ta&sourceUrl%2Fexam%2Foj%2Fta%3Fdifficulty%3D2%26page%3D1%26pageSize%3D50%26search%3D%26tpId%3D37%26type%3D37&dif…

区块链行业遭供应链攻击,上万加密钱包被“抄底”损失上亿美元

当地时间8月2日晚间, 区块链行业遭遇了一次行业重创 。据科技媒体TechCrunch报道, 若干名攻击者“抄底”了上万个加密钱包,钱包内有价值上亿美元的代币。 据了解遭受攻击的加密钱包包括Phantom、Slope和TrustWallet等。涉及到的币种除了SOL、…

Vue2的tsx开发入门完全指南

本篇文章尽量不遗漏重要环节,本着真正分享的心态,不做标题党 下面进入正题: 由于现在vue的官方脚手架已经非常完善我们就不单独配置webpack了,节省大量的时间成本。 首先使用vue/cli创建一个vue模版项目(记得是vue/…

Dockerfile详解

一、能干嘛? 我们总会遇到下面这种情况:使用docker pull 拉取下来的镜像发现其提供的功能并不完善,比如拉下来个centos的镜像,运行该镜像生成容器发现连vim,ifconfig命令都没有!想要在该镜像的基础上扩充其…

[SQL]增删查改语法概览

数据定义 基本概念 基本表 本身独立存在的表SQL中一个关系就对应一个基本表一个(或多个)基本表对应一个存储文件一个表可以带若干索引 存储文件 物理结构对用户透明索引存放在存储文件中 视图 从一个或几个基本表导出的表数据库中至存放数据的定义而不存放视图对应的数据视…

Moonlight iPad全屏无边框串流方法

环境:iPad MoonLight 串流PC 问题:iPad无法全屏,有边框 解决办法:将电脑分辨率和MoonLight自定义分辨率调整为iPad原始分辨率 背景:在使用iPad进行MoonLight串流PC游戏时,发现客户端不论如何设定iPad都有边…

SQL函数

SQL函数 DATE_SUB()函数 1.1函数语法定义 1.2函数实际应用: 语法: 获取当前日期:select curdate()获取当前日期前一天:select date_sub(curdate(),interval 1 day)获取当前日期后一天:select date_sub(curdate(),interval -1 …

mysql(一) 使用注意事项及优化

初学mysql的时候、写了一份 "什么是CRUD? CRUD的操作" 的文章(18年的) 我开心看到有朋友经常在下面讨论一些问题、 但是以现在(今天 23年)回头看觉得 那些只是入门需要知道和掌握的、也刚好最近不是很忙 所…

S3C2440开发环境搭建

拿出了之前的S3C2440开发板,然后把移植uboot、移植内核、制作根文件系统、设备树编写驱动等几项再做一遍,这篇文章先记录下环境搭建过程,以及先把现成的uboot、内核、根文件系统下载进去,看看开发板还能不能用,先熟悉一…

【C++】踏入C++的大门(万字总结)

文章目录🎪 踏入C的大门🚀1.什么是C🚀2.C发展史🚀3.C关键字🚀4.命名空间⭐4.1 命名空间定义⭐4.2 命名空间使用⭐4.3 C输入和输出🚀5.缺省参数⭐5.1 缺省参数概念⭐5.2 缺省参数分类🚀6.函数重载…

Unreal Engine10:Character的实现

写在前面 这里主要是介绍一下Character的实现,顺带也介绍一下UE4资源的获取; 一、UE4资源获取 1. 地图的获取 1.1 下载资源 在Epic Games Launcher的虚幻商城中搜索内容,带有环境标签的就主要是地图资源;有一些是免费的资源和…

C#--耗时操作实现UI界面实时更新不阻塞(耗时操作解决窗体卡顿)

前言C#实现窗体加载进度条或者百分比实时显示耗时操作的进度,方法有很多。但是经过我的学习、查找与实际应用,发现Task配合MethodInvoker最为高效便捷。下面我就来结合代码讲一下要注意的问题。基础知识C#在winform上进行耗时操作往往会放置progressbar&…

JavaWeb 实战 01 - 计算机是如何工作的

计算机是如何工作的1. 计算机发展史2. 计算机的基本组成2.1 冯诺依曼体系结构2.2 CPU的内部结构2.3 指令2.3.1 指令表2.3.1.1 寄存器2.3.2 CPU的工作流程2.4 小结3. 操作系统3.1 核心功能3.2 操作系统的软硬件结构3.3 什么是进程 / 任务3.4 进程管理3.4.1 管理3.4.2 PCB : 进程…

Carl2——二叉树

一.定义struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {} };二.遍历深度优先1.1 迭代法【1】前序遍历&#xff08;144&#xff09;class Solution { public:vector<int> preorderTraversal(TreeNode* roo…

小文智能结合ChatGPT的产业未来

最近几个月&#xff0c;由人工智能实验室OpenAI发布的对话式大型语言模型ChatGPT在国内外各大平台掀起了一阵AI狂潮。短短几天时间&#xff0c;其用户量就突破了百万大关&#xff0c;注册用户之多一度导致服务器爆满。 继AI画图之后&#xff0c;ChatGPT成为了新的顶流&#xf…

支付宝二面:使用 try-catch 捕获异常会影响性能吗?

一. JVM异常处理逻辑 Java 程序中显式抛出异常由athrow指令支持&#xff0c;除了通过 throw 主动抛出异常外&#xff0c;JVM规范中还规定了许多运行时异常会在检测到异常状况时自动抛出(效果等同athrow), 例如除数为0时就会自动抛出异常&#xff0c;以及大名鼎鼎的 NullPointe…